mikrocontroller.net

Forum: Compiler & IDEs ATmega8 -UART Problem(dringend!!!)


Autor: Carol (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo everybody,

ich habe ein Programm fuer UART geschrieben.
Dieses Programm soll die Zeichnen, die ich getippt habe, an PC 
zurueckschicken.
Diese Kommunikation zwischen ATmega8 und PC laeuft, aber keine richtige 
Zeichnen zurueckgegeben.
Mit Oszilloskop habe Rx und Tx beobachtet. Rx ist richtig. Aber Tx ist 
falsh. Wahrscheinlich kennt Atmega8 die Zeichnen nicht.
Ich habe die Einstellung der USART ueberprueft. Aber habe kein Fehler 
gefunden.
Konnt jemand mir helfen?

Code sieht unter:
mit ATmega8L, 7,3728MHz
mit ICCAVR Complier

#include <iom8v.h>
#include "C:\ICC_H\CmmICC.H"

#include <macros.h>

#define DISP_DDR  DDRC
#define DISP_PORT  PORTC

#define F_CPU 7372800
const unsigned char buffer[]="http://www.avrvi.com";

void USART_Init(uint16 baud )
{
uint16 tmp;
/* Baud rate setting*/
UCSRB = 0x00;
tmp= F_CPU/baud/16-1;
UBRRH = (uint8)(tmp>>8);// 0x00;
UBRRL = (uint8)tmp;//  0x2F;
/* enable transmitter and receiver   0x18*/
 DISP_PORT = 0x00;
 delay50ms(2);
UCSRB = (1<<RXEN)|(1<<TXEN);

 DISP_PORT = 0x03;
 delay50ms(2);
/* 8 databit 1 stopbit  0x86*/
UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
UCSRA = 0x00;
}

void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x2F; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x18;

}


void USART_Transmit(unsigned char data )
{

while ( !( UCSRA & (1<<UDRE)) )
;

UDR = data;
}


unsigned char USART_Receive( void )
{

while ( !(UCSRA & (1<<RXC)) )
;
return UDR;
}


void USART_Transmit_2( void )
{
while ( !( UCSRA & (1<<UDRE)) )
;
UDR = 'H';
while ( !( UCSRA & (1<<UDRE)) )
;
UDR = 'e';
while ( !( UCSRA & (1<<UDRE)) )
;
UDR = 'l';
while ( !( UCSRA & (1<<UDRE)) )
;
UDR = 'l';
while ( !( UCSRA & (1<<UDRE)) )
;
UDR = 'o';
}


void main(void)
{
 unsigned char n=0,tmp=0;
 DISP_DDR = 0xFF;

  DISP_PORT = 0x02;    // hier funktioniert
//    delay50ms(4);
//  uart0_init();
  DISP_PORT = 0x03;   // hier funktioniert
//  delay50ms(4);
USART_Init(9600); //???9600 ?????

/*
for(n=0;n<10;n++) //???????????http://www.avrvi.com
{
USART_Transmit(0x41);
}
*/
for(n=0;n<10;n++){
 USART_Transmit('A');//kein 'A' an PC geschickt, aber '.' und '€' 
geschickt
 DISP_PORT = 0x02;   // hier funktioniert
 delay50ms(2);
 DISP_PORT = 0x01;    // hier funktioniert
 delay50ms(2);
 }
   DISP_PORT = 0x05;  // hier funktioniert



while(1)
{
if(UCSRA&(1<<RXC))
{
  tmp=USART_Receive();
  USART_Transmit(tmp);

  if(tmp=='a')
  {
    USART_Transmit('O');
    USART_Transmit('K');
  }
  if(tmp=='A')        // wenn ich 'A' tippe, wird hier nicht gelaufen
  {
    DISP_PORT = 0x01;
    USART_Transmit_2();
  }
}
}
}

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Empfänger ist bestimmt auf eine andere Baudrate eingestellt.

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit ICC-Code bist du im _GCC_-Forum ein bisschen verkehrt ;).
Aber dein Problem klingt nach einem Takt-problem...
- Bist du sicher, dass der Atmega mit den 7,...MHz läuft und nicht mit 
den 1? MHz Internem Takt? (Stichwort: Fuses 
http://www.mikrocontroller.net/articles/AVR_Fuses )
- ist im Pc-Programm dieselbe Baudrate eingestellt (die "9600????" ;) ), 
wie im Atmega?

hth. Jörg

ps. benutz BITTE die [ c] [/ c] -Tags, danke!

Autor: Carol (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 [ c]
danke Jörg!
ich bin neu hier. :-P

"Aber dein Problem klingt nach einem Takt-problem..."
ich glaube auch.
Ich glaube schon, dass ATmega8 mit 7.3728Mhz funktioniert.
Aber morgen werde ich nochmal ueberpruefen.
Terminal Programm habe ich bestimmt mit 9600 MHz eingestellt.
Mit Osizilloskop habe ich Rx auch beobachtet. Es ist richtig.


 [/ c]

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich glaube schon, dass ATmega8 mit 7.3728Mhz funktioniert.

Das glauben wir alle (sogar ATMEL glaubt daran). Die Frage ist nur, ob 
du deinen Controller auch mit dem richtigen Quarz (7,3728MHz) betreibst, 
und ob du die Fuses richtig eingestellt hast.

> Terminal Programm habe ich bestimmt mit 9600 MHz eingestellt.

Wow... eine RS232 Schnittstelle mit 9.600.000.000 Baud? Cool! ;)

> Mit Osizilloskop habe ich Rx auch beobachtet. Es ist richtig.

Bitte um Definition von: "es ist richtig"

Gruß,
Magnetus

Übrigens:

  Die [c ] und [/c ] Tags müssen ohne Leerzeichen geschrieben werden.
  Das [c ] markiert den Anfang eines Programmausschnitts und das [/c ]
  markiert das Ende.

Das Ganze kann dann z.B. so aussehen:
while(code_is_faulty())
{
  visit("www.microcontroller.net");
  write_code(better,than,before);
  test(new_code);
};

Autor: Carol (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe eine Entwicklungsboard gekauft.
Ich glaube, dass die Fusse richtig eingestellt werden.


9600MHz..... hab falsch eintippt.. war 9600bps

Die Bits an Pin Rx an ATmega8 sind richtig. Ein Bit betraegt circa. 
1/9600s. (also 9600Hz) Wenn ich "A" eingetippt habe, wird 0x41 
geschickt.

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die Bits an Pin Rx an ATmega8 sind richtig. Ein Bit betraegt circa.
> 1/9600s. (also 9600Hz)

"Circa 1/9600s (also 9600Hz)" reicht nicht. Es müssen genau 9600 Baud 
sein. Es wäre z.B. denkbar, dass der µC mit dem internen 8MHz Takt 
läuft. Da siehst du mit dem Oszi auf die Schnelle keinen großen 
Unterschied.

> Wenn ich "A" eingetippt habe, wird 0x41 geschickt.

Heisst das jetzt, dass der PC korrekterweise 0x41 an den µC schickt, 
oder dass der µC mit 0x41 antwortet?

Autor: Carol (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob er bei genau 9600 Baud arbeitet, kann dieser Oszilloskop nicht mehr 
genauer sagen. Aber ich bin sicher, in den Bereich von 9550-9650.

Wenn ich "A" eingetippt, wird 0x41 an den uC geschickt.
while(1)
{
if(UCSRA&(1<<RXC))
{
  tmp=USART_Receive();
  USART_Transmit(tmp);

  if(tmp=='a')
  {
    USART_Transmit('O');
    USART_Transmit('K');
  }
  if(tmp=='A')        // wenn ich 'A' tippe, wird hier nicht gelaufen
  {
    DISP_PORT = 0x01;
    USART_Transmit_2();
  }
}
´bei tmp=='A' sollte pin 0 bei PORTC einen High Pegel ausgeben.
Aber es wurde nicht geklappt.

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ob er bei genau 9600 Baud arbeitet, kann dieser Oszilloskop nicht mehr
> genauer sagen. Aber ich bin sicher, in den Bereich von 9550-9650.

Glauben (sicher sein) und wissen sind zwei paar Schuhe...
DISP_PORT = 0x01;

Wer weiss was sich hinter "DISP_PORT" versteckt...

Hast du den entsprechenden Portpin auch vorher als Ausgang gesetzt?

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, wenn ich das Ganze noch mal so durchlese, fällt mir auf, dass Dein 
µC ja scheinbar gar nicht über die Serielle Schnittstelle antwortet, 
oder?

Regt sich denn überhaupt etwas am TX-Pin des Controllers?

Autor: Carol (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tx antwortet etwas, aber nicht die richtige Zeichnen.
Dieses Programm sollte die Zeichnen, die ich gegeben habe, 
zurueckschicken.
Wenn ich "A" schicke, uC kennt ihn nicht. Aber er schickt etwas anderes 
zurueck.

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du bist wirklich sicher, dass der Atmega für "Crystal Oscillator" - so 
heißt das im Datasheet!, im deinem Brennprogramm kann es anders heißen 
(insbesonders NICHT mit "External Clock" verwechseln!!) - ge'fuse't ist?

Autor: Carol (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, bin nicht sicher. Ich pruefe es gerade ueber. Es kann moeglich 
sein, dass die Entwicklungsboard nicht richtig funktioniert oder ich 
nicht es richtig eingetellt habe.

Autor: Carol (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die interne Oszillator wurde wahrscheinlich benutzt. :-P
Die Fusse wurden nicht richtig eingestellt.
Ich benutze ICCAVR als Complier und Ponyprog ueber ISP(kein JTag), um 
die Programm unterzuladen. Wie kann ich damit die Fusse richtig 
einstellen?
Ich bedanke mich alle hier. Thank u very much~~~~~xie xie(chinesisch):-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Carol wrote:
> die Programm unterzuladen. Wie kann ich damit die Fusse richtig
> einstellen?

http://www.mikrocontroller.net/articles/AVR_Fuses#...

Aber Achtung:
Die Darstellung verwendet (wie das Tutorial) einen Quarzoszillator.
Wenn du einen Quarz benutzt, dann muessen die Häckchen bei
CKSEL0 - CKSEL3 nicht gesetzt sein.

Vor den Änderungen die Fusebits einlesen nicht vergessen!

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/articles/Pony-Prog_...

...Ist die Artikelsammlung echt so schwer zu finden?

Autor: Carol (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geklappt!!!!
War der Fehler mit Fuse!!!
Hatte die Datenblatt nicht alle durchgelesen! selber Schuld!
Aber danke Euch! Ihr hat mir sehr viel geholfen!

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.