Hi.
Ich hab ne kleine ATmega8 Schaltung die auch funktioniert und möchte
dazu über die Serielle Schnittstelle mit meinem PC kommunizieren.
Aufgebaut habe ich es ziemlich genau so:
http://www.mikrocontroller.net/wikifiles/e/ee/AVR-RS232.png
Mein Code sieht so aus:
1 | #include <avr/io.h>
|
2 |
|
3 |
|
4 | #define BAUDRATE 9600UL //Definition als unsigned long, sonst gibt es Fehler in der Berechnung
|
5 | #define F_CPU 4000000UL //Define the MPU operating frequency
|
6 |
|
7 | static inline int uart_putc (const uint8_t c)
|
8 | {
|
9 | // Warten, bis UDR bereit ist für einen neuen Wert
|
10 | while (!(UCSRA & (1 << UDRE)))
|
11 | ;
|
12 |
|
13 | // UDR Schreiben startet die Übertragung
|
14 | UDR = c;
|
15 |
|
16 | return 1;
|
17 | }
|
18 |
|
19 | static inline uint8_t uart_getc_wait (void)
|
20 | {
|
21 | // Warten, bis etwas empfangen wird
|
22 | while (!(UCSRA & (1 << RXC)))
|
23 | ;
|
24 |
|
25 | // Das empfangene Zeichen zurückliefern
|
26 | return UDR;
|
27 | }
|
28 |
|
29 | static inline int uart_getc_nowait (void)
|
30 | {
|
31 | // Liefer das empfangene Zeichen, falls etwas empfangen wurde; -1 sonst
|
32 | return (UCSRA & (1 << RXC)) ? (int) UDR : -1;
|
33 | }
|
34 |
|
35 |
|
36 | // Einen 0-terminierten String übertragen.
|
37 | void uart_puts (const char *s)
|
38 | {
|
39 | do
|
40 | {
|
41 | uart_putc (*s);
|
42 | }
|
43 | while (*s++);
|
44 | }
|
45 |
|
46 |
|
47 | void uart_init (void)
|
48 | {
|
49 | uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1);
|
50 |
|
51 | UBRRH = (uint8_t) (ubrr>>8);
|
52 | UBRRL = (uint8_t) (ubrr);
|
53 |
|
54 | // UART Receiver und Transmitter anschalten
|
55 | // Data mode 8N1, asynchron
|
56 | UCSRB = (1 << RXEN) | (1 << TXEN);
|
57 | UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
|
58 |
|
59 | // Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
|
60 | do
|
61 | {
|
62 | UDR;
|
63 | }
|
64 | while (UCSRA & (1 << RXC));
|
65 | }
|
66 |
|
67 |
|
68 |
|
69 | int main()
|
70 | {
|
71 | char text[] = "Hallo Welt.\n";
|
72 | uart_init();
|
73 | //sei(); // Wird nur gebraucht bei der Interrupt-Version
|
74 |
|
75 | uart_puts (text);
|
76 | uart_puts ("Hallo Welt!\n");
|
77 |
|
78 | return 0;
|
79 | }
|
Allerdings hab ich schon viele andere Versionen ausprobiert und nie auch
nur eine Antwort erhalten. Auslesen tue ich mit HTerm unter Windows auf
Com 1, welcher auf Bit pro Sek 9600, Datenbits 8 usw. genau wie unter
HTerm eingestellt ist.
Ich kann nicht genau feststellen, ob die Schaltung, der Code oder gar
Windows mein Problem ist, da ich Windows 7 64 Bit nutze.