Gast
#1416596
Hallo Leute,
folgendes Problem habe ich. Die Software funktioniert eigentlich wunder
bar. Aber sobal ich den "Taster 4" drücke, geht der PORTD7 auf eins und
es funktioniert nichts mehr. Ich habe schon alles mögliche ausprobiert,
sogar für jeden einzigen Taster Variablen angelegt, wie man in der
Software sieht.
Ich habe das Gefühl, dass die die Software die while Schleife verläßt
und dann stoppt. Was mache ich falsch?
Die Software soll eigentlich "ewig" in der Schleife bleiben!
#include <avr/io.h>
#include "Taster.h"
int main(void)
{
DDRD |= (1<<7);
DDRB |= (1<<0) | (1<<3) | (1<<4) | (1<<5);
DDRC |= (1<<4) | (1<<7);
int16_t adcval2, adcval3, adcval4, adcval5, adcval7, adcval9,
adcval10;
int16_t offset2, offset3, offset4, offset5, offset7, offset9,
offset10;
int16_t ergebn2, ergebn3, ergebn4, ergebn5, ergebn7, ergebn9,
ergebn10;
offset2 = ReadChannel(2);
offset3 = ReadChannel(3);
offset4 = ReadChannel(4);
offset5 = ReadChannel(5);
offset7 = ReadChannel(7);
offset9 = ReadChannel(9);
offset10 = ReadChannel(10);
while (1)
{
//Taster 3
adcval2 = ReadChannel(2);
ergebn2 = offset2 - adcval2;
if (ergebn2 > 10)
{
PORTB |= (1<<0);
}
else PORTB &= ~(1<<0);
//Taster 4
adcval3 = ReadChannel(3);
ergebn3 = offset3 - adcval3;
if ((ergebn3 > 10 ) && (bit_is_clear(PIND,7)))
{
PORTD |= (1<<7);
}
else if ((ergebn3 > 10) && (bit_is_set(PIND,7)))
{
PORTD &= ~(1<<7);
}
//Taster 1
adcval5 = ReadChannel(5);
ergebn5 = offset5 - adcval5;
if (ergebn5 > 10 )
{
PORTC |= (1<<4);
}
else PORTC &= ~(1<<4);
//Taster 5
adcval9 = ReadChannel(9);
ergebn9 = offset9 - adcval9;
if (ergebn9 > 10 )
{
PORTB |= (1<<3);
}
else PORTB &= ~(1<<3);
//Taster 6
adcval10 = ReadChannel(10);
ergebn10 = offset10 - adcval10;
if (ergebn10 > 10 )
{
PORTB |= (1<<4);
}
else PORTB &= ~(1<<4);
//Taster 7
adcval4 = ReadChannel(4);
ergebn4 = offset4 - adcval4;
if (ergebn4 > 10 )
{
PORTC |= (1<<7);
}
else PORTC &= ~(1<<7);
//Taster 8
adcval7 = ReadChannel(7);
ergebn7 = offset7 - adcval7;
if (ergebn7 > 10 )
{
PORTB |= (1<<5);
}
else PORTB &= ~(1<<5);
}
return 0;
}
uint16_t ReadChannel(uint8_t mux)
{
uint8_t i;
uint16_t result;
ADMUX = mux; //Channel wählen
ADMUX |= (1<<REFS0); //AVCC ohen Kondensator
ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); //Frequwnzvorteiker
setzen auf 8 udn ADC aktivieren
ADCSRA |= (1<<ADSC); // Starte umwandlung
while (ADCSRA & (1<<ADSC)){;} // auf Abschluß der Konvertiereung
warten
result = ADCW; //ADC lesen
result = 0;
for (i=0;i<4;i++){
ADCSRA |= (1<<ADSC); // Starte umwandlung
while (ADCSRA & (1<<ADSC)) {;}
result += ADCW;
}
ADCSRA &= ~(1<<ADEN);
result /= 4;
return result;
}