Forum: Mikrocontroller und Digitale Elektronik UART geht mal wieder nicht


von Christian Lienen (Gast)


Lesenswert?

Hallo Kollegen,
ich weiß, dass diese Thema schon relativ häufig in diesem Forum 
diskutiert wurde. Ich habe mir auch schon ziemlich viele dieser Beträge 
durchgelesen, komme aber trotzdem nicht weiter.
Folgendes Problem:

Ich habe mir eine Platine gelötet mit einem Atmega48 und einem externen 
Quarz mit 14,7456MHz. Led's lassen sich damit auch prima ansteuern. Um 
sicherzustellen, dass der µC wirklich mit diesem Quarz läuft, habe ich 
ihn auch schon einmal abgelötet. Nach dem löten ließ er sich auch nicht 
mehr ansteuern.
Nun aber zu meinem eigentlichen Problem:

1
#include <inttypes.h>
2
#include <avr/io.h>
3
#define F_CPU 14745600UL
4
#define BAUD        9600
5
#define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)
6
7
void uart_init(void)
8
{
9
    UBRR0H = (uint8_t) (UBRR_BAUD>>8);
10
    UBRR0L = (uint8_t) (UBRR_BAUD & 0x0ff);
11
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
12
    // Einstellen des Datenformats: 8 Datenbits, 2 Stoppbit
13
    UCSR0C = (1<<UCSZ01)|(1<<UCSZ00)|(1<<USBS0);
14
}
15
16
int main(void)
17
{
18
19
uart_init();
20
21
    while (1)
22
    {
23
24
        // Warten bis der Sendepuffer frei ist
25
        while ( !( UCSR0A & (1<<UDRE0)) );
26
27
        // Daten in den Puffer schreiben und damit senden
28
        UDR0 = 'H';
29
   }
30
}


Ich möchte den µC mit diesem kleinen Programm dazu bewegen, mir 
wenigstens schonmal den Buchstaben H auf die serielle Schnittstelle zu 
senden.
Leider tut er dies nicht.
Ich habe auch schon versucht, ein Oszi direkt an Rx des µC zu hängen. 
Dieses zeigt mir jedoch die ganze Zeit nur 5V an.
Könntet ihr mir vielleicht ein paar Anregungen liefern um dieses Problem 
zu beseitigen?

Mit freundlichen Grüßen
Christian Lienen

von Michael B. (planlessmichi)


Lesenswert?

Hi, ich habe mir Dein Programm jetzt nicht angesehen, aber wenn Dein µC 
dem PC was senden soll, dann musst Du am Tx-Pin vom µC und nicht am Rx 
messen.

von Lord Z. (lordziu)


Lesenswert?

Christian Lienen schrieb:
> ein Oszi direkt an Rx des µC zu hängen.

Rx ist der Empfänger. Wenn du sendest, solltest du was an Tx sehen 
können.


Erste Frage (wie immer): Ist die CKDIV8 Fuse gesetzt?

von Christian Lienen (Gast)


Lesenswert?

Oh sorry, ich habe auch an Tx gemessen, es hier nur leider falsch 
hingeschrieben :-[

Leider passiert immernoch nichts. Ich habe auch noch einmal nachgesehen, 
ob das CKDIV8 Bit gesetzt ist. Leider ist das gesetzt.
Was kann ich noch tun?

Mit freundlichen Grüßen
Christian Lienen

von Karl H. (kbuchegg)


Lesenswert?

Christian Lienen schrieb:

> Ich habe mir eine Platine gelötet mit einem Atmega48 und einem externen
> Quarz mit 14,7456MHz. Led's lassen sich damit auch prima ansteuern. Um
> sicherzustellen, dass der µC wirklich mit diesem Quarz läuft, habe ich
> ihn auch schon einmal abgelötet. Nach dem löten ließ er sich auch nicht
> mehr ansteuern.

OK.
Das heisst erst mal noch nicht allzuviel

Hast du irgendwo eine LED drann hängen? WEnn
ja, dann findest du hier ein Testprogramm

http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART

passe dort die Taktfrequenz auf deine an, trage die LED ein und sieh 
nach, ob die Blinkzeiten stimmen. Optimizer vom Compiler einschalten 
nicht vergessen.

> ob das CKDIV8 Bit gesetzt ist. Leider ist das gesetzt.
> Was kann ich noch tun?

Kontrolliere erst mal, ob die aktiv ist.
Wenn ja, dann blinkt oben genanntes Testprogramm alle 8 Sekunden. WEnn 
nicht, dann alle 1 Sekunden.
Du brauchst 1 Sekunde.

Wenn die die CKDIV8 Fuse falsch steht, dann nimm dein Brennprogramm her 
und ändere sie auf die andere Seite.

Ziel: Die 1 Sekunde Blinkrate im Testprogramm

> Leider tut er dies nicht.

Tut sich sonst irgendetwas?

> Ich habe auch schon versucht, ein Oszi direkt an Rx des µC zu hängen.
> Dieses zeigt mir jedoch die ganze Zeit nur 5V an.

Ok. Tx anstelle von Rx.

Du kannst nicht einfach mit dem 5V Ausgang auf den PC gehen. Du brauchst 
einen Pegelwandler, der die 0V-5V auf +-12V umsetzt.

http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART


Ein Oszi ist zwar gut um die Signale auszumessen, wenn es aber nur darum 
geht festzustellen, ob der µC überhaupt sendet, finde ich eine 
stinknormale LED zur Fehlersuche besser geeignet. Schliesse sie mit 
einem 220 Ohm Widerstend (oder irgendwas in dieser Grössenordnung gegen 
Masse an). Wenn der µC sendet, dann flackert die LED, das kannst du kaum 
übersehen. Vor allen Dingen dann nicht, wenn du die Baudrate auf 300 
Baud zurücknimmst.

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
Noch kein Account? Hier anmelden.