RE
Hallo,
hier mein bisheriger Code, eigentlich anders als ich es vorhatte.
CodeBox BascomAVR
'------------------------------------------------------------------
'
' Pumpentimer
' 2015 Version 1.0
'
'------------------------------------------------------------------
' Programmbereschreibung:
' Statemachine (Menue) Umsetzung für Pumpentimer
' "Zeit" lesen aus RTC
' Ausgabe auf LCD
' Hardware_Beschreibung:
' Dallas DS1307 verbunden mit 32.768 khz Quarz und Backupbatterie und 1Hz Ausgang
' SDA an PortC.1
' SCL an PortC.0
' LCD an Portc - Betriebsmodus: 4 Bitmode und nur 2 Kontrollerports, R/W an GND
' 5 Schalter/Taster an PortB.0, B.1, D.2, D.3, D.6
' Programmbesonderheiten:
'
'------------------------------------------------------------------
' Compiler (Hardwaredetais für Bascom)
$regfile = "m32def.dat" 'Mikrocontroller ATmega32
$crystal = 8000000 'Quarzfrequenz
'
'------------------------------------------------------------------
'Hardware Definitionen
'Definition ob Ein- (In) oder Ausgang (Out)
'Config Porta = Output 'LEDs on portA
Config Portb = Output '
Config Pinb.0 = Input 'Taster 5
Portb.0 = 1 'interner Pullup aktivieren
Config Pinb.1 = Input 'Taster 4
Portb.1 = 1 'interner Pullup aktivieren
Config Pind.2 = Input 'Taster 3
Portd.2 = 1 'interner Pullup aktivieren
Config Pind.3 = Input 'Taster 2
Portd.3 = 1 'interner Pullup aktivieren
Config Pind.6 = Input 'Taster 1
portd.6 = 1 'interner Pullup aktivieren
Config Portc = Output 'Lcdansteuerung
Config Portd = Output
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.1 , Rs =Portc.0
Config Lcd = 40 * 2 'LCD konfigurieren
Config Sda = Portc.1
Config Scl = Portc.0
'Hardware_Benennung
Sw_5 Alias Pinb.0
Sw_4 Alias Pinb.1
Sw_3 Alias Pind.2
Sw_2 Alias Pind.3
Sw_1 Alias Pind.6
Pumpe Alias Portb.2
Reset Pumpe ' Pumpe 1
'------------------------------------------------------------------
'Konstanten Benennung
Const State_main = 0
Const State_Pumpe_Ein = 1
Const State_Pumpe_Aus = 2
Const State_Zeit_wechseln = 3
Const State_Pumpenzeit_wechseln = 4
Const State_Pumpendauer_wechseln = 5
'------------------------------------------------------------------
'Variablen Benennung
Dim Curr_state As Byte 'Menue-Variable
Dim Switch As Byte 'welcher Taster wird betätigt
Dim Pumpen_Stunden As Byte
Dim Pumpen_Minuten As Byte
Dim Pumpen_Dauer As Byte
Dim Cursor_Position As Byte
Dim Altsekunden As Byte
'-----------------------------------------------------------------
'RTC-Variablen für DS1307
Dim Control As Byte
Dim Temp As Byte
Dim Jahrhundert As Byte
Dim Jahr As Byte
Dim Monat As Byte
Dim Tag As Byte
Dim _dayofweek As Byte
Dim Stunden As Byte
Dim Minuten As Byte
Dim Sekunden As Byte
Dim Ramlocation as Byte
Dim Ramvalue as Byte
'Initialisierungsvariablen
Curr_state = State_main '
Cursor_Position = 1
Jahrhundert = 20
'------------------------------------------------------------------
' Programmbeginn
Cls
Cursor Off
Locate 1 , 7
Lcd "Pumpensteuerung"
Locate 2 , 10
LCD " Version 1.0"
Wait 3
Cls
'------------------------------------------------------------------
'state machine Umsetzung
Do
'Tasten einlesen, wenn gedrückt (gnd (0) als aktiver/gedrückter Tastenstatus)
Switch = 0
Debounce Sw_1 , 0 , S1 , Sub
Debounce Sw_2 , 0 , S2 , Sub
Debounce Sw_3 , 0 , S3 , Sub
Debounce Sw_4 , 0 , S4 , Sub
Debounce Sw_5 , 0 , S5 , Sub
Select Case Curr_state
Case State_main : Gosub Sub_main
Case State_Pumpe_Ein : Gosub Sub_Pumpe_Ein
Case State_Pumpe_Aus : Gosub Sub_Pumpe_Aus
Case State_Zeit_wechseln : Gosub Sub_Zeit_wechseln
Case State_Pumpenzeit_wechseln : Gosub Sub_Pumpenzeit_wechseln
Case State_Pumpendauer_wechseln : Gosub Sub_Pumpendauer_wechseln
End Select
Loop
End
'------------------------------------------------------------------
'switch routines
S1:
Switch = 1
Return
S2:
Switch = 2
Return
S3:
Switch = 3
Return
S4:
Switch = 4
Return
S5:
Switch = 5
Return
'------------------------------------------------------------------
Sub_main:
'Pumpenzustand auf dem LCD
Locate 1 , 1
Lcd " die Pumpe ist "
If Pumpe = 0 Then
Lcd "AUS"
Else
Lcd "EIN "
End If
'lesen und anzeigen der Zeit auf dem LCD
Gosub Read_1307time 'RTC auslesen (ds1307)
Gosub Displaytime 'Ausgabe der Zeit auf dem Display
Locate 2 , 1 'User_Einstellungen auf dem Display in der zweiten Zeile
Lcd "Ein Aus Zeit_setzen PumpenZeit Dauer"
Select Case Switch
Case 1 : Cls
Curr_state = State_Pumpe_Ein
Case 2 : Cls
Curr_state = State_Pumpe_Aus
Case 3 : Cls
Gosub Displaytimedate 'Aktuelles Datum und Zeit
Cursor_Position = 1 'Beginn bei genannte Cursorposition
Locate 1 , Cursor_Position 'Display beginnt hier
Cursor On Blink 'blinkender Cursor sichtbar
Curr_state = State_Zeit_wechseln
Case 4 : Cls
Curr_state = State_Pumpenzeit_wechseln
Case 5 : Cls
Curr_state = State_Pumpendauer_wechseln
End Select
Gosub Check_Pumpenzeit 'ist es Zeit die Pumpe ein/aus zuschalten
Return
Sub_Pumpe_Ein:
Set Pumpe
Curr_state = State_main
Return
Sub_Pumpe_Aus:
Reset Pumpe
Curr_state = State_main
Return
Sub_Pumpenzeit_wechseln:
Locate 1 , 1
Lcd " Pumpe schaltet ein um "
Locate 1 , 21
If Pumpen_Stunden < 10 Then Lcd "0"
Lcd Pumpen_Stunden
Lcd ":"
If Pumpen_Minuten < 10 Then Lcd "0"
Lcd Pumpen_Minuten
Locate 2 , 1
Lcd " -Std +Std -Min +Min Speichern"
If Switch = 1 Then Gosub Decr_Stunde
If Switch = 2 Then Gosub Incr_Stunde
If Switch = 3 Then Gosub Decr_Minuten
If Switch = 4 Then Gosub Incr_Minuten
If Switch = 5 Then Gosub Save_Pumpen_Zeit
If Pumpen_Stunden = 23 Then
If Pumpen_Minuten > 30 Then Pumpen_Minuten = 30
End If
Return
Sub_Zeit_wechseln:
Locate 2 , 1
Lcd " links rechts minus plus speichern"
If Switch = 1 Then Gosub Cursor_links
If Switch = 2 Then Gosub Cursor_rechts
If Switch = 3 Then Gosub Decrement
If Switch = 4 Then Gosub Increment
If Switch = 5 Then Gosub Save_Zeit
Return
Sub_Pumpendauer_wechseln:
Locate 2 , 1
Lcd " 5min 10min 15min 20min 25min"
Select Case Switch
Case 1 : Pumpen_Dauer = 5
Case 2 : Pumpen_Dauer = 10
Case 3 : Pumpen_Dauer = 15
Case 4 : Pumpen_Dauer = 20
Case 5 : Pumpen_Dauer = 25
End Select
If Switch > 0 Then Gosub Save_Pumpendauer
Return
'------------------------------------------------------------------
Save_Pumpendauer:
Curr_state = State_main
gosub writeram
Return
Check_Pumpenzeit:
Return
Displaytime:
Locate 1 , 16
If Stunden < 10 Then Lcd "0"
Lcd Stunden
Lcd ":"
If Minuten < 10 Then Lcd "0"
Lcd Minuten
Lcd ":"
If Sekunden < 10 Then Lcd "0"
Lcd Sekunden
Locate 1 , 28
Lcd Pumpen_Stunden
Lcd ":"
Lcd Pumpen_Minuten
Locate 1 , 36
Lcd Pumpen_Dauer
Lcd "min"
Return
Displaytimedate:
Locate 1 , 1
Select Case _dayofweek
Case 1 : Lcd "Mon"
Case 2 : Lcd "Die"
Case 3 : Lcd "Mit"
Case 4 : Lcd "Don"
Case 5 : Lcd "Fr"
Case 6 : Lcd "Sa"
Case 7 : Lcd "So"
End Select
Lcd " "
Select Case Monat
Case 1 : Lcd "Jan"
Case 2 : Lcd "Feb"
Case 3 : Lcd "Mar"
Case 4 : Lcd "Apr"
Case 5 : Lcd "Mai"
Case 6 : Lcd "Jun"
Case 7 : Lcd "Jul"
Case 8 : Lcd "Aug"
Case 9 : Lcd "Sep"
Case 10 : Lcd "Okt"
Case 11 : Lcd "Nov"
Case 12 : Lcd "Dez"
End Select
Lcd " "
If Tag < 10 Then Lcd "0" '
Lcd Tag
Lcd " "
Lcd Jahrhundert
If Jahr < 10 Then Lcd "0"
Lcd Jahr
Lcd " "
Locate 1 , 17
If Stunden < 10 Then Lcd "0"
Lcd Stunden
Lcd ":"
If Minuten < 10 Then Lcd "0"
Lcd Minuten
Lcd ":"
If Sekunden < 10 Then Lcd "0"
Lcd Sekunden
Return
'------------------------------------------------------------------
Incr_Stunde:
Incr Pumpen_Stunden
If Pumpen_Stunden > 23 Then Pumpen_Stunden = 0
Return
Decr_Stunde:
Decr Pumpen_Stunden
If Pumpen_Stunden > 23 Then Pumpen_Stunden = 23
Return
Incr_Minuten:
Incr Pumpen_Minuten
If Pumpen_Minuten > 59 Then Pumpen_Minuten = 0
Return
Decr_Minuten:
Decr Pumpen_Minuten
If Pumpen_Minuten > 59 Then Pumpen_Minuten = 59
Return
Save_Pumpen_Zeit:
Curr_state = State_main
gosub writeram
Return
'------------------------------------------------------------------
'Time modification routines
Increment:
Select Case Cursor_Position
Case 1 : Incr _dayofweek
If _dayofweek > 7 Then _dayofweek = 1
Case 5 : Incr Monat
If Monat > 12 Then Monat = 1
Case 10 : Incr Tag
If Tag> 31 Then Tag = 1
Case 15 : Incr Jahr
If Jahr > 12 Then Jahr = 0
Case 18 : Incr Stunden
If Stunden > 23 Then Stunden = 0
Case 21 : Incr Minuten
If Minuten > 59 Then Minuten = 0
Case 24 : Incr Sekunden
If Sekunden > 59 Then Sekunden = 0
Case Else:
End Select
Gosub Displaytimedate
Return
Decrement:
Select Case Cursor_Position
Case 1 : Decr _dayofweek
If _dayofweek < 1 Then _dayofweek = 7
Case 5 : Decr Monat
If Monat < 1 Then Monat = 12
Case 10 : Decr Tag
If Tag < 1 Then Tag = 31
Case 15 : Decr Jahr
If Jahr = 255 Then Jahr = 0
Case 18 : Decr Stunden
If Stunden = 255 Then Stunden = 23
Case 21 : Decr Minuten
If Minuten = 255 Then Minuten = 59
Case 24 : Decr Sekunden
If Sekunden = 255 Then Sekunden = 59
Case Else:
End Select
Gosub Displaytimedate
Return
Cursor_links:
Select Case Cursor_Position
Case 1 : Cursor_Position = 24
Case 24 : Cursor_Position = 21
Case 21 : Cursor_Position = 18
Case 18 : Cursor_Position = 15
Case 15 : Cursor_Position = 10
Case 10 : Cursor_Position = 5
Case 5 : Cursor_Position = 1
End Select
Locate 1 , Cursor_Position
Return
Cursor_rechts:
Select Case Cursor_Position
Case 1 : Cursor_Position = 5
Case 5 : Cursor_Position = 10
Case 10 : Cursor_Position = 15
Case 15 : Cursor_Position = 18
Case 18 : Cursor_Position = 21
Case 21 : Cursor_Position = 24
Case 24 : Cursor_Position = 1
End Select
Locate 1 , Cursor_Position
Return
Save_Zeit:
Cursor_Position = 1
Cls
Cursor Off
Gosub Write1307time
Curr_state = State_main
Read_1307time:
I2cstart
I2cwbyte &B11010000
I2cwbyte 0
I2cstop
Waitms 50
I2cstart
I2cwbyte &B11010001
I2crbyte Sekunden , Ack
I2crbyte Minuten , Ack
I2crbyte Stunden , Ack
I2crbyte _dayofweek , Ack
I2crbyte Tag , Ack
I2crbyte Monat , Ack
I2crbyte Jahr , Nack
Sekunden = Makedec(Sekunden)
Minuten = Makedec(Minuten)
Stunden = Makedec(Stunden)
_dayofweek = Makedec(_dayofweek)
Tag = Makedec(Tag)
Monat = Makedec(Monat)
Jahr = Makedec(Jahr)
I2cstop
Return
Write1307time:
I2cstart
I2cwbyte &B11010000
I2cwbyte &H00
Temp = Makebcd(Sekunden)
I2cwbyte Temp
Temp = Makebcd(Minuten)
I2cwbyte Temp
Temp = Makebcd(Stunden)
I2cwbyte Temp
Temp = Makebcd(_dayofweek)
I2cwbyte Temp
Temp = Makebcd(Tag)
I2cwbyte Temp
Temp = Makebcd(Monat)
I2cwbyte Temp
Temp = Makebcd(Jahr)
I2cwbyte Temp
I2cstop
Return
Write1307ctrl:
I2cstart
I2cwbyte &B11010000
I2cwbyte &H07
I2cwbyte &B10010000 ' Ausgang 1Hz
I2cstop
Return
Start1307clk:
I2cstart
I2cwbyte &B11010000
I2cwbyte 0
I2cwbyte 0
I2cstop
Return
Write1307ram:
I2cstart
I2cwbyte &B11010000
I2cwbyte Ramlocation
I2cwbyte Ramvalue
I2cstop
Return
Read1307ram:
I2cstart
I2cwbyte &B11010000
I2cwbyte Ramlocation
I2cstop
Waitms 50
I2cstart
I2cwbyte &B11010001
I2crbyte Ramvalue , Nack
I2cstop
Return
Clear1307ram:
Ramvalue = 00
Ramlocation = &H08
I2cstart
I2cwbyte &B11010000
I2cwbyte Ramlocation
For Ramlocation = &H08 To &H3F
I2cwbyte Ramvalue
Next
I2cstop
Return
Writeram:
Ramlocation = &H08
Ramvalue = Pumpen_Dauer
Gosub Write1307ram
Ramlocation = &H09
Ramvalue = Pumpen_Stunden
Gosub Write1307ram
Ramlocation = &H0A
Ramvalue = Pumpen_Minuten
Gosub Write1307ram
Return
Readram:
Cls
Ramlocation = &H08
Gosub Read1307ram
Lcd Ramvalue
Locate 2,10
Lcd ""
Ramlocation = &H09
Gosub Read1307ram
Lcd Ramvalue
LCD " : "
Ramlocation = &H0A
Gosub Read1307ram
Lcd ":"
Lcd Ramvalue
Wait 5
Return