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:
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
Mein C-Prog (welches nicht Funktioniert)
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;
}
Wo ist der Fehler (im C-Code)??
ps.: Controller: ATmega32 bei 16MHz externem Takt
Lesezeichen