Hallo Roboternetz-Forum!
Ich habe ein kleines Problem. Ich will mit dem ATmega328p eine kleine Messschaltung aufbauen, für welche ich eine Zeitmessung brauche. In diesem Fall habe ich den Timer 1 so eingestellt, dass er akke 10us einen Overflow-Interrupt verursacht. Die Variable, die ich in der Timer-ISR raufzählen lasse, habe ich zum testen mal auf einem I2C LCD Display ausgegeben. Das Problem hierbei: die Variable hat schon nach dem Wert (2^16)/2 einen Überlauf. Die ist aber als 'unsigned long int' deklariert, also eigendlich als 32-bit. Aber egal, was ich probiere, der Überlauf kommt immer viel zu früh, was mache ich hier falsch?
Hoffe, Ihr könnt mir helfen!
Code:#include <avr/io.h> #include <util/delay.h> #include <stdio.h> #include <stdlib.h> #include <avr/interrupt.h> #include "lcd.h" // Library for I2C LCD Display #define F_CPU 16000000UL #define TIMER1_PRELOAD -20 extern void lcd_backlight(char on); // not in lcd.h unsigned long int timer1_cnt = 0; char buffer_timer1_cnt[20]; // to buffer a variable for "itoa" int main (void) { // Initalize 16-bit Timer 1 Overflow-Interrupt TCCR1A = 0x00; TCCR1B = (0 << CS12) | (1 << CS11) | (0 << CS10); // set prescaler to 8 --> Timer = 8 / 16MHz = 0.5us --> preload = -20 TCNT1 = TIMER1_PRELOAD; TIMSK1 = (1<<TOIE1); // enable timer 1 overflow interrupt sei(); // (set enable interrupt) enable all interrupts lcd_init(LCD_ON_DISPLAY); lcd_backlight(1); while(1) { lcd_clrscr(); lcd_gotoxy(0, 0); // first parameter = column, second parameter = line itoa(timer1_cnt, buffer_timer1_cnt, 10); // convert integer to string lcd_puts(buffer_timer1_cnt); // write a string to I2C-LCD Display _delay_ms(10); } // while (1) } // int main (void) ISR (TIMER1_OVF_vect) { // 0.01ms clk TCNT1 = TIMER1_PRELOAD; // preload timer cnt register timer1_cnt++; } // ISR (TIMER1_OVF_vect)







Zitieren

Lesezeichen