Hallo,
habe jezt auch mal die Baudrate fix eingestellt dies hat aber auch nichts gebracht. Immer der selbe "Müll".
Habe meinen externen Quarz mal weggenommen und habe intern den RCOsc. mal auf 8MHz; 6CK+64ms gestellt, und habe meine F_CPU auf 8000000 gestellt
Meine LED's blinken alle noch im sekundentakt.
Wenn ich mir einen festen Wert oder Buchstabe übertragen lassen will, kommt in ANSI nichts mehr an und in Ascii nur noch komische Symbole, ich sehe aber an meinen RXD das irgendwelche daten ankommen.
Hier nochmal mein Programm
Code:
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#define F_CPU 8000000// 12000000 /* evtl. bereits via Compilerparameter definiert */
#define BAUD 300 // Baudrate
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
#include <util/setbaud.h>
//------------------------------------------------------------------------------------------
//USART initialisieren
void uart_init(void)
{
//Set Baudrate
UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
UCSRB |= (1<<TXEN) | (1<<RXEN); //UART TX und RX einschalten
UCSRC = (1<<URSEL) |(1<<UCSZ1) | (1<<UCSZ0); // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
}
//------------------------------------------------------------------------------------------
//Warteschleife
void delay_ms(unsigned int ms)
{
unsigned int zaehler;
while (ms) {
zaehler = F_CPU / 5000;
while (zaehler) {
__asm volatile("nop");
zaehler--;
}
ms--;
}
}
//------------------------------------------------------------------------------------------
// Zeichen senden
int uart_putc(unsigned char c)
{
while (!(UCSRA & (1<<UDRE)))
{
}
UDR = c;
return 0;
}
//------------------------------------------------------------------------------------------
//String senden
void uart_puts(char *s)
{
while (*s)
{ /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
uart_putc(*s);
s++;
}
}
//------------------------------------------------------------------------------------------
//Zeichen empfangen
uint8_t uart_getc(void)
{
while (!(UCSRA & (1<<RXC))) //warten bis Zeichen verfügbar
;
return UDR; //Zeichen aus UDR an Aufrufer zurückgeben
}
//------------------------------------------------------------------------------------------
//Sting empfangen
void uart_gets(char *Buffer, uint8_t MaxLen)
{
uint8_t NextChar;
uint8_t StringLen = 0;
NextChar = uart_getc(); // Warte auf und empfange das nächste Zeichen
// Sammle solange Zeichen, bis:
// * entweder das String Ende Zeichen kam
// * oder das aufnehmende Array voll ist
while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
*Buffer++ = NextChar;
StringLen++;
NextChar = uart_getc();
}
// Noch ein '\0' anhängen um einen Standard
// C-String daraus zu machen
*Buffer = '\0';
}
//------------------------------------------------------------------------------------------
//Hauptprogramm
int main(void)
{
int Line[2]; //Array vom Typ int
char Buffer[3]; //String mit maximal 8 zeichen
int a;
DDRB = 0xFF;
PORTB = 0xFF;
a=12;
uart_init(); // UART einstellen
while (1)
{
if ((UCSRA & (1<<RXC))) //überprüfen ob neue Zeichen vorhanden sind
{
uart_gets(Line, sizeof(Line)); //Zeichen wurden empfangen, jetzt abholen
a=atoi (Line); //aus Text eine Zahl machen
itoa (Line, Buffer, 10); // Aus der Variablen a ein Text erstellen
uart_puts("j"); //Senden festen Buchstaben j
}
else
{
uart_puts(a); //Variable a senden Testzwecke
PORTB = 0b00000000;
uart_puts(a); //Variable a senden Testzwecke
delay_ms(1000);
uart_puts(a); //Variable a senden Testzwecke
PORTB = 0b00001111;
uart_puts(a); //Variable a senden Testzwecke
delay_ms(1000);
PORTB = 0b11110000;
delay_ms(1000);
PORTB = 0b11111111;
delay_ms(1000);
}
}
}
Kann das wirklich nur an der CPU-Frequenz liegen?
Habe eben mal noch Versucht eine feste Variable zu Übertragen das heißt ich habe
geschrieben und es kommt auch die 12 an auch wenn ich buchstaben übertrage funktioniert das.
Wenn ich jetzt aber eine Variabel deklariere zum Beispiel
Aber hier kommt dann nur wirres zeug an.
Lesezeichen