Re: Steuerung Vorverstärker Kategorie: Programmierung Basic (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 | |
Antwort schreiben Antworten: Re: Steuerung Vorverstärker (von UlliS - 3.03.2016 16:15) 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