Hallo geehrte Freunde der "C"-Sprache!
Nun habe ich etwas weiter gemacht.Ich bin auf Timer umgestiegen!
Soweit funktioniert es auch grundsätzlich!Ein Problem habe ich aber...
Ich schaffe es nicht zuverlässig den Taster abzufragen..
Nun habe ich schon in fast jede zweite Code-Zeile die Abfrage reingepackt...kein erfolg..Es funktioniert einfach unzuverlässig.
Prinzip ist schnell erklärt:Es wird immer die Funktion schalten_ohne(); ausgeführt.bis der Taster PB3 gedrückt wird!dann soll in der nächsten Rot-Phase für Autos, grün für Fußgänger angehen.
Was mache ich falsch?muss ich tatsächlich auf interrupt für Taster ausweichen(wie in der ersten Version vom Code)?Gibt es vlt doch eine andere Lösung?
Code:
/*
* Ampel_mit_Timer.c
*
* Created: 10.08.2013 10:05:38
* Author: Gerrus
*/
#define F_CPU 4000000UL //Takt auf 4Mhz festlegen
#include <avr/io.h>
#include <avr/interrupt.h> //Include fürs INterrupt
// eigene Bezeichnungen
#define rot PC0
#define gelb PC1
#define gruen PC2
#define rotf PC4
#define gruenf PC5
#define ein 1
#define aus 0
volatile int sec,igr;
void rotf_schalten(unsigned int i)
{
if (i==ein){PORTC |= (1 << rotf);} // Setzen
else {PORTC &= ~(1 << rotf);} // Rücksetzen
};
void gruenf_schalten(unsigned int i)
{
if (i==ein){PORTC |= (1 << gruenf);} // Setzen
else {PORTC &= ~(1 << gruenf);} // Rücksetzen
};
void rot_schalten(unsigned int i)
{
if (i==ein){PORTC |= (1 << rot);} // Setzen
else {PORTC &= ~(1 << rot);} // Rücksetzen
};
void gelb_schalten(unsigned int i)
{
if (i==ein){PORTC |= (1 << gelb);} // Setzen
else {PORTC &= ~(1 << gelb);} // Rücksetzen
};
void gruen_schalten(unsigned int i)
{
if (i==ein){PORTC |= (1 << gruen);} // Setzen
else {PORTC &= ~(1 << gruen);} // Rücksetzen
//_delay_ms(1000);
};
void schalten_ohne (void)
{
if (!(PIND &(1<<PD3)))
{
sec=1;
}
if (igr==0)
{
rot_schalten(ein);
}
if (!(PIND &(1<<PD3)))
{
sec=1;
}
if (igr==76)
{
gelb_schalten(ein);
}
if (!(PIND &(1<<PD3)))
{
sec=1;
}
if (igr==107)
{
rot_schalten(aus);
gelb_schalten(aus);
gruen_schalten(ein);
}
if (!(PIND &(1<<PD3)))
{
sec=1;
}
if (igr==183)
{
gruen_schalten(aus);
gelb_schalten(ein);
}
if (!(PIND &(1<<PD3)))
{
sec=1;
}
if (igr==213)
{
gelb_schalten(aus);
igr=0;
}
}
void schalten_mit (void)
{
if (!(PIND &(1<<PD3)))
{
sec=1;
}
if (igr==0)
{
rot_schalten(ein);
rotf_schalten(ein);
}
if (igr==15)
{
rotf_schalten(aus);
gruenf_schalten(ein);
}
if (igr==61)
{
gruenf_schalten(aus);
rotf_schalten(ein);
}
if (igr==76)
{
gelb_schalten(ein);
}
if (igr==107)
{
rot_schalten(aus);
gelb_schalten(aus);
gruen_schalten(ein);
}
if (igr==183)
{
gruen_schalten(aus);
gelb_schalten(ein);
}
if (igr==213)
{
rotf_schalten(aus);
gelb_schalten(aus);
igr=0;
sec=0;
}
}
ISR (TIMER0_OVF_vect) // Die Funktion die beim Overflow aufgerufen wird
{
igr ++;
if (!(PIND &(1<<PD3)))
{
sec=1;
}
}
int main(void)
{
//PORT C als Ausgang
PORTC = 0x00;
DDRC = 0xFF;
//PORT D als Eingang
DDRD = 0<<PD3;
PORTD = 1<<PD3;
TCCR0 |= (1<<CS02)|(1<<CS00); //Einstellen Von Preteiler 1/1024. Datasheet Seite 85
TIMSK |= (1<<TOIE0); //Interrupt auslösen beim Overflow Datasheet Seite 85
TCNT0 = 0; //den timer selber reseten.Eine Null reinschreiben
sei(); //Interruos aktivieren
while(1)
{
if (!(PIND &(1<<PD3)))
{
sec=1;
}
if (sec==0)
{
schalten_ohne(); //Ampelschaltung ohne fussgaenger
}
if (!(PIND &(1<<PD3)))
{
sec=1;
}
if (sec==1)
{
schalten_mit(); //Ampelschaltung mit fussgaenger
}
}
}
P.S: Bin über jede Art von Tips dankbar!!Vlt verfolge ich komplett verkehrten weg?vlt geht es einfacher,stabiler,besser?
Vielen Dank!
Lesezeichen