Hi inka,
wie versprochen hier das Programm zur Tasterabfrage der M32.
Du musst das natürlich anpassen, ich habe es nur schnell überflogen und überflüssiges gelöscht. So das es deutlich wird was ich in meinte.
Hi inka,
wie versprochen hier das Programm zur Tasterabfrage der M32.
Du musst das natürlich anpassen, ich habe es nur schnell überflogen und überflüssiges gelöscht. So das es deutlich wird was ich in meinte.
Gruß TrainMen
danke TrainMen,
die nächste frage:
die abfrage taucht mehrmals in meinem programm auf, kann ich diese abfrage zu einer funktion "void abbruch (void)" machen, oder wird es wegen der schleife und der if abfrage nicht funktionieren?
Code:do { pressedMultiIOButtonNumber = checkMultiIOPressedButtonEvent(); task_I2CTWI(); if (pressedMultiIOButtonNumber == 4) main(); } while (pressedMultiIOButtonNumbe
gruß inka
@inka:
Der Aufruf der main() und auch noch ohne Abbruch der do-while Struktur ist keine gute Idee!
Das dürfte irgendwann zu einem Stacküberlauf und zum Programmende führen.
Das sind dann schwer zu findende Fehler!
Was du ja wohl machen willst ist eine Art "Menüstruktur". Du drückst eine Taste und ein Programmteil startet. Dann beendet man das wieder durch einen Tastendruck und kommt zurück ins Auswahlmenü.
Das braucht etwas mehr Aufwand, als per brute-force in die main zurückzuspringen.
Du kannst aber z.B. im RP6Base_SELFTEST.c sehen, wie man ein solches Menü bauen kann.
Gruß
Dirk
genau. und wenn es mit "brutaler kraft" sein muss - ich hatte keine idee und dachte eher an das gute alte "goto" aus basic-zeiten. Würde das ein eingesetztes break abmildern, oder ist die ganze idee für die katz?
meinst Du das hier?
ich erkenne hier eher eine einstufige abfragesituation und innerhalb der einzelnen cases oder if-abfragen läuft hier keine while-schleife...Code:test = receiveBuffer[0] - 48; if(receiveBuffer[0] == 's') { speed_control(); } else if(receiveBuffer[0] == 'd') { testMoveDistance(); } else if(receiveBuffer[0] == 'c') { testEncoderDutyCycle(); } else if(test > 8) { writeString_P("You need to enter a single number from 0 to 8, s, d or c!"); continue; } else { switch(test) { case 0: testPowerOn(); testLEDs(); testVoltageSensor(); testBumpers(); testLightSensors(); testACS(); testRC5(); testMotorsAndEncoders(); break; case 1: testPowerOn(); break; case 2: testLEDs(); break; case 3: testVoltageSensor(); break; case 4: testBumpers(); break; case 5: testLightSensors(); break; case 6: testACS(); break; case 7: testRC5(); break; case 8: testMotorsAndEncoders(); break; } }
gruß inka
@inka:
Goto gibt's immer noch,- ist aber ziemlich verpönt. Es läßt sich auch sehr gut umgehen ......und dachte eher an das gute alte "goto" aus basic-zeiten. Würde das ein eingesetztes break abmildern, oder ist die ganze idee für die katz?
Das sieht nur so aus. In den einzelnen Funktionen des Testprogramms wird teilweise auch eine Abbruchbedingung abgefragt....ich erkenne hier eher eine einstufige abfragesituation und innerhalb der einzelnen cases oder if-abfragen läuft hier keine while-schleife...
D.h.: Die Einzelfunktionen bestimmen selbst, ob sie einmalig durchlaufen oder dauerhaft bis zu einer Abbruchbedingung. Daher braucht es in der case Struktur keine do-while Schleife.
Gruß
Dirk
danke erstmal für die antworten...
hier mein problem noch einmal (etwas detailierter):
RP6Control_08_I2CMaster.c , auskommentierter bereich:
/** * This is a new Event Handler and it gets called when the Battery Voltage
* is getting low! The Parameter isVoltageLow is true, when the voltage
* is low and false, when the voltage is OK.
*/
/*
void batteryVoltageLow(uint8_t isVoltageLow)
{
if(isVoltageLow)
{
writeString_P("\nBattery Voltage low: ");
// Send Battery voltage to UART:
writeIntegerLength((((adcBat/102.4f)+0.1f)), DEC, 2);
writeChar('.');
writeIntegerLength((((adcBat/1.024f)+10)), DEC, 2);
writeString_P("V\n");
}
else
{
writeString_P("\nBattery Voltage is OK!\n");
}
}
*/
standard.c, funktion hinzugefügt:
/************battery_voltage_low******************* ******/
void batteryVoltageLow(uint8_t isVoltageLow)
{
if(isVoltageLow)
{
writeString_P("\nBattery Voltage low: ");
// Send Battery voltage to UART:
writeIntegerLength((((adcBat/102.4f)+0.1f)), DEC, 2);
writeChar('.');
writeIntegerLength((((adcBat/1.024f)+10)), DEC, 2);
writeString_P("V\n");
}
else
{
writeString_P("\nBattery Voltage is OK!\n");
}
}
standard.h, deklaration (die zeile, die moniert wird hervorgehoben):
//void receiveRC5Data(void (RC5data_t) (rc5data));
//void batteryVoltageLow(void);
void batteryVoltageLow (uint8_t isVoltageLow);
//void printAllSensorValues(void);
//void task_LCDHeartbeat(void);
//void watchDogRequest(void);
erstellungsprotokoll beim kompilieren:
ich kann keinen fehler erkennen, wüsste ich auch nicht wo ich dort die ")" hinzufügen soll?-------------- Erstellen: RP6Control_08_I2CMaster in m32_samples ---------------
Compiliere: ../../RP6Lib/RP6common/RP6I2CmasterTWI.c
../../RP6Lib/RP6common/RP6I2CmasterTWI.c: In function ‘I2CTWI_requestedDataReady_DUMMY’:
../../RP6Lib/RP6common/RP6I2CmasterTWI.c:55:46: warning: unused parameter ‘requestID’
../../RP6Lib/RP6common/RP6I2CmasterTWI.c: In function ‘I2CTWI_transmissionError_DUMMY’:
../../RP6Lib/RP6common/RP6I2CmasterTWI.c:62:45: warning: unused parameter ‘requestID’
Compiliere: ../../RP6Lib/RP6common/RP6uart.c
Compiliere: ../../RP6Lib/RP6control/RP6ControlLib.c
Compiliere: ../../RP6Lib/RP6control/RP6Control_I2CMasterLib.c
../../RP6Lib/RP6control/RP6Control_I2CMasterLib.c: In function ‘IRCOMM_RC5dataReady_DUMMY’:
../../RP6Lib/RP6control/RP6Control_I2CMasterLib.c:62:42: warning: unused parameter ‘rc5data’
../../RP6Lib/RP6control/RP6Control_I2CMasterLib.c: In function ‘BATTERY_lowVoltage_DUMMY’:
../../RP6Lib/RP6control/RP6Control_I2CMasterLib.c:93:39: warning: unused parameter ‘isVoltageLow’
Compiliere: ../../RP6Lib/RP6mio/RP6Control_MultiIOLib.c
Compiliere: ../../RP6Lib/standard/standard.c
In file included from ../../RP6Lib/standard/standard.c:1:0:
../../RP6Lib/standard/standard.h:38:33: error: expected ‘)’ before ‘isVoltageLow’
Prozess wurde mit Status 1 beendet. (0 Minuten, 0 Sekunden)
1 Fehler, 4 Warnungen
gruß inka
Hallo inka,
Das ist eine schwäche von C.
Der Fehler ist immer zwischen dem Anfang der Datei und der Stelle welche der Compiler angibt!
BTW: woher kennt der Compiler uint8_t ??
Da müsste irgendwo eine Definition davon ein, vielleicht in einer Headerdatei, welche vergessen wurde?
MfG Peter(TOO)
uint8_t kennt der Compiler in diesem Fall.
Der Fehler liegt VOR dieser Fehlerzeile.
Such mal die ganze Header-Datei ab oder poste sie hier (keine Ausschnitte, sondern den kompletten Header, so wie er kompiliert wurde).
Gruß
Dirk
das hier ist der komplette header:
Code:#ifndef STANDARD_H_ #define STANDARD_H_ #endif /*STANDARD_H_*/ void accuspannung(void); void accuzustand(void); void watchDogRequest(void); void task_LCDHeartbeat(void); void printAllSensorValues(void); //void writeDoubleLCD(void); //void writeDouble(void); //void I2C_transmissionError(); //void show_buttons(); //ACS_setStateChangedHandler(acsStateChanged); void acsStateChanged(void); void bumpersStateChanged(void); //void receiveRC5Data(void); //void receiveRC5Data(void (RC5data_t) (rc5data)); //void batteryVoltageLow(void); void batteryVoltageLow (uint8_t isVoltageLow); //void printAllSensorValues(void); //void task_LCDHeartbeat(void); //void watchDogRequest(void); //ACS_setStateChangedHandler(void); //ACS_setStateChangedHandler(acsStateChanged);
gruß inka
Hallo Dirk,
Woher ?
MfG Peter(TOO)
- - - Aktualisiert - - -
Hallo Inka,
Und wie sieht das Hauptprogramm aus?
Besonders: Welche Header bindest du da ein und in welcher Reihenfolge?
Ich bin immer noch der Meinung, dass der Compiler zu diesem Zeitpunkt nicht weiss was uint8_t sein soll.
MfG Peter(TOO)
Lesezeichen