www.mikrocontroller.net

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


Autor: Norbert Luger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vermutlich die Read-Modify-Write-Falle der PICs.

Manche PICs brauchen ein NOP zwischen 2 Portbit-Befehlen.


Peter

Autor: Alex Bürgel (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: airwulff (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Müller Nick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>     watschdog ();

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


Gruß,
Nick

Autor: Norbert Luger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

}

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Norbert Luger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian --- (kakuijin)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.