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)