-
Problem mit USART
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
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");
}
}
}
-
IMHO ist das & 0x0f beim Setzen der Baudrate nicht korrekt, weil da die Bits 4-7 flöten gehen.
-
danke für die schnelle Antwort, ich habe ohne &0x0F probiert, hat es nicht geklappt, prblem ist ich bekomme nichts zurück.
danke
-
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.
-
Hi,
Sender und emfänger sind Fehlerfrei, ich kann schon ein Zeichen senden und emfangen. Problem liegt nur bei Zeichenkette.
-
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...
-
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
-
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
-
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