Sebastian132
23.07.2006, 12:33
Hallo! Ich komme hier gerade nicht weiter: Bin gerade dabei ein Programm zu erstellen, in dem u.A. alle 5 Sekunden ein Zeichen auf dem Display (Fleury Lib) ausgegeben werden soll. Nur irgendwie läuft der Timer und die dazugehörige ISR nicht so wie sie soll. Controller ist nen etwas betagtes Modell, der 90s8515, er läuft bei 4 MHz.
Folgendes Problem: Mit dem unten stehenden Code, gibt er etwa jede Sekunde ein Zeichen aus. Aber warum? 4.000.000 1/s /64 (Prescaler) macht nach meiner Ansicht immernoch 62500 1/s, bzw. alle 0,1µs einen Interrupt, warum er dann trotzdem nur jede Sekunde etwas ausgibt verstehe ich nicht. Ebenso tritt keine Änderung ein, wenn ich OCR1B irgendeinen Wert zuweise, immer die gleiche Geschwindigkeit. Nur wenn ich am Prescaler drehe, ändert sich was. Ich weiss immoment echt nicht weiter, auch wenn es bestimmt ein ganz blöder Fehler ist ;).
Hier mal ein Snippet:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include <avr/pgmspace.h>
#include "lcd.h"
#define F_CPU 4000000
#define CPU_CLK_64 (F_CPU/64)
#define TIMER_SECOND (CPU_CLK_64/2)
int main( void )
{
sei();
lcd_init(LCD_DISP_ON);
TCCR1B |= (1<<CS11)|(1<<CS10); // CPU_CLK/64
//OCR1B=TIMER_SECOND;
TIMSK |= (1<<OCIE1B);
for(;;)
{
}
}
ISR(TIMER1_COMPB_vect) //Interruptroutine
{
lcd_puts("a");
}
Folgendes Problem: Mit dem unten stehenden Code, gibt er etwa jede Sekunde ein Zeichen aus. Aber warum? 4.000.000 1/s /64 (Prescaler) macht nach meiner Ansicht immernoch 62500 1/s, bzw. alle 0,1µs einen Interrupt, warum er dann trotzdem nur jede Sekunde etwas ausgibt verstehe ich nicht. Ebenso tritt keine Änderung ein, wenn ich OCR1B irgendeinen Wert zuweise, immer die gleiche Geschwindigkeit. Nur wenn ich am Prescaler drehe, ändert sich was. Ich weiss immoment echt nicht weiter, auch wenn es bestimmt ein ganz blöder Fehler ist ;).
Hier mal ein Snippet:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include <avr/pgmspace.h>
#include "lcd.h"
#define F_CPU 4000000
#define CPU_CLK_64 (F_CPU/64)
#define TIMER_SECOND (CPU_CLK_64/2)
int main( void )
{
sei();
lcd_init(LCD_DISP_ON);
TCCR1B |= (1<<CS11)|(1<<CS10); // CPU_CLK/64
//OCR1B=TIMER_SECOND;
TIMSK |= (1<<OCIE1B);
for(;;)
{
}
}
ISR(TIMER1_COMPB_vect) //Interruptroutine
{
lcd_puts("a");
}