PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Taster Stromstoßschalter



ChristianP.
23.01.2010, 09:08
Hallo Forum

Möchte mit einem ATmega32 einen Stromstoßschalter realisieren, d. h.,
wenn ich den Taster drücke sollen alle LEDs von PORTC leuchten. Bei
nochmaltigen drücken des Tasters sollen alle LEDs wieder ausgehen.

Verwende einen externen PullDown für die Taster.

Habe schon einige Programme probert, jedoch ohne Erfolg.
Vermutlich handelt es sich um einen Denkfehler.

Hier mein derzeitiger Stand:


#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>



int main(void)
{
DDRC = 0xFF;
PORTC =0xFF;

DDRD =0x00;
//PORTD =0xFF; // PullUp aktivieren!!

while(1){

if(PIND & (1<<PD0) && PORTC == 0xFF)
{
PORTC = 0x00;
}
if(PIND & (1<<PD0) && PORTC == 0x00)
{
PORTC = 0xFF;
}
}
}


Danke für eure Hilfe

oberallgeier
23.01.2010, 09:44
Hi ChristianP.,

willkommen im Forum.

... Vermutlich handelt es sich um einen Denkfehler ...Das liegt doch mehr an der Syntax, oder nicht?

Bin ziemlich in Eile. Auf die Schnelle, aber nicht getestet:



#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - Vorschlag - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#define IsBitSet(ADDR,BIT) (((ADDR)&(1<<BIT))?1:0) // Fragt Bit = 1?

#define TASTER 0 // Taster auf PD0
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

int main(void)
{
DDRC = 0xFF;
PORTC =0xFF;

DDRD =0x00;
//PORTD =0xFF; // PullUp aktivieren!!

while(1){
// if(PIND & (1<<PD0) && PORTC == 0xFF)
// da sollte man entweder nicht mit Klammern sparen oder
// sich über die Prioritäten/Reihenfolgen der Operatoren
// bei der Abarbeitung im Klaren sein, daher :
if (( IsBitSet ( PIND, TASTER )) && (IsBitSet (PINC, 1))) // Abfrage
{
PORTC = 0x00;
}
// if(PIND & (1<<PD0) && PORTC == 0x00)
else // Wenn nicht gedrückt, dann ist er lose *ggg*
{
PORTC = 0xFF;
}
}
}

ChristianP.
23.01.2010, 21:13
Danke für die schnelle Antwort.
Gibt es vielleich eine etwas einfachere Alternative? Habe schon alle Foren durchforstet, aber nicht fündig geworden.

Danke für die Beiträge

BurningWave
24.01.2010, 17:43
Du kannst einfach PORTC bei jedem Tastendruck invertieren:



#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>
#include <stdlib.h> // braucht du eigentlich nicht
#include <avr/interrupt.h> // die auch nicht

int main(void)
{
DDRC = 0xFF;
PORTC =0xFF;

DDRD =0x00;
//PORTD =0xFF; // PullUp aktivieren!!

while(1){

if(PIND & (1<<PD0))
{
PORTC ~= PORTC;
_delay_ms(150); // entprellen
}
}
}


Ist nicht getestet, sollte aber funktionieren.

mfg