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.