Guten Morgen![]()
schon seit einiger zeit bin in nun an einem kleinen Projekt von mir dran, komme aber leider nicht weiter.
Die Problemstellung ist, ich habe einen ADV mit Spannungswandler nach +5V, der gegen Masse geschaltet wird. Die Werte dazu habe ich berechnet und scheint auch ganz gut zu funktionieren. Habe es kurz getestet.
Nun sollen diese 3 möglichen Felder, verschiedene funktionen haben, 2 Felder wie ein Taster und eines soll unterscheiden zwischen kurz gedrückt und gedrückt gehalten. Nun bin ich auf eure Tutorial "Taster-Abfrage in C" gestoßen. Diese ist genau das was ich suche. Also habe ich es mit meiner AD-Wandler abfrage kombiniert. Nur leider funktioniert so garnichts :/
Könnte sich vieleicht bitte mal wer meinen Code ansehen und mir vieleicht tips geben ?
Wäre sehr nett danke schonmalCode:#include <avr/io.h> #include <avr/interrupt.h> /* Wir haben 3 Taster, in taster.h wird also angepasst zu #define NUM_TASTER 3 */ #include "taster.h" #define ADC_VREF_TYPE 0x00 // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input|ADC_VREF_TYPE; // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } /* Bei 1MHz Grundtakt läuft Timer0 alle 256µs über. * Um auf rund 10ms zu kommen, rufen wir get_taster nur * jedes 39. mal auf. */ SIGNAL (SIG_OVERFLOW0) { static unsigned char count_ovl0; unsigned char ovl0 = count_ovl0+1; if (ovl0 >= 39) { unsigned int result = read_adc(0); get_taster (0, ((result >= 700) && (result <= 790)) ? 1:0); get_taster (2, ((result >= 800) && (result <= 880)) ? 1:0); get_taster (1, ((result >= 890) && (result <= 940)) ? 1:0); ovl0 = 0; } count_ovl0 = ovl0; } void ioinit() { /* Timer0 ohne Prescaler starten */ TCCR0 = 1 << CS00; /* Timer0-Overflow-Interrupt aktivieren */ TIMSK |= (1 << TOIE0); } int main() { ioinit(); // ADC initialization // ADC Clock frequency: 500,000 kHz // ADC Voltage Reference: AREF pin ADMUX=ADC_VREF_TYPE; ADCSRA=0x81; /* Taster konfigurieren (#define NUM_TASTER 3 in taster.h) */ tasten[0].mode = TM_SHORT; tasten[1].mode = TM_LONG; tasten[2].mode = TM_SHORT; /* Interrupts global aktivieren */ sei(); // Input/Output Ports initialization // Port B initialization // Func7=In Func6=Out Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out // State7=T State6=0 State5=T State4=T State3=T State2=0 State1=0 State0=0 PORTB=0x00; DDRB=0x47; /* Hauptschleife */ while (1) { signed char tast = taster; switch (tast) { default: case NO_TASTER: PORTB &= ~((1<< PINB6) | (1 << PINB2) | (1 << PINB1) | (1<< PINB0)); break; case 0: /* Taster 0 */ PORTB = (1 << PINB0); // PB0 amschalten break; case 1: /* Taster 1 kurz gedrueckt */ PORTB = (1 << PINB2); // PB2 amschalten break; case 1+TASTER_LONG: /* Taster 1 lange gedrueckt */ // PORTB = (1 << PINB6); break; case 2: /* Taster 2 */ PORTB = (1 << PINB1); // PB1 amschalten break; } if (tast != NO_TASTER) taster = NO_TASTER; /* ********************************** */ /* Weiterer Code in der Hauptschleife */ } } taster.h: #ifndef _TASTER_H_ #define _TASTER_H_ /* Wert fuer taster, wenn nichts gedrückt wurde */ #define NO_TASTER (-1) /* Maximale Anzahl der Taster */ #define NUM_TASTER 3 /* 0 --> Taster sind low-aktiv */ /* 1 --> Taster sind high-aktiv */ #define TASTER_LEVEL 1 /* Dieser Offset wird zur Tasten-Nummer addiert, */ /* wenn eine Taste lange gedrückt wurde */ #define TASTER_LONG 16 /* Zeitverzögerung (in Ticks), bis zum Beginn von auto-repeat */ #define TASTER_REPEAT_DELAY (60) /* Zeitverzögerung (in Ticks), bis zum nächsten auto-repeat */ #define TASTER_REPEAT (15) /* Ab dieser Dauer wird der Tastendruck 'lange' */ #define TASTER_DELAY_LONG (80) typedef struct { /* private */ const unsigned char delay, old; /* Mode des Tasters aus: TM_SHORT, TM_LONG, TM_REPEAT */ unsigned char mode; } taste_t; extern taste_t tasten[]; /* In dieser Variable kann abgefragt werden, welche Taste gedrückt wurde. --> NO_TASTER: es wurde nichts gedrückt --> 0..NUM_TASTER-1: Taster Numero 'taster' wurde (kurz) gedrückt --> TASTER_LONG ... TASTER_LONG + NUM_TASTER-1: Taster Numero 'taster-TASTER_LONG' wurde lange gedrückt */ extern volatile signed char taster; extern void get_taster (const unsigned char num, unsigned char tast); enum { TM_SHORT, TM_LONG, TM_REPEAT }; #endif /* _TASTER_H_ */![]()
Ach was ich vergessen habe, Ich benutze einen ATMega8 und an den Ausgängen PB0,PB1,PB2,PB6 hängt ein Relais Treiber mit 4 Relais.







Zitieren

Lesezeichen