- 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
    so. nach einigen tests von beiden beschriebenen beiträgen muss ich leider wider einen misserfolg vermelden. es will und will nicht .

  2. #2
    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

  3. #3
    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)

  4. #4
    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

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Nachtrag: Ich habe gerade das Register OCR1A nachgeschlagen. Das ist ja der Compare-Vergleichswert. Da reicht es, wenn er einmal gesetzt wird. In der ISR kannst du ihn weglasen.

    Die Initialisierung des Timers habe ich nicht geprüft. Ich hoffe die Bits stimmen alle, und auch der Interrupt wird richtig aktiviert. Wenn es immer noch nicht läuft, würde ich eine LED anschalten, wenn die Interrupt-Routine ausgeführt wird. (Vor dem sei natürlich ausschalten)

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    04.06.2012
    Beiträge
    14
    hmm.. danke dir erst mal für deine mühen. code hab ich versucht --> erfolglos

    zum datentyp. in der praxis zählt er höher als bis 100 (100 war nur zur vereinfachten darstellung im forum - aber auch mit 100 funktioniert es nicht)

    led werde ich testen.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    04.06.2012
    Beiträge
    14
    led wird nicht angesteuert - ergo wird die routine gar nicht angesprochen. aber warum ?

  8. #8
    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.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    04.06.2012
    Beiträge
    14
    ich danke euch allen für die posts. werde mich wohl selbst etwas mehr einlesen müssen und hoffen dass ich etwas mehr finde.

Ä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