- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 22

Thema: Timer1 als Gesamtlaufzeit-Zähler möglich?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    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.
    GrußundTschüß \/
    ~Jürgen

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    Alsooooo. Irgendwie ist da der Wurm drin.

    Ich habe jetzt alternativ das simple LCD-Testprogramm von Sprut mal draufgemacht, das läuft original mit 4mhz, die 4096mhz sollten also egal sein.
    Da krieg ich aufs ganze LCD (20x4) nur ne graue Fläche, keine Pixel o.ä. sichtbar.

    Meine 5V Spannung war anscheinend zu schwach gepuffert, da hatte ich nur 4,6V , jetzt vorne und hinten 100µF an den Regler und die 4,95V sind da.
    Den Kontrastpin am LCD habe ich auch son hingedreht mitm Trimmer,
    dass ich gut was sehe, dazu das LCD mit 13mA Strom (5V mit 100Ohm Vorwiderstand bei 3,6V LED Spannung)etwas beleuchtet.

    Nun zum komischen Teil.
    Ich hatte ja zu anfangs schon diese 2 schwarzen Balken.
    Wenn ich HS Oszillator eingestellt hatte kam erstmal nix, jetzt mit XT "Crsytal" kam was.
    Laut Sprut ist bei um 4Mhz aber egal ob XT oder HS. (ausser Strom)

    Jetzt mit XT, "low volt disabled",
    Kommt manchmal nach
    "Spannung weg, Spannung Ran" reset

    Ein blinkender Cursor.. der saut dann einmal nach rechts, dann kommt ein "?" was stehenbleibt.
    Was ich auch schon hatte war ein rasendes "?" über die beiden aktiven Zeilen ...

    MCLR bzw reset pin ist aktiv, ich sehe aber keine Auswirkung am LCD.
    Muss mir irgendwie noch ne blinkende LED an einen freien port setzen, als Programm-läuft-Rückmeldung.

    Kann es sein, dass mein Quarz nicht ins Schwingen kommt?
    Ich hab da die gleichen kerkos dran wie ich für die 10Mhz quarze vor Jahren mitgekauft hatte
    -Kann ich (und wie) die Schaltung mit dem internen Schwinger testen,
    oder raucht dann was ab wenn der externe quarz auch noch dran ist?
    ... Sonst muss ich da halt mit EntLötlitze ran.

    Ich werde jetzt noch versuchen das asm selber zu compilieren,
    da kamen bisher über 83 Fehler daher habe ich das fertige hex genommen und nur die Konfiguration geändert.

    Achja: Ich benutze einen PiC16F628A , der wohl auch tut, im Brenner erkannt wird und auch die Demoprogramme
    von Vellemann astrein macht. Das geschribene Hex habe ich auch nachm schreiben überprüft udn es gab keine Fehler/Abweichungen...

    ToDo/Memo an mich selbst für morgen:
    1. ASM compilieren, ohne Fehlermeldung hinbekommen
    2. ASM modifizieren, die Wartezeiten und loops um 50% verringern, anpassung von 10mhz auf 4mhz,
    und weil ein anderer Display controller drin steckt nach der Abfrage "Display Ready Pin" noch ne 10mS Pause einbauen.
    GrußundTschüß \/
    ~Jürgen

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    Ich sehe, dass du Assembler machst und Sprut zitierst. Arbeitest du mit High Voltage Programming? (Sprut propagiert und begründet das ja deutlich).
    Hast du das LowVoltage Programming Enable Bit in den CONFIGs disabled? Es gibt kein HV-Prog.-Enable, das geht immer. Nur der Pin RB3 kann dann noch stören. Ist der per Widerstand auf GND gezogen? Das kann viel Ärger ersparen.

    Das 16-Bit-Register des Timer1 nützt dir kaum was. Auslesen und Verarbeiten kannst du ihn nur byteweise; die Inkrementierung auf 16-Bit-Ebene in Software??? - das wüsste ich grad nicht, wie das gehen soll.

    ISR steht für "Interrupt Service Routine", ansonsten aber richtig.

    Hast du eine Diagnose-LED am Controller dran? Dann mach dich vielleicht erstmal dran, bezüglich Chipprogrammierung auf festen Boden zu kommen. Danach vielleicht einen 1ms- oder 10ms-Interrupt einrichten. Eine blinkende LED. Eine Delayfunktion in der ISR für das Hauptprogramm. Die Datenübergabe an das Display ...

    Bei Fosz = 4,096MHz bzw. Fcycl = 1MHz und 1ms-Interrupt hast du im Extremfall fast 1000 Befehle für die ISR zur Verfügung. Da passt sooo viel rein: (natürlich würde dann das Hauptprogramm nicht mehr "laufen", nur noch "kriechen", aber das ist ein anderes Thema)
    Taster- bzw. Lichtschranken-Signalentprellung, die Uhrenkaskade, Kopieren der Bytes bei erkanntem Zeitnahme-Trigger, die LCD-Bedienung, und und und... die meisten Sachen sind ja mit wenigen Befehlen abgehandelt.

    Vielleicht magst du ja schon vorher die Fehlercodes zeigen, damit du schneller < 10 kommst?

Ähnliche Themen

  1. Problem mit Timer1 als Counter im CTC Modus und Interupt
    Von Anam52 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 26.02.2013, 15:34
  2. Variablenschar als Schieberegister möglich??
    Von drivepro82 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 05.10.2008, 14:06
  3. Mehr als 7 Defchar. Möglich?
    Von Jon im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 01.01.2007, 19:45
  4. Mini-Auftrag: Microcontroller als Zähler mit RS232
    Von frank-findus im Forum Elektronik
    Antworten: 12
    Letzter Beitrag: 07.11.2006, 09:34
  5. Welchen IC als Decoder / Zähler
    Von Lorenz im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 28.10.2005, 13:21

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen