Hallo,
so habe die Probleme gelöst es funktioniert alles. Naja fast alles, muss jezt noch mein Kommunikation mit VB.Net hinbekommen (auch schon fast am verzweifeln).
Ich möchte mich mal bei allen beteiligten bedanken, für die groß Hilfe, viel Dank!
Das Hauptproblem lag wahrscheinlich darin das mein 12MHz Quarz einen defekt hatte bzw hat, habe das jetzt alles auf dem intern 8MHz laufen und funktioniert alles,
es waren aber auch noch genug kleine fehler dabei.
Ich habe mein Aufteilung mit der "strtok" und "strcpy" funktionen erledigt.
Mit der strtok habe ich auf meine String auf Trennzeichen untersucht
und mit der strcpy in die entsprechenden Variablen gespeichert.
Wenn ich jetzt über das RealTerm eine 1,2,3,4\n sende veränderen sich auch die Blink Zeiten entsprechend.
Hier mal mein Programm
Code:
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>
#define F_CPU 8000000 /* 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>
struct _S_DATA S_DATA;
int Line[9]; //Array vom Typ int
//------------------------------------------------------------------------------------------
//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
}
//------------------------------------------------------------------------------------------
struct _S_DATA
{
char Rot[2];
char RG [2];
char GR [2];
char GE [2];
};
//------------------------------------------------------------------------------------------
//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';
}
//------------------------------------------------------------------------------------------
//String Zerlegung
void string_zer(void)
{
unsigned char i; //Case Hochzählung
char Trennzeichen[]=","; //Trennungszeichen
char *ptr; //Variable zum zwischenspeichern
i = 2; //Variable i auf 2 setzten
ptr=strtok(Line, Trennzeichen); // Line durchsuchen bis zum Trennzeichen und in ptr zwischen speichern
strcpy (S_DATA.Rot, ptr); // Erster Teil in Rot kopiern wo in der Struct _S_DATA liegt
while (ptr != NULL) //weiter durchsuchen bis das nächste Trennzeichen oder Ende kommt
{
ptr = strtok (NULL, Trennzeichen); // Line durchsuchen bis zum Trennzeichen oder Ende und in ptr zwischen speichern
switch (i) //Um in Unterschiedlichen Variablen zu speichern
{
case 2: strcpy(S_DATA.RG,ptr); break;
case 3: strcpy(S_DATA.GR,ptr); break;
case 4: strcpy(S_DATA.GE,ptr); break;
}
i++; //Variable i um eins hochzählen
}
}
//------------------------------------------------------------------------------------------
//Hauptprogramm
int main(void)
{
//Variablen Deklartion
int time = 1000;
int time1 = 1000;
char Buffer[9]; //String mit maximal 8 zeichen
int a; //Umwandlung ascii zu integer
DDRB = 0xFF;
PORTB = 0xFF;
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
string_zer(); //String in seine Teile zerlegen
uart_puts(S_DATA.Rot);
uart_puts(S_DATA.GE);
a = atoi (S_DATA.Rot); //Rot in integer wandeln
time = a *1000; // mal 1000 um auf sekunden zu kommen
itoa (time, Buffer, 10); //time in char umwandeln
uart_puts(Buffer); //Buffer senden
}
//---------------------------------------------------------------------------------------------
else
{
PORTB = 0b00000000;
delay_ms(time1);
PORTB = 0b00001111;
delay_ms(time);
PORTB = 0b11110000;
delay_ms(time1);
PORTB = 0b11111111;
delay_ms(time);
}
}
}
Lesezeichen