Ich habe sowohl hardware-als auch software den taster versucht zuentprellen.daran liegt es nicht.
Das muss einfach an dem Programm liegen.
@Siro
ich habe versuch die "sec" umzubenennen und auch die Interrups vorrübergehend zuverbieten,kein erfolg.
Ich werde das Programm neu schreiben.Aber von hinten aufgerollt.Sprich:Erst "sec" setzen und dann immer weiteren Code zufügen.und diesmal will ich das hochzählen aus zwei variablen auslagern und diese auch im interrupt nullen.
ca so:
Code:
Interruptfunktion{
i_ohne++; (wenn >=255-> i_ohne =0;)
i_mit++; (wenn i_mit >=255 -> i_mit =0;)
wenn taster PD3 dann sec=1;
}
main()
{
if sec=1 dann
switch(i_mit)
case 12:
case23:
usw
...
case 234: sec= 0;
if sec=0 dann
switch (i_ohne)
case 12:
case 23:
usw
der derzeitige Code sieht so aus:
Code:
/*
* Ampel_mit_Timer.c
*
* Created: 10.08.2013 10:05:38
* Author: Gerrus
*/
//#define F_CPU 16000000UL //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 igr;
volatile unsigned m_sec;
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)
{
while(1)
{
if (igr==0)
{
rot_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);
rotf_schalten(aus);
}
if (igr==213)
{
gelb_schalten(aus);
igr=0;
}
break;
}
}
void schalten_mit (void)
{
while (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)
{
m_sec=0;
rotf_schalten(aus);
gelb_schalten(aus);
igr=0;
}
break;
}
}
ISR (TIMER0_OVF_vect) // Die Funktion die beim Overflow aufgerufen wird
{
int temp;
temp=PIND;
if ((temp &(1<<PD3)))
{
m_sec = 1; // setzen den Wert
}
igr ++;
}
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)
{
switch(m_sec)
{
case 0:
schalten_ohne();
break;
case 1:
schalten_mit();
break;
}
}
}
und es funktioniert NUR wenn ich den Taster dauerhaft gedrückt halte.dann geht das.Los lasse,dann geht er wieder in Phase ohne Fussgänger-Ampel.wieder gedrückt halte,wieder mit Fussgänger.
Ich weiss nicht warum das Programm die variable "sec" immer wieder auf null setzt ,bevor die Funktion schalten_mit eintritt...
Ich melde mich,sobald ich das neue Programm fertig habe
Lesezeichen