Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

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)