So, da bin ich wieder.
Habe jetzt auch meine ersten Erfolge mit dem Timer, aber auch meine ersten Unverständlichkeiten.
Und zwar lasse ich mir den Wert des Timers und die Variable, die anzeigt wie oft der Timer schon übergelaufen ist per UART und HyperTerminal anzeigen.
Aber dort sehe ich, das der Timer seinen Überlauf immer bei 0 hat. Also der Zähler fängt bei Null an und zählt bis 32535, dann springt er nach -32536 und zählt bis Null, bei Null wird dann der Interrupt ausgelöst.
Egal was für einen Variablentyp ich auswähle, ich bekomme eine negativen Wert, das kann ja eigentlich nicht stimmen. Habe jetzt den uint16_t.
Kann mir einer sagen, ob das so richtig ist, oder ob ich was falsch eingestellt habe.
Ich benutze einen ATMega32 und den Timer1 mit 16Bit.
Mein Code:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
void uart_init (void);
int uart_putchar(char c, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM( uart_putchar, NULL, _FDEV_SETUP_WRITE );
volatile uint16_t x=0;
int main (void)
{
uint16_t n=0;
stdout = &mystdout;
uart_init();
sei();
TCCR1B |= (1<<CS12)|(0<<CS11)|(1<<CS10); // Prescaler 1024
TIMSK |= (1<<TOIE1); // Interrupt bei Overflow
while(1)
{
n=TCNT1;
printf("Over: %d",x);
printf(" Counter: %d\n",n);
}
}
ISR(TIMER1_OVF_vect) //Interrupt bei Overflow Timer1
{
x++;
}
void uart_init (void)
{
/* USART-Init 19200 Baud bei 16MHz für Mega32 */
UCSRB |= ( 1 << TXEN ); // UART TX einschalten
UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 ); // Asynchron 8N1
UBRRH = 0;
UBRRL = 51;
}
int uart_putchar( char c, FILE *stream ) // Funktion für printf()
{
if( c == '\n' )
uart_putchar( '\r', stream );
loop_until_bit_is_set( UCSRA, UDRE );
UDR = c;
return 0;
}
Lesezeichen