hmm hab alles ausprobiert.. der arbeitet aber trotzdem mit 100
Werbung
hmm hab alles ausprobiert.. der arbeitet aber trotzdem mit 100
Sind deine änderungen in das .c datei gespeichert und dannach neu ubersetzt? Das speichern wird oft vergessen.
Oje, langsam wird's zäh. Versuche mal das:
Nicht getestet, aber mit diesen Dummy-Files fehlerfrei übersetzt:PHP-Code:#include "stdlib.h"
#include "asuro.h"
#include "lcd.h"
#include "i2c.h"
int o = 1;
//Geschwindigkeit
int speed = 100;
void start(void)
{
int keys;
int i = 1;
while(i)
{
keys = PollSwitchLCD();
if(!keys)
{
Msleep(100);
}
else
{
switch(keys)
{
case LCD_KEY_YELLOW:
if(speed < 246) speed = speed +10;
break;
case LCD_KEY_BLUE:
if(speed > 9) speed = speed -10;
break;
case LCD_KEY_RED:
i = 0;
break;
}
ClearLCD();
PrintSetLCD(0,0,"Geschwindigkeit");
SetCursorLCD(0, 1);
PrintIntLCD(speed);
}
}
o--;
}
//Hauptprogramm
int main(void)
{
Init();
InitI2C();
InitLCD();
GREEN_LED_ON;
while(o > 0)
{
PrintSetLCD(0,0,"Geschwindigkeit");
SetCursorLCD(0, 1);
PrintIntLCD(speed);
start();
}
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
while(1); // Das Programm darf nie beendet werden!
return 0;
}
lcd.h:lcd.cPHP-Code:#define LCD_KEY_YELLOW 1
#define LCD_KEY_BLUE 2
#define LCD_KEY_RED 4
void InitLCD(void);
int PollSwitchLCD(void);
void ClearLCD(void);
void SetCursorLCD(unsigned char colum, unsigned char line);
void PrintIntLCD(int i);
void PrintSetLCD(unsigned char colum, unsigned char line, char *data);
void InitI2C(void);
PHP-Code:#define LCD_KEY_YELLOW 1
#define LCD_KEY_BLUE 2
#define LCD_KEY_RED 4
void InitLCD(void){}
int PollSwitchLCD(void){return(0);}
void ClearLCD(void){}
void SetCursorLCD(unsigned char colum, unsigned char line){}
void PrintIntLCD(int i){}
void PrintSetLCD(unsigned char colum, unsigned char line, char *data){}
void InitI2C(void){}
![]()
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Aber dan wird es immer noch das selbe Zeichen auf dem LCD. (Geschwindigkeit 100) Weil am ende der erste Durchlauf von start wird die globale Variable o auf 0 gesetzt. (ist am Anfang 1) Das verhindert den zweite Durchlauf von den while-schleife in das main Programm. Und geht dann (nach der Motor Kommandos) in dem Endlos--schleife von Radbruch. Was genau bedeutet diese Variable "o". Was ist ihre Funktion in dein (Hermann Wessel) Logik? Wieso wird sie am ende von den start Funktion decrementiert?
Geändert von Valen (01.04.2011 um 14:58 Uhr)
Das Display wird auch in start() nach jedem Tastendruck aktualisiert. Sein Programm ist wohl ein Ausschnitt eines größeren Programms, vielleicht dient o dort zur Steuerung des Ablaufs? In meiner Version wird speed einmalig editiert und dann schwirrt der asuro davon ;)
![]()
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Radbruch stimmt. Ohne Roten Taster wird es in dem Funktion start stecken bleiben und dem LCD aktualisieren.
(Notiz an selb: NICHT 2 Quellcodes durcheinander liesen!!!!!!)
so
tut mir echt leid für die verspätete antwort hatte letzen tage bissl stress^^
das hier ist mein volles programm
ich gehe mal von aus das ihr das dann versteht was o auf sich hat
das einzigste problem ist einfach das speed mit start zwar verändert werden kann aber nicht weiter übernommen wirdCode:#include "stdlib.h" #include "asuro.h" #include "lcd.h" #include "i2c.h" int speed = 100; int o = 1; void start(int speed) { int keys; int i = 1; int zaehler = 0 ; while(i >0) { keys = PollSwitchLCD(); if (keys & LCD_KEY_YELLOW) //schwarzer Taster { while ( zaehler == 0) { if(speed < 350) //Geschwindigkeit erhöhen { speed = speed +10; ClearLCD(); PrintSetLCD(0,0,"Geschwindigkeit"); SetCursorLCD(0, 1); zaehler = zaehler +1; PrintIntLCD(speed); } zaehler = zaehler +1; } } else if (keys & LCD_KEY_RED ) //roter Taster { //wechseln von der Geschwindigkeiseinstellung i = 0; //in den Messbetrieb } else if (keys & LCD_KEY_BLUE ) //Blauer Taster { while ( zaehler == 0) { if(speed >0) { speed = speed -10; //Geschwindigkeit vermindern ClearLCD(); PrintSetLCD(0,0,"Geschwindigkeit"); SetCursorLCD(0, 1); PrintIntLCD(speed); zaehler = zaehler +1; } zaehler = zaehler +1; } } if(!keys) // für das einmalige hochzählen beim drücken eines knopfes { Msleep(100); zaehler = 0; } } o--; } void berechnung(int zeit) { int keys; int reifen = 120; //Reifenumfang in mm int wegaenderung = 0; int inszeit = 0; int geschwindigkeit = 0; int durchschnitt = 0; int zaehler = 1 ; while(1) { int odometrie = encoder[0]; wegaenderung = odometrie + reifen / 8 / 10; inszeit = Gettime() /1000; geschwindigkeit = wegaenderung / inszeit; durchschnitt = wegaenderung / inszeit; keys = PollSwitchLCD(); if(keys) // für das ständige aktuallisieren der Daten { zaehler = 0; } if ((keys & LCD_KEY_YELLOW) || (zaehler == 1) ) // Geschwindigkeit { ClearLCD(); PrintSetLCD(0,0,"CM pro S"); SetCursorLCD(0, 1); PrintIntLCD(geschwindigkeit); zaehler = 1; } else if ((keys & LCD_KEY_RED) || (zaehler == 2)) //Zurückgelegter Weg { ClearLCD(); PrintSetLCD(0,0,"Weg in CM"); SetCursorLCD(0, 1); PrintIntLCD(wegaenderung); zaehler = 2; } else if ((keys & LCD_KEY_BLUE) || (zaehler == 3)) // Durchschnittsgeschwindigkeit { ClearLCD(); PrintSetLCD(0,0,"CM pro S"); SetCursorLCD(0, 1); PrintIntLCD(durchschnitt); zaehler = 3; } Msleep(100); } } //Hauptprogramm int main(void) { //Geschwindigkeit //void int speed = 100; Init(); InitI2C(); InitLCD(); EncoderInit(); EncoderSet(780,790); EncoderStart(); GREEN_LED_ON; while(o > 0) { PrintSetLCD(0,0,"Geschwindigkeit"); SetCursorLCD(0, 1); PrintIntLCD(speed); start(speed); } MotorDir(FWD,FWD); MotorSpeed(speed,speed); int zeit = Gettime() / 1000; //zeit in Sekunden ClearLCD(); PrintIntLCD(zeit); berechnung(zeit); }
Wenn du die Funktion mit "void start(int speed)" definierst, wird beim Aufruf eine für diese Funktion lokale Variable "speed" erzeugt. Diese ist nicht identisch mit der beim Programmstart global definierten gleichnamigen Variablen. Wenn du aber mit "void start(void)" keine Parameterübergabe festlegst, verwendet start() die selbe Variable wie main(). Dann wird die Änderung an der globalen Variablen durchgeführt.
![]()
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen