Djävulsbesatt Timer0 ATmega168

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
wolie
Inlägg: 118
Blev medlem: 1 juli 2007, 11:07:08
Ort: Gbg

Djävulsbesatt Timer0 ATmega168

Inlägg av wolie »

Försöker porta lite djävulsbesatt C-kod:

Kod: Markera allt

/*Globals*/

unsigned char Timer, OverTime;
void init_timer0 (void)
{
TCCR0B = 0x00;
TCNT0 = 184;
bit_set(TIMSK0,TOIE0);
TCCR0B = 0x05;
}


ISR (TIMER0_OVF_vect)
{
TCNT0 = 184;
if (Timer != 0)
{ 
Timer--; 
} else { 
OverTime = 1;
bit_flip(PORTB,PB0);
Timer = 0;
}
So far so good, PB0 tänds.
MEEEEEN i main:

Kod: Markera allt

...
while (1)
{
  if (OverTime == 1) {
     break;
  }
_delay_ms(10);
}
...
Så hoppar den aldrig ur while-loopen. Har provat med olika typer av while och for loopar men resultatet är detsamma: Att OverTime blivit 1 ignoreras totalt.
Tankar på det? :(
sm5tfx
Inlägg: 114
Blev medlem: 20 juli 2011, 14:28:41
Ort: Gnällbältet

Re: Djävulsbesatt Timer0 ATmega168

Inlägg av sm5tfx »

Deklarera OverTime som volatile så att kompilatorn inte optimerar bort läsningarna i loopen.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Djävulsbesatt Timer0 ATmega168

Inlägg av Micke_s »

volatile är det nog du bör lägga till framför OverTime, annars så kommer/kan kompilatorn optimera lite till din nackdel.
Edit: var inte riktigt först.
wolie
Inlägg: 118
Blev medlem: 1 juli 2007, 11:07:08
Ort: Gbg

Re: Djävulsbesatt Timer0 ATmega168

Inlägg av wolie »

Jahh, just det. Tack! :)

Körde iofs. med -O0 men gcc envisas alltså med optimeringar i alla fall? :humm:
Användarvisningsbild
Icecap
Inlägg: 26654
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Djävulsbesatt Timer0 ATmega168

Inlägg av Icecap »

Nu tycker jag ju att sättet programmet är skrivit på är synnerligt fel men det kan ju bara vara en test-case och att det finns anledning att ha den struktur ändå, jag har dock svårt att förstå att det behövs.

Nåväl, kompilern kanske "anser" att det inte har med optimeringar att göra eller hur?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Djävulsbesatt Timer0 ATmega168

Inlägg av jesse »

Varför har du delay_ms(10) inuti while-loopen?
Det finns väl ingen anledning att inte kolla flaggan (OverTime) hela tiden?
wolie
Inlägg: 118
Blev medlem: 1 juli 2007, 11:07:08
Ort: Gbg

Re: Djävulsbesatt Timer0 ATmega168

Inlägg av wolie »

Precis som jesse och Icecap påpekar är koden jag tagit ur main bara tillfällig test-kod. Det ska inte se ut så alls.
Om någon har liknande problem rekommenderar jag http://en.wikipedia.org/wiki/Volatile_variable
Intressant är dock att om du kör gcc -O0 på 'without' exemplet på wikipediasidan så fungerar det utmärkt.
Skriv svar