Datum:
Hi, nachdem sich nun das Problem mit den Interrupts gelöst hat, macht der USART nun nicht das, was er soll. ICh möcht ezu beginn nur mal alle x-sek. ein Zeichen ausgeben. Leider kommt aber am Terminal nichts, bzw. nur ab un dzu fehlerhafte zeichen an. Auf dem Oszi betrachtet, werden aber richtige Zeichen mit der korrekten Baudrate verschickt. Jetzt wird der geneigte Btrachter sagen, dass die serielle Schnittstelle defekt wäre, ist sie aber nicht. getestet. Vielleicht ist es wieder eine dieser kleinigkeiten, über die ich immer stolpere. Den Code habe ich nochmal gepostet. Vielleicht hat jemand ja Anregungen oder tips ?
//uart0.c
#include <avr/io.h>
#include <avr/interrupt.h>
#define myBRR0 51 // BAUDRATE 9600 bps
volatile unsigned char i = 0;
volatile unsigned char rxFlag = 0;
unsigned char rxCh;
void Uart0Init(void);
void putc(unsigned char ch);
void puts(unsigned char *str);
void Timer0(unsigned char time);
ISR( TIMER0_OVF_vect )
{
}
ISR( USART_RX_vect )
{
rxCh = UDR0;
putc(rxCh);
}
void main(void)
{
//STATUS LEDs
DDRC = (1<<5);
DDRB = (1<<7);
//POWER REDUCTION REGISTER
PRR = (1<<7) | (1<<2) | (1<<0);
Uart0Init();
sei(); // Interrupts einschalten
Timer0(0);
for(;;)
{
while( !( TIFR0 & (1<<TOV0) ) )
;
while( !( UCSR0A & (1<<UDRE0) ) )
;
UDR0 = 'a';
}
}
void Uart0Init(void)
{
UBRR0H = (unsigned char)(myBRR0 >> 8);
UBRR0L = (unsigned char)myBRR0;
UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);
UCSR0C = (3<<UCSZ00); // 8-Bit Charaktersize
}
void puts(unsigned char *str)
{
while(*str)
{
putc(*str);
str++;
}
}
void Timer0(unsigned char time)
{
//time = vielfaches von 0,128ms
/* time Lookuptable der aktueller Konfiguration 19.03.07
time 0.. - 255
00 = 0,00 ms
10 = 1,28 ms
20 = 2,56 ms
30 = 3,84 ms
40 = 5,12 ms
50 = 6,40 ms
...
*/
TCNT0 = 128;
TIMSK0 |= (1 << TOIE0); // Timer 0 Overflow Interrupt
TCCR0B = (1<<CS01) | (1<<CS00); // Teiler 1024
}
|
mfg, Simon
Datum:
@LC-HC >ICh möcht ezu beginn nur mal alle x-sek. ein Zeichen ausgeben. Leider >kommt aber am Terminal nichts, bzw. nur ab un dzu fehlerhafte zeichen >an. Auf dem Oszi betrachtet, werden aber richtige Zeichen mit der >korrekten Baudrate verschickt. Ist im Terminalprogramm die richtige Baudrate eingestellt? MFG Falk
Datum:
> Auf dem Oszi betrachtet, werden aber richtige Zeichen mit > der korrekten Baudrate verschickt. Daraus muss man ja wohl den Schluss ziehen, dass das Problem nicht beim Microcontroller liegt, oder?
Datum:
Guckst du mit dem Oszi auf der TTL-Seite am AVR oder auf der +-12V-Seite hinter dem Pegelwandler?
Datum:
HI, danke für die antworten. Die DAten liegen sowohl am TTL, als auch zwischen Treiber und PC in gleicher Form an. Da ich aber noch nebenbei mit einem M16C arbeite und der ohne Probleme seine Debuganweisungen ausgibt, kanns der PC nicht sein. Der µC verwendet den internen 8Mhz Takt.
Datum:
> Der µC verwendet den internen 8Mhz Takt.
Und genau da könnte das Problem liegen...
Datum:
Teste mal den RS232-Treiber, indem du auf seiner TTL-Seite RX und TX verbindest (den AVR aus der Fassung nehmen und nen Draht in die Fassung stecken) und vom PC aus sendest. Wenn die Daten dann korrekt zum PC zurückkommen: Treiber in Ordnung, Fehler beim AVR. Ansonsten kann der Fehler auch im Treiber liegen.
Datum:
Ok, Problem gelöst !? Es lag am Kabel. Der M16C ließ sich jedoch mit dem selben Kabel ohne Probleme lesen und flashen ... ? Danke nochmal !