-
Hi Micro5,
besten Dank fürs online-stellen Deines Quellcodes. Ich habe den Quelltext 1 zu 1 in mein AVR-Studio kopiert, Frequenz und Baudrate geändert, kompiliert, übertragen und ausprobiert - keine Änderung.
Dein Terminalprogramm habe ich auch ausprobiert. Es liefert aber auch genau das zurück, was mein anderes Terminalprogramm TerraTerm auch zurück gibt.
Irgendwo ist also noch der Wurm drin. Ich denke, ich werde es jetzt doch wie vorgeschlagen mal im Mikrocontroller-Forum probieren.
Besten Dank für Eure Hilfe bis hierhin.
Grüße
Leuchtturm
-
Hi Leuchtturm
hast du die Fusebits des Atmegas richtig gesetzt? Wenn du einen neuen eingesetzt hast, wovon ich mal ausgehe, musst du noch die Fusebits einstellen, damit er auch mit dem externen Quarz getaktet wird, ansonsten läuft er mit dem intern 1MHz oszillator und dann stimmt die ganze Berechnung für die Baudrate nicht mehr. Dadurch kommt es dann zu falsch übertragenen Zeichen wie bei dir.
Gruß D'oh
-
Hi D´oh,
wie Du schon sagst, war die Baudratenberechnung das Problem.
Ich habe das Programm nach Hilfestellung im Mikrocontroller-Forum etwas abgeändert und nun läuft das wie gewünscht:
#include <avr/io.h>
#include <inttypes.h>
/* CPU Frequenz */
#define F_CPU 1000000UL //Frequenz 1 Mhz
#define BAUD 9600UL //Baudrate
// USART initialisieren
void uart_init(void)
{
// Baudrate einstellen (Normaler Modus)
#if F_CPU < 2000000UL
UCSRA = (1 << U2X);
UBRRL = F_CPU / (8 * BAUD) - 1;
#else
UBRRL = F_CPU / (16 * BAUD) - 1;
#endif
// Aktivieren von receiver und transmitter
UCSRB = (1<<TXEN) | (1<<RXEN);
// Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
int main(void)
{
uint8_t buffer;
DDRA=0xff; //Port A als Ausgang
// USART initialisieren
uart_init();
while (1)
{
// Warten bis Daten empfangen wurden
while ( !(UCSRA & (1<<RXC)) );
// Empfangsregister auslesen
buffer = UDR;
if(buffer==0x31) //Wenn der PC das Zeichen "1" sendet,
PORTA=0x01; //dann die erste LED ausschalten
else //sonst
PORTA=0x00; //alle LED´s ein
// Warten bis der Sendepuffer frei ist
while ( !( UCSRA & (1<<UDRE)) );
// Daten in den Puffer schreiben und damit senden
UDR = buffer;
}
return 0;
}
Grüße
Leuchtturm