Forum: Mikrocontroller und Digitale Elektronik Atmega8 + Uart


von Rene3233 (Gast)


Lesenswert?

Hallo ich habe ein programm auf meinem atmega 8 der mit 8hz lauft und 
die verbindung mit uart zum computer funktioniert auch nur gibt er mir 
nur komische zeichen aus stat v was die ganze zeit gesendet wird bekomme 
ich 
```````````````````````````````````````````````````````````````````````` 
```````````````````````````````````````````````````````````````````````` 
```````````````````````````````````````````````````````````````````````` 
```````````````````````````````````````````````````````````````````````` 
```````````````````````````````````````````````````````````````````````` 
```````````````````````````````````````````````````````````````````````` 
````````````````````````````````````````````````````````````````


Kann mir wer tipps geben woran das liegt?

von Jobst M. (jobstens-de)


Lesenswert?

Rene3233 schrieb:
> 8hz

Das ist zu wenig.


Rene3233 schrieb:
> ```````````````````````````````````````````````````````````````````````` 
```````````````````````````````````````````````````````````````````````` 
```````````````````````````````````````````````````````````````````````` 
```````````````````````````````````````````````````````````````````````` 
```````````````````````````````````````````````````````````````````````` 
```````````````````````````````````````````````````````````````````````` 
````````````````````````````````````````````````````````````````

Und dann ist schon Schluß?


Mit welcher Baudrate arbeitest Du?
Woher holt Dein Prozessor den Takt?


Gruß

Jobst

von Rene3233 (Gast)


Lesenswert?

Ne dan ist nicht schluss das geht undendlich so weiter habe ja im 
programm eine dauerschleife drinn.

Der holt sich den takt aus dem internen qaerz.

Ich habe eine baudrate von 9600.

Hier mal mein Programm:
/*
 * UartTest.c
 *
 * Created: 28.05.2012 12:35:08
 *  Author: Rene
 */
#define F_CPU      8000000

#define BAUD        9600
#define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)


#include <avr/io.h>
#include <avr/interrupt.h>


void uart_init(void)
{
    // Baudrate einstellen (Normaler Modus)
    UBRRH = (uint8_t) (UBRR_BAUD>>8);
    UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);

    // oder einfacher:
    // UBRR = UBRR_BAUD;

    // Aktivieren von receiver und transmitter
    UCSRB = (1<<RXEN)|(1<<TXEN);

    // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
int
main(void)
{
    uint8_t buffer;

    // USART initialisieren
    uart_init();

    while (1)
    {
        // Warten bis Daten empfangen wurden
        while ( !(UCSRA & (1<<RXC)) )
            ;

        // Empfangsregister auslesen
        buffer = UDR;

        // Warten bis der Sendepuffer frei ist
        while ( !( UCSRA & (1<<UDRE)) )
            ;

        // Daten in den Puffer schreiben und damit senden
        UDR = "v";
    }
}

von Rene3233 (Gast)


Lesenswert?

Wüede den ein 16 mhz querz reichen?

von g457 (Gast)


Lesenswert?

Schon ∗überprüft∗ ob der wirklich mit 8MHz läuft? Und:
> UDR = "v";
        ^ ^
..macht nicht das was Du denkst dass es macht.

von Rene3233 (Gast)


Lesenswert?

wie kann ich das den Überprüfen und wie sende ich dan richtig?

von Rene3233 (Gast)


Lesenswert?

So der lauft wirklich mit 8Mhz. Auf dem Pollin Evolution bord ist noch 
ein 16 Mhz querz wir kann ich den verwenden?

von g457 (Gast)


Lesenswert?

> 16 Mhz querz wir kann ich den verwenden

Im Prinzip ja, ist aber erstens auch nicht besser und wird Dir zweitens 
obige (fehlerhafte) Zuweisung auch nicht korrigieren. Bring erst mal 
jene in Ordnung sonst wirst Du auch weiterhin kein 'v' nicht zu sehen 
kriegen.

von Jobst M. (jobstens-de)


Lesenswert?

Jobst M. schrieb:
> Und dann ist schon Schluß?

Rene3233 schrieb:
> Ne dan ist nicht schluss das geht undendlich so weiter habe ja im
> programm eine dauerschleife drinn.

Das war eigentlich auch ehr ironisch gemeint. Ein einziges Zeichen hätte 
auch gereicht.


> Der holt sich den takt aus dem internen qaerz.

Intern befindet sich gar kein Quarz, sondern nur ein Oszillator, welcher 
nicht unbedingt genau ist.

Und das ist auch schon Dein Fehler!
... wenn nicht noch weitere vorhanden sind ...



Gruß

Jobst

von Georg W. (gewe)


Lesenswert?

Bekommst Du beim Übersetzen eine Medlung bei UDR = "v"; ?

Ich würde sagen:

UDR = 'v';



cu
Georg

von Rene3233 (Gast)


Lesenswert?

aber wie muss ich das den sonst machen? also wie sende ich den ein v

von Georg W. (gewe)


Lesenswert?

Nachdem ich vorher nicht aktualisieren gedrückt habe und den Beitrag 
weiter oben übersehen habe, hier die Info:

"v" ist eine Zeichenkette/String mit zwei Zeichen. Einmal das 'v' und 
einmal das Stringendezeichen '\0' oder 0x00.

'v' ist die Schreibweise eines Zeichens und somit nur ein Byte mit 'v'.

PS: An alle C-Experten: Falls jemand ein bessere Erklärung hat, dann her 
damit.

cu
Georg

von Rene3233 (Gast)


Lesenswert?

ok soweit vertanden. was muss ich tun damit ich sowas versenden kann?

von Marcus P. (marc2100)


Angehängte Dateien:

Lesenswert?

Hi,
anbei mal der C-Code wie es funktionieren sollte.
Ansonsten solltest du mal ins Datenblatt schauen, da sind Beispiele in 
ASM und C, darauf kannst du ja dann aufbauen.

von Rene3233 (Gast)


Lesenswert?

ok aber wo ist dort der unterschied du sendest doch auch ein A

von Georg W. (gewe)


Lesenswert?

Alternativ, einfach das Warten auf ein Zeichen Rausnehmen und keinen 
String senden:
1
    while (1)
2
    {
3
        // Warten bis der Sendepuffer frei ist
4
        while ( !( UCSRA & (1<<UDRE)) )
5
            ;
6
7
        // Daten in den Puffer schreiben und damit senden
8
        UDR = 'v';
9
    }


cu
Georg

von Noname (Gast)


Lesenswert?

Was Du möglicherweise noch nicht verstanden hast, Rene, ist der 
Unterschied in der Notation.

Ein 'v' in einfachen Anführungszeichen ist genau ein Zeichen, nämlich 
das Vau.
Ein "v" in doppelten Anführungszeichen ist eine Zeichenkette, ein 
String, bestehend aus einem 'v' und einer '\0'

In das UDR Register passen bloss 8 Bit, also genau ein Zeichen.

Deswegen ist es ein Unterschied ob Du UDR = "v" schreibst oder UDR = 
'v'.

von Marcus P. (marc2100)


Lesenswert?

Ja,
der unterschied sollte im wesendlichen zwischen dem '(zeiche)' und bei 
dir halt "(zeichen)" sein, wie ein Vorposter schon geschrieben hatte.

Falls da troz '(zeichen)' noch immer nur komisches Zeug rauskommt, 
stimmt wahrscheinlich die Taktfrequenz nicht. In dem Fall kannst du 
nochmal die FUSE-Bits checken, oder testweise mal #define F_CPU auf 
1000000 setzen, das wäre der Takt im auslieferungszustand des AVRs.

von Ingo (Gast)


Lesenswert?

RXD TXD vertauscht, dann kommt manchmal auch immer das selbe Zeichen!

von Rene3233 (Gast)


Lesenswert?

ok so jetzt funktioniert es danke an alle nur noch eine wie sende ich 
jetzt daten an den mircocontroler habe zum empfängen einfach putty 
genommen wen ich aber was eigebe und enter drücke passiert nix ich komme 
uach in keine neue zeile. Im programm sende ich die empfangenen daten 
einfach zürück.


    while (1)
    {
        // Warten bis Daten empfangen wurden
        while ( !(UCSRA & (1<<RXC)) )
            ;

        // Empfangsregister auslesen
        buffer = UDR;

        // Warten bis der Sendepuffer frei ist
        while ( !( UCSRA & (1<<UDRE)) )
            ;

        // Daten in den Puffer schreiben und damit senden
       //USART_transmit(0b01000001);
     USART_transmit(buffer);
    }

void USART_transmit (unsigned char c) {
     UDR = c;
}

von Marcus P. (marc2100)


Lesenswert?

Putty sendet einfach alles was du eingibst per UART an den ATmega8, und 
zeigt nur an was per UART reinkommt.
Da senden ja funktioniert, sollte die Verbindung ja OK sein, aber falls 
möglich, kannst du ja mal testweise an der Hardware mit der du 
Programmierst die PINs RX und TX verbinden, dann sollte Putty alles 
anzeigen was du eintippst, falls es das tut, stimmt etwas mit deinem 
Programm nicht.

von Rene3233 (Gast)


Lesenswert?

Ok das funktioniert soweit jetzt alles großen danke nur wenn ich das 
empfangende wieder sende dan funktioniert es nur ein einziges mal und 
dan nicht mehr. Hat jemand tipps?

von oldmax (Gast)


Lesenswert?

Hi
Rene, ich hab da mal eine Frage. Im Code steht sauberes Deutsch, also 
auch Groß-und Kleinschrift. In deinen Texten ... na ja, da brauch ich 
nix zu sagen. Wie kommt das ? Also, von C&P lernst du nicht viel.
Arbeite mal die Tutorials durch, da steht viel zu dem Thema drin.
Gruß oldmax

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.