Forum: Mikrocontroller und Digitale Elektronik UART TXD Atmega8


von Falk H. (Gast)


Lesenswert?

Hallo,
ich bin noch nicht lange beim Thema MC. Nun wollte ich mich mit dem UART 
beschäftigen und komme nicht weiter. Ich habe auch gerade noch keinen 
MAX232 zur Hand und kann daher keine Daten zum PC senden. Deshalb habe 
ich erstmal eine LED an TXD angeschlossen, aber die gibt kein Signal von 
sich. Auch an PD7 ist eine LED angeschlossen (zur Kontrolle).Hier mein 
Quelltext:

#include <avr/io.h>
#define F_CPU 16000000
#include<util/delay.h>
#define BAUD 31250
#include<util/setbaud.h>

void uart_init(void)
{

  UBRRH = UBRRH_VALUE;
  UBRRL = UBRRL_VALUE;
 UCSRB |= (1<<TXEN);
 UCSRC  = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);

}

int main(void)
{  DDRD = 0b11111011;
   while(1)
   {  while(!(UCSRA & (1<<UDRE)))
            {
      }
          UDR = 0b11110000;
        PORTD |=  (1<<PD7);
              _delay_ms(1000);
                          PORTD &= ~(1<<PD7);
                             _delay_ms(1000);
   }
}

Was mache ich da verkehrt? Warum gibt die LED Kein Signal von sich ?
Ich würde mich freuen wenn mir Jemand auf die Sprünge helfen könnte.
Danke schonmal.

von Karl M. (Gast)


Lesenswert?

Hi,

was uart_init() da ?

von holger (Gast)


Lesenswert?

>Was mache ich da verkehrt?

uart_init() wird nirgendwo ausgeführt.

von Falk H. (falk_h)


Lesenswert?

Hallo,
danke erstmal für eure Antworten.
Das mit der Funktion habe ich verstanden.
Bevor ich gestern die Funktion (von der ich nicht einmal wusste was sie 
ist) benutzt habe, hatte ich die Register vom UART in main initialisiert 
und hatte das selbe Problem wie jetzt: die an TXD angeschlossene LED 
leuchtet ständig (also ununterbrochenes high Potenzial).
Warum wird nicht im 2-Sekundentakt ein Byte ausgegeben?
1
#include <avr/io.h>
2
#define F_CPU 16000000
3
#include<util/delay.h>
4
#define BAUD 31250
5
#include<util/setbaud.h>
6
7
void uart_init()
8
{
9
10
  UBRRH = UBRRH_VALUE;
11
  UBRRL = UBRRL_VALUE;
12
 UCSRB |= (1<<TXEN);
13
 UCSRC  = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
14
15
}
16
17
int main(void)
18
{  DDRD = 0b11111111;
19
   uart_init();
20
   while(1)
21
   {  while(!(UCSRA & (1<<UDRE)))
22
            {
23
            }
24
           UDR = 0b11110000;
25
        PORTD |=  (1<<PD7);
26
        _delay_ms(1000);
27
              PORTD &= ~(1<<PD7); 
28
              _delay_ms(1000);
29
   }
30
}

Ich hoffe ich nerve euch nicht zu sehr.
Danke

--

C-Quelltext in [ c ] [ /c ] -Tags einschließen, wie es auch oberhalb des 
Texteingabefeldes unter "Formatierung" steht.

-rufus

: Bearbeitet durch User
von Joe S. (joesch)


Lesenswert?

Hi, kannst Du mal bitte dein Coding C-mäßig formatieren. Und nimm bitte 
eine
niedrigere Baudrate vielleicht siehst Du dann das kurze flackern.
Im Datenblatt ist eine simple Initialisierungs- und Senderoutine 
angegeben,
versuche es mal damit.

von Falk H. (falk_h)


Lesenswert?

Wie mache ich das mit dem Formatieren ?
9600 Baud hatte ich gestern auch schon. War das selbe Problem. Müsste 
zwischen den Bytes nicht LOW Pegel sein?
Datenblatt sehe ich mir gleich nochmal an.

Danke

von Joe S. (joesch)


Lesenswert?

Falk H. schrieb:
> Wie mache ich das mit dem Formatieren ?
> 9600 Baud hatte ich gestern auch schon. War das selbe Problem. Müsste
> zwischen den Bytes nicht LOW Pegel sein?
> Datenblatt sehe ich mir gleich nochmal an.
>
> Danke

Zum Formatieren die c-code tags wie im Antwortform angegeben benutzen
und dann die geschwungenen Klammern nett ausrichten etc.

9600 ist wahrscheinlich auch noch zu schnell am besten mal was gaaanz
langsames (vllt. 300) zum testen nehmen und als zu sendendes Byte 
0b01010101.

von Falk H. (falk_h)


Lesenswert?

Was hießt " wie im Antwortform angegeben "
Und danke erstmal. Ich habe 300 Baud eingegeben und dann sah ich die 
Unterbrechung im High-Signal. Ich habe jetzt die LED umgedreht und gegen 
vcc (statt gnd) geschaltet und nun sehe ich den Impuls sogar bei 31250 
(weil ich mit Midi experimentieren will).
Also ist zwischen den Bytes High Pegel auf TXD ?!
Soweit war ich noch nicht.

von Joachim B. (jar)


Lesenswert?

Falk H. schrieb:
> Also ist zwischen den Bytes High Pegel auf TXD ?!

Ruhesignal ist am µC immer high

Invertiert wird im MAX

von H.Joachim S. (crazyhorse)


Lesenswert?

Falk H. schrieb:
> Also ist zwischen den Bytes High Pegel auf TXD ?!

So ist das seit Urzeiten bei allen UARTs (einige MCs können die 
UART-Pegel invertieren, der AVR nicht).

von Falk H. (falk_h)


Lesenswert?

Super , danke , das das bei Midi so ist wusste ich und dachte dafür muss 
ich invertieren...
Das hat mir sehr geholfen .
Ich wünsche dir noch einen schönen Abend.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Falk H. schrieb:
> Was hießt " wie im Antwortform angegeben "

Ich hab' das jetzt mal für Dich gemacht.

Dein Quelltext ist allerdings trotzdem grauenerregend formatiert.

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.