Re: Steuerung Vorverstärker Kategorie: Programmierung Basic (von UlliS - 3.03.2016 16:15) | |
Als Antwort auf Re: Steuerung Vorverstärker von Siggi - 3.03.2016 14:04
| |
> Hallo ihr Lieben, > > da ich für mein Programm allerlei "Schipsel" aus diesem Forum geklaut habe, möchte > ich natürlich auch meinen Code zum Räubern hier vorstellen; evtl. kann ja jemand was > davon brauchen :-) > Der Vorverstärker hat auf der Front einen Ein-Taster, 4 Taster zum Auswählen der > Quelle, einen Empfänger für die Ferbedienung, ein Motorpoti für die Lautstärke sowie > ein Display. > > Gru� Siggi > > > > > Dim LCD_Text(16) As Char > Dim rc5_data As Word > Dim a As Integer ' Merker Taste > Dim b As Integer ' Merker Mute > Dim Merker_Ein As Integer ' Merker Ein/Aus Zustand > Dim minute, hour As Byte > Dim sec, last_sec As Byte > > Dim DCF_Buffer(59) As Byte 'Buffer für einzelne DCF Bits > Dim DCF_Mode As Byte 'Merker für jeweiligen DCF_Mode > Dim CheckCounter As Byte 'Zähler für DCF Erkennung > Dim BitCounter As Integer 'Zähler für DCF Datenarraybuffer > Dim Firstflag As Byte 'Entscheidungsbit ob eine DCF 1 anliegt > Dim dcf_durchlaufen As Byte 'Merker für Display Reset > Dim DCF_minute As Byte 'DCF Data > Dim DCF_hour As Byte 'DCF Data > Dim freeCount As Integer 'Zähler DCF Parität > > Dim counter As Integer 'Zähler für Cursor-Position > > #define DCF_Port 40 > #define Hell 27 > > > Sub LCD_Reset() > LCD_Init() > LCD_ClearLCD() > LCD_CursorOff() > End Sub > > > > Sub Event_Ein_Aus() > Port_WriteBit (Hell,1) > Port_ToggleBit(20) > If Merker_Ein= 0 Then Merker_Ein= 1 > Else Merker_Ein= 0 > End If > LCD_ClearLCD() > If Merker_Ein= 0 Then > LCD_Text= "Aus..." > Port_Write(PortC,255) > AbsDelay(100) > Port_WriteBit (Hell,0) > Else > LCD_Text= "Ein..." > End If > LCD_Locate(1,1) > LCD_WriteText(LCD_Text) > AbsDelay(1000) > LCD_ClearLCD() > If (a= 19) And Merker_Ein= 1 Then Event_Taste1() > End If > If (a= 17) And Merker_Ein= 1 Then Event_Taste2() > End If > If (a= 16) And Merker_Ein= 1 Then Event_Taste3() > End If > If (a= 18) And Merker_Ein= 1 Then Event_Taste4() > End If > End Sub > > > > Sub Taster_Beginn() > Port_WriteBit (Hell,1) > Port_Write(PortC,239) ' Kein Eingangsrelais, Mute EIN > AbsDelay(400) > LCD_ClearLCD() > End Sub > > > Sub Taster_End() > LCD_Locate(1,1) > LCD_WriteText(LCD_Text) > AbsDelay(400) > Port_ToggleBit(a) ' Auswhl Eingangsrelais > AbsDelay(400) > Port_ToggleBit(23) ' Mute AUS > LCD_ClearLCD() > Port_WriteBit (Hell,0) > End Sub > > > > > Sub Event_Taste1() > Taster_Beginn() > a= 19 > LCD_Text= "DVD <-" > Taster_End() > End Sub > > > Sub Event_Taste2() > Taster_Beginn() > a= 17 > LCD_Text= "Fernseher <-" > Taster_End() > End Sub > > > Sub Event_Taste3() > Taster_Beginn() > a= 16 > LCD_Text= "Aux <-" > Taster_End() > End Sub > > > Sub Event_Taste4() > Taster_Beginn() > a= 18 > LCD_Text= "Quelle_4 <-" > Taster_End() > End Sub > > > Sub Event_Lauter() > Port_WriteBit (Hell,1) > LCD_ClearLCD() > LCD_Text= "Lauter" > LCD_Locate(1,1) > LCD_WriteText(LCD_Text) > Do While (rc5_data= 13328 Or rc5_data= 15376) > Port_ToggleBit(21) > AbsDelay(200) > Port_ToggleBit(21) > AbsDelay(200) > rc5_data = RC5_Read() > End While > AbsDelay(400) > LCD_ClearLCD() > Port_WriteBit (Hell,0) > End Sub > > > Sub Event_Leiser() > Port_WriteBit (Hell,1) > LCD_ClearLCD() > LCD_Text= "Leiser" > LCD_Locate(1,1) > LCD_WriteText(LCD_Text) > Do While (rc5_data= 13728 Or rc5_data= 15776) > Port_ToggleBit(22) > AbsDelay(200) > Port_ToggleBit(22) > AbsDelay(200) > rc5_data = RC5_Read() > End While > AbsDelay(400) > LCD_ClearLCD() > Port_WriteBit (Hell,0) > End Sub > > > Sub Event_Mute() > Port_WriteBit (Hell,1) > Port_ToggleBit(23) > LCD_ClearLCD() > LCD_Text= "Mute..." > LCD_Locate(1,1) > LCD_WriteText(LCD_Text) > AbsDelay(1000) > Do While Port_ReadBit(0)= 1 And b= 1 > rc5_data = RC5_Read() > If rc5_data <> 0 Then > If (rc5_data= 13325 Or rc5_data= 15373) Then b= 0 > End If > If (rc5_data= 13328 Or rc5_data= 15376) Then b= 0 > End If > If (rc5_data= 13728 Or rc5_data= 15776) Then b= 0 > End If > If (rc5_data= 13324 Or rc5_data= 15372) Then b= 0 > End If > End If > AbsDelay(50) > End While > LCD_ClearLCD() > AbsDelay(500) > Port_ToggleBit(23) > b= 1 > Port_WriteBit (Hell,0) > End Sub > > > > > Sub RCF_Routine() 'INT Routine, welche alle 10ms angesprungen wird > Dim irqcnt As Integer > DCF_Start() 'einzelne DCF Routinen aufrufen, welche aber nur > DCF_Puls() 'abhängig vom DCF-Mode ausgeführt werden > DCF_Datastart() > DCF_Collect() > DCF_Calc() > irqcnt = Irq_GetCount(INT_TIM2COMP) 'INT Abarbeitung bestätigen > End Sub > > > Sub DCF_Start() > If DCF_Mode = 0 Then 'wenn DCF inaktiv check auf Uhrzeit > If Clock_GetVal(2) = 4 And Clock_GetVal(1)= 58 Then > DCF_Mode = 1 'Uhrzeit wird um 04:58 gestellt, dann wird DCF_Mode 1 > CheckCounter = 0 > End If > End If > End Sub > > Sub DCF_Puls() 'hier wird auf Vorhandensein eines DCF Signals geprüft > If DCF_Mode = 1 Then > If Port_ReadBit(DCF_Port)= 1 Then > CheckCounter++ 'wenn Signal High Counter erhöhen > Else > CheckCounter = 0 'wenn nicht, Counter zurück setzen > End If > If CheckCounter = 3 Then 'wenn 3 mal (30ms) HIGH Signal > DCF_Mode = 2 'dann wird auf DCF_Mode 2 geschaltet > CheckCounter = 0 'Counter zurücksetzen für andere Routinen > End If > End If > End Sub > > Sub DCF_Datastart() 'hier wird auf die lange Pause im DCF_Signal getriggert > If DCF_Mode = 2 Then ' MODE2 bedeutet: Warten auf 59te Sekunde > If Port_ReadBit(DCF_Port)= 0 Then > CheckCounter++ 'wenn kein Signal (0) dann Counter erhöhen > Else > CheckCounter = 0 'sonst Counter zurück setzen > End If > If CheckCounter > 120 Then > DCF_Mode = 3 'wenn Signal mindestens 1200ms auf Low > CheckCounter = 0 'dann DCF_Mode 3 einschalten und Counter auf 0 > End If > End If > End Sub > > Sub DCF_Collect() > If DCF_Mode = 3 Then > Port_WriteBit(52,Port_ReadBit(DCF_Port ) ) 'DCF Signal auf LED darstellen > If Port_ReadBit(DCF_Port)= 1 Then 'Wenn wieder eine 1 kommt > CheckCounter++ 'dann incr Counter und setze > Firstflag = 1 'setze das Flag für ersten Impuls > Else 'sonst wird der letzte Impuls nach Länge ausgewertet > If Firstflag = 1 Then 'wenn tatsächlich ein Impuls vorhanden WAR > If CheckCounter < 15 Then 'schauen ob kürzer als 15x10ms > DCF_Buffer(BitCounter) = 0 'und in diesem Fall den Buffer mit 0 beschreiben > CheckCounter = 0 > Firstflag = 0 'Flag für vorhandenes DCF Signal löschen > BitCounter++ 'Counter für Buffer Array incrementieren > Else > DCF_Buffer(BitCounter) = 1 'sonst BufferArray mit 1 beschreiben > CheckCounter = 0 > Firstflag = 0 'Flag für vorhandense DCF Signal löschen > BitCounter++ 'Counter für Buffer Array incrementieren > End If > End If > End If > If BitCounter = 59 Then 'wenn 59 Bits gesammelt wurden > DCF_Mode = 4 'DCF_Mode schalten auf Auswertung > BitCounter = 0 'DCF Arraybufferzähler löschen > End If > End If > End Sub > > Sub DCF_Calc() > Dim a As Integer > Dim ParMin As Integer > Dim ParHour As Integer > ParMin = 0 > ParHour = 0 > If DCF_Mode = 4 Then 'wenn DCF_Mode auf Auswertung > 'in diesem Block werden aud den jeweiligen BufferBits die tatsächlichen > 'Werte errechnet und in die DCF Uhrzeit Variablen geschoben > DCF_minute = DCF_Buffer(21)*1 + DCF_Buffer(22)*2 + DCF_Buffer(23)*4 + DCF_Buffer(24)*8 > +DCF_Buffer(25)*10 +DCF_Buffer(26)*20 +DCF_Buffer(27)*40 > > DCF_hour = DCF_Buffer(29)*1 + DCF_Buffer(30)*2 + DCF_Buffer(31)*4 + DCF_Buffer(32)*8 > +DCF_Buffer(33)*10 +DCF_Buffer(34)*20 > > For freeCount = 21 To 27 'Parität für Minuten berechnen > ParMin = ParMin Xor DCF_Buffer(freeCount) > Next > For freeCount = 29 To 34 'Parität für Stunden berechnen > ParHour = ParHour Xor DCF_Buffer(freeCount) > Next > > > If ParMin = DCF_Buffer(28) And ParHour = DCF_Buffer(35) Then > Do While 1 > If Port_ReadBit(DCF_Port ) = 1 Then 'wenn Prüfung positiv war, dann wird die > 'interne Uhr genau dann gestellt, wenn > 'das DCF Signal auf 1 wechselt > 'und dann die While Schleife verendet;-) > Clock_SetTime(DCF_hour,DCF_minute,0,0 ) > Exit > End If > End While > DCF_Mode = 0 'DCF-Mode wird auf 0 gestellt > Else > DCF_Mode = 1 'sonst wird auf Mode 1 geschaltet (Check DCF Signal) > End If > End If > End Sub > > > Sub DCF_Abfrage() > sec= Clock_GetVal(CLOCK_SEC) > If sec <> last_sec Then > LCD_ClearLCD() ' Clear display > LCD_Locate(1,counter) ' Set LCD Cursor position > LCD_Text= "*" > LCD_WriteText(LCD_Text) ' Print string Line1 > counter= counter + 1 > LCD_Locate(2,1) > LCD_Text= "DCF..." ' Set LCD Cursor position > LCD_WriteText(LCD_Text) ' Print string Line1 > If counter > 16 Then counter= 1 > End If > End If > last_sec=sec > dcf_durchlaufen= 1 > If Clock_GetVal(1)= 01 Then ' Nach 3 Minuten DCF-Suche abbrechen > DCF_Mode= 0 > End If > End Sub > > > > Sub Zeit_Anzeige() > If dcf_durchlaufen= 1 Then > LCD_ClearLCD() > dcf_durchlaufen= 0 > DCF_Mode = 0 > End If > sec= Clock_GetVal(CLOCK_SEC) > If sec <> last_sec Then > hour=Clock_GetVal(CLOCK_HOUR) > minute=Clock_GetVal(CLOCK_MIN) > If sec Mod 2 = 0 And Merker_Ein= 1 Then > Str_Printf(LCD_Text, "%2d %02d", hour, minute) > Else > Str_Printf(LCD_Text, "%2d:%02d", hour, minute) > End If > LCD_Locate(1,6) > LCD_WriteText(LCD_Text) > last_sec= sec > End If > End Sub > > > /*------------------------------------------------------------------------------ > description: Hauptprogram > ------------------------------------------------------------------------------*/ > Sub main() > Port_DataDir(PortC,255) ' Port C als Ausgänge > Port_Write(PortC,255) ' Alle ausgeschaltet > > Port_DataDir(PortA,0) ' Port A als Eingänge > Port_Write(PortA,255) ' PullUp für Eingang > > Port_DataDirBit (Hell,1) ' Port PD3, Ausgang für LCD-Beleuchtung > Port_WriteBit (Hell,0) ' helle Beleuchtung auf Aus > > RC5_Init(7) ' Port PA7 für IR-Fernbedienung > > Merker_Ein= 0 ' Am Anfang: Gerät "Aus" > b= 1 ' Merker "Mute" > a= 19 ' Merker Eingangsrelais > > Clock_SetTime(14,57,30,00) > last_sec=Clock_GetVal(CLOCK_SEC) > LCD_Reset() > > Port_DataDirBit(DCF_Port,0 ) ' DCF Port als Eingang > Port_WriteBit(DCF_Port,1 ) ' PullUp für Eingang > DCF_Mode = 0 ' DCF Modus auf 0 (Grundeinstellung) > BitCounter = 0 ' und weitere Grundwerte setzen > Firstflag = 0 > counter= 1 > dcf_durchlaufen= 0 > Irq_SetVect(INT_TIM2COMP,RCF_Routine) ' Int Routine definieren > > > Do While True ' Schleife Hauptprogramm > If DCF_Mode <> 0 Then DCF_Abfrage() > Else > Zeit_Anzeige() > rc5_data = RC5_Read() > If rc5_data <> 0 Then > Msg_WriteWord(rc5_data) > Msg_WriteChar(13) > End If > If (rc5_data= 13324 Or rc5_data= 15372 Or Port_ReadBit(4)= 0) Then Event_Ein_Aus() > End If > If (rc5_data= 13695 Or rc5_data= 15743 Or Port_ReadBit(3)= 0) And a<>19 And Merker_Ein= 1 Then Event_Taste1() > End If > If (rc5_data= 13359 Or rc5_data= 15407 Or Port_ReadBit(1)= 0) And a<>17 And Merker_Ein= 1 Then Event_Taste2() > End If > If (rc5_data= 13341 Or rc5_data= 15389 Or Port_ReadBit(0)= 0) And a<>16 And Merker_Ein= 1 Then Event_Taste3() > End If > If (rc5_data= 13368 Or rc5_data= 15416 Or Port_ReadBit(2)= 0) And a<>18 And Merker_Ein= 1 Then Event_Taste4() > End If > If (rc5_data= 13328 Or rc5_data= 15376) And Merker_Ein= 1 Then Event_Lauter() > End If > If (rc5_data= 13728 Or rc5_data= 15776) And Merker_Ein= 1 Then Event_Leiser() > End If > If (rc5_data= 13325 Or rc5_data= 15373) And Merker_Ein= 1 Then Event_Mute() > End If > End If > End While > End Sub > > > ' EOF > > Hi, mach doch ein ZIP-File daraus und lade in unter "Programm" hoch. | |
Antwort schreiben Antworten: Re: Steuerung Vorverstärker (von Siggi - 3.03.2016 20:58) Re: Steuerung Vorverstärker (von UlliS - 7.03.2016 8:27) |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum