Używam PWM do generowania różnych współ. wypełnienia dla diody RGB.
Jeden przycisk jest odpowiedzialny za zmienianie trybów, jest on podłączony do INT0 (pin pracuje jako wej. z podciąganiem do plusa, a przycisk podpięty do masy).
W skrócie, gdy zostaje naciśniety przycisk program wchodzi do obsługi przerwania, inkrementuje zmienna m. Gdy wychodzi z obsługi w głównej pętli sprawdzana jest zmienna m i ustawiany odpowiedni tryb (kolor).
Problem jest taki, że czasem (b. rzadko) przeskoczy mi o 2 tryby. W ubsłudze przerwania starałem się wyeliminować drgania styków, nawet opóźnienie 1sec w obsłudze nie pomagało....
Jeden przycisk jest odpowiedzialny za zmienianie trybów, jest on podłączony do INT0 (pin pracuje jako wej. z podciąganiem do plusa, a przycisk podpięty do masy).
W skrócie, gdy zostaje naciśniety przycisk program wchodzi do obsługi przerwania, inkrementuje zmienna m. Gdy wychodzi z obsługi w głównej pętli sprawdzana jest zmienna m i ustawiany odpowiedni tryb (kolor).
Problem jest taki, że czasem (b. rzadko) przeskoczy mi o 2 tryby. W ubsłudze przerwania starałem się wyeliminować drgania styków, nawet opóźnienie 1sec w obsłudze nie pomagało....
#define F_CPU 4000000UL
#include "avr/io.h"
#include "avr/interrupt.h"
#include "util/delay.h"
#include "stdlib.h"
#define red OCR0
#define green OCR1A
#define blue OCR2
uint8_t m; // m-tryb pracy
//inicjacja
void init(void){
DDRD |= _BV(PD5) | _BV(PD7); //piny PD5 i PD7 wyjściami
//red
DDRB = (1<<PORTB3);
TCCR0 = (1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<COM00)|(1<<CS01);
//green
TCCR1A = (1<<COM1A1)|(1<<COM1A0)|(1<<WGM10);
TCCR1B = (1<<WGM12)|(1<<CS10);
//blue
TCCR2 = (1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<COM00)|(1<<CS01);
}
//inicjacja przycisku
void init_klaw(void){
DDRD &= ~_BV(PD2); //pin PD2 wejściem
PORTD |= _BV(PD2); //pin PD2 podciągnięty do plusa
//przerwanie zew INT0 (reaguje na zbocze opadajace)
MCUCR = (MCUCR | 0b00000010);
MCUCR = (MCUCR & 0b11111110);
GIFR = (1<<INTF0);
GICR = (1<<INT0);
}
// Przerwanie od klawiatury
SIGNAL(SIG_INTERRUPT0){
m++;
_delay_ms(100);
while(!(PIND & 0x04)) {}
_delay_ms(100);
init_klaw();
}
int main(void){
init_klaw();
init();
sei();
m=0;
while(1){
if(m==0)
czerwony(0);
if(m==1)
zolty(0);
if(m==2)
zielony(0);
if(m==3)
blekitny(0);
if(m==4)
niebieski(0);
if(m==5)
fioletowy(0);
if(m==6)
bialy(0);
if(m>6)
m=0;
}
}