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

Aquariumsteuerung Kategorie: Verschiedenes (von Siegfried Opolka - 11.02.2009 12:31)
Ich nutze:
C-Control Pro Mega128, CC-Pro 128 Application Board
Hallo!
Bin Neuling hier, also Gnade bitte ;-)
Vor einigen Jahre habe ich eine Aquariumsteuerung mit der C-Control I gebaut,
die sehr gut funktioniert. Nun möchte ich mich ein wenig mit der Mega128
befassen und habe einfach mal mein altes Programm mit einigen der
Beispielprogrammen verwurstet.
Scheint alles zu funktionieren (DCF-Teile konnten aber noch nicht getestet
werden). Nun möchte ich Euch bitten mir Neuling noch ein paar Verbesserungen
am Programm mit an die Hand zu geben, bevor das ganze dann auf eine eigene
Platine gesetzt wird.

Danke Siggi

' A_02: Aquariumsteuerung
'
' DCF an PortF0 (40)
' AD-Wandler an ADC2 (42) und ADC4 (44)
' 4 Ausgänge an PortC (23, 21, 19, 17)
' Library: IntFunc_Lib.cc, LCD_Lib.cc, DCF_Lib.cc


  Dim ADC_Wert1 As Word
  Dim ADC_Wert2 As Word
  Dim l As Byte
  Dim n As Byte
  Dim s As Integer
  Dim s_alt As Integer
  Dim Text(9) As Char
  Dim z As Integer
  Dim t_soll, ph_soll, abweich As Word
  Dim t1, t2, t3, t4, t5 As Word
  Dim p1, p2, p3, p4, p5 As Word
  Dim s1_a(1), s1_b(1), s1_c(1), s2_a(1), s2_b(1) As Char

'---------------------------------------------------------------
' Zeichenausgabe Uhr
'
Sub Write2Dig(pos As Byte,val As Byte)
    Dim num(3) As Char
    Dim c As Char
    LCD_CursorPos(pos)                  ' LCD Cursor positionieren
    If val<10 Then
        c=&H30
        If pos=1 Then
          c=&H20
        End If
        LCD_WriteChar(c)
    End If
    Str_WriteInt(val,num,0)             ' Zahl in String schreiben
    LCD_WriteText(num)                  ' String ausgeben
End Sub


'---------------------------------------------------------------
' Uhr
'
Sub Display_Time()
    Write2Dig(1,Stunde)              ' Stunde
    If Sekunde Mod 2 <> 0 And l= 0 Then
      LCD_WriteChar(&H20)            ' Blinkender Cursor
    Else
      LCD_WriteChar(&H3a)
    End If
    Write2Dig(4,Minute)              ' Minute
End Sub


'---------------------------------------------------------------
' Schalten
'
Sub Schalten()
  If (Stunde > 21) Or (Stunde = 21 And Minute > 29) Or (Stunde < 8) Or (Stunde > 12 And Stunde < 15) Or (Tag = 3 And Stunde > 20) Then
    Port_WriteBit(23,PORT_OFF)
    Else Port_WriteBit(23,PORT_ON)
  End If
  If (ADC_Wert1-4*abweich) > t_soll Then
    Port_WriteBit(21,PORT_OFF)
    Else Port_WriteBit(21,PORT_ON)
  End If
  If (ADC_Wert1+abweich) < t_soll Then
    Port_WriteBit(19,PORT_ON)
  End If
  If (ADC_Wert1-abweich) > t_soll Then
   Port_WriteBit(19,PORT_OFF)
  End If
  If (ADC_Wert2+abweich) < ph_soll Then
   Port_WriteBit(17,PORT_OFF)
  End If
  If (ADC_Wert1-abweich) > ph_soll And ADC_Wert1 <> 999 Then
   Port_WriteBit(17,PORT_ON)
  End If
End Sub

'---------------------------------------------------------------
' *Service Wasserwechsel
'
Sub Swit()
      If Port_ReadBit(PORT_SW1)= 0 And l= 0 Then
        LCD_CursorPos(&H40)
        LCD_WriteText(Text)
        Port_WriteBit(23,PORT_ON)
        Port_WriteBit(19,PORT_OFF)
        Port_WriteBit(17,PORT_OFF)
        l= 1
        AbsDelay (500)
        Else
        If Port_ReadBit(PORT_SW1)= 0 And l= 1 Then
          Port_WriteBit(52,PORT_OFF)
          l= 0
          LCD_ClearLCD()
          AbsDelay (500)
          z=20
        End If
      End If
End Sub


'
'---------------------------------------------------------------
' Takt Sekunden
'
 Sub RTC_1()
   s= Sekunde
   z=z+1
   ADC_Set(ADC_VREF_VCC,2)
   ADC_Wert1= ADC_Read()
   ADC_Set(ADC_VREF_VCC,4)
   ADC_Wert2= ADC_Read()
   If z Mod 5= 0 Then
     t1= ADC_Wert1
     p1= ADC_Wert2
   End If
   If z Mod 5= 1 Then
     t2= ADC_Wert1
     p2= ADC_Wert2
   End If
   If z Mod 5= 2 Then
     t3= ADC_Wert1
     p3= ADC_Wert2
   End If
   If z Mod 5= 3 Then
     t4= ADC_Wert1
     p4= ADC_Wert2
   End If
   If z Mod 5= 4 Then
     t5= ADC_Wert1
     p5= ADC_Wert2
   End If
   ADC_Wert1= ((t1 + t2 + t3 + t4 + t5)/5)* 0.977
   If ADC_Wert1 > 888 Or ADC_Wert1 < 111 Then
     ADC_Wert1= 999
   End If
   ADC_Wert2= ((p1 + p2 + p3 + p4 + p5)/5)* 0.0977
   If ADC_Wert2 > 88 Or ADC_Wert2 < 11 Then
     ADC_Wert2= 99
   End If
   Str_WriteWord((ADC_Wert1/100),10,s1_a,0,1)
   LCD_CursorPos(&H40)
   LCD_WriteText(s1_a)
   Str_WriteWord(((ADC_Wert1 Mod 100)/10),10,s1_b,0,1)
   LCD_WriteText(s1_b)
   LCD_WriteChar(&H2e)
   Str_WriteWord((ADC_Wert1 Mod 10),10,s1_c,0,1)
   LCD_WriteText(s1_c)
   Str_WriteWord((ADC_Wert2/10),10,s2_a,0,1)
   LCD_CursorPos(&H45)
   LCD_WriteText(s2_a)
   LCD_WriteChar(&H2e)
   Str_WriteWord((ADC_Wert2 Mod 10),10,s2_b,0,1)
   LCD_WriteText(s2_b)
   If z= 30 Then
     z= 0
     Schalten()
   End If
 End Sub


'---------------------------------------------------------------
' Takt 10ms
'
Sub RTC_10m()
    cnt1=cnt1+1                         ' 10ms Zähler erhöhen
    If cnt1=50 And l= 1 Then
      Port_WriteBit(51,PORT_OFF)        ' LED1 ausschalten
    End If
    If cnt1=100 Then
        Port_WriteBit(51,PORT_ON)       ' LED1 einschalten
        Display_Time()                  ' Funktionsaufruf: Display_Time
        Sekunde= Sekunde+1
        If Sekunde=60 Then
            Sekunde=0
            If Minute= &H15 And Stunde= &H01 Then
             DCF_START()
            End If
            Minute= Minute+1
            If Minute=60 Then
                Minute=0
                Stunde= Stunde+1
                If Stunde=24 Then
                    Stunde=0
                End If
            End If
        End If
        cnt1=0
    End If
End Sub


'---------------------------------------------------------------
' Interrupt alle 10ms
'
Sub INT_10ms()
    Dim irqcnt As Integer
    Swit()
    RTC_10m ()
    If s <> Sekunde And l=0 Then RTC_1()
    End If
    DCF_PULS()
    DCF_SYNC()
    DCF_FRAME()
    irqcnt=Irq_GetCount(INT_TIM2COMP)
End Sub


'---------------------------------------------------------------
' Hauptprogramm
'
Sub main()
    DCF_INIT()
    DCF_START()
    LCD_Init()                          ' Display initialisieren
    LCD_ClearLCD()                      ' Display löschen
    LCD_CursorOff()                     ' Display Cursor ausschalten
    cnt1= 0
    Port_DataDirBit(36,PORT_IN)         ' Taster 1
    Port_DataDirBit(51,PORT_OUT)        ' LED1 auf Ausgabe vorbereiten
    Port_WriteBit(51,PORT_OFF)          ' LED1 ausschalten
    Port_DataDirBit(23,PORT_OUT)        ' Port Licht auf Ausgabe vorbereiten
    Port_WriteBit(23,PORT_OFF)          ' Port Licht ausschalten
    Port_DataDirBit(21,PORT_OUT)        ' Port Heiz.1 auf Ausgabe vorbereiten
    Port_WriteBit(21,PORT_OFF)          ' Port Heiz.1 ausschalten
    Port_DataDirBit(19,PORT_OUT)        ' Port Heiz.2 auf Ausgabe vorbereiten
    Port_WriteBit(19,PORT_OFF)          ' Port Heiz.2 ausschalten
    Port_DataDirBit(17,PORT_OUT)        ' Port Ventil auf Ausgabe vorbereiten
    Port_WriteBit(17,PORT_OFF)          ' Port Ventil ausschalten
    l= 0
    z= 20
    t_soll= 250
    ph_soll= 70
    abweich= 3
    Sekunde=0                           ' Startzeit festlegen z.B. 12:55
    Minute=55
    Stunde=12
    Text= "Service!"
    Irq_SetVect(INT_TIM2COMP,INT_10ms)  ' Interrupt Service Routine definieren

  Do While 1 : End While
End Sub


    Antwort schreiben


Antworten: