Hoi allemaal,
Wie kan helpen bij mijn probleempje?
Ik wil elke 10 ms de code in de main functie doorlopen.
Hiervoor gebruik ik Timer0.
Wanneer ik de code (00 optimalisatie) test met de AvrStudio4 simulator loopt het perfect.
Vervolgend compileer ik de code nogmaals maar nu met 0s optimalisatie en schuif de hex-file in de Mega.
Om de een of andere reden worden er geen Timer0 interrupts geactiveerd.
De code staat hieronder.
Wie weet raad?
#include "Init.h"
#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define DEBOUNCE_DELAY 0xF
#define COUNTS 144
#define STARTVALUE_T0 (256 - COUNTS)
void vInitTimer0(void);
unsigned char bToetsBuffer, bToets, bActie,bMainloopflag;
int iInterruptCount, iCount = 1;
void vInitTimer0(void){
TCCR0 = _BV(CS02); //prescaler 256 3,86MHz
TCNT0 = STARTVALUE_T0;
TIMSK = _BV(TOIE0);
}
ISR(TIMER0_OVF_vect){
TCNT0 = STARTVALUE_T0;
bMainloopflag = 1;
}
int main(void)
{
DDRB = 0xFF; //all bits port B output
vInitTimer0();
sei();
while(1){
while(!bMainloopflag){ //waiting for flag
PORTB |= _BV(2);
}
PORTB &= ~_BV(2);
bMainloopflag = 0;
bToets = (PINC & _BV(0));
if(bToets)
PORTB |= _BV(1);
else
PORTB &= ~_BV(1);
}
plantrekker
True story bro!
Zet bMainloopflag eens als volatile.
Dus:
volatile unsigned char bMainloopflag;
Daarmee maak je duidelijk aan de compiler dat de variabele kan veranderen door een interrupt en de waarde steeds uit de ram gelezen moet worden.
[Bericht gewijzigd door plantrekker op (47%)]
Hé, zou dat de grap zijn?
Klinkt heel logisch. Omdat de optimalisatie aan staat.
Ga ik proberen. t'Kan een paar daagjes duren, k'heb net m'n opstelling opgeruimd.
Hartelijk dank.
edit: Ja hoor, t'werkt perfect. En dan te bedenken dat ik een paar weken geleden het hoe en waarom van volatiles gelezen had. Grrr.....
[Bericht gewijzigd door drieske op (28%)]