Hallo Zusammen
ich haben eine LED 7 Segment Anzeigen Uhr gebaut
ich habe die Uhr vorher mit dem internem RTC des Atmaga8 betrieben
jetzt möchte ich auf ein externen RTC umstellen
ich habe mit dem DS1307 noch wenig Erfahrung und benötige euren Hilfe
Kurz zu meiner Hardware:
Atmega8--> interner 8MHz
'Segment_a --> Portd.0
Segment_b --> Portd.1
Segment_c --> Portd.2
Segment_d --> Portd.3
Segment_e --> Portd.4
Segment_f --> Portd.5
Segment_g --> Portd.6
Segment_dp --> Portd.7
Ziffer_1 --> Portc.0
Ziffer_2 --> Portc.1
Ziffer_3 --> Portb.4
Ziffer_4 --> Portb.3
Ziffer_5 --> Portb.2
Ziffer_6 --> Portb.5
Sda vom DS1307 --> Portc.4
Scl vom DS1307 --> Portc.5
und hier ist Versuch den DS1307 zu intrigieren
ich bitte um Hilfe
lg mnsp2
ich haben eine LED 7 Segment Anzeigen Uhr gebaut
ich habe die Uhr vorher mit dem internem RTC des Atmaga8 betrieben
jetzt möchte ich auf ein externen RTC umstellen
ich habe mit dem DS1307 noch wenig Erfahrung und benötige euren Hilfe
Kurz zu meiner Hardware:
Atmega8--> interner 8MHz
'Segment_a --> Portd.0
Segment_b --> Portd.1
Segment_c --> Portd.2
Segment_d --> Portd.3
Segment_e --> Portd.4
Segment_f --> Portd.5
Segment_g --> Portd.6
Segment_dp --> Portd.7
Ziffer_1 --> Portc.0
Ziffer_2 --> Portc.1
Ziffer_3 --> Portb.4
Ziffer_4 --> Portb.3
Ziffer_5 --> Portb.2
Ziffer_6 --> Portb.5
Sda vom DS1307 --> Portc.4
Scl vom DS1307 --> Portc.5
und hier ist Versuch den DS1307 zu intrigieren
Code:
'*******************************************************************************
' 7 segment anzeigen Uhr mit DS1307
'*******************************************************************************
'**** µC Deklarationen ****
$regfile = "m8def.dat"
$crystal = 8000000
'****Variablen****
Dim Temp_ziffer As Byte 'welche ziffer soll bearbeitet werden
Dim Bcd_aus As Byte 'enthält den Wert der dez zahl die ausgegeben werden soll
Dim Weekday As Byte
Dim Sek_einer As Byte , Sek_zehner As Byte , Min_einer As Byte , Min_zehner As Byte , Std_einer As Byte , Std_zehner As Byte
Dim Datum_zaehler As Integer , Tag_zehner As Byte , Tag_einer As Byte , Monat_zehner As Byte , Monat_einer As Byte , Jahr_zehner As Byte , Jahr_einer As Byte
'****Ein-/Ausgänge****
Config Portd = Output 'Ddrd = &B11111111 --> 1 Ausgang, 0 Eingang
Config Portc = Output
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Config Portb.5 = Output
Config Portb.6 = Input
Config Portb.7 = Input
Portb.6 = 1 '1 = PullUp aktiviert Eingang (Taster gegen Masse)
Portb.7 = 1
Portd = &B00000000
Portc.1 = 0
Portc.0 = 0 'Alle Ziffern AUS
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
Portb.5 = 0
'****Alias****:
Dezimalpunkt Alias Portc.2
Ziffer_2 Alias Portc.1
Ziffer_1 Alias Portc.0
Ziffer_6 Alias Portb.5
Ziffer_3 Alias Portb.4
Ziffer_4 Alias Portb.3
Ziffer_5 Alias Portb.2
'(Segment_a Alias Portd.0
Segment_b Alias Portd.1
Segment_c Alias Portd.2
Segment_d Alias Portd.3
Segment_e Alias Portd.4
Segment_f Alias Portd.5
Segment_g Alias Portd.6
Segment_dp Alias Portd.7
')
'****SUB****
'Declare Sub Min_stellen
'Declare Sub Std_stellen
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'Ds1307
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Einstellen der TWI (I2C) Schnittstelle in BASCOM
Config Sda = Portc.4
Config Scl = Portc.5
' Address des DS1307 $D0=schreiben $D1=lesen
Const Ds1307w = &HD0
Const Ds1307r = &HD1
' Einstellen der Datum-/Zeitfunktion in BASCOM dabei werden automatisch
' die Variablen _year,_month,_day,_hour,_min,_sec im BCD Format angelegt
Config Clock = User
' Datumsformat deutsch Tag.Monat.Jahr und als Trennzeichen den Punkt
Config Date = Dmy , Separator = .
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Timer0 für Multiplexausgabe
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
On Timer0 7segment 'Interrupt-Routine für Timer0-Overflow
Config Timer0 = Timer , Prescale = 64 'Takt: Quarz/Prescale (möglich: 1, 8, 64, 256, 1024)
Enable Timer0 'Timer0-Overflow-Interrupt einschalten
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Hauptprogramm
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' ### Uhren Code ###
Do
'Start Hauptschleife
Dezimalpunkt = 1
'Debounce Pinb.6 , 0 , Min_stellen , Sub
'Debounce Pinb.7 , 0 , Std_stellen , Sub
Loop 'Ende Hauptschleife
'( ### Uhr stellen ###
Sub Min_stellen
Incr Min_einer
Sek_einer = 0
Sek_zehner = 0
End Sub
Sub Std_stellen
Incr Std_einer
End Sub
')
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Interrupt-Routine für Ziffer ausgabe im 7 Segmentcode
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7segment:
If Temp_ziffer = 6 Then Temp_ziffer = 0 'bestimmt die auszugebende Ziffer (1 bis 4)
Incr Temp_ziffer 'bei jedem aufruf des Lable wir eine andere Ziffer ausgegeben
Portc.1 = 0
Portc.0 = 0 'Alle Ziffern aus, ansonsten gibt es "Geister" Anzeigen
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
Portb.5 = 0
Portd = &B00000000
Select Case Temp_ziffer 'welche Ziffer soll angesteuert werden
Case 1 : Ziffer_1 = 0 '6. Ziffer
Ziffer_2 = 0
Ziffer_3 = 0
Ziffer_4 = 0
Ziffer_5 = 0
Ziffer_6 = 1
If Std_zehner = 0 Then
Bcd_aus = 10
Ziffer_6 = 0
Else
Bcd_aus = Std_zehner
Ziffer_6 = 1
End If
Case 2 : Ziffer_1 = 0 '5. Ziffer
Ziffer_2 = 0
Ziffer_3 = 0
Ziffer_4 = 0
Ziffer_5 = 1
Ziffer_6 = 0
Bcd_aus = Std_einer
Case 3 : Ziffer_1 = 0 '4. Ziffer
Ziffer_2 = 0
Ziffer_3 = 0
Ziffer_4 = 1
Ziffer_5 = 0
Ziffer_6 = 0
Bcd_aus = Min_zehner
Case 4 : Ziffer_1 = 0 '3. Ziffer
Ziffer_2 = 0
Ziffer_3 = 1
Ziffer_4 = 0
Ziffer_5 = 0
Ziffer_6 = 0
Bcd_aus = Min_einer
Case 5 : Ziffer_1 = 0
Ziffer_2 = 1 '2. Ziffer
Ziffer_3 = 0
Ziffer_4 = 0
Ziffer_5 = 0
Ziffer_6 = 0
Bcd_aus = Sek_zehner
Case 6 : Ziffer_1 = 1 '1. Ziffer
Ziffer_2 = 0
Ziffer_3 = 0
Ziffer_4 = 0
Ziffer_5 = 0
Ziffer_6 = 0
Bcd_aus = Sek_einer
End Select
' *********** 7 Segmentcode - Tabelle *****************
' --A--
' | |
' F B
' | |
' --G--
' | |
' E C
' | |
' --D--
Select Case Bcd_aus
'GFEDCBA
Case 0 : Portd = &B0111111 '0
Case 1 : Portd = &B0000110 '1
Case 2 : Portd = &B1011011 '2
Case 3 : Portd = &B1001111 '3
Case 4 : Portd = &B1100110 '4
Case 5 : Portd = &B1101101 '5
Case 6 : Portd = &B1111101 '6
Case 7 : Portd = &B0000111 '7
Case 8 : Portd = &B1111111 '8
Case 9 : Portd = &B1101111 '9
Case 10 : Portd = &B0000000 'leeres Feld (zur Nullstellenunterdrückung)
End Select
Return
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'Get date time
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Getdatetime:
I2cstart ' Start
I2cwbyte Ds1307w ' DS1307 schreiben
I2cwbyte 0 ' DS1307 Adresszeiger auf 0 stellen
I2cstart ' Start
I2cwbyte Ds1307r ' DS1307 lesen (ab vorher eingestellter Adresse 0)
I2crbyte _sec , Ack ' Sekunden
I2crbyte _min , Ack ' Minuten
I2crbyte _hour , Ack ' Stunden
I2crbyte Weekday , Ack ' Wochentag (in Dummy gelesen da von date$/time$ nicht genutzt)
I2crbyte _day , Ack ' Tag
I2crbyte _month , Ack ' Monat
I2crbyte _year , Nack ' Jahr
I2cstop
Sek_einer = _sec
Sek_zehner = _sec
Shift Sek_zehner , Right , 4
Sek_einer = Sek_einer And &H0F
Sek_zehner = Sek_zehner And &H0F
Min_einer = _min
Min_zehner = _min
Shift Min_zehner , Right , 4
Min_einer = Min_einer And &H0F
Min_zehner = Min_zehner And &H0F
Std_einer = _hour
Std_zehner = _hour
Shift Std_zehner , Right , 4
Std_einer = Std_einer And &H0F
Std_zehner = Std_zehner And &H0F
Tag_zehner = _day
Tag_einer = _day
Shift Tag_zehner , Right , 4
Tag_zehner = Tag_zehner And &H0F
Tag_einer = Tag_einer And &H0F
Monat_zehner = _month
Monat_einer = _month
Shift Monat_zehner , Right , 4
Monat_zehner = Monat_zehner And &H0F
Monat_einer = Monat_einer And &H0F
Jahr_zehner = _year
Jahr_einer = _year
Shift Jahr_zehner , Right , 4
Jahr_zehner = Jahr_zehner And &H0F
Jahr_einer = Jahr_einer And &H0F
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return
Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart ' Start
I2cwbyte Ds1307w ' DS1307 schreiben
I2cwbyte 4 ' DS1307 Adresszeiger auf 4 (Byte 5) stellen
I2cwbyte _day ' Tag schreiben
I2cwbyte _month ' Monat schreiben
I2cwbyte _year ' Jahr schreiben
I2cstop
Return
Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart ' Start
I2cwbyte Ds1307w ' DS1307 schreiben
I2cwbyte 0 ' DS1307 Adresszeiger auf 0 stellen
I2cwbyte _sec ' Sekunden schreiben
I2cwbyte _min ' Minuten schreiben
I2cwbyte _hour ' Stunden schreiben
I2cstop
Return
ich bitte um Hilfe
lg mnsp2