Program po naciśnięciu przycisku ma zmieniać stan diody na przeciwny. Na logikę wydaje się dobry. Ale w praktyce to nie działa. Mógłby ktoś napisać dlaczego?
Po usunięciu tego fragmentu:
Gdy przycisk jest naciśnięty dioda mruga cały czas w rytm owych 30 ms. Nie jestem w stanie zrozumieć dlaczego.
Po usunięciu tego fragmentu:
_delay_ms(30);
if (bit_is_set(PINB, 2))
Gdy przycisk jest naciśnięty dioda mruga cały czas w rytm owych 30 ms. Nie jestem w stanie zrozumieć dlaczego.
// główny moduł projektu
#define _MAIN_MOD_ 1
#define __AVR_ATmega32__
#define DIODE PA1
//włączenie diody
#define DIODE_OFF (PORTA &=~_BV(DIODE))
//wyłączenie diody
#define DIODE_ON (PORTA |=_BV(DIODE))
//przełączenie diody na stan przeciwny
#define DIODE_XOR (PORTA ^=_BV(DIODE))
//taktowanie uC
#define F_CPU 16E6
// pliki dołączone ( include ) :
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB=0x00; // port B jest portem wejściowym
PORTB=0xff;
DDRA=0xff; //port A jest portem wejściowym
PORTA=0x00;
volatile unsigned char i; // flaga określająca poprzedni stan diody
DIODE_ON; //wstępne włączenie diody
while (1)
{
if (bit_is_clear(PINB, 2) && (i==0))
{
_delay_ms(30);
if (bit_is_clear(PINB, 2))
{
DIODE_XOR;
i=1;
}
}
if (bit_is_set(PINB,2) && (i=1));
{
//--------------------------------------------------------------------
_delay_ms(30);
if (bit_is_set(PINB, 2))
//--------------------------------------------------------------------
{
i=0;
}
}
}
}