Hallo
Code:
#include "RP6RobotBaseLib.h"
unsigned char brightOld = 0;
unsigned char bright = 0;
void light(void){
if(adcLSR<400){
bright = 1;
}
else if((adcLSR<=1000)&&(adcLSR>=400)){
bright = 0;
}
else if (adcLSR>1000){
bright = 2;
}
if(bright != brightOld){
switch(bright){
case 0:
writeString_P("\nIch bin glücklich\n");
break;
case 1:
writeString_P("\nMach das Licht an!\n");
break;
case 2:
writeString_P("\nMir ist es hier zu hell!\n");
break;
}
}
brightOld = bright;
}
int main (void)
{
initRobotBase();
while(true)
{
task_ADC();
light();
}
return 0;
}
Das Problem war die lokale Variable bright die nicht initialisiert wurde. Bei jedem Aufruf von light() wurde sie neu angelegt und hatte dann den zufälligen Wert, der im Speicher stand.
Für bright==0 habe ich noch eine Meldung eingefügt damit man merkt, wenn sich die Helligkeit ändert. Die Abfrage zum Setzen von bright=0 habe ich um <= bzw. >= erweitert.
Mit dem adc-Task wird nur bei jedem 6sten Aufruf ein neuer Wert in adcLSR gespeichert:
Code:
void task_ADC(void)
{
static uint8_t current_adc_channel = 0;
if(!(ADCSRA & (1<<ADSC))) {
// ADCSRA |= (1<<ADIF);
switch(current_adc_channel) {
case 0: adcBat = ADC; startADC(ADC_MCURRENT_L); break;
case 1: adcMotorCurrentLeft = ADC; startADC(ADC_MCURRENT_R); break;
case 2: adcMotorCurrentRight = ADC; startADC(ADC_LS_L); break;
case 3: adcLSL = ADC; startADC(ADC_LS_R); break;
case 4: adcLSR = ADC; startADC(ADC_ADC0); break;
case 5: adc0 = ADC; startADC(ADC_ADC1); break;
case 6: adc1 = ADC; startADC(ADC_BAT); break;
}
if(current_adc_channel == 6)
current_adc_channel = 0;
else
current_adc_channel++;
}
}
Das könnte man berücksichtigen und in light() zuerst prüfen, ob sich adcLSR seit dem letzen Aufruf geändert hat.
Übrigens hat der Mega32 reichlich Speicher, den könnt ihr mit den paar Programmzeilen nie füllen
Nettes Programm..
Gruß
mic
Lesezeichen