Programm kurz warten lassen



  • Hallo,

    ich habe ein Problem bezüglich eines kleinen Programms in C.

    Und zwar möchte ich das Programm an einer bestimmten Stelle warten lassen.
    Hab ich im Programm als Kommentar geschrieben. Findet man weiter unten

    Nicht wundern wenn dort unverständliche Kommentare sind, aber das Programm ist für einen kleinen Mikrocontroller geschrieben (also z.b. PortA oder PortB)

    Ich habe es schon mit delay.h probiert, jedoch nicht zu einem richtigen Ergebnis gekommen, bzw. er hat das Programm nicht richtig kompiliert.

    // Datei: Phaserec.c
    // Bi-Phasen RC5 Empfänger
    // Zwölf Kanäle
    //
    // hk@holger-klabunde.de
    // www.holger-klabunde.de
    // 30.04.2001
    // Compiler CC5x
    
    #include "prozess.h"      // Der verwendete Prozessor
    
    #include "Phaserec.h"
    #include "protos.h"
    
    //Na wenn das man ANSI-C ist
    //Statt alle Module einzeln zu compilieren und dann zu linken,
    //müssen bei CC5x alle Module included werden !
    #include "phase.c"
    
    unsigned char shift;   //Register für die Abtastung
    unsigned char subcode; //Der RC5 Gerätecode
    unsigned char comcode; //Der RC5 Kommandocode
    unsigned char combuf;  //Puffer für Kommandocode. Für Verify
    unsigned char subbuf;
    unsigned char toggle;  //Das empfangene Togglebit
    
    //*******************************************************
    // Hauptprogramm
    //*******************************************************
    void main()
    {
     unsigned char by,buf;
    
     CLRWDT;	    //Vor ändern des Prescalers auf Timer0 laut Microchip
    
    //Takt des PIC 4MHz, ein Zyklus = 1us
     OPTION=0b10000010; //Pullups off,Prescaler auf TMR0, 1:8
    
     TRISA=0b11110000;   //PA3..0 Ausgänge, PA4 Eingang
     TRISB=0b00000000;   //PB7..0 Ausgänge
     PORTB=0x00;
     PORTA=0x00;
    
     shift=0; //Empfangsregister löschen
    
     while(1) // Programm-Endlosschleife
      {
    
       do
        {
         by=PhaseDemod(); //Warten auf eingehende Impulse
        }while(by==0);
    
       combuf=comcode; //Eben empfangenen Code speichern
       subbuf=subcode;
    
       do //Code ein zweites mal empfangen
        {
         by=PhaseDemod(); //Warten auf eingehende Impulse
        }while(by==0);
    
       if(comcode==combuf && subcode==subbuf) //Beide Codes gleich ?
        {
         if(subcode==SUBID) //Stimmt der Gerätecode ?
          {
    
           if(comcode<12) //Gültiger Kanal ?
            {
             if(comcode<8) //Die Ausgänge an PORTB
              {
               buf=PORTB; //Alten Zustand von PORTB lesen
               by=1<<comcode; //Ausgang an die richtige Stelle schieben
    
               if(toggle==ONE) //Ein Ausgang soll eingeschaltet werden. Ich denke hier muss die Pause hin,
    			   // also der Ausgang soll eingeschaltet werden und nach einer Sekunde wieder ausgeschaltet werden.
    			   // unten weiter das gleiche
                {
                 buf|=by;       //Bit setzen
                }
               else          //Ein Ausgang soll ausgeschaltet werden
                {
                 buf&=~by;      //Bit zurücksetzen
                } 
    
               PORTB=buf;     //Und ausgeben
              }
             else          //Die Ausgänge an PORTA
              {
               buf=PORTA; //Alten Zustand von PORTA lesen
    
    //Das hier ist Standard C. Kann CC5x aber nicht. Zu kompliziert !??           
    //           by=1<<(comcode-8); //Ausgang an die richtige Stelle schieben
    // Erst wenn man es auseinandernimmt gehts
               comcode-=8;
               by=1<<comcode; //Ausgang an die richtige Stelle schieben
    
               if(toggle==ONE) //Ein Ausgang soll eingeschaltet werden. Und zwar hier. Wieder ca. eine Sekunde warten lassen.
                {
                 buf|=by;       //Bit setzen
                }
               else          //Ein Ausgang soll ausgeschaltet werden
                {
                 buf&=~by;      //Bit zurücksetzen
                } 
    
               PORTA=buf;     //Und ausgeben
              } 
    
            }//if comcode<12
    
          }// ifsubcode==SUBID
    
        } //if(comcode==combuf && subcode==subbuf)
    
      } //while(1) Endlosschleife
    
    }
    

    Ich hoffe ihr könnte mir weiterhelfen, bin echt verzweifelt 😞

    MfG Der Stuhl



  • Unglaublich, noch jemand außer mir der Wert auf ANSI C legt, muss wohl an Weihnachten liegen:

    #include <time.h>
    
    void sleep( clock_t msec )
    {  /* wartet Millisekunden */
       clock_t ende = msec+clock();
       while( ende>clock() );
    }
    

    In der Hoffnung, dass dein Compiler ein wirklicher ANSI C Compiler ist und clock implementiert, sonst bliebe noch der Weg mit time(0).



  • Was hast du denn mit delay.h probiert?
    _delay_ms(1000)?



  • ja genau das hab ich gemacht
    aber der hat ein Fehler beim kompilieren angezeigt.



  • Fusselparty schrieb:

    ja genau das hab ich gemacht
    aber der hat ein Fehler beim kompilieren angezeigt.

    Welchen?


Anmelden zum Antworten