PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM Rechteckbreite über den den Hyperterminal ändern



bmtil
18.10.2011, 14:03
Hiho,
ich haette da ein recht fieses Problem was die C Programmierung meines AtMega 16 angeht.
Ich möchte über das Senden von einem Befehl, von zum Bsp. 3 Zeichen Länge + Wert von 0-1023, die Rechteckbreite meiner PWM ändern, und die Änderung auf dem Oszi sehen.
Die UART steht schon, die PWM auch, das Programm kann schon so einiges, zum Beispiel auf Befehl mir die Heizung an und ausmachen, Sensorwerte anzeigen lassen, etc.
Aber nun hänge ich daran einer Variable erstmal zu sagen dass sie nur einen Wertebereich von 0 bis 1023 annehmen darf (diese wird dann irgendwo in der mainloop gesetzt mit
zum bsp. pwm_rechteckbreite=OCR1A (OCR1A bestimmt die die Breite der PWM Rechtecke bei AtMega16).
Und des weiteren weiss ich nicht wie ich das hinkriegen soll dass ich der UART sage:
prb=255
dass dann, diese die Breite tatsaechlich auf 255 aendert.

Ich hab mal meine Quellcodes zu dem Programm, welches mittlerweile doch schon recht umfangreich ist hochgeladen.
Ich hoffe meine Problematik ist verstaendlich und schonmal vielen Dank für Anregungen und Hilfe.
Mit freundlichen Grüßen.

KR-500
18.10.2011, 14:27
Hi,

also ich gehe mal davon aus, dass deine Routine zum Empfangen funktioniert. Dann kannst du einfach die ersten vier Bytes von deinem Teststring nehmen ("prb=") und diese dann mit memcmp (http://www.cplusplus.com/reference/clibrary/cstring/memcmp/) vergleichen. Sollte der String dann übereinstimmen, kannst du mit atoi() oder einer selbst geschriebenen Funktion den String in einen Integer umwandeln und dem Register zuweisen.

Viele Grüße
KR-500

bmtil
19.10.2011, 08:54
Hi,

also ich gehe mal davon aus, dass deine Routine zum Empfangen funktioniert. Dann kannst du einfach die ersten vier Bytes von deinem Teststring nehmen ("prb=") und diese dann mit memcmp (http://www.cplusplus.com/reference/clibrary/cstring/memcmp/) vergleichen. Sollte der String dann übereinstimmen, kannst du mit atoi() oder einer selbst geschriebenen Funktion den String in einen Integer umwandeln und dem Register zuweisen.

Viele Grüße
KR-500

Diesen Vergleich mach ich schon mit der strcmp Funktion das funktioniert auch ganz gut.

Hab gerade noch ein viel schlimmeres (triviales?) Problem:
Und zwar hat mein Betreuer eine Subset Funktion gebaut,
die nach einem Leerzeichen schaut, wenn dieser in dem zu sendendem String vorhanden ist,
wird dieser String an der Stelle des Leerzeichens getrennt, und der String vor dem Leerzeichen als str_1 ausgegeben,
der nach dem Leerzeichen als str_2.
Allerdings funktioniert das alles nicht so richtig, wenn ich das mit dem Terminal überprüfen möchte.

Hab mal die 2 kritischen Code stellen hier in die code-tags gepackt:


while(1)
{

if (uart_str_complete == 1) //wenn der empfangene string komplett ist, dann

{
if (strcmp( uart_str, "Hzgaus" ) == 0 ) //soll empfangene string mit "LED aus" vergliechen werden, wenn die gleich sind, dann
{
LED_PORT = 0; //LED soll ausgehen
//uart_puts("aus"); //und puts soll mir eben den Text rausgeben
}

if (strcmp( uart_str, "Hzgan" ) == 0 ) //wenn aber der empfangene String "LED an" heisst, dann
{
LED_PORT = 1; //dann soll die LED angehen
//uart_puts("ein"); //und puts eben dazu
}
if (strcmp( uart_str, "snd")== 0)
{
wert_ausgabe();
}
if (strcmp(uart_str, "xxx yyy")==0)
{
//atoi (uart_str) ;
strcpy(str_in, uart_str);
subset();
uart_puts(str_1);
uart_puts(str_2);
}
uart_str_complete = 0; //das uart_str_complete wieder auf 0 setzen, damit die ISR weitere Dinge empfangen kann und nicht
} //dauernd zeug sendet
}
}


und die stringsubset funktion:



char str_in [10];
char str_1 [10];
char str_2 [10];

void subset()
{
char index_in, index_out;

index_in = 0;
index_out = 0;
while (str_in[index_in] != 0x20)
{
str_1[index_out] = str_in[index_in];
index_in++;
index_out++;
}
index_out = 0;
while (str_in[index_in] != 0x0a && str_in[index_in] != 0x0D)
{
str_2[index_out] = str_in[index_in];
index_in++;
index_out++;
}
}


Rest funktioniert.

Grüße.