Hallo zusammen,
Ich bin noch totaler Anfänger in Sachen µCs und habe (wie wohl viele vor
mir auch :-)) ein Problem mit dem USART: Es kommen statt des gesendeten
"+" immer ein "j" an, dieses allerdings zuverlässig. Ich verwende einen
ATMega8 mit 4MHz Oszillator. Ich bin langsam am verzweifeln... ich hab
einfach keine Ahnung mehr woran das liegen könnte!!!
Meine Schnittstelle ist ok, die habe ich mit der hier beschriebenen
Methode des "RXD an TXD" auch schon erfolgreich getestet.
Hier mein Code:
1 | #include <avr/io.h>
|
2 | #include <util/delay.h> //die Warteschleifen
|
3 | #include <stdint.h> //die Datentypen
|
4 | #ifndef F_CPU
|
5 | #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
|
6 | #define F_CPU 4000000L // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden!
|
7 | #endif
|
8 |
|
9 | #define UBRR_VAL 25 //für Baudrate 9600 bps bei 4MHz
|
10 |
|
11 |
|
12 |
|
13 | /*#define BAUD 9600L // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
|
14 |
|
15 | // Berechnungen
|
16 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
17 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
18 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille
|
19 |
|
20 | #if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
|
21 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
22 | #endif*/
|
23 |
|
24 |
|
25 | void USART_Init( unsigned int ubrr)
|
26 | {
|
27 | UBRRH = (unsigned char)(ubrr>>8); // Set baud rate
|
28 | UBRRL = (unsigned char)ubrr;
|
29 | UCSRB |= (1<<TXEN); // Enable transmitter
|
30 | UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); // Set frame format: 8data, 2stop bit
|
31 | }
|
32 |
|
33 |
|
34 | void USART_Transmit( unsigned char data )
|
35 | {
|
36 | while ( !( UCSRA & (1<<UDRE)) ); // Wait for empty transmit buffer
|
37 | UDR = data; // Put data into buffer, sends the data
|
38 | }
|
39 |
|
40 |
|
41 | int main( void ) //Hauptfunktion
|
42 | {
|
43 | USART_Init (UBRR_VAL); //USART initialisieren
|
44 |
|
45 |
|
46 | DDRC &= ~(1<<PC5); //Pin C5 auf Eingang
|
47 | PORTC = (1<<PC5); //Pull-up Widerstand Pin C5 ein
|
48 |
|
49 |
|
50 | while( 1 ) //Endlosschleife
|
51 | {
|
52 | if (!(PINC & (1<<PINC5))) //Wenn Pin C5 Low ist...
|
53 | {
|
54 | USART_Transmit ('+'); //...ein + senden
|
55 | }
|
56 | _delay_ms(1000);
|
57 | }
|
58 |
|
59 | return 0;
|
60 | }
|
Das ist teilweise selbst geschrieben, teilweise aus den sehr hilfreichen
Tutorialen hier kopiert und aus dem Datenblatt.
Ich weiß einfach nicht woran es noch liegen könnte! Ich habe schon alles
probiert... Der Oszillator läuft wohl auch korrekt (hab ne LED
angeschlossen und Zeit gestoppt, kam ganz gut hin, Oszi hab ich leider
nicht ;-)) Dann müssten die Fuses ja wohl auch richtig gesetzt sein,
oder?
Wäre echt klasse, wenn ihr mir helfen könntet!!!