PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit USART



chouifi
12.02.2007, 13:44
Hallo Zusammen,
ich bin jetzt auf eure Rate angewiesen, seit 3 Tagen versuche ich, eine Zechenkette in Hyperterminal zu zeigen, es hat nicht geklappt.
ich weiss nicht, was ich falsch mache.
Ich programmiere Atmega128, hier ist mein Code


#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#define F_CPU 16000000UL

#define BAUD 9600UL
#define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1)
volatile uint8_t zeichen;
volatile uint8_t buffer;


// USART initialisieren
void uart_init0(void)
{
// Baudrate einstellen (Normaler Modus)
UBRR0H = (uint8_t) (UBRR_BAUD>>8);
UBRR0L = (uint8_t) (UBRR_BAUD & 0x0F);
UCSR0B=0;
// Aktivieren von receiver und transmitter
UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);

// Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
UCSR0C=0;
UCSR0C = (1<<UMSEL0)|(1<<UCSZ01)|(1<<UCSZ00);
}


SIGNAL(SIG_UART0_RECV){
zeichen= UDR0;
}


void UART_SendByte(uint8_t buffer){
while ( !( UCSR0A & (1<<UDRE0)));
UDR0=buffer;
}

void putstring(char *s){

while (*s!=0){
UART_SendByte(*s);

*s++;
}
}
int main(void)
{

DDRE=0xFF;
PORTE=0xFF;
uart_init0();
sei();
while (1){

if(zeichen==0x0D){
putstring("Hallo Welt\n");

}
}
}

SprinterSB
12.02.2007, 13:55
IMHO ist das & 0x0f beim Setzen der Baudrate nicht korrekt, weil da die Bits 4-7 flöten gehen.

chouifi
12.02.2007, 14:03
danke für die schnelle Antwort, ich habe ohne &0x0F probiert, hat es nicht geklappt, prblem ist ich bekomme nichts zurück.
danke

SprinterSB
12.02.2007, 14:33
In putstring muss es s++ heissen, nicht *s++ ... obwohl, das sollte egal sein...

Es wäre ganz hilfreich, wenn du rausfinden würdest, ob der receive-Teil oder der Transmit-Teil nicht geht. Das macht die Fehlersuche dann einfacher.

Du kannst zB das "Hallo Welt immer ausgeben (anstatt als Reaktion) und dann ein while(1); Nach dem Reset sollte der µC dann einen String zum PC schicken.

chouifi
12.02.2007, 15:13
Hi,
Sender und emfänger sind Fehlerfrei, ich kann schon ein Zeichen senden und emfangen. Problem liegt nur bei Zeichenkette.

SprinterSB
12.02.2007, 15:28
Wenn du möchtest, daß man dir hier hilft, ist es hilfreich möglichst genau zu beschreiben, was nicht funktioniert.

"Problem bei Zeichenkette" ist nicht wirklich hilfreich...

chouifi
12.02.2007, 15:35
ich möchte, wenn ich "Hallo Welt" als Zeichenkette an Atmega128 sende, sollte es an Hyperterminal gezeigt werden.
es gibt nicht viel zu erklären.
danke

chouifi
13.02.2007, 11:23
Hallo Zusammen,
ich bin selber auf die Lösung gekommen, einfach UMSEL=0 setzen.
es wird synchrone Verbindung erstellt, d.h keine Kopfschmerzen mit dem Baudrategenauigkeit.
vielen Dank für Alle, die sich bemüht besonderes SprinterSB
Güss majid

Reeper
13.02.2007, 13:03
Hallo chouifi,

kannst du mal deinen neuen Code posten oder noch besser, deinen ganzen Ordner als .rar oder .zip rausgeben.
Wäre echt nett, da ich langsam mit C und uc anfangen will. Es ist äußerst günstig, wenn man eine Basis hätte (makefile, Quelltext, usw.), sodass man darauf aufbauen kann. Ich will das Ganze mit einem Atmega32 testen :-)
Es verwirrt mich schon ein bisschen, dass man mehrer Header und Quelltext Dateien nutzen kann und zudem noch ein makefile benötigt. Bei Bascom schreibt man alles in eine Datei/Programm.

Gruß
Stefan