Hi,
das meiste hab ich bisher schon hinbekommen mit meinem AtMega 8 aber der
UART will einfach nicht. Ich habe es erst mit eigenem Code versucht, als
das nicht klappen wollte habe ich diverse Beispielcodes durchgetestet.
Weder der aus der Doc zum mega8 noch der hier von der Webseite haben
irgendetwas bewirkt.
Es gibt ja wirklich viel allein in diesem Forum zum UART und ich habe
mir auch vieles durchgelesen, aber etwas das mir hilft habe ich nicht
gefunden (oder übersehen).
Als Board benutze ich ein Olimex Development Board, gab es mal hier im
Shop. Also nichts selbsgebautes. 2 Kabel sind gesteckt RX und TX, und
das wars, sonst hab ich alles vom board runtergenommen.
Folgenden Minimalcode habe ich als letzten Versuch benutzt
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <inttypes.h>
|
4 | #include <stdlib.h>
|
5 |
|
6 | #ifndef F_CPU
|
7 |
|
8 | #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
|
9 | #define F_CPU 8000000L // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden!
|
10 | #endif
|
11 |
|
12 | #define BAUD 19200L // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
|
13 | #define UBRR_VAL 25 //19200 BAUD
|
14 |
|
15 | int main(void)
|
16 | {
|
17 | UCSRB |= (1<<TXEN); // UART TX einschalten
|
18 | UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1
|
19 |
|
20 | UBRRH = UBRR_VAL >> 8;
|
21 | UBRRL = UBRR_VAL & 0xFF;
|
22 |
|
23 | while(1)
|
24 | {
|
25 | while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
|
26 | {
|
27 | }
|
28 |
|
29 | UDR = 'x'; /* schreibt das Zeichen x auf die Schnittstelle */
|
30 | }
|
31 | return 0;
|
32 | }
|
Also Initialisieren, und bis zum Sanktnimmerleinstag x über den USART
schicken. Viel mehr abspecken kann man ja nun wirklich nichtmehr aber
kein Terminalprogramm empfängt irgendetwas. Getestet wurde an 3 PC's.
Den Wert für UBRR habe ich aus dem Datenblatt aus der Tabelle bei 19200
Baud, andere Werte haben auch nicht funktioniert.
Da ich im moment absolut nicht weiterkommen... hat jemand einen
funktionierenden (möglichst kurzen) Beispielcode für einen mega8 ? Ich
würde gerne den Code als Fehlerquelle ausschliessen.
Da ich leider auf den 8 Mhz Quarz angewiesen bin komme ich nicht auf
wirklich gute Baudraten, notfalls kommt einfach ein anderer quarz drauf,
aber funktionieren müsste es ja eigentlich auch so.
Hat jemand einen Ratschlag ?