Suche nach einer Lösung für mein Problem , habe ein Programm in CC5X C geschrieben für PIC 12F629 . Habe aber nun den Fehler das wenn ich an den Ausgänge verschidene Blinkgeschwindigkeiten ausgebe Blinkt immer nur der lette in der Kette vom Programm ,finde einfach nicht den Fehler kann mir jemand behilflich sein beim Fehlersuchen m.f.g. Norbert PS. Anbei ein Auszug vom Programm //*********UnterprogrammZeitschleife******* void zeit_msek(uns16 ms) { while(ms) { OPTION = 1; TMR0 = 125; watschdog (); // Aufruf vom Wachdog um ihn zurück zu setzen while (TMR0); ms--; } } //********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_2 = licht_2; Led_3 = licht_3; Led_4 = licht_4; Led_5 = licht_5; 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) { GPIO = 0b.0011.0111; CMCON = 0b.0011.0111; PCON = 0b.0000.0000; 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 WPU = 0b.0000.0000; // WPU WEAK PULL-UP REGISTER
Vermutlich die Read-Modify-Write-Falle der PICs. Manche PICs brauchen ein NOP zwischen 2 Portbit-Befehlen. Peter
>Habe aber nun den Fehler das wenn ich an >den Ausgänge verschidene Blinkgeschwindigkeiten ausgebe Blinkt immer nur >der lette in der Kette vom Programm In dem Teil den du gepostet hast konnte ich keinen Fehler sehen. Ich sehe dort aber auch nicht die Passager, in der du "verschiedene Blinkgeschwindigkeiten" ausgibst. Poste diesen Teil bitte auch noch. Stationär funktioniert es demnach? (Wenn du nur 1x eine Geschwindigkeit angibst) Grüße, Alex
Hallo, da ich den CC5X nicht kenne, nur 2 Möglichkeiten die ich aus dem Programmausschnitt vermute: - Problem bei gleichzeitiger Nutzung des Timer0 für Watchdog und eigener Zeitschleife? - Unter einem Basic-Compiler hatte ich das Problem, daß beim 12F629 Bits des GPIO nicht einzeln gesetzt werden konnten, sondern der gesamte Port beschrieben werden mußte. Viel Erfolg Airwulff
> watschdog ();
Ich denke, "watschdog" sollte spätestens beim linken einen Fehler
liefern! ;-)
Gruß,
Nick
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
}
Norbert Luger schrieb: > Anbei das komplette Programm : Hoffe das jemand den Fehler in meinem > Programm findete warum immer nur der letzte Ausgang gültig ist : Du mußt die Antworten auch mal lesen! Dein Compiler wird ja wohl ein NOP-Macro haben. Peter
Habe es mit Nop getestet das Ergebnis blieb das selbe , immer bei der Ausgabe blinkt immer nur Led 5 Sperre ich Led 5 blinkt Led 4 und so weiter . Setze ich bei der Ausgabe Led 1 zum Schluss blinkt nur Led 1 . Was mache ich Falsch ?? m.f.g. Norbert
Norbert Luger schrieb: > Habe es mit Nop getestet das Ergebnis blieb das selbe , immer bei der > Ausgabe blinkt immer nur Led 5 Sperre ich Led 5 blinkt Led 4 und so > weiter . Setze ich bei der Ausgabe Led 1 zum Schluss blinkt nur Led 1 . > Was mache ich Falsch ?? > > m.f.g. > Norbert Hm. Kopiere dir mal die Standart Einstellungen in ein neues C-Programm und versuche dort nur die ersten 2 LED's zum laufen zu bringen, wenn das klappt dann versuch das Programm langsam bis auf 5 LED's zu erweitern. lg
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.