- SF800 Solar Speicher Tutorial         
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
    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)

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von robo_tom_24
    Registriert seit
    04.02.2012
    Ort
    Burgenland, Österreich
    Beiträge
    485
    Ok...
    CTC heißt das der Timer nach dem Match - also der Übereinstimmung - zurückgesetzt wird

    Das kannst du aber auch händisch machen inem du in deiner ISR den Timer wieder auf 0 zurück setzt:
    Code:
    TCNT1=0; //Timer-Wert-Register auf 0 setzen

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.242
    Ohne CTC läuft der Timer nicht richtig.
    Das CTC bedeutet, das das TCNT1 Register bei einem Comparematch auf 0 gesetzt wird.
    Wenn das nicht eingestellt ist wird der Timer über den Overflow springen und dann erst wieder beim Zählerstand von 15625 wieder einen Interrupt auslösen.
    Das bedeutet der Interrupt wird nur alle ca 4 Sekunden angesprungen.
    Da gibt es mehrere Lösungen.
    Entweder du zählst bei einem aufgetretenen Comparematch Interrupt ( in diesem natürlich ) einfach die 15625 zum Comparematchwert dazu.
    OCR1A+=15625;
    Das bewirkt, das beim Zählerstand von 31250 wieder ein Interrupt ausgelöst wird.
    Keine Angst bei den Überläufen ( >65535 ) Werden die Überlaufenden Bits gekillt, weil das ja nur ein 16Bit Register ist.
    Oder du aktivierst das CTC Bit im Register, das anscheinend in der Library anders heisst, oder nicht definiert ist.
    Guck auch mal ins Datenblatt unter Timer 1 WGM10 bis WGM13 bzw. CTC1.

    Das mit dem TCNT1=0 würde ich nicht machen, weil dabei ein kompletter Zählersprung "vergessen" werden könnte und deine Uhr damit auf Dauer falsch geht.
    Das ist halt eine Sache wie lange deine Controller sich in anderen Interupts aufhält, wie lange diese Interrupts sind und welche Prescaler man benutzt.
    Geändert von wkrug (10.06.2012 um 21:13 Uhr)

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    04.06.2012
    Beiträge
    14
    danke für eure antworten. kann im moment leider nichts testen - werde den code aber noch versuchen und mich dann nochmals melden .

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    04.06.2012
    Beiträge
    14
    so. nach einigen tests von beiden beschriebenen beiträgen muss ich leider wider einen misserfolg vermelden. es will und will nicht .

  6. #6
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    35
    Beiträge
    3.501
    Blog-Einträge
    9
    Wie macht sich den der Fehler bemerkbar?
    Wird die Timer-ISR nicht ausgeführt oder was?
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    04.06.2012
    Beiträge
    14
    Weder ein syntaktisch noch ein semantisch Fehler wird vom Compiler angezeigt, folgedessen muss es sich um einen Logikfehler handeln.
    Bemerkbar macht sich das dadurch, dass der Couter jetzt gar nicht mehr hochzählt.

    folgenden code verwende ich im moment:
    //Variablen initialisierung
    long int Laufvariable = 0;

    //HAUPTPROGRAMM
    int main (void)
    {
    //Timer1 (16Bit) Initialisieren
    TCCR1A |= (1<<CS02) | (1<<CS00) | (1<<WGM10);
    OCR1A = 15625;
    TIMSK |= (1<<OCIE1A);
    sei();
    ...
    ...
    //Ausgabe der Variablen "Laufvariable" auf dem Display
    //(Displayfehler habe ich 100%ig ausgeschlossen)
    ...
    ...
    return 0;
    }

    //INTERRUPT von Timer1 (16Bit)
    ISR (TIMER1_COMPA_vect)
    {
    if (++Laufvariable > 100)
    Laufvariable = 0;
    }
    laut meinem verständnis sollte der code jede sekunde unterbrechen und den zähler "Laufvariable" durch die isr um eins erhöhen. ist der zähler über 100 gekommen, so wird er reseted.
    Geändert von tom77? (15.06.2012 um 14:06 Uhr)

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Hallo,

    drei Dinge fallen mir spontan auf:

    - die Laufvariable muss volatile sein (volatile long int Laufvariable = 0 Warum ist die überhaupt Long? Wenn die nur bis 100 zählt reicht ein Smallint bis 127 oder zumindest ein Byte. Controller-Speicher ist kostbar!
    - in die ISR müsste noch ein OCR1A = 15625; oder?
    - ist die Display-Ausgabe in der Main auch in einer Endlosschleife?

    Viele Grüße
    Andreas

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von tom77? Beitrag anzeigen
    Weder ein syntaktisch noch ein semantisch Fehler wird vom Compiler angezeigt
    Ist auch ein wildes Durcheinander.

    Im letzten geposteten Code:
    Code:
    //Timer1 (16Bit) Initialisieren
    TCCR1A |= (1<<CS02) | (1<<CS00) | (1<<WGM10);
    OCR1A = 15625;
    TIMSK |= (1<<OCIE1A);
    sei();
    TCCR1A enthält keine Prescalerbits, ein paar Posts vorher war das noch ein bisserl besser:
    Code:
    TCCR1B |= (1<<CS02) | (1<<CS00);
    Lies das Datenblatt statt programming-by-guessing.
    Prescalerbits und auch einige andere Bitnamen haben bei Atmel die Timernummer im Namen, ein CS02 ist ein Timer0-Bit, hat hier nur keinen Einfluss, da das Register sowieso das Falsche ist und die Bits für Timer0 und Timer1 ander gleichen Position stehen.
    Außerdem ver-odert man bei der Initialisierung nicht:
    Code:
    TCCR1A |= ...
    sondern weist direkt zu, damit die Register einen definierten Zustand erhalten.

    Mach das alles richtig und es wird gehen.

Ä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
  •  

12V Akku bauen