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 ?
Code:
#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_ */
Wäre sehr nett danke schonmal
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.
Lesezeichen