Hallo alle, ich versucht seite einige zeit zeichen von der tastatur zur Hyperterminal via der microcontroller (Atmega16)zu senden aber es klap immer nicht. ich habe auch ein beispiel Programm in winavr ordner genohmen aber es geht immer nicht. bitte wenn jemand ein solche programm hat kann er mcih es senden oder helfen sie mir meine programme richtig zu schreiben. N.B. in anhang steht das beispiel programm von Winavr mit einigen modifikationen von mir ich danke Ihnen schon Marie
Hmm... Was soll das Programm machen bzw. wie erkennst du, dass "es geht immer nicht" eintritt? Ich kann in der Hauptroutine main() keine Aktion erkennen, die auf die Datenübertragung reagiert. Für mich sieht es so aus, als ob einfach nur die ehemalige uart_init() zu main() umgemodelt wurde. Desweiteren sind die Funktionen uart_getchar() und uart_putchar() bereits auf Streams ausgelegt. Das ist eine Stufe komplexer als eine einfache Datenübertragung (wie z.B. im AVR-GCC-Tutorial hier bei mikrocontroller.net), weil diese Streams eingerichtet auch werden müssen (http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html). Ich kann in deinem Beispielcode keine solche Initialisierung erkennen. Schlussendlich musst du noch checken, ob deine Hardware entsprechend zum Beispielcode eingerichtet ist (Frequenz 1 MHz und TX/RX Verbindung zum PC über RS232-Pegelwandler und Kabel).
du hast ja recht Stefan, ich habe die ahemalige uart_init() zu main umgemodelt das habe ich ich gemacht weil während die kompilierung gabe es immer ein fehler weil die main function fällt. ich bitte dich wenn du ein beispiel die nicht kompliziert ist kannst du mir das zeigen? MFG Marie
Das programm soll daten vom Tastatur zu controller empfangen und diesen daten zu Hyperterminal des PC senden. und wie ich schon vorher gesagt habe ich habe das beispiel programm von WinAvr kopiert und wie du gesagt hast es ist eine Stufe Komplexe und ich will gern eine simple beispiel haben. ich habe im Tutorial geschaut aber habe ich keine konkrete Beispiel gesehen. Bitte kann jemand mir helfen? MFG Marie
Hier ein einfaches Programm zum Emfangen und Zurücksenden:
1 | //
|
2 | // Datei uart.c
|
3 | // MCU: Atmega16
|
4 | //
|
5 | #include <avr/io.h> |
6 | |
7 | // CHECK F_CPU WITH HARDWARE OSZILLATOR SETTING !!!!
|
8 | #define F_CPU 1000000UL
|
9 | #define UART_BAUD 9600
|
10 | |
11 | void uart_init(void); |
12 | unsigned char uart_getc(void); |
13 | int uart_putc(unsigned char c); |
14 | void uart_puts (char *s); |
15 | |
16 | int main(void) |
17 | {
|
18 | unsigned char c; |
19 | |
20 | uart_init(); |
21 | |
22 | uart_puts("hello world!\r\n\r\n"); |
23 | |
24 | while(1) |
25 | {
|
26 | // Poll
|
27 | c = uart_getc(); |
28 | |
29 | // Funny conversion
|
30 | if (c >= 'a' && c <= 'z') |
31 | c += 'A' - 'a'; |
32 | else if (c >= 'A' && c <= 'Z') |
33 | c += 'a' - 'A'; |
34 | |
35 | // Echo
|
36 | uart_putc(c); |
37 | }
|
38 | |
39 | return 0; |
40 | }
|
41 | |
42 | void uart_init(void) |
43 | {
|
44 | UCSRB |= (1<<TXEN) |(1<<RXEN); // tx/rx enable |
45 | UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 |
46 | |
47 | #if F_CPU < 2000000UL && defined(U2X)
|
48 | UCSRA |= (1<<U2X); /* improve baud rate error by using 2x clk */ |
49 | UBRRL = (F_CPU / (8UL * UART_BAUD)) - 1; |
50 | #else
|
51 | UBRRL = (F_CPU / (16UL * UART_BAUD)) - 1; |
52 | #endif
|
53 | }
|
54 | |
55 | int uart_putc(unsigned char c) |
56 | {
|
57 | while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */ |
58 | {
|
59 | }
|
60 | |
61 | UDR = c; /* sende Zeichen */ |
62 | return 0; |
63 | }
|
64 | |
65 | void uart_puts (char *s) |
66 | {
|
67 | while (*s) |
68 | { /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */ |
69 | uart_putc(*s); |
70 | s++; |
71 | }
|
72 | }
|
73 | |
74 | unsigned char uart_getc(void) |
75 | {
|
76 | while (!(UCSRA & (1<<RXC))) // warten bis Zeichen verfuegbar |
77 | ;
|
78 | return UDR; // Zeichen aus UDR an Aufrufer zurueckgeben |
79 | }
|
Ich danke dir Stefan. ich habe noch einigen frage: kann ich die String von der Tastatur eingeben? und wenn ich das Programm mit interrupt steuern will was soll ich noch machen? ich meine wenn ich das Empfangen und das Senden mit Interrupt routine schreiben will wie soll ich das machen. MFG Marie
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.