- LiFePO4 Speicher Test    Werbung      
Ergebnis 1 bis 10 von 15

Thema: 1 Interrupt pro Sekunde

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    36
    Beiträge
    3.501
    In deiner Timer 1 ISR lädst du 49911 in das Timer Register. Ich weiß jetzt nicht welchen Controller du hast aber ich meine bei allen AVRs wären die Timerregister nur 8bit breit. D.h. du musst die 49911 in High und Low aufteilen und in das High bzw. Low Register schreiben. Du kannst keine 49911 in ein 8bit Register quetschen.
    Ich denke das sollte das Problem lösen.

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    08.06.2010
    Ort
    78xxx
    Alter
    33
    Beiträge
    73
    Das wusste ich nicht. Ok, wie teile ich die Zahl denn Richtig auf? Einfach abschneiden?
    Code:
    49911 ==> 1100 0010 1111 0111
    Also ist:
    High = 1100 0010 => 194
    Low = 1111 0111 => 247

  3. #3
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    36
    Beiträge
    3.501
    Jop genau.
    Das mit der 16bit Zahl in einem Timerregister kann schon deswegen nicht funktionieren weil die AVRs alle 8bit Prozessoren sind. Und über einen 8bit Datenbus kannst du keinen 16bit Timerwert schicken Bild  
    Deswegen musst du die Zahl aufteilen. Und das macht man so wie du gesagt hast.
    Und ich glaube du musst das Timer High Register als erstes beschreiben und dann das Low Register.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    08.06.2010
    Ort
    78xxx
    Alter
    33
    Beiträge
    73
    Ok, vielen Dank euch, jetzt könnte eine Sekunde hinkommen!

    PS: Ich würde das Thema jetzt als Gelöst Markieren, kann aber nicht herausfinden wie das geht .. können das nur Admins?

  5. #5
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    36
    Beiträge
    3.501
    Nein das kannst du auch machen. Musst du mal gucken indem du auf "Bearbeiten" klickst. Kann dir selber nicht genau sagen wie das geht.
    Und die 1 Sekunde kannst du am besten mit einer Stoppuhr oder einer Digital Uhr mit Sekundenanzeige nachprüfen Bild  

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    08.06.2010
    Ort
    78xxx
    Alter
    33
    Beiträge
    73
    Ich will ne Uhr draus bauen, also lass ich die Sekunde jetzt erst mal ne Sekunde sein und mess dann Später die Verzögerung über nen ganzen Tag Bild   Ist, glaube ich, einfacher wie die Sekunde jetzt zu messen.

    EDIT1: Man, bin ich blind: Thema als erledigt Markieren ist ganz einfach. Einfach oben auf "Themen-Optionen"->"Markiere Thema als erledigt"

  7. #7
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    36
    Beiträge
    3.501
    Für eine Uhr würde ich aber eher ein 32kHz Quarz nehmen. Lässt sich besser runterfallen als 1 bzw. 16 MHz Bild  

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    26.08.2006
    Beiträge
    84
    1 Int pro Sekunde geht auch stressfreier:
    Code:
    // ****** timer int, send message to counter tiny
    ISR(SIG_OUTPUT_COMPARE1A) {
        // --- irgendwas machen
    }
    
    // ****** init 16bit timer
    void init_timer(void) {
        // --- set counter to 0
        TCNT1 = 0;
        // --- control registers
        TCCR1A = 0;
        TCCR1B = (1<<WGM12) | (1<<CS12);    // CTC mode, prescaler 256 for 8 MHz
        TIMSK = 0x10;    // besser: TIMSK |= 0x10; da TIMSK hier auch für timer0+2 zuständig ist...
        // --- set max for compare
        OCR1A = 0x7a12;                // 0x7a12 bei clk/256 @ 8,0 MHz ohne Rest :)
    }
    Hier wird der Timer1 (16Bit) eines ATMega32 im CTC Mode benutzt. Dabei läuft der Zähler von 0 bis Max (hier 0x7a12 bzw. 31.250) und wird dann da automatisch auf 0 gesetzt, wodurch man sich das counter neu setzen jedesmal in der ISR spart Bild  . da du noch nen 8 bit timer benutzt kann es sonst zu überschneidungen kommen, was das neu setzen des Counters verzögern würde, die Sekunden wären also ab und zu ein paar Takte länger.

    Für ne LED Matrix tät ich eher empfehlen in der refresh ISR die frames zu zählen und danach das Bild zu ändern, bzw. die Zeit zu zählen.
    Noch schicker wirds wenn du 2 Framebuffer benutzt und dann immer im gerade nicht angezeigten rummalst, dann wirkt das Ganze noch stabiler Bild  
    Einen externen Uhren IC könnte man dann noch per Knopfzelle puffern (z.B. DS1307 hat da direkt Pins für), die Synchronisation per GPS ist einfacher als man denkt (und für <€40,00 machbar!) und beides täte auch 1x pro Sekunde nen Puls liefern. Also am Besten gleich RXD/TXD, Int0 oder Int1 und SDA+SCL freilassen, spart später das umstricken...

    Ich hoffmal das war jetzt nützlich und halbwegs verständlich :P
    Geändert von Slein (03.09.2011 um 21:54 Uhr)

Ähnliche Themen

  1. Genaue Sekunde mit 4,194304 Mhz Quarz
    Von Draconix im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 03.01.2010, 11:01
  2. messungen pro sekunde
    Von ikarus_177 im Forum Sensoren / Sensorik
    Antworten: 5
    Letzter Beitrag: 14.04.2008, 17:54
  3. Frage timervorgabe für eine Sekunde?
    Von alper im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 21.11.2006, 22:55
  4. Jede Sekunde ein Timer Interrupt
    Von Johannes G. im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 06.10.2006, 16:52
  5. Wie viele Messungen maximal mit dem internen ADC pro Sekunde
    Von Florian im Forum AVR Hardwarethemen
    Antworten: 17
    Letzter Beitrag: 02.04.2005, 23:13

Berechtigungen

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

    Werbung      Labornetzteil AliExpress