Forum: Compiler & IDEs Overflow-Routine


von Patrick Weber (Gast)


Lesenswert?

Hallo,

ich habe bei einen 8515 den 8-bit Counter realisiert. Er zählt auch,
doch nun möchte ich, wenn er überläuft, das die Overflowroutine
aufgerufen wird. Dies macht er auch, so wie mir das das AVR Studio
anzeigt. Doch den Coder darin steht wird nicht ausgeführt.

Kurzbeschreibung: Counter läuft über => Overflow Routine soll eine
Variable um 1 nach oben zählen und den Wert auf den LEDs des STK500
ausgeben!

Code:

#include <io.h>
#include <sig-avr.h>
#include <interrupt.h>
#include <math.h>

unsigned char wert_r, wert_l, wert_h, overflow_r=0x00;
   /*8-bit Variablenn*/
long double  faktor = 0.44753086, schlupf_r;
/*16-bit Gleitkomma Variablen*/


SIGNAL(SIG_INTERRUPT0)                  /*Switch 2: Start 8-bit
Counter*/
{

wert_r=inp(TCNT0);                        /*Wert des Counter
auslesen*/
outp(~wert_r, PORTB);                     /*Den Wert auf den LEDs
ausgeben*/

outp(0x00, TCNT0);                      /*8-bit Counter
zurücksetzen/nullen*/
cbi(TIFR, TOV0);                        /*Overflow-Bit zurücksetzen*/
outp((1<<CS00), TCCR0);                 /*Counter-Start mit CLK*/
/*overflow_r=2;*/
}

SIGNAL (SIG_OVERFLOW0)                  /*Wenn das Overflowbit gesetzt
wird
                                        startet diese Routine und zählt
die
                                        Variable overflow_r um 1
hoch*/
{
overflow_r++;                           /*Overflow um 1 hochzählen*/
outp(~overflow_r, PORTB);               /*Wert auf den LEDs ausgeben*/
}

SIGNAL(SIG_INTERRUPT1)                  /*Switch 3: Start 16-bit
Counter*/
{
wert_h=inp(TCNT1L);                     /*Wert des Counters auslesen*/
outp(~wert_h, PORTB);                   /*Den Wert auf den LEDs
ausgeben*/

outp(0x00, TCNT1H);                     /*High-Counter
zurücksetzen/nullen*/
outp(0x00, TCNT1L);                     /*Low-Counter
zurückstellen/nullen*/
cbi(TIFR, TOV1);                        /*Overflow-Bit zurücksetzen*/
outp((1<<CS10),TCCR1B);                 /*Counter-Start mit CLK*/
}

int main(void)
{
outp(0x00, DDRD);                       /*Port D als Eingänge
schalten*/
outp(0xFF, DDRB);                       /*Port B als Ausgabe
(LEDs)schalten*/

outp(0x02, TIMSK);                      /*8-bit: Overflow Interrupt
aktivieren*/
outp((1<<INT0)|(1<<INT1), GIMSK);       /*Interrupteinstellungen*/
sei();                                  /*Interrupts einschalten*/

/*schlupf_r = 1-faktor*wert_r/wert_h;*/

for(;;)                                 /*Endlosschleife*/
{
}
}


Vielleicht kann mir jemand nen Tipp geben!

Vielen Dank schon mal im Voraus!


MfG Patrick Weber

von Joerg Wunsch (Gast)


Lesenswert?

FAQ #1...  Lies doch bitte erstmal die FAQ.

(WinAVR -> docs -> avr-libc docs)

von Patrick Weber (Gast)


Lesenswert?

ok, ich hatte das Programm nicht installiert und deshalb auch nicht
diese FAQ... Aber nun gut, nun habe ich die Variable folgendermassen
deklariert: volatile unsigned char overflow_r=0;
Aber es passiert dennoch nichts, also keine LED leuchten auf, auch wenn
ich die Variable zB mit dem Wert 3 belege...

Hat jemand ne Idee?

regards patrick

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.