Hallo,
Ich will Zeitwerte an meine uC senden, wo ich warte Zeiten ändern kann.
Dachte das es in ASCII konvertieren einfacher geht. Ich gebe eine Zahl auf dem PC ein, wandele die dann in den ASCII-Code um
Auf dem uC wieder zurück und nehme die Zahl mal x das ich auf meine Wartezeit komme.
Die Übertragungsrate habe ich auf PC auf 9600 und auf dem uC auch (unter der CPU Definition).
Habe mich jetzt im Internet noch etwas recherchierte habe auch ein paar Fehler gefunden, aber es funktioniert immer noch nicht, ich bin am Verzweifeln.
Hier ist noch mal mein Programm.
Code:
#include <avr/io.h>
#include <stdlib.h>
#include <inttypes.h>
#include <util/delay.h>
#define F_CPU 1200000 /* evtl. bereits via Compilerparameter definiert */
#define BAUD 9600UL // 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>
//----------------------------------------------------------------------------------------------------
// UART konfig
void uart_init (void)
{
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
}
//----------------------------------------------------------------------------------------------------
//Zeichen Senden
int uart_putc(unsigned char c)
{
while (!(UCSRA & (1<<UDRE)))
{
}
UDR = c;
return 0;
}
//----------------------------------------------------------------------------------------------------
void uart_puts (char *s)
{
while (*s)
{ /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
uart_putc(*s);
s++;
}
}
//----------------------------------------------------------------------------------------------------
//Zeichen Empfanen
uint8_t uart_getc(void)
{
while (!(UCSRA & (1<<RXC))) //warten bis Zeichen verfügbar
;
return UDR; //Zeichen aus UDR an Aufrufer zurückgeben
}
//----------------------------------------------------------------------------------------------------
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';
}
//----------------------------------------------------------------------------------------------------
int main (void)
{
DDRB = 0xFF;
PORTB = 0xFF;
int Line [8]; //Array vom Typ int
char Buffer[9]; //String mit maximal 8 zeichen
int a;
uart_init(); // UART einstellen
while (1)
{
if ( (UCSRA & (1<<RXC))) //überprüfen ob neue Zeichen vorhanden sind
{ //Zeichen wurden empfangen, jetzt abholen
uart_gets (Line, sizeof(Line));
a=atoi(Line); //aus Text eine Zahl machen
itoa (Line, Buffer, 10); // Aus der Variablen a ein Text erstellen
uart_puts(Buffer); //Senden Text aus Buffer
}
else
{
PORTB = 0b00000000; //Port B schalten
_delay_ms(1000); //WarteZeit t
PORTB =0b11111111; //Port B ausschalten
_delay_ms(1000); //WarteZeit t
PORTB = 0b00000000; //Port B schalten
_delay_ms(1000); //WarteZeit t
PORTB =0b11111111; //Port B ausschalten
}
}
return 0; // never reached
}
Lesezeichen