www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik senden mit Atmega8


Autor: Karl M (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich versuche gerade mit dem Atmega8 über uart auf meinen COM-Port zu 
senden. hab auch schon eine Beispiel programm gefunden. jedoch 
funktioniert dieses bei mir nicht. hab im Hyperterminal auch schon alles 
richtig eingestellt(9600,8,n,1). aber es kommt nichts an.
sehe ich das richtig das dieses programm mir normalerweise ein X 
schicken müsste?
ich sende mit dem myavr-board. dieses ist auch fehlerfrei da ich mit dem 
Testprogramm keine Fehler habe.
danke
 
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
#define F_CPU 4000000L    // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden! 
#endif
 
#define BAUD 9600L          // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
 
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille 
 
#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif
 /* USART-Init beim ATmega16 */
 
int main(void)
{
    UCSRB |= (1<<TXEN);                // UART TX einschalten
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1 
 
    UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;
// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.B. fuer ATmega16:
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
    {
    }
 
    UDR = 'x'; 
}

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

suche mal im hier Forum nach  ->  printf

Stephan

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>    UCSRB |= (1<<TXEN);                // UART TX einschalten
>    UCSRC |= (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1

Mach das mal so:

    UCSRB = (1<<TXEN);                // UART TX einschalten
    UCSRC = (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1

(die "|" weglassen)

Autor: Karl M (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habs ausprobiert. hat aber auch nicht funktioniert.
hat jemand vielleicht einen funktionierenden code für das myavr-board?
danke

Autor: Gabriel Wegscheider (gagosoft)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bekommst Du die
"F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
Meldung? Ist die Frequenz auch wirklich richtig eingestellt?

#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
ist das das wirklich das gleiche wie
#  define MY_BAUD FOSC/16/BAUD-1
ist ja auch nicht so wichtig, wie kompliziert der Ausdruck ist, wird ja 
vom COMPILER ausgewertet.
Da bin ich mir nicht ganz sicher...
hoffentlich werden die // Kommentare vor dem Preprocessor weggeräumt 
(lieber davor hinschreiben)

Autor: Michael Kentschke (mad_axe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch doch erstmal das 'x' in einer Schleife zu sende, also endlos in 
der while Schleife. So kannst du erstmal schauen ob es allgemein geht 
und bist nicht nur auf ein Senden angewiesen.

Gruß
Micha

Autor: Karl M (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab jetzt was herausgenommen.
und zwar while (!(UCSRA & (1<<UDRE))). Kann es sein das ich dafür CTS 
RTS aktivieren muss.anstatt diesem hab ich eine While-schleife 
eingefügt,die ständig sendet mit 500ms pausen.
jedoch bekomm ich im hyperterminal nur seltsame zeichen. hab auch den 
externen quarz aktiviert. kann mir jemand sagen woran das liegt. bei 
4800,9600 und 11.... kommen seltsame zeichen. drunter und drüber geht 
nichts.
danke
#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>

 
#ifndef F_CPU
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
   F_CPU im Makefile definiert werden, eine nochmalige Definition
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
   #ifndef/#endif 
 
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
   verwendet wird und dort eine andere, nicht zur Hardware passende 
   Taktrate eingestellt ist: Dann wird die folgende Definition 
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
   noch nicht definiert: */
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
#define F_CPU 4000000L    // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden! 
#endif
 
#define BAUD 9600L          // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
 
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille 
 
//#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
  //#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
//#endif
 /* USART-Init beim ATmega16 */
 //hab ich herausgenommen, sonst kommen nur fehlermeldungen beim compilieren
int main(void)
{
    UCSRB = (1<<TXEN);                // UART TX einschalten
    UCSRC = (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1


    UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;
// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.B. fuer ATmega16:
                    
    
    while(1)
 {
    UDR = 'hallo'; 
  _delay_ms( 500 );}
}

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Antworte doch mal auf diese Fragen von Gabriel Wegscheider:

> bekommst Du die
> "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
> Meldung? Ist die Frequenz auch wirklich richtig eingestellt?

Das myAVR Board arbeitet nicht mit 4 MHz. Es ist eine Taktquelle mit 
anderer Frequenz drauf! Wenn obige Meldung kommt, heisst das das ein 4 
MHz Wert benutzt wird, um die UART Einstellungen für die Baudrate 9600 
zu berechnen, Und dann käme auf der Gegenseite wenn überhaupt nur Müll 
an.

Und wie war dein Fehlerbild ?-)

> jedoch bekomm ich im hyperterminal nur seltsame zeichen. hab auch den
> externen quarz aktiviert. kann mir jemand sagen woran das liegt. bei
> 4800,9600 und 11.... kommen seltsame zeichen. drunter und drüber geht
> nichts.

Autor: Karl M (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
also ich bekomm diese Fehlermeldung im programmers notepad. siehe anhang

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar. Wenn die UART des AVR wie hier die Baudrate nur mit einem Fehler 
grösser 1% einstellen kann, dann ist es kein Wunder, dass auf der 
Gegenseite nur Müll oder garnix ankommt.

Du kannst versuchen statt 9600 Baud eine andere Baudrate zu finden, bei 
der es einen kleineren Fehler gibt. Hilfreich ist bei der Suche die 
Taktrate des Boards ;-) und die Tabelle im UART-Teil des Datenblattes 
des verwendeten AVRs.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.