Mam do zrobienia program o następującym działaniu: przerwaniem zewnętrznym (INT0) uruchamiam całą machinę - czas zaczyna być mierzony, kolejnym przerwaniem zewnętrznym (INT1) robię STOP, i w tym momencie wynik powinien być wyświetlony na wyświetlaczu LCD. Niestety jak chce odpalić program już na płytce to się nic kompletnie nie dzieje. Zapewne coś jest nie tak z przerwaniami. Poniżej zamieszczam kod.
#define F_CPU 1000000
//#include <avr/timer.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "char_code.h"
#include "LCD_lib.h"
//#include <stdlib.h>
volatile uint8_t licznik = 0; //inkremetuje sie jest przepelnienie licznika
volatile uint8_t mili_sek = 0;
volatile uint8_t setna_sek = 0;
volatile uint8_t dziesiata_sek = 0;
volatile uint8_t sekunda = 0;
volatile uint8_t dziesiatki_sek = 0;
volatile uint8_t flaga = 1;
volatile uint8_t ms = 0;
volatile uint8_t ss = 0;
volatile uint8_t da_s = 0;
volatile uint8_t s = 0;
volatile uint8_t di_s = 0;
SIGNAL (SIG_INTERRUPT0){
//timer0_start();
TCNT0 = 0; //bedzie liczyl od zera
TIMSK |= (1 << TOIE0); //aktywacja przerwan timerow
flaga = 1; //flaga sluzaca do wyswietlania wynikow
}
SIGNAL (SIG_INTERRUPT1){
TIMSK |= (0 << TOIE0); //wylaczenie przerwan od timerow
//timer0_stop();
ms = konwertuj(mili_sek);
ss = konwertuj(setna_sek);
da_s = konwertuj(dziesiata_sek);
s = konwertuj(sekunda);
di_s = konwertuj(dziesiatki_sek);
flaga = 0;
}
SIGNAL (SIG_OVERFLOW0) {
licznik = licznik+1;
if (licznik == 2) {
licznik = 0;
mili_sek = mili_sek+1;
if(mili_sek == 10) {
mili_sek = 0;
setna_sek = setna_sek+1;
if(setna_sek == 10) {
setna_sek = 0;
dziesiata_sek = dziesiata_sek+1;
if(dziesiata_sek == 10) {
dziesiata_sek = 0;
sekunda = sekunda+1;
if(sekunda == 10) {
sekunda = 0;
dziesiatki_sek = dziesiatki_sek+1;
}
}
}
}
}
TCNT0 = 0;
}
int main(void) {
DDRD = 0x00;
//timer0_source(TCCR0);
OCR0 = 250; //249; F9
TCCR0 = 10;// CS01 = 1; WGM01 = 1;WGM00 = 0;
//CS02 = 0;
//CS01 = 1;
//CS00 = 0;
TIMSK = 130;//OCIE0 = 1;
//TIMSK = _BV(TOIE0);
MCUCR = ((1<<ISC01)|(0<<ISC00));
MCUCR = ((1<<ISC11)|(0<<ISC10));
//GICR |= _BV(INT0)| _BV(INT1);
GICR |= ((1<<INT0)|(1<<INT1));
DDRD = 0x00;
sei();
while(!flaga) { //petla odpowiedzialna za wyswietlenie wyniku
LCD(di_s, 1, 0, 1);
LCD(s, 1, 0, 2);
LCD(kropka, 1, 0, 3);
LCD(da_s, 1, 0, 4);
LCD(ss, 1, 0, 5);
LCD(ms, 1, 0, 6);
}
}