franzl
23.11.2006, 20: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
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