- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 33

Thema: Timer beim ATMega32 in C

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von robo_tom_24
    Registriert seit
    04.02.2012
    Ort
    Burgenland, Österreich
    Beiträge
    485
    Neee...aber man kann den Timer direkt nach außen legen auf einen Pin...

    Aber ich helf dir mal ein bisschen....
    Du willst:
    Im 1Hz Takt wird eine Variable inkrementiert

    Du brauchst:
    Timer
    Prescaler
    Interrupt
    Interrupt-Routine
    Variable

    Einen fertigen Code wirst du wahrscheinlich nirgends finden - bekommen wirst du von uns auch keinen - nur Denkanstöße

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    04.06.2012
    Beiträge
    14
    hmm.. also wenn ich alles richtig kapiert habe, dann mal eine kleine nachfrage...

    TCCR1B |= (1<<CTC1)| (1<<CS02) | (1<<CS00);
    OCR1C = 15625;
    OCR1A = 0;
    TIMSK |= (1<<OCIE1A);
    wie ich den code verstehe:
    zeile eins ergibt den vorteiler mit wert 1024 (dann wird der interrupt ausgelößt).
    nach dem wert in zeile zwei (15625) wird wider bei null (wegen zeile drei) begonnen.
    zweile vier schaltet den interrupt wieder frei.

    berechnung:
    16Mhz / 1024 = 15625Hz
    1/15625Hz = 0,000064 Sek.

    funktion:
    der timer wir alle 0,000064 Sek. um den wert eins erhöht (+1).
    bei "OCR1C = 15625;" bedeutet das 0,000064 Sek. * 15625 = 1,00 Sek.
    der timer springt ab 15625 auf 0 und dann wird die interrupt routine ausgelößt und so geht es weiter und weiter und weiter....

    liege ich soweit richtig mit meiner interpretation?!
    und wie um gottes willen lege ich jetzt diese interrupt routine an?!

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.190
    Also.
    In deiner ersten Zeile stellst Du den Prescaler ein und sagst dem Timer, das das TCNT Register bei einem Comparematch 0 werden soll.
    In der zweiten Zeile gibst Du an, das das Comparematchregister 1C einen Wert von 15625 haben soll.
    In der dritten Zeile weist Du dem OCR1A Register den Wert 0 zu, was aber eigentlich keinen Sinn macht.
    In der vierten Zeile gibst Du den Interrupt bei Comparematch des 1A Comparematch frei.

    Nimm Zeile 2 raus und weise in Zeile 3 dem OCR1A den Wert 15625 zu.

    Das Ganze funktioniert nun so 16MHz/1024/15625 = 1Hz. Das passt dann schon mal.

    Das anlegen eines Interrupts ist von deinem Compiler abhängig.
    Soweit ich weiß muss man bei AVR GCC die interrupt.h Library includen #include <avr/interrupt.h> und kann dann mit der Funktion.
    ISR (Vektorname)
    {
    }

    Nach der Initialisierung und vor der Hauptschleife deines Programmes musst Du mit sei(); noch global die Interrupts frei geben.
    Sonst wird niemals ein Interrupt ausgeführt.

    Den Funktionsaufruf der Interruptroutine starten.
    Da gibts aber so viele Tutorials dafür, guck da einfach mal nach.

    In diesem Interrupt würde ich nur ein Flag setzen ( Bit Variable ) und im Hauptprogramm dieses Flag wieder löschen, sobald es verarbeiet wurde.
    Dadurch bleibt die Interruptroutine sehr kurz, was ja auch erwünscht ist.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von wkrug Beitrag anzeigen
    In diesem Interrupt würde ich nur ein Flag setzen ( Bit Variable ) und im Hauptprogramm dieses Flag wieder löschen, sobald es verarbeiet wurde.
    Wozu dann überhaupt eine ISR? Dann kannst du ja gleich das Interrupt Status Bit in der Mainloop pollen.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    04.06.2012
    Beiträge
    14
    auch nach vielen versuchen und änderungen will der code nicht. jetzt wird zu langsam gezählt

    #include <avr/interrupt.h>
    ...
    unsigned long int timerLauf= 0;
    ...
    int main (void)
    {
    TCCR1B |= (1<<CS02) | (1<<CS00);
    OCR1A = 15625;
    TIMSK |= (1<<OCIE1A);
    sei();
    ...
    }

    ISR (TIMER1_COMPA_vect)
    {
    timerLauf++;
    }
    was mache ich nur falsch?
    Geändert von tom77? (10.06.2012 um 14:37 Uhr)

  6. #6
    Erfahrener Benutzer Roboter-Spezialist Avatar von robo_tom_24
    Registriert seit
    04.02.2012
    Ort
    Burgenland, Österreich
    Beiträge
    485
    Hast du den Quarz richtig eingestellt?

    Setzt du den Timer auch wieder zurück nachdem der ISR aufgerufen wurde?
    Du musst noch ins Register TCCR1B das Bit CTC aktivieren -> Clear Timer on Compare Match -> Rücksetzen nach Abgleich

    Wahrscheinlich zählt der Timer 1 mal richtig und dann zählt er immer die vollen 65535 Schritte durch
    Also ca so:
    Timerwert: 0...........15625 *INTERRUPT* ..............65535 - 0 ........ 15625 *INTERRUPT* ...........65535 - 0 .........15625 *INTERRUPT*.... ->
    Zeiterlauf: 0s.................1s............................. ...................................4,2s........... ............................................8,4s.. ................. ->
    Variable:...0....................1................ .................................................. 2................................................. ...........3.................... ->

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    04.06.2012
    Beiträge
    14
    wenn ich das CTC aktiviere lässt sich der code nicht kompilieren

    TCCR1B |= (1<<CTC) | (1<<CS02) | (1<<CS00);
    error: 'CTC' undeclared (first use in this function)

    achja: quarz ist richtig eingestellt (getestet mit _delay_ms(xx) -> funktioniert exakt, auch gemessen mit dem oszi)

    Wie genau meinst du das?
    Setzt du den Timer auch wieder zurück nachdem der ISR aufgerufen wurde?
    Geändert von tom77? (10.06.2012 um 18:50 Uhr)

  8. #8
    Hi
    du machst den Fehler das du Timer1 mit parameter von Timer0 lädst
    so gehts - nur Quartz anpassen
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #define F_CPU 5120000
    #include <util/delay.h>
    #include <avr/pgmspace.h>
    #include <stdio.h>
    #include <inttypes.h>

    ISR(TIMER1_COMPA_vect)
    {
    PORTA ^= (1<<PA1);
    }

    int main(void)
    {
    TCCR1B |= (1<<WGM12)| (1<<CS12) | (1<<CS10);
    OCR1A = 5000;
    TIMSK |= (1 << TOIE1);
    TIMSK |= (1<<OCIE1A);
    sei();

    while(1);
    }

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    04.06.2012
    Beiträge
    14
    danke. inzwischen habe ich aber schon die lösung für mein problem gefunden.

  10. #10
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    inzwischen habe ich aber schon die lösung für mein problem gefunden.
    Dann schreib das doch und zeig uns noch deine Lösung. Danke.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Ähnliche Themen

  1. Timer beim atmega8
    Von MrTaco im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 19.05.2010, 14:28
  2. ausschaltverzögerung beim einschalten (timer)
    Von Warloxx im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 03.09.2009, 18:55
  3. Timer => Fehlermeldungen beim compilieren
    Von The Man im Forum Assembler-Programmierung
    Antworten: 5
    Letzter Beitrag: 14.02.2007, 10:07
  4. Timer/Counter0 beim Butterfly
    Von Heiko R. im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 09.11.2005, 17:55
  5. Timer beim Mega16
    Von maw_hn im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 22.08.2005, 09:03

Stichworte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress