Ahoj všem,
mam takový menší problém nejspíš s atomicitou.
Ale uvedu do problému, postavil jsem si z nudy takové blikátko, kde mam tři LED a jedno tlačítko. Smyslem je, že počítám stisky tlačítka a rozsvěcuji je podle toho jaký počet stisků odpovídá pro aktivaci jednotlivých LED diod. To vše funguje bez problému, nicméně jsem se rozhodl, že si LEDKy rozblikám a tam je problém, po stisku tlačítka a odpovídající hodnotě stisku se mi ten if nevykoná, nevím proč. Ke zpoždění používám funkci _delay_ms() z knihovny util/delay.h a celý ten kus kódu mam nacpaný v bloku atomic z knihovny util/atomic.h. Zpoždění mezi změnou stavu portu tvořím skrze tu fnci _delay_ms() a tak mne napadlo, jestli si to spolu rozumí dobře? Mne přijde že ne, a nevím proč. A nebo jestli mám špatně nastavený kompilátor avr-gcc? V současné době mám nastaven optimalizaci takto: Optimize (O1). Byl bych rád, kdyby mi někdo vysvětlil kde mam problém, popřípaděm jestli jsem udělal logickou chybu v kódu a přehlížím jí.
níže kód.
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
//#include <avr/interrupt.h>
#include <util/atomic.h>
#include "header_tiny.h"
volatile uint8_t stav;
volatile uint8_t i;
int main(void)
{
DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB4); //nastaveni vystupu pro jednotlive zateze
DDRB &= ~(1<<PB2); //nastaveni vstupu pro tlacitko
PORTB |= (1<<PB2);
while (1)
{
if((PINB&(1<<PB2)) == 0){
_delay_ms(120);
if((PINB&(1<<PB2)) == 0){
stav++;
if(stav == 1){
PORTB |= (1<<PB0);
}else if(stav == 2){
PORTB |= (1<<PB1);
}else if (stav == 3){
PORTB |= (1<<PB4);
}else if(stav == 4){
ATOMIC_BLOCK(ATOMIC_FORCEON){
PORTB |= (1<<PB0);
PORTB |= (1<<PB1);
PORTB |= (1<<PB4);
_delay_ms(500);
PORTB &= ~(1<<PB0);
PORTB &= ~(1<<PB1);
PORTB &= ~(1<<PB4);
_delay_ms(500);
}
}else if(stav == 5){
stav = 0;
}
}
}
}
return 0;
}