NikNek
04.01.2007, 17:11
Hallo, ich habe mir die Codeschnipsel von muraad runtergeladen und aalles funktioniert auhc wunderbar mit einem Eingang, da ich aber 2 Sensoren (CNY70) habe möchte ich ständig die Werte von diesen in 2 unterschiedlichen integern speichern.
Mein jetziger Code
int main(void) // Main-Funktion, d.h. dass was der Roboter macht!
{
init();
warte(2000);
unsigned int l; // ADC-Wert für linken Sensor
unsigned int r; // ADC-Wert für rechten Sensor
ADCinit;
ADCchannel_init;
//ADCfree;
ADCvintern;
//ADCinterrupt_on;
ADCprescaler_16;
while(1==1)
{
ADCchannel_1;
ADCstart;
l=getadc();
ADCchannel_reset;
ADCchannel_2;
ADCstart;
r=getadc();
if (l>0 && l<8) // wenn schwarzer Untergrund
L_Motor_v();
if (l>=8) // wenn weißer Untergrund
L_Motor_r();
if (r>0 && r<8) // wenn schwarzer Untergrund
R_Motor_v();
if (r>=8) // wenn weißer Untergrund
R_Motor_r();
warte(10);
}
return 0;
}
Jedoch funktioniert dieser nicht.
Bitte um schnelle Hilfe.
PS: Hier noch die Defines aus dem Codeschnipsel:
/* Analog/Digital converting */
#define ADCchannel_init DDRA=0x00 // ADC Port als Eingang deklarieren
#define ADCinit ADCSRA|=_BV(ADEN) // Teilt dem Board mit, dass der jeweilige Port für ADC verwendet wird
#define ADCdisable ADCSRA &=~_BV(ADEN) // mach das vorherige wieder rückgängig
#define ADCstart ADCSRA|=_BV(ADSC) // startet eine Konvertierung auf dem gewünschten Kanal/Pin
#define ADCfree ADCSRA|=_BV(ADATE) // schaltet den freilaufenden Modus ein
#define ADCvintern ADMUX|=_BV(REFS0) // interne Spannungsversorgung
#define ADCinterrupt_on ADCSRA|=_BV(ADIE) // ADC interrupt wird freigeschaltet
#define ADCprescaler_2 ADCSRA |=_BV(ADPS0) // gewünschter Teilungsfaktor/Prescaler
#define ADCprescaler_4 ADCSRA|=_BV(ADPS1)
#define ADCprescaler_8 ADCSRA=_BV(ADPS1) | _BV(ADPS0)
#define ADCprescaler_16 ADCSRA|=_BV(ADPS2)
#define ADCprescaler_32 ADCSRA=_BV(ADPS2) | _BV(ADPS0)
#define ADCprescaler_64 ADCSRA=_BV(ADPS2) | _BV(ADPS1)
#define ADCprescaler_128 ADCSRA=_BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0)
#define ADCprescaler_reset ADCSRA = ~_BV(ADPS2) & ~_BV(ADPS1) & ~_BV(ADPS0)
#define ADCchannel_1 // gewünschter Kanal z.B bei ATmega32 PINA0 - PINA7
#define ADCchannel_2 ADMUX|=_BV(MUX0) // wenn kein Freilaufen-Modus muss ADCchannel_x vor ADCstart
#define ADCchannel_3 ADMUX|=_BV(MUX1) // kommen, dann kann man mit getadc() den
#define ADCchannel_4 ADMUX= _BV(MUX1) | _BV(MUX0) // Adcwert des gewählten Kanals auslesen
#define ADCchannel_5 ADMUX|=_BV(MUX2)
#define ADCchannel_6 ADMUX= _BV(MUX2) | _BV(MUX0)
#define ADCchannel_7 ADMUX= _BV(MUX2) | _BV(MUX1)
#define ADCchannel_8 ADMUX= _BV(MUX2) | _BV(MUX1) | _BV(MUX0)
#define ADCchannel_reset ADMUX= ~_BV(MUX2) & ~_BV(MUX1) & ~_BV(MUX0)
inline unsigned int getadc(void)
{
while (ADCSRA & _BV(ADSC)) {}
return ADC;
}
Mein jetziger Code
int main(void) // Main-Funktion, d.h. dass was der Roboter macht!
{
init();
warte(2000);
unsigned int l; // ADC-Wert für linken Sensor
unsigned int r; // ADC-Wert für rechten Sensor
ADCinit;
ADCchannel_init;
//ADCfree;
ADCvintern;
//ADCinterrupt_on;
ADCprescaler_16;
while(1==1)
{
ADCchannel_1;
ADCstart;
l=getadc();
ADCchannel_reset;
ADCchannel_2;
ADCstart;
r=getadc();
if (l>0 && l<8) // wenn schwarzer Untergrund
L_Motor_v();
if (l>=8) // wenn weißer Untergrund
L_Motor_r();
if (r>0 && r<8) // wenn schwarzer Untergrund
R_Motor_v();
if (r>=8) // wenn weißer Untergrund
R_Motor_r();
warte(10);
}
return 0;
}
Jedoch funktioniert dieser nicht.
Bitte um schnelle Hilfe.
PS: Hier noch die Defines aus dem Codeschnipsel:
/* Analog/Digital converting */
#define ADCchannel_init DDRA=0x00 // ADC Port als Eingang deklarieren
#define ADCinit ADCSRA|=_BV(ADEN) // Teilt dem Board mit, dass der jeweilige Port für ADC verwendet wird
#define ADCdisable ADCSRA &=~_BV(ADEN) // mach das vorherige wieder rückgängig
#define ADCstart ADCSRA|=_BV(ADSC) // startet eine Konvertierung auf dem gewünschten Kanal/Pin
#define ADCfree ADCSRA|=_BV(ADATE) // schaltet den freilaufenden Modus ein
#define ADCvintern ADMUX|=_BV(REFS0) // interne Spannungsversorgung
#define ADCinterrupt_on ADCSRA|=_BV(ADIE) // ADC interrupt wird freigeschaltet
#define ADCprescaler_2 ADCSRA |=_BV(ADPS0) // gewünschter Teilungsfaktor/Prescaler
#define ADCprescaler_4 ADCSRA|=_BV(ADPS1)
#define ADCprescaler_8 ADCSRA=_BV(ADPS1) | _BV(ADPS0)
#define ADCprescaler_16 ADCSRA|=_BV(ADPS2)
#define ADCprescaler_32 ADCSRA=_BV(ADPS2) | _BV(ADPS0)
#define ADCprescaler_64 ADCSRA=_BV(ADPS2) | _BV(ADPS1)
#define ADCprescaler_128 ADCSRA=_BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0)
#define ADCprescaler_reset ADCSRA = ~_BV(ADPS2) & ~_BV(ADPS1) & ~_BV(ADPS0)
#define ADCchannel_1 // gewünschter Kanal z.B bei ATmega32 PINA0 - PINA7
#define ADCchannel_2 ADMUX|=_BV(MUX0) // wenn kein Freilaufen-Modus muss ADCchannel_x vor ADCstart
#define ADCchannel_3 ADMUX|=_BV(MUX1) // kommen, dann kann man mit getadc() den
#define ADCchannel_4 ADMUX= _BV(MUX1) | _BV(MUX0) // Adcwert des gewählten Kanals auslesen
#define ADCchannel_5 ADMUX|=_BV(MUX2)
#define ADCchannel_6 ADMUX= _BV(MUX2) | _BV(MUX0)
#define ADCchannel_7 ADMUX= _BV(MUX2) | _BV(MUX1)
#define ADCchannel_8 ADMUX= _BV(MUX2) | _BV(MUX1) | _BV(MUX0)
#define ADCchannel_reset ADMUX= ~_BV(MUX2) & ~_BV(MUX1) & ~_BV(MUX0)
inline unsigned int getadc(void)
{
while (ADCSRA & _BV(ADSC)) {}
return ADC;
}