Atmega8 + Uart

Gast #2693187
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?
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
Gast
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";
    }
}
Gast
> 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.
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
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
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
Gast
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'.
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.
Gast
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;
}
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.
Gast
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?
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.