mikrocontroller.net

Forum: Compiler & IDEs Atmega644 Timer0 - Falscher Interrupt?


Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich quäle mich gerade mit dem Mega644 ab.

Folgender Code verursacht einen dauernden Reset:
void display_init(void)
{
    //Ports auf Ausgänge setzen
    SEG_DRIVER_DDR = CHAR_DRIVER_DDR = 0xFF;
    //Prescaler setzen
    TCCR0B |= PRESCALER_VALUE;
    //Overflow-Interrupt aktivieren
    TIMSK0 |= (1 << TOIE0); 
    //Globale Interrupts aktivieren
    sei();
}
ISR (TIMER0_OVF_vect)
{
    CHAR_DRIVER_PORT = ~(1 << bufferpos);
    SEG_DRIVER_PORT = buffer[++bufferpos];
    if(bufferpos == 7)
        bufferpos = 0;
}

Getestet hab ich das indem ich erst display_init aufgerufen habe, sofort 
darauf cli und später wieder sei und sofort beginnt das ganze von neuem.

Hab ich die Falschen Register genommen oder den flaschen Vektor? Der  µC 
muss ja ins "leere" springen, damit das passiert.

Autor: Reset (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Der  µC muss ja ins "leere" springen, damit das passiert.

Nicht unbedingt. Sollte die angeschlossene Schaltung z.B. einen 
Kurzschluss oder allgemein einen Überstrom produzieren, sägt sich der 
AVR selbst Vcc ab. Man könnte die Resetursache auszuwerten, ob es 
vielleicht ein Brownout ist.

>    SEG_DRIVER_PORT = buffer[++bufferpos];

uint8_t buffer[8]; ?
volatile uint8_t bufferpos; ?

>    CHAR_DRIVER_PORT = ~(1 << bufferpos);
>    SEG_DRIVER_PORT = buffer[++bufferpos];

PORTPINs != Reset-Pin ?

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Reset, es lag wirklich am Strom: Wenn ich buffer auf 0 lasse, wird 
nicht resettet.

Ich habe keine Treiberstufen, aber durch eine unachtsamkeit zu kleine 
Widerstände verwendet. Nun wollte ich einfach den Strom mit meinem 
Labornetzteil begrenzen, damit der AVR nicht kaputt gehen kann, aber der 
Schuss ist wohl nach hinten los gegangen.

Reset schrieb:
> volatile uint8_t bufferpos; ?

Danke, daran habe ich gar nicht gedacht.

Reset schrieb:
> . Man könnte die Resetursache auszuwerten, ob es
> vielleicht ein Brownout ist.

Wahrscheinlich, wenn ich nur 8 LEDs leuchten ließ brach die Spannung auf 
2.1V ein. Brown out wäre bei 1.8V gewesen. Da im Buffer aber mehr Leds 
an waren, war das wahrscheinlich die Ursache.

Nur mal so was nebenbei wie berechnet man wie weit die Spannung 
einbricht?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.