Einer Magische Glasskügel:
Bild hier
Na ja, dass das LCD-display Taster hat ist mir schon bekannt. Aber in welcher Folge sind sie an geprellt.
Druckbare Version
Einer Magische Glasskügel:
Bild hier
Na ja, dass das LCD-display Taster hat ist mir schon bekannt. Aber in welcher Folge sind sie an geprellt.
Hallo
Hier zuerst mal dein etwas umformatierter Code:
Was mir als Wichtigstes erscheint: Eigentlich dürftest du nur einmal eine Ausgabe von speed erhalten, denn nach dem ersten Aufruf von start() wird o (sehr schlechter Variablenname!) zu 0 und das Programm verläßt nach MotorSpeed(); den asuro (und verschwindet im Nirwana!):PHP-Code:
#include "stdlib.h"
#include "asuro.h"
#include "lcd.h"
#include "i2c.h"
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 < 355) //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--;
}
//Hauptprogramm
int main(void)
{
//Geschwindigkeit
//void int speed = 100;
int speed = 100;
Init();
InitI2C();
InitLCD();
GREEN_LED_ON;
while(o > 0)
{
PrintSetLCD(0,0,"Geschwindigkeit");
SetCursorLCD(0, 1);
PrintIntLCD(speed);
start(speed);
}
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
return 0;
}
Zur besseren Übersichtlichkeit würde ich die if/else-Verschachtelungen in Start() durch switch/case ersetzen. Dann würde ich das Hauptprogramm in eine Endlosschleife packen und dann einen neuen Versuch starten.PHP-Code:
while(o > 0)
{
...
PrintIntLCD(speed);
start(speed);
}
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
return 0;
}
"Würde", denn ohne LCD mit seiner Lib und der I2C-Lib kann ich nun überhaupt nichts mehr selbst testen, ich kann's nun nicht mal mehr übersetzen. :(
Aber egal, mach mal weiter.
Gruß
mic
Edit: Anstelle von while(o > 0) ein while(1) wäre ein schneller Test für die start()-Funktion ohne Motorbewegung. ;)
hm ich glaube wir reden an einander vorbei :D:D
in dem programm gebe ich ja die variable speed zur funktion start und dort kann ich das ja mithilfe der taster rauf oder runter setzen
das problem ist lediglich das er den wert speed nicht wieder zur main gibt, sondern nur mit dem definierten wert 100 nimmt.
im internet habe ich gelesen das (int &speed) helfen sollte funktioniert aber nicht.
das ist garnicht das fertige programm doch das problem ist mir beim schreiben des programmes aufgefallen das das nich funktioniert.
bei bedarf kann ich hier das fertige programm poste
mfg
Hermann
Upps, du hast recht, wir reden aneinander vorbei. Versuche es mal so:
void start()
{
....
start() sollte dann die Variable speed von main() übenehmen. Wenn's dann immer noch nicht funzt:
//Hauptprogramm
int speed = 100;
int main(void)
{
Init();
...
So ist speed auf jeden Fall global
Oder start() als Funktion mit Rückgabewert:
int start(int speed)
{
...
}
o--;
return(speed);
}
und Aufruf mit Zuweisung:
...
PrintIntLCD(speed);
speed = start(speed);
}
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){}
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?
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 ;)
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!!!!!!)