Ich habe den 4096er Quarz bestellt weil Sprut in seinen Beispielen explizit sagt,
dass mit dem 32khz uhrenquarz eine 100mS oder 10mS Uhr nicht möglich ist, da mit seiner vorgehensweise der kleinste passende Teiler eben der 1 Sekunden Schritt ist.
Habe mich da in die 3 Programmbeispiele die er hat versucht etwas einzulesen:
Zitat Sprut bei 32khz LCd Uhr:
Weiterführende Gedanken
Kann man auf dieser Basis auch eine Stoppuhr mit 1/10 und 1/100 Sekunden-Anzeige bauen???
Nein! es gibt keine Möglichkeit, aus einem 32768-Hz-Takt durch Teilung ein 10Hz oder 100Hz-Signal abzuleiten. Folglich müssen Stoppuhren mit ganz anderen Quarzen bestückt sein.
Und bei 4.096 : 4 : 256 wäre man bei => 4000 überläufen pro Sekunde .. wenn ich die dann
durch 4 (Vorteiler) Teile habe ich beim Originalprogramm von Sprut eine um 1000fach höhrere Messzeit, also 1mS statt 1s.
gegenüber
32768 : 4 : 256 => 32 Überläufe pro Sekunde .. die teilt Sprut dann durch 32 (Vorteiler) und hat seinen Überlauf im Sekundentakt.
"Theroetisch", muss ich im Originalprogramm also nur die Pausenzeiten/Loops anpassen um den Faktor 1000x und die LCD Wartezeiten an mein großes LCD anpassen,
dann läuft die Uhr schon mit mS. Ist aber halt noch keine Stoppuhr.
--------------
Sprut speichert die Zahlenwerte direkt in die auszugebenden Zeichen (ES ist ein vorher definiertes Speicher Bit), soweit ich das richtig sehe,
wobei er dann eben gleich die entsprechenden Überläufe zur nächsten Stelle mit macht, z.B: bei 59+1sek = 1min. ( siehe code bei clrfs ES)
So sieht das Unterprogramm dafür aus, das für jeden Sekundenüberlauf/Interrupt abgearbeitet wird.
Code:
Int_1
bsf neu
incf ES, f ; 1 Sekunden erhöhen
movlw D'10'
subwf ES, w
btfss STATUS, Z
goto Int_end ; 1 Sekunden <> 10
clrf ES
incf ZS, f ; 10 Sekunden erhöhen
movlw D'6'
subwf ZS, w
btfss STATUS, Z
goto Int_end ; 10 Sekunden <> 6
clrf ZS
incf EM, f ; 1 Minuten erhöhen
movlw D'10'
subwf EM, w
btfss STATUS, Z
goto Int_end ; 1 Minuten <> 10
clrf EM
incf ZM, f ; 10 Minuten erhöhen
movlw D'6'
subwf ZM, w
btfss STATUS, Z
goto Int_end ; 10 Minuten <> 6
clrf ZM
incf EH, f ; 1 Stunden erhöhen
movlw D'10'
subwf EH, w
btfss STATUS, Z
goto Test24 ; 1 Stunden <> 10
clrf EH
incf ZH, f ; 10 Stunden erhöhen
goto Int_end
Da Sprut nur eine Uhr und keine Stoppzeiten benötigt, zeigt er diese Stellen [ZM][EM]:[ZS][ES] direkt auf dem LCD an.
Vom Prinzip her würde es also reichen im Fall von "STOPP" Werte der laufenden Uhr zu kopieren und anzuzeigen.
Beim 2 zeiligen Display wäre es also möglich in der 1. Zeile immer die laufende Uhr zu zeigen
und in der 2. Zeile die im Moment vom letzten "Stopp" rauskopierten Werte.
Ich weiß nur nicht ob das schnell genug geht (unter 10mS) dass ich nicht beim Auslesen von hinten nach vorne
einen Überlauf ins nächsthöhere Bit verpasse und quasi noch paar mS weiterzähle.
Daher der Gedanke "nach" dem 255+1 Timer den 65535er Timer1 zu verwenden (zu beschreiben) und in diesem die verstrichene Gesamtzeit zu zählen,
damit ich nur diesen einzelnen Wert auslesen und anschließend "umrechnen" muss,
und nicht alle 5 Stellen einzeln kopieren.
Ich versuche mal meinen Gedanken weiterzuführen/zu erläutern:
Ich lasse den Timer0 255+1 mit den Teilern 4096/4 :4 laufen.
Ich habe also 1000 überläufe pro sekunde.
Das schreib ich in ein Byte, was jeweils nach 9+1 überläuft.
Ich komme also von 1mS Schritt damit auf 10mS. (Dieser Zwischenwert interssiert mich nicht wirklich beim auslesen,
da mich der 1mS Stand nicht interessiert. Falls genug Luft bleibt kann ich den ja aber immer noch auslesen)
Diesen 9+1mS Überlauf zähle ich dannn in Timer1 mit.
Timer 1 kann dann 65535 x 10mS zählen (=655350mS), also eine Gesamtzeit von 655 Sekunden
- was über 10 Minuten sind und völlig ausreichend.
Im Fall von "Stopp" lese ich dann den Wert von Timer1 zu diesem Zeitpunkt aus,
und kann den gespeicherten Wert dann "ganz in Ruhe" langsam auf dem LCD darstellen,
was dann auch länger dauern darf, da der Timer ja im Hintergund mit seiner Interruptroutine ungestört weiterläuft.
Die vermeintlichen Grundlagen dazu hab ich da gelesen:
http://www.sprut.de/electronic/pic/g...mer.htm#timer0
Mit ISR, meinst du die "Interrupt gesteuerte Routine", also das zeitkritische Programm was
das LCD-Anzeige/UmrechenHauptprogramm unterbricht und danach wieder zurückspringt, korrekt ?
...
Nunja. Soviel zu dem wie ich mir das theoretisch überlegt habe. Leider fehlen mir noch die Fachbegriffe und Zuordnungen, wie was wo..
Aber erstmal muss ich meine Platine zum Laufen bekommen, die zeigt nämlich nur 2 schwarze Balken aufm LCD und tut sonst nichts.
Ich habe das 10Mhz Programm mit dem 4096er Quarz verwenden wollen zum Testen meiner Platine, das läuft halt dann nur auf 40% Speed.
=> http://www.sprut.de/electronic/pic/p...hr/lcduhr.html
Leider tut sich nichts. Werde die Schaltung nochmal prüfen, wobei ich einen Fehler beim Compilieren vor dem Brennen vermute, da muss ich mal etwas rumspielen
und werde dann die Fehlercodes posten wenns unter 10 geworden sind
Mit dem fertigen *.hex und der passend Konfig (high voltage aktiv) beim Brennen hats leider auch nicht geklappt.
Lesezeichen