Hallo Zusammen,
aktuell habe ich ein Problem mit DCF 77 , I2C und einer 7 Segment Anzeige.
Im Einzelnen: ich steuere 2 7 Segment Displays an, die jeweils durch einen PCF 8574N getrieben werden. Die PCF werden über I2C angesteuert. Daserste 7 Segm. ist für die Einer-Stelle zuständig, das zweite für die Zehner-Stelle.
Das Programm läuft auf einem Tiny 85. Es wird eine DCF77 Uhr ausgewertet mit der entsprechenden Bascom Routine. Dabei wird die Sekunde in Einer und Zehner zerlegt und dann per I2C übertragen. Die Rechenmethode habe ich zuvor mit einem Tiny 2313 erprobt und funktioniert. Da der 2313 aber nicht genügend Speicherkapa hat für LCD Display Anzeige und 7 Segment, bin ich dann auf Tiny 85 umgestiegen. (Einen Tiny 4313 habe ich aktuell nicht vorrätig)
Das Problem ist folgendes : Die Sekundenanzeige läuft viel zu schnell. Sie durchläuft in ca. 5 sec (geschätzt) den Bereich von 0 bis 60, d.h. es läuft ca. Faktor 12 zu schnell. Gleiches geschieht übrigens auch, wenn ich einen Tiny 45 verwende.
Wenn ich aber den DCF77 Eingang als Tastereingang verwende, und den Befehl Debounce etc. anwende wird sauber rauf gezählt. ( Der ganze DCF77 Teil ist dann natürlich inaktiv gesetzt)
Kann bitte mal jemand über mein Programm schauen, und mir ggf. sagen/ zeigen wo mein Fehler liegt. Mein aktuelles Programm habe ich unten angehängt.
Vielen Dank für Eure Mühe.
Gruss
Theo
Alles anzeigen
aktuell habe ich ein Problem mit DCF 77 , I2C und einer 7 Segment Anzeige.
Im Einzelnen: ich steuere 2 7 Segment Displays an, die jeweils durch einen PCF 8574N getrieben werden. Die PCF werden über I2C angesteuert. Daserste 7 Segm. ist für die Einer-Stelle zuständig, das zweite für die Zehner-Stelle.
Das Programm läuft auf einem Tiny 85. Es wird eine DCF77 Uhr ausgewertet mit der entsprechenden Bascom Routine. Dabei wird die Sekunde in Einer und Zehner zerlegt und dann per I2C übertragen. Die Rechenmethode habe ich zuvor mit einem Tiny 2313 erprobt und funktioniert. Da der 2313 aber nicht genügend Speicherkapa hat für LCD Display Anzeige und 7 Segment, bin ich dann auf Tiny 85 umgestiegen. (Einen Tiny 4313 habe ich aktuell nicht vorrätig)
Das Problem ist folgendes : Die Sekundenanzeige läuft viel zu schnell. Sie durchläuft in ca. 5 sec (geschätzt) den Bereich von 0 bis 60, d.h. es läuft ca. Faktor 12 zu schnell. Gleiches geschieht übrigens auch, wenn ich einen Tiny 45 verwende.
Wenn ich aber den DCF77 Eingang als Tastereingang verwende, und den Befehl Debounce etc. anwende wird sauber rauf gezählt. ( Der ganze DCF77 Teil ist dann natürlich inaktiv gesetzt)
Kann bitte mal jemand über mein Programm schauen, und mir ggf. sagen/ zeigen wo mein Fehler liegt. Mein aktuelles Programm habe ich unten angehängt.
Vielen Dank für Eure Mühe.
Gruss
Theo
Quellcode
- $regfile = "Attiny85.dat"
- $crystal = 8000000 ''8 Mhz int. Generator
- $swstack = 40
- $hwstack = 20
- $framesize = 8
- '######### Eingänge definieren
- Declare Sub Sekunde_stellen()
- 'Array für Segmente einreichten
- 'Daten müssen in der Reihenfolge : =&B P7 P6 P5 P4...... im Array stehen
- '0= Segment an ; 1= Segment aus
- 'Die Reihenfolge der Bits ist angepasst an das Layout der Platine
- Dim Array_D(12) as Byte
- Array_D(1)= &B00101000 'ist 0
- Array_D(2)= &B10101111 'ist 1
- Array_D(3)= &B01001010 'ist 2
- Array_D(4)= &B00001110 'ist 3
- Array_D(5)= &B10001101 'ist 4
- Array_D(6)= &B00011100 'ist 5
- Array_D(7)= &B00011001 'ist 6
- Array_D(8)= &B10101110 'ist 7
- Array_D(9)= &B00001000 'ist 8
- Array_D(10)= &B10001100 'ist 9
- Array_D(11)= &B11111111 'alle Segmente aus incl. DP
- Array_D(12)= &B00000000 'alle Segmente an incl DP --> lamp test
- 'Adressen der einzelnen PCF 8574 in Array setzen
- Dim Array_Adr (2) as Byte
- Array_Adr(1)= &B01000000 'Adresse Sekunden Einer
- Array_Adr(2) =&B01000010 'Adresse Sekunden Zehner
- 'I2C einrichten
- Config SCL=Portb.2
- Config SDA=Portb.0
- 'Const AdrSec_E= &B01000000'Adresse Sekunden Einer
- 'Const AdrSec_Z= &B01000010 'Adresse Sekunden Zehner
- '############################## LCD komplett inaktiv setzen #################
- '######### LCD definieren
- 'Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Porta.0 , Rs = Porta.1
- 'Config Lcd = 16 * 2
- 'Cls
- 'Cursor = 0ff
- 'Wait 1
- 'Cursor=off
- '#################################################################################
- '### DCF 77 konfigurieren '#######
- Config Dcf77 = Pinb.3 , Inverted = 1 , Timer = 1 , Update = 0 , Debug = 0 , Check = 1 , Gosub = Sectic
- Config Date = Dmy , Separator = .
- Enable Interrupts
- Portb.3 = 1 'Eingang für DCF77 Signal; Pullup einschalten
- Dim Sync_Uhr as Byte
- Dim Neue_sekunde As Byte
- Dim Sek as Byte 'Wert der aktuellen Sekunde
- Dim Sek_E as Byte 'Sekunde Einer
- Dim Sek_Z as Byte ' Sekunde Zehner
- Dim Sek_alt as Byte
- Sek_E=0
- Sek_Z =0
- Sek=0
- Sek_alt=0
- Do
- 'Signal_kontroll_led = Dcf_status.0
- Sync_Uhr=Dcf_status.7 '=0 wenn nicht synchronisiert; =1 wenn synchronisiert
- If Neue_sekunde = 1 Then
- Neue_sekunde = 0
- If Dcf_status.7 = 0 Then'Uhr nicht synchronisiert
- 'Locate 1 , 1 ' LCD Inaktiv
- 'Lcd Time$ LCD inaktiv
- Elseif DCF_status.7 <> 0 then 'Uhr sychronisiert
- 'Locate 1 , 1'LCD inaktiv
- 'Lcd Time$'Lcd inaktiv
- End if
- End If
- Sek=_sec
- if Sek<> Sek_alt then
- Sekunde_stellen
- End if
- Loop
- End
- Sectic:
- Neue_sekunde = 1
- Return
- Sub Sekunde_stellen
- if Sek<10 then
- Sek_E =Sek
- Sek_Z=0
- elseif Sek>9 then
- sek_E= Sek Mod 10
- Sek_Z=Sek/10
- End if
- Sek_alt=Sek
- '####### inaktiv########
- 'Sekunden Einer und Zehner anzeigen
- 'Locate 2,1 LCD inaktiv
- 'Lcd "Zehn: "; Sek_Z ;" Ein: ";Sek_E LCD Inaktiv
- '############################
- 'hier Daten per I2C senden
- 'Sekunden Einer senden
- I2Cstart
- I2Cwbyte Array_Adr(1)
- I2Cwbyte Array_D(Sek_E+1)
- I2CStop
- 'Waitms 100
- 'Sekunden Zehner senden
- I2Cstart
- I2cwbyte Array_Adr(2)
- I2Cwbyte Array_D(Sek_Z+1)
- I2CStop
- End Sub