Hey Leute, habe eine Frage wie bekomme ich es hin das ich unter dem AVR Terminal Zahlen und Buchstabe bekomme? Ich Probiere grade grade damit einwenig rum aber bekomme es nicht hin:-( bei 9600 Baudratebekomme ich nur &@ usw. was kann ich da machen?
Was sendest du denn für Daten? Sind deine Zahlen auch wirklich ASCII-Werte? Dein Sender steht auch auf 9600 Baud? Wenn du Hilfe willst, dann liefer bitte mehr Infos (Code und ggf. Schaltung)
Das ist das Beispiel SerilleKommunikation aus dem Buch AVR-RISC Emebedded Software selbst enwickeln
1 | /*
|
2 | Serielle Kommunikation
|
3 | Einfacher Befehlsinterpreter
|
4 | |
5 | ATMEGA8/16/32 und kompatibel
|
6 | STK500 mit dem STK500 Oszillator (3.68 MHz)
|
7 | Baudrate: 9600 (8N1)
|
8 | |
9 | Roman Mittermayr
|
10 | AVRBUCH.DE
|
11 | */
|
12 | |
13 | #include <avr/io.h> |
14 | #include <string.h> // Für "strcmp" |
15 | #include <stdlib.h> // Für "itoa" |
16 | |
17 | |
18 | #define TAKT 3680000
|
19 | #define UART_BAUDRATE 9600
|
20 | |
21 | |
22 | |
23 | // Berechnung der Konfigurationsparameter
|
24 | #define UART_SETTING ((TAKT/16L/UART_BAUDRATE)-1)
|
25 | |
26 | |
27 | void setup_uart() |
28 | {
|
29 | /* Baudrate einstellen */
|
30 | UBRRH = (char) (UART_SETTING >> 8); |
31 | UBRRL = (char) (UART_SETTING); |
32 | |
33 | /* Empfänger und Sender einschalten */
|
34 | UCSRB = (1<<RXEN) | (1<<TXEN); |
35 | |
36 | /* Asynchron, 8N1 */
|
37 | UCSRC = (1<<URSEL) | (3<<UCSZ0); |
38 | }
|
39 | |
40 | void uart_putchar(char c) |
41 | {
|
42 | // Warten bis Buffer bereit ...
|
43 | while (!(UCSRA & (1 << UDRE))) |
44 | ;
|
45 | |
46 | // Senden...
|
47 | UDR = c; |
48 | }
|
49 | |
50 | void uart_putstring(char *str) |
51 | {
|
52 | unsigned char i; |
53 | |
54 | for (i=0;i<255;i++) /* Maximal 255 Zeichen ausgeben ... */ |
55 | {
|
56 | if (str[i] != 0) |
57 | uart_putchar(str[i]); |
58 | else
|
59 | break; // Ende des Strings erreicht |
60 | }
|
61 | }
|
62 | |
63 | char uart_getchar() |
64 | {
|
65 | // Ist schon ein Zeichen im Buffer?
|
66 | if (bit_is_set(UCSRA, RXC)) |
67 | return UDR; |
68 | else
|
69 | return -1; |
70 | }
|
71 | |
72 | void uart_readline(char *str) |
73 | {
|
74 | char c; |
75 | unsigned char index; |
76 | |
77 | index = 0; |
78 | |
79 | while (1) |
80 | {
|
81 | c = uart_getchar(); |
82 | if (c != -1) |
83 | {
|
84 | if (c == 13) /* ASCII: NewLine */ |
85 | {
|
86 | /* Ende der Zeile erreicht,
|
87 | also String abschließen */
|
88 | str[index] = 0; |
89 | |
90 | /* Funktion beenden */
|
91 | return; |
92 | }
|
93 | else /* Normales Zeichen, anhängen an die Zeichenkette */ |
94 | {
|
95 | str[index] = c; |
96 | index++; |
97 | }
|
98 | }
|
99 | }
|
100 | }
|
101 | |
102 | int main(void) |
103 | {
|
104 | char kommando[255]; |
105 | char temp[10]; |
106 | unsigned char zahl=0; |
107 | |
108 | /* RS232 einschalten ... */
|
109 | setup_uart(); |
110 | |
111 | /* Willkommensnachricht senden ... */
|
112 | uart_putstring("AVRBUCH.DE - Serielle Kommunikation gestartet ...\r\n\r\n"); |
113 | |
114 | while (1) |
115 | {
|
116 | /* Auf komplettes Kommando warten ... */
|
117 | uart_readline(kommando); |
118 | |
119 | /* Welcher Befehl wurde geschickt? ============ */
|
120 | |
121 | /* ==== BEFEHL: "version" */
|
122 | if (strcmp(kommando, "version")==0) |
123 | {
|
124 | uart_putstring("OK: Version 1.00\r\n"); |
125 | }
|
126 | |
127 | /* ==== BEFEHL: "up" */
|
128 | else if (strcmp(kommando, "up")==0) |
129 | {
|
130 | if (zahl<255) |
131 | {
|
132 | zahl++; |
133 | uart_putstring("OK: Zahl wurde erhoeht\r\n"); |
134 | }
|
135 | else
|
136 | uart_putstring("ERROR: Maximum erreicht (Zahl=255)\r\n"); |
137 | }
|
138 | |
139 | /* ==== BEFEHL: "down" */
|
140 | else if (strcmp(kommando, "down")==0) |
141 | {
|
142 | if (zahl>0) |
143 | {
|
144 | zahl--; |
145 | uart_putstring("OK: Zahl wurde verringert\r\n"); |
146 | }
|
147 | else
|
148 | uart_putstring("ERROR: Minimum erreicht (Zahl=0)\r\n"); |
149 | }
|
150 | |
151 | /* ==== BEFEHL: "show" */
|
152 | else if (strcmp(kommando, "show")==0) |
153 | {
|
154 | itoa(zahl, temp, 10); |
155 | uart_putstring("OK: Zahl = "); |
156 | uart_putstring(temp); |
157 | uart_putstring("\r\n"); |
158 | }
|
159 | }
|
160 | |
161 | return 0; |
162 | }
|
Es ist ein ATMege 16 reicht das oder braucht Ihr mehr? Wäre sehr nett wenn Ihr mir Helfen würdet
> Es ist ein ATMege 16
Werkfrisch (1 MHz) oder bereits auf die 3.68 MHz Taktrate des STK500
Oszillators gefust?
ist gebraucht kann ich also nicht sagen andere sachen laufen ohne probleme nur da hab ich probleme bei
> ist gebraucht kann ich also nicht sagen
Lies die Fuses aus und dann kannst du es sagen.
Das erklärt die UART Probleme. Also ist Umfusen angesagt. Die Anleitung zum STK500 hilft dabei vermutlich weiter.
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.