-
danke für die info,dirk.
wenn ich einmal nach links shifte, 4 mal.
ausgang so &B01011001 shiften &B10010000
und wieder nach rechts ist der bin code doch &B00001001
oder nicht.
ich muss mir mal ein nullmodem-kabel zulegen und die bin werte mir
auf dem terminal anschauen,habe den verdacht das die cd4094 nicht i.o. sind.wiederum habe ich ein prog geschrieben um mir die zahlen 1-9 und alles andere anzeigen zu lassen,das funktioniert auch.wenn du den letzten abschnitt meines prog anschaust wirst du sehen das ich die zahlen die durch makedec herauskommen, in der read-data schleife umwandle in meine binär version für die cd4094.nur kommt da auf dem display nur mist raus.ich weis auch nicht ob die umwandlung richtig erfolgt,es fehlt ja wie gesagt noch der terminal anschluss.
gruß mike
-
Hallo helimike0705,
ich habe mir dein Prog im groben angesehen, ohne die Gesamtfunktion testen zu können. Dazu eine Frage:
Wenn du in diesem Teil ...
Code:
Sek1:
Shift Wert , Left , 4
Shift Wert , Right , 4
Dual1 = Makedec(wert)
Gosub Zahlendaten
Shiftout Pinb.0 , Pinb.1 , B1 , 2 , 8 , 1
Return
... die Einzelziffern der Sekunde ausgeben willst (passiert ja dann letztlich über die Bytevariable B1), dann must du ja wohl über B1 die Zehner und Einer der Sekunde nacheinander (abhängig von deiner Hardware) ausgeben, oder?
Dann brauchst du ja auch einen 2-fachen Aufruf von Shiftout ...:
Code:
Sek1:
Dual2 = Makedec(wert)
Dual1 = Dual2
Shift Dual1 , RIGHT , 4 ' Zehner ausgeben
Gosub Zahlendaten
Shiftout Pinb.0 , Pinb.1 , B1 , 2 , 8 , 1
Dual1 = Dual2 And &b00001111 ' Einer ausgeben
Gosub Zahlendaten
Shiftout Pinb.0 , Pinb.1 , B1 , 2 , 8 , 1
Return
... oder erst Einer, dann Zehner je nach deiner Hardware-Verschaltung, d.h. davon, ob erst Einer oder Zehner hineingeschoben werden müssen.
Oder habe ich dein Prob ganz falsch verstanden???
Gruß Dirk
-
hallo dirk,
das ist richtig,deine vermutung.habe dies auch 4 mal vorgesehen,aber zur zeit weggelassen um den code übersichtlich zu machen.es sollten in dem falle erstmal nur die sekunden einer angezeigt werden,was aber leider fehl schlägt.ich denke das ich auf dem richtigem weg bin nur macht die anzeige nicht was sie soll.jeder cd4094 ist für eine anzeige zuständig,die 8 register sollten mit meinem bin-code geladen werden und dann ausgeben.poblem ist,ich weiss nicht wie der bin-code der bei shiftout heraus kommt aus sieht.denke das da der hase im pfeffer liegt. mit einem anderen testprog läuft die anzeige einwandfrei. siehe anhang.
es werden die einzelnen zahlen richtig ausgegeben.
Code:
'*******************************************************************************
'* demo für 7 segment platine mit CD4094"
'* anschluss des steckers: 1=plus ,2=minus ,3=output enable=plus
'* 4=stobe ,5=clock ,6=date´n
'* 4 und 5 können auf einen pin gelegt werden
'* steckeranschluss 1 ist unten ,neben dem kondensator
'*******************************************************************************
$regfile = "attiny2313.dat"
$crystal = 4000000
Config Portb = Output
Clock Alias Portb.1 ' anschluss 4 und 5
Outpin Alias Portb.0 ' anschluss 6
'**** variablen für die Zahle 1-9 und den punkt sowie alles aus ***
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte
Dim E As Byte
Dim F As Byte
Dim G As Byte
Dim H As Byte
Dim I As Byte
Dim J As Byte
Dim K As Byte
Dim L As Byte
Dim M As Byte
A = &B00111111 '1
B = &B10101000 '2
C = &B00111000 '3
D = &B00011101 '4
E = &B01011000 '5
F = &B01001000 '6
G = &B00111110 '7
H = &B00001000 '8
I = &B00011000 '9
J = &B00001010 '0
K = &B11110111 'punkt
L = &B11111111 'alles aus
'**** start der anzeige mit nullen ****
For M = 1 To 4
Shiftout Outpin , Clock , J , 0 , 8 , 100
Next
Wait 1
'**** jetzt die zahlen und den punkt sowie alles aus
'**** nacheinander darstellen
Main1:
Shiftout Outpin , Clock , A , 1 , 8 , 100
Shiftout Outpin , Clock , B , 1 , 8 , 100
Shiftout Outpin , Clock , C , 1 , 8 , 100
Shiftout Outpin , Clock , D , 1 , 8 , 100
Wait 2
Shiftout Outpin , Clock , E , 1 , 8 , 100
Shiftout Outpin , Clock , F , 1 , 8 , 100
Shiftout Outpin , Clock , G , 1 , 8 , 100
Shiftout Outpin , Clock , H , 1 , 8 , 100
Wait 2
Shiftout Outpin , Clock , I , 1 , 8 , 100
Shiftout Outpin , Clock , J , 1 , 8 , 100
Shiftout Outpin , Clock , K , 1 , 8 , 100
Shiftout Outpin , Clock , L , 1 , 8 , 100
Wait 2
Goto Main1 ' zurück an den start
End
-
Hallo Dirk,
Habe die Uhr zu laufen gebracht,derzeit sind nur die Minuten und Stunden erfasst.Der Rest kommt später dran.Das ganze Probelm lag am ATtiny2313,der hat zu wenig Speicher für die Variablen,denke ich.Habe jetzt einen Mega8 benutzt und Funtioniert.Der momentane laufende Code
ist im Anhang zu sehen,wer möchte,soll ihn Erweitern und mir den Code mal zukommen lassen, Danke.
Mike
P.S. Dauertest ist noch am laufen,Code ist eventuell noch nicht fehlerfrei
Code:
'*******************************************************************************
'* DCF77 - 7 Segment Uhr mit Anzeige-Platine CD 4094, dadurch das die
'* 8 register des CD 4094 nicht mit Register 1 mit Segment A und Reg 2
'* mit Segment b usw verbunden sind, muss mit der Code angepaast werden
'*
'* Die Steckerbelegung ist wie folgt
'* Pin1=Plus, Pin2=Minus, Pin3=Enabel Output, Pin4=Strobe, Pin5=Takt, Pin6=Daten
'*
'* Erstellt am 17.02.2008 durch Mike Köppl
'* Bascom: 1.11.9.0.
'*******************************************************************************
$crystal = 4000000
$regfile = "m8def.dat"
$framesize = 128
Config Pind.2 = Input
Config Pind.5 = Output
Set Portd.2
Set Portd.5
Config Timer0 = Timer , Prescale = 256 '4000000 / 256 = 15625 Hz
Const Startwert = 100 'Überlauf 256 - Startwert 100 = 156 ( 15625 Hz / 156 = 100,1 Hz ) => 10ms
Load Timer0 , Startwert
Dim Zahl As Byte
Dim Minute1 As Byte
Dim B1 As Byte
Dim A As Word
Dim B As Word
Dim C As Word
Dim Count As Byte
Dim I As Byte
Dim J As Byte
Dim K As Byte
Dim Impuls As Byte
Dim Pause As Integer
Dim Sekunde As Byte
Dim Wert As Byte
Dim Paritaet As Byte
Dim Checker As Byte
Dim Wochentag As String * 14
Dim Temp As String * 2
Wochentag = "MoDiMiDoFrSaSo" ' String mit Kuerzel der Wochentage
Dim Werte_bit(6) As Byte
Dim Werte_start(6) As Byte
Dim Minute(42) As Byte ' Enthaelt die Sekunden-Impulse 0 und 1
'**** Arrays für Startposition und Länge der Daten im Array Minute() **********
Werte_start(1) = 4 'Minuten
Werte_bit(1) = 6
Werte_start(2) = 12 'Stunden
Werte_bit(2) = 5
Werte_start(3) = 19 'Tag
Werte_bit(3) = 5
Werte_start(4) = 25 'Wochentag
Werte_bit(4) = 2
Werte_start(5) = 28 'Monat
Werte_bit(5) = 4
Werte_start(6) = 33 'Jahr
Werte_bit(6) = 7
Impuls = 0
Pause = 0
Sekunde = 0
Checker = 0
Config Int0 = Rising
Enable Interrupts
Enable Int0
Enable Timer0 'enable the interrupt
On Int0 Zaehle Nosave
On Ovf0 Tim0_isr
'*******************************************************************************
Do
nop
Loop
End
'*******************************************************************************
'***** Routine zählt Sekunden und wertet Impuls- und Pausenzeit aus ***********
Zaehle:
Disable Interrupts
Stop Timer0
If Pind.2 = 1 Then ' Pruefen, ob Signal 0 oder 1. 0=aktiv
Set Portd.5
Incr Sekunde
If Sekunde > 18 Then
K = Sekunde - 18
If Impuls > 10 Then
Minute(k) = 1
Else
Minute(k) = 0
End If
End If
Config Int0 = Falling ' Interrupt regiert auf fallende Flanke
Else
Wert = Makebcd(sekunde) ' Umweg ueber BCD, dann fuehrende 0
Reset Portd.5
If Pause > 100 Then ' Wenn die Pause groesser 100 war, dann wars der Minutentrenner
If Checker = 0 Then ' Checker-Flag setzen
Checker = 1
Else
Checker = 2
Gosub Check_parity
End If
Sekunde = 0 ' Sekunde 0 setzen
End If
Config Int0 = Rising
If Checker = 2 Then ' wenn Daten korrekt scheinen, dann Dekodieren und Anzeigen
Gosub Dekoder
Checker = 1
End If
End If
Start Timer0
Enable Interrupts
Impuls = 0
Pause = 0
Return
'*******************************************************************************
Tim0_isr: ' Timer incrementiert die Zaehler
Incr Impuls
Incr Pause
Return
'*******************************************************************************
Check_parity: ' Ueberprufung der empfangenen Daten
If Sekunde <> 59 Then ' Stimmt die Zahl der Sekunden?
Checker = 1
End If
Paritaet = 0 'pruefe Minutenparitaet
For I = 4 To 10
Paritaet = Paritaet + Minute(i)
Next I
Paritaet = Paritaet And 1
If Paritaet <> Minute(11) Then
Checker = 1
End If
Paritaet = 0
For I = 12 To 17 'pruefe Stundenparitaet
Paritaet = Paritaet + Minute(i)
Next I
Paritaet = Paritaet And 1
If Paritaet <> Minute(18) Then
Checker = 1
End If
Paritaet = 0
For I = 19 To 40 'pruefe Rest
Paritaet = Paritaet + Minute(i)
Next I
Paritaet = Paritaet And 1
If Paritaet <> Minute(41) Then
Checker = 1
End If
Return
'*******************************************************************************
Dekoder: ' Daten im Minuten-Array dekodieren und ausgeben.
For K = 1 To 6 ' Schleife, weil kompakter
Wert = 0
J = Werte_start(k) + Werte_bit(k)
For I = J To Werte_start(k) Step -1
Shift Wert , Left
Wert = Wert + Minute(i)
Next I
J = Werte_start(k)
Minute(j) = Wert
Next K
K = Minute(25) * 2 ' Wochentag aus String schneiden.
K = K - 1
Temp = Mid(wochentag , K , 2)
'*******************************************************************************
'********* Minutenauswertung und Umwandlung ************************************
Minute1 = Bcd(minute(4))
Minute1 = Makedec(minute(4))
A = Minute1 / 10
B = A * 10
C = Minute1 - B
Zahl = C
Gosub Zahlendaten
Shiftout Portb.0 , Portb.1 , B1 , 1 , 8 , 1
Zahl = A
Gosub Zahlendaten
Shiftout Portb.0 , Portb.1 , B1 , 1 , 8 , 1
'*******************************************************************************
'******* Stundenauswertung und Umwandlung ***************************************
Minute1 = Bcd(minute(12))
Minute1 = Makedec(minute(12))
A = Minute1 / 10
B = A * 10
C = Minute1 - B
Zahl = C
Gosub Zahlendaten
Shiftout Portb.0 , Portb.1 , B1 , 1 , 8 , 1
Zahl = A
Gosub Zahlendaten
Shiftout Portb.0 , Portb.1 , B1 , 1 , 8 , 1
Reset Portb.2
Waitms 10
Set Portb.2
Return
'*******************************************************************************
'**** Daten der Zahlendarstellung Zahlen aussuchen *****************************
Zahlendaten:
Restore Dta1
For Count = 0 To Zahl
Read B1
Next
Return
'***** Zahlen Darstellungsdaten ***********************************************
Dta1:
Data &B00001010 , &B00111111 , &B10101000 , &B00111000 , &B00011101 , &B01011000 , '0,1,2,3,4,5
Data &B01001000 , &B00111110 , &B00001000 , &B00011000 , &B11111111 , &B11110111 , 0, '6,7,8,9,alles-aus,d-punkt
-
Nachtrag:
das Programm läuft auch auf dem tiny 2313,mein Problem war das Steckbrett.Es hatte Kontaktschwierigkeiten,jetzt ist es behoben und siehe da es läuft auf dem Tiny2313.Habe aber mit diesem Programm wieder viel gelern. Danke noch mal an alle.
mfg Mike
P.S.7 Segment LED Anzeige LEDTECH 1.06 LA1571-21 T [ROT] bei eBay.de: Bauteile (endet 24.02.08 17:02:16 MEZ) (300195658940)
das sind die Anzeigen die ich benutzte,prima Teile. Laufen schon mit 5 Volt und sind bei 8 - 12 Volt schön hell.