Forum: Mikrocontroller und Digitale Elektronik senden mit Atmega8


von Karl M (Gast)


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
1
 
2
#ifndef F_CPU
3
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
4
#define F_CPU 4000000L    // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden! 
5
#endif
6
 
7
#define BAUD 9600L          // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
8
 
9
// Berechnungen
10
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
11
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
12
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille 
13
 
14
#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
15
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
16
#endif
17
 /* USART-Init beim ATmega16 */
18
 
19
int main(void)
20
{
21
    UCSRB |= (1<<TXEN);                // UART TX einschalten
22
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1 
23
 
24
    UBRRH = UBRR_VAL >> 8;
25
    UBRRL = UBRR_VAL & 0xFF;
26
// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.B. fuer ATmega16:
27
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
28
    {
29
    }
30
 
31
    UDR = 'x'; 
32
}

von Stephan (Gast)


Lesenswert?

Hallo,

suche mal im hier Forum nach  ->  printf

Stephan

von STK500-Besitzer (Gast)


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)

von Karl M (Gast)


Lesenswert?

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

von Gabriel W. (gagosoft)


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)

von Michael K. (mad_axe)


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

von Karl M (Gast)


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
1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <util/delay.h>
4
5
 
6
#ifndef F_CPU
7
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
8
   F_CPU im Makefile definiert werden, eine nochmalige Definition
9
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
10
   #ifndef/#endif 
11
 
12
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
13
   verwendet wird und dort eine andere, nicht zur Hardware passende 
14
   Taktrate eingestellt ist: Dann wird die folgende Definition 
15
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
16
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
17
   noch nicht definiert: */
18
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
19
#define F_CPU 4000000L    // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden! 
20
#endif
21
 
22
#define BAUD 9600L          // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
23
 
24
// Berechnungen
25
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
26
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
27
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille 
28
 
29
//#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
30
  //#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
31
//#endif
32
 /* USART-Init beim ATmega16 */
33
 //hab ich herausgenommen, sonst kommen nur fehlermeldungen beim compilieren
34
int main(void)
35
{
36
    UCSRB = (1<<TXEN);                // UART TX einschalten
37
    UCSRC = (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1
38
39
40
    UBRRH = UBRR_VAL >> 8;
41
    UBRRL = UBRR_VAL & 0xFF;
42
// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.B. fuer ATmega16:
43
                    
44
    
45
    while(1)
46
 {
47
    UDR = 'hallo'; 
48
  _delay_ms( 500 );}
49
}

von Stefan B. (stefan) Benutzerseite


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.

von Karl M (Gast)


Angehängte Dateien:

Lesenswert?

also ich bekomm diese Fehlermeldung im programmers notepad. siehe anhang

von Stefan B. (stefan) Benutzerseite


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.

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.