Atmega8 + Uart

Gast #2693187
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?
#2693192
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
Gast #2693195
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";
    }
}
Gast #2693225
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.
#2693228
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
#2693240
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
Gast #2693280
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'.
#2693281
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.
Gast #2693286
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;
}
#2693312
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.
Gast #2693858
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren