Okey, stimmt. Habe ich übersehen. Aber wenn ich den ersten Sendebefehl rausnehme geht es auch nicht.
Hier ist nochmal die main.c
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <avr/delay.h>
#include "usart.c"
#ifndef F_CPU
#define F_CPU 16000000L // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden!
#endif
volatile int32_t t,zahl;
int main( void )
{
TCCR0 |= (1 << CS00) | (1 << CS01 ) ; // Timer0 initialisierung
TCCR0 &= ~(1 <<CS02 ); // Vorteiler ist 64
TIMSK |= (1<<TOIE0); // Interrupt aktivieren
init_USART();
sendUSART("test2 \r\n");
_delay_ms(1000);
sei();
sendUSART("test3 \r \n");
_delay_ms(1000);
while( 1 )
{ // Endlosschleife
sendUSART("test4 \r \n");
_delay_ms(1000);
}
return 0; //wird nie erreicht
}
ISR(TIMER0_OVF_vect)
{
sendUSART("interrupt");
}
und die usart.c
Code:
/*### Senden per USART - RS232-Kommunikation ###*/
/*Zum senden von Zeichen im Hauptprogramm entweder
char irgendwas[] = "meintext";
sendUSART(irgendwas);
oder direkt
sendUSART("meinText");
verwenden.*/
void init_USART(void)
{
UCSRB |= (1<<TXEN); //UART TX (Transmit - senden) einschalten
UCSRC |= (1<<URSEL)|(3<<UCSZ0); //Modus Asynchron 8N1 (8 Datenbits, No Parity, 1 Stopbit)
UBRRH = 0; //Highbyte ist 0
UBRRL = 103; //Lowbyte ist 103 (dezimal) -> (Frequenz_in_Hz / (Baudrate * 16)) - 1 <- Quarfrequenz = 16*1000*1000 Hz!!!!
}
void sendchar(unsigned char c)
{
while(!(UCSRA & (1<<UDRE))) //Warten, bis Senden möglich ist
{
}
UDR = c; //schreibt das Zeichen aus 'c' auf die Schnittstelle
return 0;
}
void sendUSART(char *s) //*s funktiniert wie eine Art Array - auch bei einem String werden die Zeichen (char) einzeln ausgelesen - und hier dann auf die Sendeschnittstelle übertragen
{
while(*s)
{
sendchar(*s);
s++;
}
}
Die UART routinen habe ich aus dem Wiki, und ohne Interrupt ging es bisher immer. Deswegen dachte ich da gibt es kein Problem. Aber mit dem jetzigen code bekomm ich im HyperTerminal nur "test2" fortlaufend angezeigt.
Gruß
elayne
[/code]
Lesezeichen