Hallo, Ich möchte mich in den UART einarbeiten. Habe dass Toturial durchgearbeitet so weit. Möchte nun ein Zeichen senden (Als erster Versuch). Im Anhang seht ihr den Quelltext. Ich vermute, bzw bin mir sicher, dass die Fehler daran liegen, dass ich kein Port/ Pin deklariert habe. Ich habe es bisher nicht gemacht, da ich nicht sicher bin, ob ich es einfach mit ... DDRD = 0xff; ... machen kann. Also als Beispiel. Der Pin, RX und der Pin TX muss ja jeweils als Ausgang, und der andere als Eingang festgelegt werden. Liegt darin mein Fehler? Muss ich in der Fusebitkonfiguration dem Controller noch erzählen, dass ich auf die Zweitfunktion der Pins zugreife? Danke
../RS232.c:37: error: 'UDR' undeclared (first use in this function) ../RS232.c:27: error: 'FREQ_' undeclared (first use in this function) ../RS232.c:32: error: 'UCSRA' undeclared (first use in this function) und so
Shit, danke. Seh es auch grad. Hab nun folgende eingebaut: #include <avr/io.h> Gibt es noch eine extra für den UART? Muss ich Ausgänge bzw Eingänge einstellen, oder machen es die Funktionen eingenständig?
AVR wrote: > Shit, danke. Seh es auch grad. > > Hab nun folgende eingebaut: > > #include <avr/io.h> > > Gibt es noch eine extra für den UART? Nein. > > Muss ich Ausgänge bzw Eingänge einstellen, oder machen es die Funktionen > eingenständig? Nein, du musst nichts einstellen.
Okay. Habe dieses nachgefragt, da es noch immernicht übersetzt wird. ../RS232.c:30: error: 'BAUD_' undeclared (first use in this function) ../RS232.c:30: error: (Each undeclared identifier is reported only once ../RS232.c:30: error: for each function it appears in.) ../RS232.c:30: error: 'FREQ_' undeclared (first use in this function) ../RS232.c:30: warning: left-hand operand of comma expression has no effect ../RS232.c:31: warning: left-hand operand of comma expression has no effect
Habe es 1 zu 1 aus dem Toturial übernommen. Es ist für einen ATMega 16 geschrieben. Nun ist mir aufgefallen, dass Baud_ ja in der Formel zur Berechnung herangezogen wird und nirgends deklariert ist. Aber wie ? Dass Toturial gibt das nicht her.
Poste nochmal dein jetziges Program. Aber diesmal bitte nicht als PDF. Für einfach den Quelltext in das Posting ein (solange ist der ja nicht) oder hänge dein C-File als Attachment dran. Das erhöht die Chancen ungemein, dass sich das jemand ansieht.
#include <avr/io.h> #ifndef F_CPU #define F_CPU 8000000UL //Einstellen der Oszillator - Frequenz in Hz #endif #define UART_UBRR_CALC (BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1) #define UART_BAUD_RATE 9600 int main (void) { UCSRB |= (1<<TXEN); UCSRC |= (1<<URSEL) | (3<<UCSZ0); UBRRH = (uint8_t) (UART_UBRR_CALC(UART_BAUD_RATE, F_CPU) >> 8); UBRRL = (uint8_t) UART_UBRR_CALC(UART_BAUD_RATE, F_CPU); while (!(UCSRA & (1<<UDRE))) { } UDR = 'x'; return (0); }
Nimm das Leerzeichen hier
> #define UART_UBRR_CALC (BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)
*
raus.
Zwischen Makroname und Argumentliste darf keines sein.
Nun da alles geht bin ich dabei zu senden UND zu Empfangen. Nun folgt die Initialisierung für einen ATMega16:
1 | #include <avr/io.h> |
2 | #ifndef F_CPU
|
3 | #define F_CPU 8000000UL
|
4 | #endif
|
5 | |
6 | #define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)
|
7 | #define UART_BAUD_RATE 9600
|
8 | |
9 | |
10 | UBRRH = (uint8_t) (UART_UBRR_CALC(UART_BAUD_RATE, F_CPU) >> 8); |
11 | UBRRL = (uint8_t) UART_UBRR_CALC(UART_BAUD_RATE, F_CPU); |
12 | |
13 | |
14 | UCSRB = (1<<RXEN) | (1<<TXEN); |
15 | UCSRC = (1<<URSEL) | (1<<UCSZ1)|(1<<UCSZ0); |
Ist diese Fehlerfrei ? Habe ich alle Register korrekt gesetzt ? Habe ich auch nichts vergessen ?
>Ist diese Fehlerfrei ? Habe ich alle Register korrekt gesetzt ? Habe ich >auch nichts vergessen ? Ausprobieren - hängt ja kein Leben von der Funktion ab... hoffe ich :-)
Meine Hardware habe ich in der Schule. Also frühestens Montag ausprobieren. Morgen ist frei. Schade. Naja vielleicht kann mir ja noch wer damit helfen. Danke
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.