Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > 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