PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem bei Tastenabfrage



franzl
23.11.2006, 19:30
hallo,
da ich erst vor kurzem mit c programmieren angefangen habe, hab ich gleich mal eine frage an euch.
Ich habe an portd.0 einen Taster und an portc.3 ein relais angeschlossen.
Ich möchte nun beim drücken des Tasters das relais einschalten und bei erneutem drücken wieder ausschalten.
hier der code


#include <avr/io.h>
#include <avr/interrupt.h>

typedef unsigned char Byte; //Anlegen eines eigenen 8 Bit-Datentyps
typedef short int Word; //Anlegen eines eigenen 16j Bit-Datentyps
#define FALSE (0!=0)
#define TRUE (0==0)
#define F_CPU 8000000 //CPU Frequenz
#define Start (PIND & 1<<PIND0) //PIND.0
#define Plus (PIND & 1<<PIND1) //PIND.1
#define Minus (PIND & 1<<PIND2) //PIND.2
#define Relais_On (PORTC |= (1<<PORTC3)) //PORTC.3 ein
#define Relais_Off (PORTC &=~ (1<<PORTC3)) //PORTC.3 aus
Byte a;
Byte b;
Byte z;


ISR(TIMER0_OVF_vect);


ISR(TIMER0_OVF_vect) //Timer Interrupt Vector
{a++;}

void main(void)
{
SREG |= (1<<7); //Interrupts global freischalten
TIMSK |= (1<<TOIE0);
TIFR = 0;
TCCR0 |= (1<<CS00) | (1<<CS01) | (!(1<<CS02)); //Timer Prescaler = 8
DDRD =0; //PORTD als Eingänge festlegen
PORTD =255; //Pull/up Widerstände aktivieren
DDRC |= (1<<PC3); //PORTC.3 = Ausgang
for(;;) //Endlosschleife
{
if(Start) //wenn Taste Start
{ if(a>=10) //und timer 10x übergelaufen
{z++;a=0;
if(z>=2)
{z=0;Relais_Off;}
else
{Relais_On;}
}
}
else
{a=0;}

}
}

wenn ich das programm in avr studio simuliere funktioniert es einwandfrei.
aber wenn ich es auf dem atmega8 ausprobiere dann flackert das relais und bleit nur stabil in einem zustand wenn ich den taster gedrückt halte.
ich hoffe ihr könnt mir weiterhelfen
mfg franzl

izaseba
23.11.2006, 23:50
Hallo,
sind a und z da um die Taste zu entprellen ?
Sowas macht man direkt in der Timer Overflow ISR.
ich benutze z.B. folgenden Code:



static uint8_t status_taste = 0;
tastenport = PINB;
if (!(tastenport & (1<<TASTE))) {
if (!status_taste){
modus =~modus;
status_taste = 1;
}
} else status_taste = 0;

modus ist als volatile deklariert und wird bei jedem Tastendruck umgedreht.

Den code habe ich in der ISR und modus wird in der main ausgewertet.

Vielleicht hilft es Dir...

P.S.


ISR(TIMER0_OVF_vect);

die brauchst Du nicht zu deklarieren.


(!(1<<CS02))
:-k

Gruß Sebastian

franzl
24.11.2006, 13:11
hallo,
also jetzt funktionierts ich hab vergessen dass meine taster ja ein null signal haben wenn sie gedrückt werden.
#define Start (!(PIND & 1<<PIND0)) //PIND.0
trotzdem danke
mfg franzl