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 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)