Hallo
Ich muss zugeben dass ich zu Anfang auch t++; da stehen hatte. Hab aber gedacht versuchst es mal auf die alte Variante als mein Programm nicht funktioniert hat...Wollte eben alles ausschließen...
Nun hab ich mal noch den kompletten Code:
Was ich eigentlich wie gesagt will, ist dass die while Schleife 1min läuft, und in dieser Zeit immer wieder der Analogwert eingelesen wird und in Abhängigkeit von diesem (größer oder kleiner eines Referenzwertes) ein Port geschalten wird. Das will aber noch nicht so richtig. Die andere LED benutze ich auch um mir anzuzeigen bis "wohin" das Programm bereits funktioniert. Also nicht irritieren lassen...Code:#include <avr/io.h> #include <inttypes.h> #include <avr/interrupt.h> #include <stdlib.h> #include <lcd.h> #include <util/delay.h> #define F_CPU = 12000000L void long_delay(uint16_t ms); //Prototyp der Warteschleifen long_delay void ADC_init(void); //Prototyp von ADC_init uint16_t ADC_einlesen(void); //Prototyp der Einlesefunktion uint16_t result = 0; //Variable result deklarieren char buffer[8]; //buffer_Array für Umrechnung deklarieren volatile int t=0; //Variable t für Timer anlegen int a=0; int main(void) { ADC_init(); //AD Wandler initialisieren ADC_einlesen(); DDRD &= ~(1<<DDD2); //Pin D2 (INT0) als Eingang deklarieren PORTD |= (1<<PD2); //Pull Up für D2 einschalten DDRB = (1<<DDB0)|(1<<DDB1); //Port B0 als Ausgang definieren (LED) PORTB |= (1<<PB0); //LED aussschalten PORTB |= (1<<PB1); //LED aussschalten TCCR0 |= (1<<CS00)|(1<<CS02); //Timer initialisieren und einschalten TIMSK |= (1<<TOIE0); //TimerOverflow Interrupt freigeben sei(); //Interrupts freigeben while(t<2760) { ADC_einlesen(); PORTB &= ~(1<<PB0); //Einschalten der LED an B0 if(result<350) { PORTB &= ~(1<<PB1); //Einschalten der LED an B1 } else { PORTB |= (1<<PB1); //wenn result größer, LED ausschalten } } t=0; while(1); } void ADC_init(void) { ADCSRA = (1<<ADEN) | (1<<ADPS0) | (1<<ADPS2); //ADC amtivieren und Teilungsfaktor auf 32 stellen ADMUX = (!(1<<MUX0)) | (!(1<<MUX1)) | (!(1<<MUX2)); //Kanal des Multiplexers wählen (ADC 0) ADMUX |= (1<<REFS1) | (1<<REFS0); //interne Referenzspannung verwenden (2,56V) ADCSRA |= (1<<ADSC); //Dummyreadout starten while(ADCSRA & (1<<ADSC)); } uint16_t ADC_einlesen(void) { uint8_t i; //Variable i deklarieren for (i=0; i<3; i++) //for-Schleife für dreimalige Wandlung { ADCSRA |= (1<<ADSC); //Wandlung starten while(ADCSRA & (1<<ADSC)); //auf Ergebnis warten result += ADC; //Ergebnis in Variable result schreiben } ADCSRA &= ~(1<<ADEN); //ADC deaktivieren result /=3; //result durch 3 teilen return result; } ISR(TIMER0_OVF_vect) { t=t+1; }
Grüße!!
Bean







Wollte eben alles ausschließen...
Zitieren

Lesezeichen