So, nachdem ich im Dezember schonmal versucht habe, den Timer in C zu verwendne, habe ich micht heute mal wieder drann gesetzt und es erneut versucht.
Zunächst habe ich ein Einfaches programm in Bascom Basic geschrieben, welchens mithilfe des Timers eine LED blinken lässt.
Funktionierte.
Dann habe ich die binärdatei Disassembliert, und aus dem Code eine einfachses Assemblyprogramm geschrieben, welches ebenfalls LEDs blinken lässt.
Funktioniert.
Da ich nun wusste, welche daten ich in Welche Register packen muss, habe ich das ASM-programm in C übersetzt.
Funktioniert NICHT
mein asm-prog:
Mein C-Prog (welches nicht Funktioniert)Code:.include "m32def.inc" ldi r16, LOW(RAMEND) out SPL, r16 ldi r16, HIGH(RAMEND) out SPH, r16 ; timerinterrupt erstellen clr r16 out TCCR1A, r16 ldi r16, 3 out TCCR1B, r16 in r16, TIMSK ori r16, 4 out TIMSK, r16 sei ; Port C als ausgabe deklarieren ser r16 out DDRC, r16 ; r17 ist jetzt der Zähler clr r17 ; endless loop loop: rjmp loop TIMER1_OVF: inc r17 ; wenn 0 (0xFF + 1) brne intend in r16, PORTC com r16 out PORTC, r16 intend: reti
Wo ist der Fehler (im C-Code)??Code:#include <avr/io.h> #include <avr/interrupt.h> // Prototypen void timer1_init(); int main() { DDRC = 0xFF;//An C liegen die LEDs // Timer1 initialisieren timer1_init(); // Interrupts aktivieren sei(); while(1); return 0; } void timer1_init() { TCCR1A = 0; TCCR1B = 3; //OCR1A = (unsigned short) ((unsigned long) (16 MHZ) / IRQS_PER_SECOND - 1); TIMSK |= 4; } int SIGNAL (TIMER1_OVF) { static uint8_t counter = 0; counter++; if(!counter) PORTC = ~PORTC; return 0; }
ps.: Controller: ATmega32 bei 16MHz externem Takt







Zitieren

Lesezeichen