Hallo Leute, nach langer - leider erfolgloser - Suche (auch hier im Forum) habe ich mich entschlossen mein Problem mal zu posten. Vorab die Daten: Controller: ATMega88A Quarz: extern, 20MHz Konverter: Mini USB zu UART Converter (der von Conrad) Übertragungseinstellungen: sämtliche probiert... Terminal: hterm Also ich habe beim Konverter den RxD pin an den RxD Pin und den TxD Pin an den TxD Pin des Controllers gehängt. Zusatzlich habe die Pins am Koverter kurgeschlossen, um den 5V TTL Pegel zu aktivieren. Das habe ich bereits mehrfach geprüft. Der Konverter ansich funktioniert auch, den habe ich mit hterm schon mehrfach getestet. Der Controller taktet auch mit 20MHz (hab ich überprüft). Auch das Austauschen des Controllers habe ich schon versucht. Ich weis nicht genau, ob der Controller Zeichen empfängt... aber mir geht es erst mal um das Senden von Daten. Wenn ich in der Schleife nun die ganze Zeit ein 'X' sende, messe ich am TxD Pin des Controllers zwar permanent TTL-Signale (mithilfe eines Oszis), aber am PC kommt so wie es aussieht nichts an. Mein hterm bekommt es auf jeden Fall nicht mit. Ich habe schon sämtliche Baudraten von 2400 bis 115200 versucht mit 1 und 2 Stoppbits, aber nie etwas empfangen... Weis jemand woran das noch liegen kann? Ich habe auch schon 1:1 Quellcode aus dem Datenblatt probiert. Erfolglos. Hier der Aktuelle Quellcode:
1 | #include <avr/io.h> |
2 | |
3 | #ifndef MCU
|
4 | #define MCU ATmega88
|
5 | #endif
|
6 | |
7 | #ifndef F_CPU
|
8 | #define F_CPU 20000000
|
9 | #endif
|
10 | |
11 | #define BAUD 9600
|
12 | |
13 | #include <util/setbaud.h> |
14 | #include <util/delay.h> |
15 | |
16 | void uart_init(void) |
17 | {
|
18 | UBRR0 = UBRR_VALUE; |
19 | |
20 | /* evtl. verkuerzt falls Register aufeinanderfolgen (vgl. Datenblatt)
|
21 | UBRR = UBRR_VALUE;
|
22 | */
|
23 | #if USE_2X
|
24 | /* U2X-Modus erforderlich */
|
25 | UCSR0A |= (1 << U2X0); |
26 | #else
|
27 | /* U2X-Modus nicht erforderlich */
|
28 | UCSR0A &= ~(1 << U2X0); |
29 | #endif
|
30 | |
31 | UCSR0B = (1<<RXEN0)|(1<<TXEN0); // UART RX, TX und RX Interrupt einschalten |
32 | UCSR0C = (1<<USBS0)|(1<<UCSZ00); // Modus auf 8 Datenbit und 2 Stoppbit setzten |
33 | }
|
34 | |
35 | int uart_putc(unsigned char c) |
36 | {
|
37 | while (!(UCSR0A & (1<<UDRE0))) /* warten bis Senden moeglich */ |
38 | ;
|
39 | |
40 | UDR0 = c; /* sende Zeichen */ |
41 | return 0; |
42 | }
|
43 | |
44 | unsigned char uart_getc(void) |
45 | {
|
46 | while (!(UCSR0A & (1<<RXC0))) // warten bis Zeichen verfuegbar |
47 | ;
|
48 | return UDR0; // Zeichen aus UDR an Aufrufer zurueckgeben |
49 | }
|
50 | |
51 | int main(void) |
52 | {
|
53 | uart_init(); |
54 | |
55 | while(1) |
56 | {
|
57 | uart_putc('X'); |
58 | _delay_ms(100); |
59 | }
|
60 | }
|