Hi,
//Wenn die erste Auswertung von Tastenabfrage() 1 ergibt, und die zweite 10, //dann wertet es dein Programm so aus, als würde zweimal die 10 //rauskommen.
ich habe vercuht nur die Fälle auseinander zu halten, wenn es nicht mit 1,10,33 geht kann ich dafür Zeichen nehmen, oder 1,2,3.
hier sind die Codes.
Danke
ADKanallesen
IntteruptroutineCode:#include <avr/io.h> #include "Initialisierung.h" #include <util/delay.h> #include <avr/interrupt.h> //variablen uint16_t U_analog; uint16_t Tastenwert; uint16_t Stromwert; extern uint8_t Prozessflag; //Funktion zur A/D-Wandlung uint16_t ADkanalLesen() { uint8_t i; uint16_t ergebnis = 0;//A/D-Wert unsigned char Durchlaeufe =4; for (i=0; i<Durchlaeufe; i++) { ADCSRA |= (1<<ADSC); //Startet eine A/D-Wandlung (Single Conversion) while (ADCSRA & (1<<ADSC)) { ; // auf Abschluss der Konvertierung warten } ergebnis += ADCW; // Wandlungsergebnisse werden aufaddieren } ADCSRA &= ~(1<<ADEN); //A/D-Wandler wird deaktiviert ergebnis /= Durchlaeufe; // Summe durch 4 teilen (Mittelwert) U_analog = (ergebnis*u_ref)/1024; return U_analog; //Analogwert }
Code:#include <avr/io.h> #include "Initialisierung.h" #include <util/delay.h> #include <avr/interrupt.h> extern uint8_t Prozessflag; //Globale Variable uint8_t Zustand; uint8_t Anreiz; uint16_t Zaehler=0; extern uint16_t Tastenwert; extern uint16_t Stromwert; // InterruptVectoren ISR( TIM0_OVF_vect ){ // Interruptroutine bei Timeroverflow TCNT0 = TCNT0init; //Counter zurück auf Startwert 58 gesetzt ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0)| (1<<ADIE); //AD-Wandler aktiviert(ADEN), Prescaler auf 32(ADSPSO,ADPS2) //Interrupt enable aktiv ADMUX |= (0<<REFS1) | (0<<REFS0); // Vcc als Referenzspannung die getrennt von AREF ist // Kanal waehlen und Vcc als Referenzspannung if(Zaehler%2){//bei 50ms und in einem 100ms Zeitabstand eine ADWandlung ausführen und ein ADInterrupt auszulösen ADMUX|=PINTASTEN; // Kanal auswählen(PIn wo die Tasten angehängt sind) ADCSRA |= (1<<ADSC) ; //Startet eine A/D-Wandlung (Single Conversion) } Zaehler++; } ISR( ADC_vect){ if(Zaehler%2){ Tastenwert=ADkanalLesen();//Tastenwert nimmt den Wert von der ADWandlung an (analogwert) Prozessflag|= Tasten;//Prozessflag wird auf Tasten gesetzt (fragt die tasten ab bei der Funktion Tastenabfrage) } }
initialisierung.h
in initialisierung sind andere Funktionen deklariert die ich da nicht zugefügt habeCode:#include <avr/io.h> #include <stdint.h> /Prozessflags #define Benutzeroberflaeche (1<<0) #define Tasten (1<<1) #define Rechnen (1<<2) // Tasten // #define KeineTaste 1 #define TasteEins 1 #define TasteZwei 2 #define TasteDrei 3







Zitieren

Lesezeichen