Anbei das komplette Programm : Hoffe das jemand den Fehler in meinem
Programm findete warum immer nur der letzte Ausgang gültig ist :
#include <C:\Dokumente und Einstellungen\luger norbert\Eigene
Dateien\Norbert\Elektronik\PIC\C Compeiler\12F629.H>
#pragma config |= 0b.11.0001.1101.1100 // Konfigurations-Wort
bit schalter @ GPIO.3; // Port Pin 4 definieren an dem der Schalter
angeschlossen ist dieser Eingang ist immer ein Eingang
bit Led_1 @ GPIO.0; // Port Pin 7 definiert als Led 1 Ausgang
bit Led_2 @ GPIO.1; // Port Pin 6 definiert als Led 2 Ausgang
bit Led_3 @ GPIO.2; // Port Pin 5 definiert als Led 3 Ausgang
bit Led_4 @ GPIO.4; // Port Pin 3 definiert als Led 4 Ausgang
bit Led_5 @ GPIO.5; // Port Pin 2 definiert als Led 5 Ausgang
//********Unterprogramm Watchdog ****************
void watschdog (void)
{
#asm // auf ASM Code umstellen
clrwdt ; // Wotchdog Rücksetzen
#endasm // ASM wider ausschalten
}
//*********UnterprogrammZeitschleife*******
void zeit_msek(uns16 ms) // Unterprogramm zum Abwarten einer
{ // angegebenen Anzahl von
Millisekunden
while(ms) // Schleife verlassen, wenn ms=0 ist
{
OPTION = 1; // Vorteiler auf 8 einstellen
TMR0 = 125; // 125*8=1000 (= 1 ms)In unserem
Fall wird er mit 85 geladen und zählt bis 256: 256-80=171 .Also wird
TMR0 alle 8 ms 171-mal erhöht.
// Der Wert von 85 wurde ermittelt
es sollte eigentlich 132 sein aber scheinbar ist der Interne Oszilator
zu Ungenau
watschdog (); // Aufruf vom Wachdog um ihn zurück
zu setzen
while (TMR0); // Abwarten einer Millisekunde
ms--; // "ms" mit jeder Millisekunde
erniedrigen
}
}
//********Unterbrogramm Zeitschleife Sekunde*****
void pause(bit licht_1,bit licht_2,bit licht_3,bit licht_4,bit licht_5 )
{
Led_1 = licht_1; // Led_1 wird eingeschaltet und ist
solange ein bis zur nächsten Schleife
Led_2 = licht_2; // Led_2 wird eingeschaltet und ist
solange ein bis zur nächsten Schleife
Led_3 = licht_3; // Led_3 wird eingeschaltet und ist
solange ein bis zur nächsten Schleife
Led_4 = licht_4; // Led_4 wird eingeschaltet und ist
solange ein bis zur nächsten Schleife
Led_5 = licht_5; // Led_5 wird eingeschaltet und ist
solange ein bis zur nächsten Schleife
zeit_msek (700); // Zeit Abwarten
Led_1 = 0 ; // Led_1 abschalten
Led_2 = 0 ; // Led_2 abschalten
Led_3 = 0 ; // Led_3 abschalten
Led_4 = 0 ; // Led_4 abschalten
Led_5 = 0 ; // Led_5 abschalten
zeit_msek (700); // Zeit Abwarten
}
//********Hauptprogramm********
void main(void) // Hier beginnt das Hauptprogramm
{
GPIO = 0b.0011.0111; // GPIO.x General Port for
Input/Output #x GPIOx = 0 GPx = LOW (0V) GPIOx = 1 GPx = HIGH (5V)
CMCON = 0b.0011.0111; // Komperator ausschalten
PCON = 0b.0000.0000; // PCON POWER CONTROL REGISTER
TRISIO = 0b.0000.1000; // Pin 4 Eingang , alle andere
Ausgänge (Led´s)
PIE1 = 0b.0000.0000; // PIE1 PERIPHERAL INTERRUPT ENABLE
REGISTER 1
PIR1 = 0b.0000.0000; // PIR1 PERIPHERAL INTERRUPT
REGISTER 1
OSCCAL = 0b.1111.1100; // OSCCAL OSCILLATOR CALIBRATION
REGISTER
//T1CON = 0b.0011.1101; // T1CON TIMER1 CONTROL REGISTER
**** wurde gespert um auch Pin 2 und 3 als Ausgang zu benuzen *****
WPU = 0b.0000.0000; // WPU WEAK PULL-UP REGISTER
bit led_1 ; // Bitvariable für Led 1
bit led_2 ; // Bitvariable für Led 2
bit led_3 ; // Bitvariable für Led 3
bit led_4 ; // Bitvariable für Led 4
bit led_5 ; // Bitvariable für Led 5
char schritte_led_1;
char schritte_led_2;
char schritte_led_3;
char schritte_led_4;
char schritte_led_5;
led_1 = 0 ;
led_2 = 0 ;
led_3 = 0 ;
led_4 = 0 ;
led_5 = 0 ;
schritte_led_1 = 1 ;
schritte_led_2 = 1 ;
schritte_led_3 = 1 ;
schritte_led_4 = 1 ;
schritte_led_5 = 1 ;
Led_1 = 1 ; // Led 1 ausschalten
Led_2 = 1 ; // Led 2 ausschalten
Led_3 = 1 ; // Led 3 ausschalten
Led_4 = 1 ; // Led 4 ausschalten
Led_5 = 1 ; // Led 5 ausschalten
Sprungmarke:
watschdog (); // Aufruf vom Wachdog um ihn zurück
zu setzen
// if (schalter ) // Abfrage ob die Ausgänge
geschaltet werden sollen
// {
//**** Schleife für Led_1 zum ein aus schalten****
if ( led_1 == 0 ) // Wenn die Variable led_1 0 ist
wird die Variable auf 1 gesetzt und der Schrittzähler auch auf 1
{
led_1 = 1 ; // Variable led_1 wird auf 1 gesetzt
schritte_led_1 =1 ; // Schrittzählerauf 1
}
if ( led_1 )
{
schritte_led_1 ++; // Schrittzähler wird um 1 erhöht
if ( schritte_led_1 > 2 ) // Schrittzähler auf Maxwert abfrage
, wenn werreicht auf Zurücksetzen
{
schritte_led_1 = 0 ; // Schrittzähler auf 0 setzen
}
}
if ( schritte_led_1 == 0 ) // Schrittzähler auf 0 abfragen wenn
ja Variable auf 0 setzen
{
led_1 = 0 ; // Variable led_1 auf 0 setzen
}
//**** Schleife für Led_2 zum ein aus schalten****
if ( led_2 == 0 ) // Wenn die Variable led_2 0 ist
wird die Variable auf 1 gesetzt und der Schrittzähler auch auf 1
{
led_2 = 1 ; // Variable led_2 wird auf 1 gesetzt
schritte_led_2 =1 ; // Schrittzählerauf 1
}
if ( led_2 )
{
schritte_led_2 ++; // Schrittzähler wird um 1 erhöht
if ( schritte_led_2 > 3 ) // Schrittzähler auf Maxwert abfrage
, wenn werreicht auf Zurücksetzen
{
schritte_led_2 = 0 ; // Schrittzähler auf 0 setzen
}
}
if ( schritte_led_2 == 0 ) // Schrittzähler auf 0 abfragen wenn
ja Variable auf 0 setzen
{
led_2 = 0 ; // Variable led_2 auf 0 setzen
}
//**** Schleife für Led_3 zum ein aus schalten****
if ( led_3 == 0 ) // Wenn die Variable led_3 0 ist
wird die Variable auf 1 gesetzt und der Schrittzähler auch auf 1
{
led_3 = 1 ; // Variable led_3 wird auf 1 gesetzt
schritte_led_3 =1 ; // Schrittzählerauf 1
}
if ( led_3 )
{
schritte_led_3 ++; // Schrittzähler wird um 1 erhöht
if ( schritte_led_3 > 4 ) // Schrittzähler auf Maxwert abfrage
, wenn werreicht auf Zurücksetzen
{
schritte_led_3 = 0 ; // Schrittzähler auf 0 setzen
}
}
if ( schritte_led_3 == 0 ) // Schrittzähler auf 0 abfragen wenn
ja Variable auf 0 setzen
{
led_3 = 0 ; // Variable led_3 auf 0 setzen
}
//**** Schleife für Led_4 zum ein aus schalten****
if ( led_4 == 0 ) // Wenn die Variable led_4 0 ist
wird die Variable auf 1 gesetzt und der Schrittzähler auch auf 1
{
led_4 = 1 ; // Variable led_4 wird auf 1 gesetzt
schritte_led_4 =1 ; // Schrittzählerauf 1
}
if ( led_4 )
{
schritte_led_4 ++; // Schrittzähler wird um 1 erhöht
if ( schritte_led_4 > 5 ) // Schrittzähler auf Maxwert abfrage
, wenn werreicht auf Zurücksetzen
{
schritte_led_4 = 0 ; // Schrittzähler auf 0 setzen
}
}
if ( schritte_led_4 == 0 ) // Schrittzähler auf 0 abfragen wenn
ja Variable auf 0 setzen
{
led_4 = 0 ; // Variable led_4 auf 0 setzen
}
//**** Schleife für Led_5 zum ein aus schalten****
if ( led_5 == 0 ) // Wenn die Variable led_5 0 ist
wird die Variable auf 1 gesetzt und der Schrittzähler auch auf 1
{
led_5 = 1 ; // Variable led_5 wird auf 1 gesetzt
schritte_led_5 =1 ; // Schrittzählerauf 1
}
if ( led_5 )
{
schritte_led_5 ++; // Schrittzähler wird um 1 erhöht
if ( schritte_led_5 > 6 ) // Schrittzähler auf Maxwert abfrage
, wenn werreicht auf Zurücksetzen
{
schritte_led_5 = 0 ; // Schrittzähler auf 0 setzen
}
}
if ( schritte_led_5 == 0 ) // Schrittzähler auf 0 abfragen wenn
ja Variable auf 0 setzen
{
led_5 = 0 ; // Variable led_5 auf 0 setzen
}
pause (led_1 , led_2 , led_3 , led_4 , led_5 );
goto Sprungmarke; // Endlosschleife
}