Atmega644 Timer0 - Falscher Interrupt?

OP #2044208
Lesenswert?
• ▲
▼
Hi

Ich quäle mich gerade mit dem Mega644 ab.

Folgender Code verursacht einen dauernden Reset:
1
void display_init(void)
2
{
3
    //Ports auf Ausgänge setzen
4
    SEG_DRIVER_DDR = CHAR_DRIVER_DDR = 0xFF;
5
    //Prescaler setzen
6
    TCCR0B |= PRESCALER_VALUE;
7
    //Overflow-Interrupt aktivieren
8
    TIMSK0 |= (1 << TOIE0); 
9
    //Globale Interrupts aktivieren
10
    sei();
11
}
12
ISR (TIMER0_OVF_vect)
13
{
14
    CHAR_DRIVER_PORT = ~(1 << bufferpos);
15
    SEG_DRIVER_PORT = buffer[++bufferpos];
16
    if(bufferpos == 7)
17
        bufferpos = 0;
18
}

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.
Gast #2044296
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 ?
OP #2044312
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.