cześć,
od kilku miesięcy robie z kumplem skaner 3D. Wszystko już mamy, jednak okazało się, że silnik krokowy, który używamy ma za małą rozdzielczość i trzeba zrobić sterowanie przez mikrokroki. Od piątku siedze nad datasheetem, tutorialami etc. i nic nie wychodzi (przerwanie SIG_OVERFLOW0 nie jest wywoływane). Postanowiłem wgrać do procesora przykład z avr.elektroda.eu do obsługi timer0 i problem jest taki sam
Silniczek jest sterowany przez portC, jtag wyłączyłem. Kod kompiluje przez avr-g++ w linuksie. Co może być źle?
Kod programu:
Obsługę przerwań włączam, preskaler jest ustawiony, kod do przerwania też jest. Próbowałem też zmienić SIG_OVERFLOW0 na SIG_OUTPUT_COMPARE0 (tak na jakimś forum znalazłem) ale nic nie dało
od kilku miesięcy robie z kumplem skaner 3D. Wszystko już mamy, jednak okazało się, że silnik krokowy, który używamy ma za małą rozdzielczość i trzeba zrobić sterowanie przez mikrokroki. Od piątku siedze nad datasheetem, tutorialami etc. i nic nie wychodzi (przerwanie SIG_OVERFLOW0 nie jest wywoływane). Postanowiłem wgrać do procesora przykład z avr.elektroda.eu do obsługi timer0 i problem jest taki sam
Kod programu:
// Testowanie timera 0 (przerwania)
#include <avr/io.h> // dostęp do rejestrów
#include <avr/interrupt.h> // funkcje sei(), cli()
#include <avr/signal.h> // definicje SIGNAL, INTERRUPT
#define T0_INIT 256-250
#define tbi(PORT,BIT) PORT^=_BV(BIT)
// przełącza stan BITu w PORTcie na przeciwny 1->0 ; 0->1
//unsigned char overflow;
volatile uint8_t overflow;
// |
// -- volatile jest konieczne ze względu na sprawdzanie
// zmiennej overflow poza procedurą obsługi przerwania
SIGNAL (SIG_OVERFLOW0)
{
TCNT0 = T0_INIT; // przeładuj timer 0
if (overflow>0)
overflow--; // dekrementuj
//tbi(PORTD,PD5); // przełącz stan LED na PB1
}
int main(void)
{
DDRC = 0xFF; // wszystkie linie PORTD jako wyjścia
// PORTC = 0xFF; // wygaś diody LED
TIMSK = _BV(TOIE0); // włącz obsługę przerwań T/C0
TCNT0 = T0_INIT; // wartość początkowa T/C0
TCCR0 = _BV(CS00)|_BV(CS02); // preskaler 1024
sei(); // włącz obsługę przerwań
while(1) // pętla nieskończona
{
// cbi(PORTD,PD4); // zapal LED na PD4
PORTC = 1 << 1;
overflow=4; // inicjuj zmienną overflow
while(overflow); // zmienna overflow jest
// dekrementowana w przerwaniu
//sbi(PORTD,PD4); // zgaś LED na PD4
PORTC = 1 << 3;
overflow=16; // inicjuj zmienną overflow
while(overflow); // zmienna overflow jest
// dekrementowana w przerwaniu
}
}
Obsługę przerwań włączam, preskaler jest ustawiony, kod do przerwania też jest. Próbowałem też zmienić SIG_OVERFLOW0 na SIG_OUTPUT_COMPARE0 (tak na jakimś forum znalazłem) ale nic nie dało
