Hallo Deutschland!
Ich habe bereits eine 7-Segment Multiplex-Uhr aufgebaut. Die Software
war dabei von dieser großartigen Seite:
http://blackstrom.derschwarz.de/avr/avr_uhr/
Jetzt möchte ich die Uhr gerne mit DCF77 aufbauen. Der DCF77 Teil
funktioniert, ich habe das bereits mit einem LCD getestet und die
Status-Led blinkt im Takt...
Der Teil mit dem Multiplexen ist von http://blackstrom. Hat jemand eine
Idee, wie man aus dem DCF77-Buffer die Stunden 1er und 10er rausbekommt?
Ich kenne nur _hour...
Wenn ich im Quellcode feste Zahlen für die Werte angebe werden diese
nicht angezeigt. Die Anzeige flackert nur... Wenn man viel Phantasie hat
kann man GEGG lesen ;)
Hier der Code:
Hallo InkogNico,
wie du die Zeit auf deine 7-Segmentanzeige bekommst, scheint
ja zu klappen. Die Sekundenimpulse aus der DCF77-Uhr sind ja auch
da, aber das reicht nicht; du musst das komplette DCF-Signal
dekodieren!
Geh mal auf die I-Seite von DH2FAA. Er beschreibt dort eine
DCF-Uhr mit einem Pollin-Modul (810 054) und einem 2313; zusätzlich
gibt es einen Umbau des Pollin-Spiels (810 148) zu einer Uhr.
Der Code ist ähnlich um nicht zusagen fast gleich.
Sieh dir den Quellcode an. Bestechend einfach, kurz und knapp.
Funzt prima. Ich habe damit die Steuerung eines Bakensenders
realiesiert. Andere Versuche mit Beispielcode aus der Bascom-Help
und vielen Beispielen aus dem Net und 'schlauen' Büchern haben
mich nicht weiter gebracht.
Noch vergessen zu erwähnen: Für die Bake brauche ich keine Anzeige
der Zeit. Zu Testzwecken kann ich mir aber die Zeit entweder
über RS232 oder ein externes I2C-Modul anzeigen lassen.
Dann sollte das doch auch mit deinen 7-Segmentanzeigen
funktionieren.
Zu dem Pollin DCF-Modul gibt es in diesem Forum viele Beiträge.
Erst suchen, bevor du Fragen stellst......
73
Wilhelm
Vielen Dank, Wilhelm!
Das ist die Seite hier: http://www.dh2faa.de/
ist auch sehr interessant - aber mit dem LCD, das hab ich schon gemacht!
Bei mir geht es um Aufteilen von 10ern und 1ern und Multiplexen!
'Konfiguration dcf-Empfang:
Config Dcf77 = Pind.0 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1
, Gosub = Sectic
Config Date = Dmy , Separator = .
Enable Interrupts
'dcf Status LED an Portd.6
Led_dcf Alias Portd.6 'Pinb.0 Led Dcf_status.0
...
Do
Led_dcf = Dcf_status.0 'blinkt bei DCF77 empfang
Also das funktioniert bis hierhin! Ich habe in Frankfurt keine Probleme
mit dem Empfang. Ich habe das Pollin Modul mit einem Spannungsteiler
2,2K / 3,6K angeschlossen ohne Stabilisierungselko. Ich glaube der Elko
auf dem Modul macht das.
Der Pon-Eingang (schaltet das Modul ein) ist in meiner Schaltung mit 10K
gegen Masse. Das funktioniert mit einem LCD - nach 2 - 3 Minuten wird
Zeit und Datum angezeigt...
mit _hour / _min kann man Stunden und Minuten extrahieren...
Kennt jemand eine Möglichkeit, 1er und 10er Minuten zu extrahieren?
Damit ich das jetzt richtig verstehe. Du willst also aus z.B. einer 36
eine 3 und eine 6 extrahieren ?
einser:= zahl modulo 10
zehner:= (zahl - einser) / 10
Kommt das in etwa dem gewünschtem nahe?
Gruß Ich
Ha!
MOD Calculates the remainder of a division.
also 22 MOD 10 = 2
_hour Mod 10
gibt die Stunden-Einer! Das geht auch prima durch!
(_hour -(_hour Mod 10)) / 10
das hier geht leider nicht durch: "reserved word may not be used"
Wenn ich mich nicht irre, geht das in Bascom auch nicht. Ich meine, dass
Du die einzelnen Berechnungen in Bascom aufeilen musst.
stundeEiner = _hour Mod 10
stundeZehner = _hour - stundeEiner
stundeZehner = stundeZehner / 10
Versuch es mal
Gruß Ich
Schon gut, wenn man weiß, wiviel Hure es gerade hat =P
Es ist eine Mischung aus beidem geworden, die saubere Lösung ging nich -
out of RAM!
Das mit den Huren müsste aber auch gehen! Ist es so, dass zuerst rechts
ausgerechnet und dann links vom "=" neu zugeordnet wird? Er hats
jedenfalls gefressen! 83% vom Speicher sind beschrieben =)
Jetzt muss ich mal schauen, wo das andere Problem liegt - es flackert
nur!
Dim Stundezehner As Byte
Dim Minutezehner As Byte
...
Stundezehner = _hour Mod 10
Stundezehner = _hour - Stundezehner
Stundezehner = Stundezehner / 10
Minutezehner = _min Mod 10
Minutezehner = _min - Minutezehner
Minutezehner = Minutezehner / 10
Select Case Temp_ziffer 'welche Ziffer soll angesteuert werden
Case 1 : Ziffer_1 = 1
Ziffer_2 = 0
Ziffer_3 = 0
Ziffer_4 = 0
Bcd_aus = Stundezehner
Case 2 : Ziffer_1 = 0
Ziffer_2 = 1
Ziffer_3 = 0
Ziffer_4 = 0
Dezimalpunkt = Sek_blink
Bcd_aus = _hour Mod 10
Case 3 : Ziffer_1 = 0
Ziffer_2 = 0
Ziffer_3 = 1
Ziffer_4 = 0
Bcd_aus = Minutezehner
Case 4 : Ziffer_1 = 0
Ziffer_2 = 0
Ziffer_3 = 0
Ziffer_4 = 1
Bcd_aus = _min Mod 10
End Select
Irgendwas stimmt mit dem Multiplexen noch nicht... Es sieht fast so aus,
als ob die Zahlen nacheinander ausgehen, wenn man langsam stellt (Timer
hoch) kann man zusehen...
$regfile = "attiny2313.dat"
$crystal = 1000000
$swstack = 10
Config Dcf77 = Pind.0 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1
, Gosub = Sectic
Config Date = Dmy , Separator = .
Enable Interrupts
Config Portb = Output 'Port B
Ausgang
Ddrd = &B1011110
Led_dcf Alias Portd.6 'Pinb.0 Led
Dcf_status.0
Segment_a Alias Portb.0
Segment_b Alias Portb.1
Segment_c Alias Portb.2
Segment_d Alias Portb.3
Segment_e Alias Portb.4
Segment_f Alias Portb.5
Segment_g Alias Portb.6
Dezimalpunkt Alias Portb.7
Ziffer_1 Alias Portd.1
Ziffer_2 Alias Portd.2
Ziffer_3 Alias Portd.3
Ziffer_4 Alias Portd.4
Dim Neue_sekunde As Bit
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 Ausgang As Byte
'Segmentfolge die Ausgegeben wird aus Segmentcode - Tabelle
Dim Sek_blink As Bit 'Blinkt im
Sekunden Takt
Dim Stundezehner As Byte
Dim Minutezehner As Byte
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++
' Timer0 für Multiplexausgabe
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++
On Timer0 7segment
'Interrupt-Routine für Timer0-Overflow
Config Timer0 = Timer , Prescale = 256 'Takt:
Quarz/Prescale (möglich: 1, 8, 64, 256, 1024)
Enable Timer0
'Timer0-Overflow-Interrupt einschalten
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++
' Hauptprogramm
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++
Do 'Start
Hauptschleife
Led_dcf = Dcf_status.0 'blinkt bei
DCF77 empfang
Loop 'Ende
Hauptschleife
End 'Programm
Ende
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++
' Interrupt-Routine für Ziffer ausgabe im 7 Segmentcode
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++
' Bei jedem Aufruf wir nur eine Ziffer ausgegeben, d.h nur eine Anzeige
wird
' angesteuert. Die anderen bleiben dunkel. Bei jedem Aufruf wird eine
Anzeige
' weitergeschaltet.
'
' Anzeigen anordnung
'
' 1111 2222 3333 4444
' 1 1 2 2 3 3 4 4
' 1111 2222 3333 4444
' 1 1 2 2 3 3 4 4
' 1111o 2222o 3333o 4444o
'
' ^-- Dezimalpunkt
' ^---- 4. Ziffer | Minute Low Wert
' ^---------- 3. Ziffer | Minute High Wert
' ^----------------- 2. Ziffer | Stunde Low Wert
' ^----------------------- 1. Ziffer | Stunde High Wert
7segment:
If Temp_ziffer = 4 Then Temp_ziffer = 0 'bestimmt
die auszugebende Ziffer (1 bis 4)
Incr Temp_ziffer 'bei jedem
aufruf des Lable wir eine andere Ziffer ausgegeben
Portb = &B00000000 'Alle
Ziffern aus, ansonsten gibt es "Geister" Anzeigen
Stundezehner = _hour Mod 10
Stundezehner = _hour - Stundezehner
Stundezehner = Stundezehner / 10
Minutezehner = _min Mod 10
Minutezehner = _min - Minutezehner
Minutezehner = Minutezehner / 10
Select Case Temp_ziffer 'welche
Ziffer soll angesteuert werden
Case 1 : Ziffer_1 = 1 '1. Ziffer
Ziffer_2 = 0
Ziffer_3 = 0
Ziffer_4 = 0
Bcd_aus = Stundezehner
Case 2 : Ziffer_1 = 0 '2. Ziffer
Ziffer_2 = 1
Ziffer_3 = 0
Ziffer_4 = 0
Dezimalpunkt = Sek_blink
'Dezimalpunkt
Bcd_aus = _hour Mod 10
Case 3 : Ziffer_1 = 0 '3. Ziffer
Ziffer_2 = 0
Ziffer_3 = 1
Ziffer_4 = 0
Bcd_aus = Minutezehner
Case 4 : Ziffer_1 = 0 '4. Ziffer
Ziffer_2 = 0
Ziffer_3 = 0
Ziffer_4 = 1
Bcd_aus = _min Mod 10
End Select
'Ermittelt aus der Segmentfolge-Tabelle den 7 Segmentcode für die
auszugebende Zahl
Select Case Bcd_aus
Case 1 : Ausgang = Lookup(1 , Segmentfolge)
Case 2 : Ausgang = Lookup(2 , Segmentfolge)
Case 3 : Ausgang = Lookup(3 , Segmentfolge)
Case 4 : Ausgang = Lookup(4 , Segmentfolge)
Case 5 : Ausgang = Lookup(5 , Segmentfolge)
Case 6 : Ausgang = Lookup(6 , Segmentfolge)
Case 7 : Ausgang = Lookup(7 , Segmentfolge)
Case 8 : Ausgang = Lookup(8 , Segmentfolge)
Case 9 : Ausgang = Lookup(9 , Segmentfolge)
Case 0 And Temp_ziffer = 1 : Ausgang = Lookup(10 , Segmentfolge)
'Nullstellenunterdrückung bei der ersten Ziffer
Case 0 And Temp_ziffer > 1 : Ausgang = Lookup(0 , Segmentfolge)
'wenn nicht erste Ziffer Null anzeigen
End Select
'Ausgabe des 7 Segmentcodes (Invertierend [Not] bei Anz. mit gem. Anode)
Segment_a = Ausgang.0 'Segment A
Segment_b = Ausgang.1 'Segment B
Segment_c = Ausgang.2 'Segment C
Segment_d = Ausgang.3 'Segment D
Segment_e = Ausgang.4 'Segment E
Segment_f = Ausgang.5 'Segment F
Segment_g = Ausgang.6 'Segment G
Return
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++
' Interrupt-Routine für Timer1 / Zeitbasis
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++
' 7 Segmentcode - Tabelle
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++
'
' --A--
' | |
' F B
' | |
' --G--
' | |
' E C
' | |
' --D--
Segmentfolge: 'GFEDCBA /
"1" Segment AN
Data &B0111111 '0
Data &B0000110 '1
Data &B1011011 '2
Data &B1001111 '3
Data &B1100110 '4
Data &B1101101 '5
Data &B1111101 '6
Data &B0000111 '7
Data &B1111111 '8
Data &B1101111 '9
Data &B0000000 'leeres Feld
(zur Nullstellenunterdrückung)
Sectic:
Neue_sekunde = 1
Toggle Sek_blink 'Ändert sich
jede Sek., 1sec an 1sec aus
Return
Wie sieht Deine Schaltung aus? Hast Du denn auch Anzeigen mit
gemeinsamen
Anoden, wie der Mann im Originalbeitrag?
Das liest sich nämlich hier so, als ob das hier bei Dir die Segmente
genau falsch herum ansteuert, d.h. was aus sein muß leuchtet und um-
gekehrt.
MfG Paul
Jap! Ich hab ein Display mit gemeinsamer Kathode!
Segment_a = Ausgang.0 'Segment A
Segment_b = Ausgang.1 'Segment B
Segment_c = Ausgang.2 'Segment C
Segment_d = Ausgang.3 'Segment D
Segment_e = Ausgang.4 'Segment E
Segment_f = Ausgang.5 'Segment F
Segment_g = Ausgang.6 'Segment G
Das war vorher invertiert:
Segment_a = Not Ausgang.0 'Segment
A
...
Kann sein, dass man noch was ändern muss!?
>Kann sein, dass man noch was ändern muss!?
Du hast doch Deine Schaltung vor Dir. Da siehst Du doch, ob Du H oder L
Pegel ausgeben mußt, um die Segmente zum Leuchten respektive die
Transis-
toren zum Aufsteuern oder zum Sperren brauchst.
Spiel das mal im Schaltplan durch und gucke dann im Programm, ob die
Data-Zeilen dafür stimmen (und auch die Ansteuereung der 4
Transistoren),
oder ob Du das entweder invertierend ausgeben mußt. Dann kannst Du aber
auch gleich die Tabelle richtig herum schreiben.
MfG Paul
Das ist hier gegeben:
Segment_a Alias Portb.0
Segment_b Alias Portb.1
Segment_c Alias Portb.2
Segment_d Alias Portb.3
Segment_e Alias Portb.4
Segment_f Alias Portb.5
Segment_g Alias Portb.6
Dezimalpunkt Alias Portb.7
Ziffer_1 Alias Portd.1
Ziffer_2 Alias Portd.2
Ziffer_3 Alias Portd.3
Ziffer_4 Alias Portd.4
Die Anzeige ist mit 680 Ohm Widerständen direkt an den Ports - mit
dieser Anzeige braucht man keine Transistoren: 8 Segmente (mit Punkt) x
5 mA sind 40 mA.
Ich verstehe nicht, wie das mit dem Timer und dem Multiplexen in der
Schaltung funktioniert!
Unten sind nochmal die Segmente:
Segmentfolge: 'GFEDCBA /
"1" Segment AN
Data &B0111111 '0
Data &B0000110 '1
Data &B1011011 '2
Data &B1001111 '3
Data &B1100110 '4
Data &B1101101 '5
Data &B1111101 '6
Data &B0000111 '7
Data &B1111111 '8
Data &B1101111 '9
Data &B0000000 'leeres Feld
(zur Nullstellenunterdrückung)
Wurden doch schon oben zugewiesen!?
> Die Anzeige ist mit 680 Ohm Widerständen direkt an den Ports - mit> dieser Anzeige braucht man keine Transistoren: 8 Segmente (mit Punkt)> x 5 mA sind 40 mA.
Und auch kein Transistor für die Spalten? Also bekommt der Spaltenpin
dann 40mA ab. Sic...
Wenn da nicht soviel Füllraum an Beschreibung und völlig unnötigem Zeugs
stände, wäre evtl. der Zusammenhang klarer:
1
Case 2 : Ziffer_1 = 0 '2. Ziffer
2
Ziffer_2 = 1
3
Ziffer_3 = 0
4
Ziffer_4 = 0
5
Dezimalpunkt = Sek_blink
6
...
7
Data &B0111111 '0
Na, fällt der Groschen ?
Wo sind übrigens bei der Topic:
> ATtiny DCF77 7-Segment Bascom Funkuhr und andere Tricks
die Tricks ?
Seh' hier keine Tricks, ist eigentlich nur wildes Rumgerudere, basierend
auf gering inspiriertem Fremdcode.
Bei der Topic hätte ich eigentlich erwartet, dass der TO hier nützliche
Information für andere Mitglieder präsentieren möchte. Liest man dann
rein, ist's das völlige Gegenteil.
Das hier ist ja auch noch gruselig:
1
Select Case Bcd_aus
2
Case 1 : Ausgang = Lookup(1 , Segmentfolge)
3
Case 2 : Ausgang = Lookup(2 , Segmentfolge)
4
Case 3 : Ausgang = Lookup(3 , Segmentfolge)
5
Case 4 : Ausgang = Lookup(4 , Segmentfolge)
6
Case 5 : Ausgang = Lookup(5 , Segmentfolge)
7
Case 6 : Ausgang = Lookup(6 , Segmentfolge)
8
Case 7 : Ausgang = Lookup(7 , Segmentfolge)
9
Case 8 : Ausgang = Lookup(8 , Segmentfolge)
10
Case 9 : Ausgang = Lookup(9 , Segmentfolge)
11
Case 0 And Temp_ziffer = 1 : Ausgang = Lookup(10 , Segmentfolge)
12
'Nullstellenunterdrückung bei der ersten Ziffer
13
Case 0 And Temp_ziffer > 1 : Ausgang = Lookup(0 , Segmentfolge)
14
'wenn nicht erste Ziffer Null anzeigen
15
End Select
Das ließe sich mit einem Bruchteil an Code schreiben. Wo lernt man denn
sowas?
Du hattest wohl schon lange keinen Sex mehr, was =P
Freut mich auf jeden Fall, das Dir mein Thread gefällt und vielen Dank
für Deine Hilfe!
Nett, dass Du auch Deine Freunde mitbringst, dann könnt ihr Gurken ja n
bisschen über das langweilige Internet lästern mit euerm super
Gehirnschmalz. Pass nur auf, dass du mit deinem Kopf noch durch die Tür
passt!
InkogNico schrieb:> Du hattest wohl schon lange keinen Sex mehr, was =P> Freut mich auf jeden Fall, das Dir mein Thread gefällt und vielen Dank> für Deine Hilfe!> Nett, dass Du auch Deine Freunde mitbringst, dann könnt ihr Gurken ja n> bisschen über das langweilige Internet lästern mit euerm super> Gehirnschmalz. Pass nur auf, dass du mit deinem Kopf noch durch die Tür> passt!
Dummschwätzen liegt Dir sichtlich besser als Programmieren, Du solltest
umsatteln. LOL
@Inkog-Nico
Nicht porös machen lassen und nicht varrickt werden -das behebt die
Fehler nicht....
Du hast Anzeigen mit gemeinsamen Kathoden. Das bedeutet aber auch, daß
im schlimmsten Fall (wenn eine "8" angezeigt wird) der Pin, der die
Kathode schalten soll, 40mA liefern muß. Das ist aber zuviel -da sagt
der Kontroller bei Zeiten: "Ich geh kaputt!"
Setze 4 NPN-Transistoren rein, die die 4 Kathoden schalten. Da reichen
BC547 aus. Vergiss nicht, denen Basiswiderstände zu verpassen (nimm
1-10 KOHm), denn so wie in der Originalschaltung (Transitoren als
Emitterfolger) geht es mit Deinen Anzeigen nicht.
So, das bedeutet dann: Es sind NPN-Transistoren drin, die einen H-
Pegel benötigen, um angesteuert zu werden. Das heißt: Immer nur der
Transistor, der gerade die entsprechende Stelle der Anzeige ansteuert,
muß H-Pegel an der Basis haben -die anderen 3 Kollegen L-Pegel.
Jetzt geht die Überlegung weiter: Bei Deinen Anzeigen liegen die
Anoden am Kontroller. Das heißt: Es muß dort H-Pegel anliegen,
für die Segmente, die leuchten sollen, zum Bleistift bei einer "8"
alle 7 Ausgänge.
Jetzt kannst Du (nachdem Du die Transistoren eingesetzt hast)
(im Programm) nachgucken, ob die Pegel wirklich so sind, wie
sie sein müssen.
MfG Paul
InkogNico schrieb:> Ja, genau! Dann könnt ihr beiden hier euer Kaffekränzchen> weitermachen!
Hör mal, ich kann doch auch nicht dafür, dass Du geistig zu gering
begabt bist, um den Inhalt meines Posts als Hilfe zu verstehen. Dir mag
meine Kritik nicht gefallen haben, nichts desto trotz war's berechtigt
und mit ein klein wenig Hirn hättest Du den Nutzen erkannt.
InkogNico schrieb:> Das ganze soll halt für einen Freund sein, deshalb brauche ich> auch> Hilfe. Damit ich mich nicht schon wieder plamier.
Dann ist's kontraproduktiv die Helfer anzupflaumen, noch dazu ich Dir
den Fehler Deiner Falschanzeige genannt habe. Bei Verwendung von
Spaltentransistoren wäre der Code übrigens ok, da Transistoren das
Spaltensignal invertieren.
MWS schrieb:> InkogNico schrieb:>> Das ganze soll halt für einen Freund sein, deshalb brauche ich>> auch>> Hilfe. Damit ich mich nicht schon wieder plamier.>> Dann ist's kontraproduktiv die Helfer anzupflaumen, noch dazu ich Dir> den Fehler Deiner Falschanzeige genannt habe. Bei Verwendung von> Spaltentransistoren wäre der Code übrigens ok, da Transistoren das> Spaltensignal invertieren.
Das hab ich nie geschrieben - ich könnte auch mal den Router neu starten
und mich als Irgendjemand anmelden.
Es ist so, dass hier nichts produktives von den Leuten kommt und dass
MWS offenbar Fimose und Menstruationszwischenblutungen hat.
Seine Unfreundliche Art ist schon behindert und Behinderte können
bekanntlich nichts für ihre Behinderungen - wir können ihm nicht böse
sein und müssen mit ihm auskommen! Bitte nehmt ihn in Zukunft ernst! Es
ist nicht seine Schuld, dass er dauermenstruiert.
InkogNico schrieb:> Es ist so, dass hier nichts produktives von den Leuten kommt und dass> MWS offenbar Fimose und Menstruationszwischenblutungen hat.> Seine Unfreundliche Art ist schon behindert und Behinderte können> bekanntlich nichts für ihre Behinderungen - wir können ihm nicht böse> sein und müssen mit ihm auskommen! Bitte nehmt ihn in Zukunft ernst! Es> ist nicht seine Schuld, dass er dauermenstruiert.
Es reicht.
Such dir woanders ein paar Blöde, die dir was beibringen.