- LiTime Speicher und Akkus         
Ergebnis 1 bis 3 von 3

Thema: Problem bei Tastenabfrage

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.05.2005
    Ort
    Rott am Inn
    Alter
    36
    Beiträge
    373

    Problem bei Tastenabfrage

    Anzeige

    Praxistest und DIY Projekte
    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
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    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:

    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))


    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.05.2005
    Ort
    Rott am Inn
    Alter
    36
    Beiträge
    373
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus