Forum: Mikrocontroller und Digitale Elektronik Probleme mit einem Programm In C für PIC 12F629


von Norbert Luger (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Vermutlich die Read-Modify-Write-Falle der PICs.

Manche PICs brauchen ein NOP zwischen 2 Portbit-Befehlen.


Peter

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


Lesenswert?

>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

von airwulff (Gast)


Lesenswert?

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

von Müller Nick (Gast)


Lesenswert?

>     watschdog ();

Ich denke, "watschdog" sollte spätestens beim linken einen Fehler 
liefern! ;-)


Gruß,
Nick

von Norbert Luger (Gast)


Lesenswert?

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

}

von Peter D. (peda)


Lesenswert?

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

von Norbert Luger (Gast)


Lesenswert?

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

von Christian -. (kakuijin)


Lesenswert?

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
Noch kein Account? Hier anmelden.