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
Code:
#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
}
Intteruptroutine
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
Code:
#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
in initialisierung sind andere Funktionen deklariert die ich da nicht zugefügt habe
Lesezeichen