nidokońca jasne działanie prerwania od przechwycenia

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
nasiono
-
Posty: 46
Rejestracja: 29 lip 2005, 0:01

nidokońca jasne działanie prerwania od przechwycenia

Post autor: nasiono » 09 sty 2006, 10:01

Witam.
Niedokońca rozumim działanie tego przerwania napisałem sobie taki prosty program który
(wiedząc, że licznik liczy od wartości TCNT1=.... do 65535) wyświetla aktualny stan ICR1 podczas przechwycenia,no i zdziwiłem sie nie miło kiedy okazało się ,że licznik zamiast pokazywać wartość od 0 do (65535-34286=39714) wyświetla czasem ponad 10 000 . Barzo prosze o jakąs pomoc a najlepiej jakąś przykłądową działąjącą realizacje takiego przerwania.

Program:

#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#include "lcd.h"
#include "definicje.h"


int main(void)
{
LCD_init();

TCCR1B=4;
TCNT1=34286;
TIMSK=(1<<TICIE1)|(1<<TOIE1);
sei();
for(;;)
{

piszliczba_float_xy(o,10,0);
piszliczba_float_xy(OBR,10,1);
}}

/////////////////////////////////////////////////////////////
SIGNAL(SIG_INPUT_CAPTURE1)
{

o=ICR1-34286;
OBR=((ICR1-34286)*16.0f)/1000000.0f;//jle sekund od ostatniego impulsu
TCNT1=34286;

}
SIGNAL (SIG_OVERFLOW1) {TCNT1=34286;}

Awatar użytkownika
Koppel
Użytkownik
Posty: 500
Rejestracja: 24 lip 2005, 18:05
Lokalizacja: Gliwice

Post autor: Koppel » 09 sty 2006, 16:38

Czemu uważasz, że nie powinien pisać > 10 000 w tym programie? Dla mnie jest jak najbardziej w porządku.

Gdzie deklarowane są zmienne o i OBR? Powinny być typu volatile. Inaczej program ma prawo się sypać.

ODPOWIEDZ