Bascom Wiedereimal der ds1307

trinity4711

Neues Mitglied
06. Feb. 2008
9
0
1
Walhorn
Sprachen
  1. BascomAVR
Hallo Forengemeinde,
ich möchte den Rambereich im ds1307 für Schaltzeiten benutzen. Habe das Datenblatt ausgiebig durchgearbeitet, aber nichts gefunden.
Gemeint ist der Adressbereich von 08h bis 3fh.



CodeBox BascomAVR
Writeram:
Ramlocation = &H08
Ramvalue = 30              'minuten:30
Gosub Write1307ram
Ramlocation = &H09
Ramvalue = 05              'stunden: 5  also zusammen Schaltzeit "AN"  5:30 Uhr
Gosub Write1307ram
Return
Readram:
Cls
Ramlocation = &H08
Gosub Read1307ram
Lcd Ramvalue
Lcd ":"
Ramlocation = &H09
Gosub Read1307ram
Lcd Ramvalue
Ramlocation = &H0A
Gosub Read1307ram
Lcd ":"
Lcd Ramvalue

If Ramvalue = Schalt1 then
set Portx.x
end if
 
Wait 5
Return


Meine Frage: Kann ich das so angehen oder muß ich die Schaltzeiten in Dual oder BCD-Werte umwandeln.

Gruß Michael
 
Hallo Michael!

Der besser Lesbarkeit wegen habe ich mir mal erlaubt, deinen BASCOM-Programmcode entsprechend hervorheben zu lassen. :wink:


Zu deiner Frage....
Meine Frage: Kann ich das so angehen oder muß ich die Schaltzeiten in Dual oder BCD-Werte umwandeln.

Ich habe das Datenblatt jetzt nur kurz überflogen und bin der Meinung, dass du ruhig das Dezimale-Format verwenden kannst.
Es stehen die 56 Bytes (56 x 8bit) frei zur Verfügung.....
also 56 Zahlen mit einem Wert von &H00 bis &HFF bzw. von 0 bis 255 (dezimal).

Eine zwingende Umwandlung der dezimalen Zahlen in das BCD-Format sehe ich für diesen Speicherbereich da nicht.


Grüße,
Cassio


EDIT:
Kleiner Tipp am Rande...
Wenn du auch Alarmzeiten verwenden möchtest und die RTC vielleicht sogar darauf reagieren soll, dann schau dir mal das Datenblatt der DS1337 an. :wink:
 
RE: Wiedermal der ds1307

Hallo Casio,

vielen Dank für deine schnelle Antwort. Habe auch an den ds1337 gedacht. Nur leider hat der nur zwei Alarmausgänge. Ich brauche aber mehr (bis zu 16).
Der Hintergrund ist der, daß ich einen Zirkulationstimer (für eine Pumpe) progen möchte, welcher seinen Zyklus zu einer beliebigen einstellbaren Zeit startet. Die Zyklendauer soll eine wählbare "Ein"- und "Auszeit" haben.

Ich werde vielleicht heute noch meinen bisherigen Code posten.

Gruß Michael
 
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
 
Re:

Hallo
Schade das mir keiner helfen kann.:confused: Das Programm läuft, wenn auch nur eingeschränkt. Es fehlt halt die Save-Funktion für Pumpenzeit und Pumpendauer.
Versuche es übers Eeprom.

Gruß Michael

PS. Wie wandelt man eigentlich den Code in die obige Bascomansicht um?
 
Re:

Hallo
Schade das mir keiner helfen kann.:confused: Das Programm läuft, wenn auch nur eingeschränkt. Es fehlt halt die Save-Funktion für Pumpenzeit und Pumpendauer.
Versuche es übers Eeprom.

Gruß Michael

PS. Wie wandelt man eigentlich den Code in die obige Bascomansicht um? (Bascom Highlight)
 
Hallo Michael,

PS. Wie wandelt man eigentlich den Code in die obige Bascomansicht um? (Bascom Highlight)

leider kann ich dir bei BascomAVR nicht so helfen.

Wenn du den Sourcecode farbig formatiert und mit Zeilennummern darstellen möchtest, selektierst du einfach den Code-Bereich (linke Maustaste drücken und auswählen) und klickst auf den entsprechenden Button ...
(Du musst dich hierzu im erweiterten Editor befinden, bei "schnell antworten" sind die Buttons nicht da)
highlighting-buttons.png


Dirk :ciao:
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)