Hallo, stehe vor einem Problem, welches ich leider alleine nicht lösen kann. Ich habe versucht, eine serielle Datenübertragung mit einem ATMEGA32 zu programmieren. Im Terminalprogramm ("Awavo Com Port Monitor") kommt leider immer etwas anderes heraus, als ich im µC hineinstecke...Die Baudrate soll 2400bps (UBRR = 01A0 -> 0,1%Fehler)betragen. Ich komme leider nicht dahinter, wo der Fehler liegt....vlt kann mir ja hier jemand helfen :) Währe sehr sehr dankbar!
1 | #define F_CPU 16000000UL // Taktfrequenz des µC definieren
|
2 | #include <util/delay.h> |
3 | #include <avr/io.h> |
4 | |
5 | int main(void) |
6 | {
|
7 | //------------------------------------µC - Initialisierung ----------------------------------------------------------------------
|
8 | |
9 | DDRB = 0xFF; // Datenrichtung für Port B als Ausgang definieren |
10 | |
11 | |
12 | // AD - Wandler:
|
13 | |
14 | ADMUX |= 0x00; // Sind die Mux4...0 -Bits = 0, so wird der Port ADC0 ausgewählt |
15 | ADMUX |= (1<<REFS0) | (1<<ADLAR); // Referenzspannung ist AVCC |
16 | |
17 | ADCSRA = 0x00; |
18 | ADCSRA |= (1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2); // Prescaler für Samplerate auf 128 |
19 | ADCSRA |= (1<<ADEN); // ADC einschalten |
20 | |
21 | |
22 | // USART - Serielle Schnittstelle
|
23 | |
24 | UCSRB |= (1<<TXEN); // USART - Transmitter einschalten |
25 | |
26 | // - Baudrate auf 2400bps einstellen
|
27 | UCSRC &= ~(1<<URSEL); // URSEL = 0 für Zugriff auf das UBRRH-Register |
28 | UBRRH = 0x01; // UBRRH mit Baudrate für 2400bps (Bits 8 - 11) -416 |
29 | UBRRL = 0xA0; // UBRRL mit Baudrate für 2400bps (Bits 0 - 7) |
30 | |
31 | // - Frame Format definieren (8 Bit ohne Parity und 1 Stopbit)
|
32 | |
33 | UCSRC |= (1<<URSEL); // URSEL = 1 für Zugriff auf das UCRSC Register |
34 | UCSRC = (1<<UCSZ1) | (1<<UCSZ0); // 8 Bit Frame Format - alle anderen Einstellungen sind defaultmäßig bereits wie gewünscht |
35 | |
36 | // - Transmitter aktivieren
|
37 | |
38 | //UCSRB |= (1<<TXEN); // USART - Transmitter einschalten
|
39 | |
40 | |
41 | while(1) |
42 | {
|
43 | ADCSRA |= (1<<ADSC); // Starten der Umwandlung |
44 | while(ADCSRA & (1<<ADSC)); // Warten bis ADSC wieder 0 wird (µC ist fertig mit der AD - Wandlung) |
45 | PORTB = ADCH; // Ausgabe des Higher-Bytes am Port B |
46 | /*
|
47 | while (!(UCSRA & (1<<UDRE))) // Warten bis die Daten des letzten Vorganges fertig verarbeitet sind
|
48 | {
|
49 |
|
50 | }
|
51 | UDR = ADCL; // Messdaten vom ADC übertragen (Lower Byte)
|
52 |
|
53 | while (!(UCSRA & (1<<UDRE))) // Warten bis die Daten des letzten Vorganges fertig verarbeitet sind
|
54 | {
|
55 |
|
56 | }
|
57 | UDR = ADCH; // Messdaten vom ADC übertragen (Higher Byte)
|
58 | */
|
59 | while (!(UCSRA & (1<<UDRE))) // Warten bis die Daten des letzten Vorganges fertig verarbeitet sind |
60 | ;
|
61 | |
62 | UDR = 0x07; |
63 | |
64 | _delay_ms(1000); // 1s warten bevor die Schleife noch einmal durchlaufen wird |
65 | }
|
66 | }
|
PS.: bitte nicht den Kopf abreissen...habe wenig Erfahrung im Umgang mit AVR's Liebe Grüsse, Stefan