Hallo liebe Gemeinde,
tut mir schon leid dass ich damit komme, aber ich sehe wohl den Wald vor
lauter Bäumen nicht? Hatte jetzt ein paar Jahre Programmierpause und
jetzt bekomme ich UART am ATMega644A nicht zum laufen. (Init und senden)
ich habe die Suche schon durch und auch das Datenblatt.
Es wird was gesendet (gemessen mit einem DSO mit Decoder) aber viel zu
wenig und auch falsch.
Den Takt habe ich auf den Pin ausgeben lassen und gemessen, es sind die
eingestellt und eingetragenen 8 Mhz.
Die Einstellung soll 9600 Baud (8,n,1) sein, zur Berechnung beutze ich
setbaud.h
Hier meine init:
#define F_CPU 8000000UL
#define BAUD 9600UL
#include <util/setbaud.h>
void serial_init()
}
UBRR0H = UBRRH_VALUE;
UBRR0L = UBRRL_VALUE;
UCSR0B |= (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00); //8,n,1
}
und hiermit sende ich in einem timer Interrupt ca. 3Hz
ISR(TIMER0_OVF_vect) //
{
//cli(); //weitere Interrupts deaktivieren
PORTB ^= (1<<PB0); // Toggelt den Ausgänge an PORTB0
while(!(UCSR0A & (1<<UDRE0)));
UDR0=48;
//sei(); //alle Interrupts wieder aktivieren
}
Vielen Dank im voraus !
Gast
#5350095
Das vollständige Programm vorzustellen wäre sinnvoll gewesen. Was passiert, wenn Sie statt dieses "setbaud" den Wert aus dem Datenblatt, nämlich 51, nehmen?
Danke für die Antwort! Ich habe auch schon den Zahlenwert direkt eingetragen aber es ändert nichts. Um das Problem zu isolieren habe ich jetzt ein Programm wo ich nur immer wieder was über die Schnittstelle raus schicke. Ich bin so langsam am verzweifeln. Am DSO wird der Pin geschaltet, aber immer nur ein-zwei lange Flanken und nie die kompletten Daten mit 8,n,1
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
René K. schrieb: > UDR0 = "42"; Das ist Quark. In UDR0 muss ein einzelnes Zeichen und kein String übergeben werden. Schreibe also:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
Das Schreiben einer Funktion puts(), die einen String wie "42" ausgeben kann, überlasse ich jetzt einmal Dir.
Gast
#5350931
Versuch mal...
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
Gast
#5350949
an René K. Also bei mir läuft das (mit UDR0='L';). Vielleicht eine Fehlinterpretation der DSO-Ausgabe.
Ich habe auch das Gefühl das am DSO liegt, aber ich habe alles schon zig mal durchgeschaut.... Aber selbst wenn das DSO nicht richtig decodiert, dann müsste ich doch dennoch die 8n1 sehen wenn ich ein Zeichen sende. oder ? Hier nochmal der aktuelle Code:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
Gast
#5350996
Tja, auch Ihr aktuelles Programm läuft bei mir einwandfrei. Der Watchdog ist ja sicher ausgeschaltet, sonst hätten Sie nicht die 8 MHz verifizieren können, wie eingangs geschildert.
Gast
#5351000
Jetzt bin ich irritiert, in dem Bild sehe ich doch ein 4C == 'L'!?
Es funktioniert mit dem einzelnen Zeichen... so was blödes: LSB first und am DSO war MSB first. Aber irgendwie hatte ich das mit den Bits anders in Erinnerung... Jetzt hoffe ich das ich den anderen Kram noch hinbekomme. Ich muss einen String basteln (nur Zahlen) und der soll zyklisch übertragen werden. Dieser setzt sich dann aus mehreren Variablen zusammen. Danke für eure Hilfe bis hierhin!!
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.

