Forum: Compiler & IDEs Atmega644 Timer0 - Falscher Interrupt?


von Sam .. (sam1994)


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.

von Reset (Gast)


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 ?

von Sam .. (sam1994)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.