Witam,
Mam dziwny problem z przerwaniem zewnętrznym INT6 w mojej atmedze128. Napisałem taki oto banalny programik.
Według mnie ten program powinien działać tak, ze po pierwszej zmianie poziomu na INT6 dioda (PORTC0) będzie się palić zawsze. U mnie wygląda to w ten sposób, że na zboczu narastającym dioda się zapala a opadającym gaśnie. W programie zmieniałem też rejestr EICRB. Po ustawieniu na wyzwalanie zboczem narastającym układ zachowuje się jak powyżej. Przy wyzwalaniu zboczem opadającym dioda się nie zapala. W nocie katalogowej napisano, że to przerwanie wymaga obecności I/O clock ( przerwanie synchroniczne). Mój wewnętrzny kwarc to 1MHz. Układ wejściowy przedstawia rysunek
[img]
[/img]
R2 ma wartość 1k zamiast 10k oraz układ jest podłączony tylko do port INT.
Czy może być tak, że ten zegar jest za wolny aby wychwycić moment zmiany zbocza ?
Z góry dziękuje za pomoc.
Mam dziwny problem z przerwaniem zewnętrznym INT6 w mojej atmedze128. Napisałem taki oto banalny programik.
#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdint.h>
ISR(INT6_vect)
{
PORTC = 0x01;
}
main()
{
DDRC = 0x01;
EIMSK |= _BV(INT6);
EICRB |= _BV(ISC60); // dowolna zmiana poziomu
// EICRB |= _BV(ISC61);
sei();
while(1)
{}
}
Według mnie ten program powinien działać tak, ze po pierwszej zmianie poziomu na INT6 dioda (PORTC0) będzie się palić zawsze. U mnie wygląda to w ten sposób, że na zboczu narastającym dioda się zapala a opadającym gaśnie. W programie zmieniałem też rejestr EICRB. Po ustawieniu na wyzwalanie zboczem narastającym układ zachowuje się jak powyżej. Przy wyzwalaniu zboczem opadającym dioda się nie zapala. W nocie katalogowej napisano, że to przerwanie wymaga obecności I/O clock ( przerwanie synchroniczne). Mój wewnętrzny kwarc to 1MHz. Układ wejściowy przedstawia rysunek
[img]
R2 ma wartość 1k zamiast 10k oraz układ jest podłączony tylko do port INT.
Czy może być tak, że ten zegar jest za wolny aby wychwycić moment zmiany zbocza ?
Z góry dziękuje za pomoc.