Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Pulsmessung Kategorie: Programmierung C (von Josef - 9.08.2009 11:46)
Als Antwort auf Pulsmessung von Josef - 8.08.2009 23:05
Ich nutze:
C-Control Pro Mega128
> Hallo,
> bin ein neuling bei der ccontrol pro,
>
> habe nach dem Puls und Periodenmessdemoprogramm einen UTI Baustein am den IC von Timer3  geh├Ąngt.
> es hat nicht funktioniert.
> Habe zum Testen wieder Timer1 Frequenzgenerator und Timer3 Pulsmssung zusammengeh├Ąngt und einige
> Teile vom UTI Programm belassen.
>
> // Dieses Demo Programm ist nur f├╝r Mega128
> #ifdef MEGA32
> #pragma Error " Timer3 nur f├╝r Mega128 "
> #endif
>
> // Deklaration der Formatierungsvariablen
> #define SPACE 0x20
> #define CR 13
> #define PORT_UTI 2                // Port C
> #define PORTDIR_UTI 0x07          // UTI1=PortC.0, UTI2=PortC.1, UTI3=PortC.2
>
> int n, m;
> word PM_Wert, T_OFF1, T_OFF2, T_REF, T_X0, T_X1, T_X2;     // globale Variablen
> char str[20];
>
> //------------------------------------------------------------------------------
> // Messung
> //
> void Timer3_ISR(void)
> {
>     PM_Wert=Timer_T3GetPM();                    // Messwert auslesen
>     n++;
>     Irq_GetCount(INT_TIM3CAPT);                 // Interrupt zur├╝cksetzen
> }
>
> //------------------------------------------------------------------------------
> // Hauptprogramm
> //
> void main(void)
> {
>     n=0; m=0; PM_Wert=0;
>     Irq_SetVect(INT_TIM3CAPT,Timer3_ISR);// Interrupt Service Routine definieren
>
>     Timer_T1PWM(256,72,PS_1024);            // Pulsgenerator
>                                             // Puls=69,4 ┬Ás*72= 5 ms
>                                             // Periode=69,4 ┬Ás*256= 17,7ms
>     Port_DataDir(PORT_UTI,PORTDIR_UTI);
>     Timer_T3PM(0,PS_64);              // Pulsmessung initialisieren und starten
>     Port_Write(PORT_UTI,0x01);
>     // die Messung beginnt hier
>     // Timer Output verbinden mit ICP (input capture pin) Timer1
>     while (1)
>     {
>     label1:
>       switch(n)
>       {
>           case 1:
>               T_OFF1=PM_Wert;
>           break;
>           case 2:
>               T_OFF2=PM_Wert;
>           break;
>           case 3:
>               T_REF=PM_Wert;
>           break;
>           case 4:
>               T_X0=PM_Wert;
>           break;
>           case 5:
>               T_X1=PM_Wert;
>           break;
>           case 6:
>               T_X2=PM_Wert;
>           break;
>       }
>       Msg_WriteText("TOFF1");
>       Msg_WriteWord(T_OFF1);
>       Msg_WriteChar(SPACE);
>       Msg_WriteText("PM");
>       Msg_WriteWord(PM_Wert);                 // Wert ausgeben
>       Msg_WriteChar(SPACE);
>       Msg_WriteInt(n);
>       if (n!=6) goto label1;                                                  // f├╝rs testen
>       Msg_WriteWord(PM_Wert);                 // Wert ausgeben
>       Msg_WriteChar(SPACE);
>       Msg_WriteInt(m);
>       Msg_WriteChar(SPACE);
>       Msg_WriteInt(n);
>       Msg_WriteChar(SPACE);
>       Msg_WriteWord(T_OFF1);
>       Msg_WriteChar(SPACE);
>       Msg_WriteWord(T_OFF2);
>       Msg_WriteChar(SPACE);
>       Msg_WriteWord(T_REF);
>       Msg_WriteChar(SPACE);
>       Msg_WriteWord(T_X0);
>       Msg_WriteChar(SPACE);
>       Msg_WriteWord(T_X1);
>       Msg_WriteChar(SPACE);
>       Msg_WriteWord(T_X2);
>       Msg_WriteChar(SPACE);
>       Msg_WriteChar(CR);
>
>       AbsDelay(500);                          // Delay 500ms
>       n=0;
>     }
> }
>
>
> hier nun die Ausgabe:
> Interpreter gestartet - 4kb RAM                                                                                        
> TOFF10 PM0 0PM0 0TOFF10 PM0 0TOFF10 PM0 0TOFF10 PM0 0TOFF10 PM0 1TOFF10 PM0 1TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152
>  2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152
>  2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152
>  2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152
>  2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152
>  2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152
>  2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152
>  2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152
>  2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152
>  2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152
>  2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152
>  2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152
>  2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152
>  2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152
>  2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10 PM1152 2TOFF10
>
> Anscheinend kommt das Programm nur 2mal in die interruptoutine und die Werte werden an T_OFF1
> auch nicht ├╝bergeben.
> Habe die caseabfrage auch in der interruptroutine gehabt, hat auch nicht gfunkt.
> wenn berechnungen eingebaut werden z. B.: PM_WERT=PM_Wert*4.64 kommt null raus.
>
> Vielleicht kann mir jemand weiterhelfen?
>
> Gru├č
> Josef


HALLO


das obige k├Ânnt ihr vergessen

habe noch ein bisschen probiert und vermute, dass es sich um ein timingproblem handelt.
das obigeprg hat noch einige fehler.
hier das ge├Ąnderte, das im debugmodus einwandfrei funktioniert aber jedoch im echtzeitmodus gibt
es keinen ├╝bergabewert.

void Timer3_ISR(void)
{
    PM_Wert=Timer_T3GetPM();                    // Messwert auslesen
    n++;
          switch(n)
      {
          case 1:
              T_OFF1=PM_Wert;
           break;
          case 2:
              T_OFF2=PM_Wert;
           break;
          case 3:
              T_REF=PM_Wert;
          break;
          case 4:
              T_X0=PM_Wert;
          break;
          case 5:
              T_X1=PM_Wert;
          break;
          case 6:
              T_X2=PM_Wert;
          break;
      }
    Irq_GetCount(INT_TIM3CAPT);                 // Interrupt zur├╝cksetzen
    if  (n<6) Timer_T3PM(0,PS_64);
}

//------------------------------------------------------------------------------
// Hauptprogramm
//
void main(void)
{
    n=0; m=0; PM_Wert=0;
    Irq_SetVect(INT_TIM3CAPT,Timer3_ISR);// Interrupt Service Routine definieren

    Timer_T1PWM(256,72,PS_1024);            // Pulsgenerator
                                            // Puls=69,4 ┬Ás*72= 5 ms
                                            // Periode=69,4 ┬Ás*256= 17,7ms
    Port_DataDir(PORT_UTI,PORTDIR_UTI);
    Timer_T3PM(0,PS_64);              // Pulsmessung initialisieren und starten
    Port_Write(PORT_UTI,0x01);
    // die Messung beginnt hier
    // Timer Output verbinden mit ICP (input capture pin) Timer1
    while (1)
    {
//            Timer_T3PM(0,PS_64);              // Pulsmessung initialisieren und starten

/*    Msg_WriteText("TOFF1");
      Msg_WriteWord(T_OFF1);
      Msg_WriteChar(SPACE);
      Msg_WriteText("PM");
      Msg_WriteWord(PM_Wert);                 // Wert ausgeben
      Msg_WriteChar(SPACE);
      Msg_WriteInt(n); */
     // if (T_X2==0) goto label1;
     while (T_X2==0);
      Msg_WriteWord(PM_Wert);                 // Wert ausgeben
      Msg_WriteChar(SPACE);
      Msg_WriteInt(m);
      Msg_WriteChar(SPACE);
      Msg_WriteInt(n);
      Msg_WriteChar(SPACE);
      Msg_WriteWord(T_OFF1);
      Msg_WriteChar(SPACE);
      Msg_WriteWord(T_OFF2);
      Msg_WriteChar(SPACE);
      Msg_WriteWord(T_REF);
      Msg_WriteChar(SPACE);
      Msg_WriteWord(T_X0);
      Msg_WriteChar(SPACE);
      Msg_WriteWord(T_X1);
      Msg_WriteChar(SPACE);
      Msg_WriteWord(T_X2);
      Msg_WriteChar(SPACE);
      Msg_WriteChar(CR);

      AbsDelay(500);                          // Delay 500ms
      n=0;
      T_OFF1=0;
      T_OFF2=0;
      T_REF=0;
      T_X0=0;
      T_X1=0;
      T_X2=0;
          Timer_T3PM(0,PS_64);
    }
}

habe um timingprobleme auszuschlie├čen die abspeicherung in die interruproutine aufgenommen.
warum muss man nach jedem interrupt den timer wieder neu definieren?

danke
josef


    Antwort schreiben


Antworten:

Re: Pulsmessung (von PeterS - 15.08.2009 21:51)
    Re: Pulsmessung (von Josef - 17.08.2009 19:09)
        Re: Pulsmessung (von ER - 20.08.2009 13:44)
            Re: Pulsmessung (von PeterS - 20.08.2009 14:52)
                Re: Pulsmessung (von Josef - 21.08.2009 10:37)