Hallo zusammen,
ich habe mit Hilfe vom Tutorial folgenden C-Code erstellt:
1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <stdlib.h>
|
5 |
|
6 |
|
7 | #ifndef F_CPU
|
8 |
|
9 | #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
|
10 | #define F_CPU 8000000UL // Systemtakt in Hz - Definition als unsigned long beachten >> Ohne ergeben Fehler in der Berechnung
|
11 | #endif
|
12 |
|
13 | #define BAUD 9600UL // Baudrate
|
14 |
|
15 | // Berechnungen
|
16 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
17 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
18 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
19 |
|
20 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
21 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
22 | #endif
|
23 |
|
24 |
|
25 | void init(void)
|
26 | {
|
27 | UCSR0B |= (1<<TXEN0); // UART TX einschalten
|
28 | UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00); // Asynchron 8N1
|
29 |
|
30 | UBRR0H = UBRR_VAL >> 8;
|
31 | UBRR0L = UBRR_VAL & 0xFF;
|
32 | }
|
33 |
|
34 |
|
35 | int uart_putc(unsigned char c)
|
36 | {
|
37 | while (!(UCSR0A & (1<<UDRE0))) /* warten bis Senden moeglich */
|
38 | {
|
39 | }
|
40 |
|
41 | UDR0 = c; /* sende Zeichen */
|
42 | return 0;
|
43 | }
|
44 |
|
45 |
|
46 | /* puts ist unabhaengig vom Controllertyp */
|
47 | void uart_puts (char *s)
|
48 | {
|
49 | while (*s)
|
50 | { /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
|
51 | uart_putc(*s);
|
52 | s++;
|
53 | }
|
54 | }
|
55 |
|
56 | void senden (uint16_t send_help)
|
57 | {
|
58 | char s[7];
|
59 | uint16_t i = send_help;
|
60 |
|
61 | //uart_init();
|
62 |
|
63 | itoa( i, s, 10 ); // 10 fuer radix -> Dezimalsystem
|
64 | uart_puts( s );
|
65 |
|
66 | // da itoa einen Zeiger auf den Beginn von s zurueckgibt verkuerzt auch:
|
67 | //uart_puts( itoa( i, s, 10 ) );
|
68 | }
|
69 |
|
70 |
|
71 |
|
72 | int main(void)
|
73 | {
|
74 |
|
75 | init();
|
76 | while(1)
|
77 | {
|
78 | senden('A');
|
79 | }
|
80 |
|
81 | }
|
Ich hatte diesen Code in einem anderen Programm mit eingebaut. Am Anfang
hat alles wunderbar funktioniert, doch jetzt bekomme ich nur noch
komische Zeichen ausgegeben. Um dem Fehler auf den Grund zu gehen hab
ich eben nur diesen Code auf den Controller (mega88) aufgespielt, aber
auch hier kommen nur komische Zeichen an bzw. in HyperTerminal kommt
sogar gar nichts an. Die Empfangsprogramme sind auf 9600Baud eingestellt
mit 8 Datenbit und 1 Stoppbit.
Hab ich oben irgendeinen Fehler mittlerweile mit eingebaut?
Hoffe ihr könnt mir helfen.
Gruß
Daniel