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

Re: Timer mit 100µs Kategorie: Programmierung C (von Klaus B. - 13.07.2006 6:44)
Als Antwort auf Re: Timer mit 100µs von Klaus B. - 11.07.2006 7:43
Ich nutze:
C-Control Pro Mega128, CC-Pro 128 Application Board
Hallo Peter,

siehst du eine Lösung? Woran liegt die Verzögerung der Timer?
Ich mu� leider drängen, wenn das mit der Mega 128 nix wird, steig ich auf andere Lösungen um.

Danke Klaus


> Hallo Peter,
> ich messe die Zeit von Port A.0 = 1 bis Port A.1=1.
> Das toggeln (lab1) von PA.0 bringt eine Periodendauer von 93µs. Nutzt mir aber nix, da ich 2
> von 0 auf 1 schaltende Ports brauche. Die ON-Zeit der Ports ist unkritisch.
> Ich brauche von steigender Flanke Port A.0 = 1 bis Port A.1=1 eben minimal 100µs.
>
> GruÃ? Klaus
>
>
> > Hmm, ich grübel da noch. Was mi�t Du eigentlich? Die Zeit wenn Port A.0 von 0 auf 1 geht?
> >
> > Dann mü�test Du eigentlich schreiben:
> >
> >   busy=1;
> >   Timer_T1Time(30,PS_64);
> >   Port_WriteBit(0,0);     // port auf 0 setzen        
> >   while (busy==1);
> >
> > Wie schnell läuft denn eigentlich ein:
> >
> > lab1:
> >    Port_WriteBit(0,0);
> >    Port_WriteBit(0,1);
> > goto lab1;
> >
> > Dies wäre die schnellste Endlosschleife
> >
> >
> > Gruss Peter
> >
> >
> >
> > > Hallo Peter,
> > > "Dein" Programm ist etwas schneller (ca.40-50 µs), aber es bleiben immer noch 300µs.
> > > Hier nochmal das Programm:
> > >
> > > void main(void)                               //Programm 1 ausführen
> > > {
> > >     Port_DataDirBit(0,1);                   //Port PA.0 auf Ausgang
> > >     Port_DataDirBit(1,1);                   //Port PA.1 auf Ausgang
> > >     Port_WriteBit(0,0);                     //Ausgang PA.0 wird zurückgesetzt
> > >     Port_WriteBit(1,0);                     //Ausgang PA.1 wird zurückgesetzt
> > >     Irq_SetVect(INT_TIM1CMPA,Timer1_ISR1);   // Interrupt Service Routine 1 definieren
> > >     Irq_SetVect(INT_TIM3COMPA,Timer3_ISR2);   // Interrupt Service Routine 2 definieren
> > >
> > >     while (true)
> > >     {
> > >            busy=1;
> > >            Timer_T1Time(30,PS_64);        
> > >            while (busy==1);
> > >
> > >            busy=1;
> > >            Timer_T3Time(30,PS_64);        
> > >            while (busy==1);
> > >
> > >            Port_WriteBit(0,0);                 // Port 50 zurücksetzen
> > >            Port_WriteBit(1,0);                 // Port 51 zurücksetzen
> > >     }                    //Ende while (true)
> > > }                        //Ende main
> > > //__________________________________________________________________________________________
> > >  void Timer1_ISR1(void)
> > >  {
> > >      Port_WriteBit(0,1);                 // Port 51 = PA0 setzen
> > >      busy=0;
> > >      Irq_GetCount(INT_TIM1CMPA);        //Interrupt Request Counter
> > >  }
> > >  //__________________________________________________________________________________________
> > >   void Timer3_ISR2(void)
> > >  {
> > >      Port_WriteBit(1,1);                   // Port 50 setzen
> > >      busy=0;
> > >      Irq_GetCount(INT_TIM3COMPA);          //Interrupt Request Counter
> > >  }
> > >
> > > Die Zeiten für x Tics von PS_64 (4,34µs):
> > > 2:   270µs
> > > 5:   296µs
> > > 10: 304µs
> > > 20: 360µs
> > > 30: 390µs
> > > 40: 450µs
> > >
> > > Die Zeiten wurden mit einem Tektronix Oszi gemessen.
> > > PS_8 und PS_256 verhalten sich ähnlich, bei 270µs ist Ende.
> > >
> > > GruÃ? Klaus
> > >
> > >
> > > > Hallo Klaus,
> > > >
> > > > das verstehe ich nicht. Klar, der Interpreter ist kein Assembler, aber er macht ungefähr 35.000 - 40.000
> > > > Instruktionen (schwankt nach Komplexität) pro Sekunde. Das das neue Programm, wie das alte die gleiche
> > > > Zeit brauchen soll, halte ich für ungewöhnlich. Es mü�te auf jeden Fall etwas schneller sein.
> > > >
> > > > > Die Definition der IRQ-Routinen 1+2
> > > > > hab ich vor die while-Schleife mal gesetzt, auch das spart nix.
> > > > Hast Du dann für die IRQ- Routinen zwei verschiedene Timer benutzt? Sonst kann es nicht funktionieren.
> > > > Bei gleichem IRQ Vektor muÃ? gewechselt werden.
> > > >
> > > > Womit hast Du die 300µsec gemessen? Mit einem Oszi? Was passiert cdenn, wenn Du die 30 aus
> > > > "Timer_T3Time(30,PS_64);" leicht variierst? Gehen die 300µsec auch leicht rauf oder runter?
> > > >
> > > > Gruss Peter
> > > >
> > > > > Hallo Peter,
> > > > > hoffentlich war Dein Urlaub wenigstens stressfrei...
> > > > >
> > > > > Ich hab Deinen Hinweis getestet, jedoch: bei 300µs ist Ende.
> > > > > Auch wenn ich Timer 1 und 3 verwende, wird's nicht schneller. Die Definition der IRQ-Routinen 1+2
> > > > > hab ich vor die while-Schleife mal gesetzt, auch das spart nix.
> > > > > Timer 0 bringt auch nix, bei 300µs ist wieder Schlu�. Der Interpreter ist vom 15.05.2006
> > > > >
> > > > > GruÃ? Klaus
> > > > >
> > > > >
> > > > >
> > > > > > Hallo ich opimiere mal das ganze Programm. Da ich unter Stress stehe kann ich es nicht testen,
> > > > > > aber sollte bis auf Syntax Fehler funktioieren:
> > > > > >
> > > > > > void main(void)  
> > > > > > {
> > > > > > Port_DataDirBit(0,1);                   //Port PA.0 auf Ausgang
> > > > > > Port_DataDirBit(1,1);                   //Port PA.1 auf Ausgang
> > > > > > Port_WriteBit(0,0);                      //Ausgang PA.0 wird zurückgesetzt
> > > > > > Port_WriteBit(1,0);
> > > > > >
> > > > > > while (true)
> > > > > >     {
> > > > > >           busy=1;
> > > > > >           Irq_SetVect(INT_TIM3COMPA,Timer3_ISR_1);
> > > > > >           Timer_T3Time(30,PS_64);          // Differenzzeit 30 x 4,34µs
> > > > > >            while (busy);                      // warten auf IRQ
> > > > > >
> > > > > >            busy=1;
> > > > > >            Irq_SetVect(INT_TIM3COMPA,Timer3_ISR_2);
> > > > > >            Timer_T3Time(50,PS_64);        // Aus-Zeit  festlegen und Timer1 starten
> > > > > >            while (busy);
> > > > > >            Port_WriteBit(0,0);                   // Port 50 zurücksetzen
> > > > > >            Port_WriteBit(1,0);                   // Port 51 zurücksetzen
> > > > > >     }
> > > > > >  }
> > > > > >  
> > > > > >  void Timer3_ISR_1(void)
> > > > > >  {
> > > > > >      Port_WriteBit(0,1);                   // Port 51 setzen
> > > > > >      busy=0;
> > > > > >      Irq_GetCount(INT_TIM3COMPA);    
> > > > > >  }
> > > > > >
> > > > > >  void Timer3_ISR_2(void)
> > > > > >  {
> > > > > >      Port_WriteBit(1,1);                   // Port 50 setzen
> > > > > >      busy=0;
> > > > > >      Irq_GetCount(INT_TIM3COMPA);    
> > > > > >  }
> > > > > >
> > > > > >
> > > > > > Ich hoffe das Primzip ist klar.
> > > > > >
> > > > > >
> > > > > > Gruss Peter
> > > > > >
> > > > > >
> > > > > >
> > > > > > > Hi,
> > > > > > >
> > > > > > > ich konnte mich wegen Urlaubs nicht um das Forum kümmern, deshalb verspätet:
> > > > > > >
> > > > > > > Pack das "Port_WriteBit(1,1);  // Port 50 setzen" doch direkt in die ISR:
> > > > > > >
> > > > > > > void Timer3_ISR(void)
> > > > > > > {
> > > > > > >      Port_WriteBit(1,1);  // Port 50 setzen  
> > > > > > >       irq_GetCount(INT_TIM3COMPA);    
> > > > > > >  }
> > > > > > >
> > > > > > > das sollte min doppelt so schnell gehen wie die vorherige Methode. Wenn man den Wert von "irqcnt"
> > > > > > > nicht braucht, kann man sich die Zuweisung auch sparen.
> > > > > > >
> > > > > > > Man kann in einer Interruptroutine alles machen.
> > > > > > >
> > > > > > > Gruss Peter
> > > > > > >
> > > > > > > > Hallo,
> > > > > > > > 2 Ports sollen nacheinander eingeschaltet werden (Differenzzeit).
> > > > > > > > Die Zeit dazwischen 100µs, die Auszeit ist unkritisch.
> > > > > > > > Bei 300µs ist Schlu�, kürzer geht offentsichtlich nicht. (Interpreter zu langsam?)
> > > > > > > >
> > > > > > > > Lä�t sich das Problem überhaupt lösen?
> > > > > > > >
> > > > > > > > GruÃ? Klaus
> > > > > > > >
> > > > > > > > void main(void)  
> > > > > > > > {
> > > > > > > > Port_DataDirBit(0,1);                   //Port PA.0 auf Ausgang
> > > > > > > > Port_DataDirBit(1,1);                   //Port PA.1 auf Ausgang
> > > > > > > > Port_WriteBit(0,0);                      //Ausgang PA.0 wird zurückgesetzt
> > > > > > > > Port_WriteBit(1,0);
> > > > > > > > Irq_SetVect(INT_TIM3COMPA,Timer3_ISR);
> > > > > > > >
> > > > > > > > while (true)
> > > > > > > >     {
> > > > > > > >           Timer_T3Time(30,PS_64);          // Differenzzeit 30 x 4,34µs
> > > > > > > >            Port_WriteBit(0,1);                   // Port 51 setzen
> > > > > > > >            busy=1;
> > > > > > > >            while (busy==1);                      // warten auf IRQ
> > > > > > > >            Port_WriteBit(1,1);                   // Port 50 setzen
> > > > > > > >            Timer_T3Time(50,PS_64);        // Aus-Zeit  festlegen und Timer1 starten
> > > > > > > >            busy=1;
> > > > > > > >            while (busy==1);
> > > > > > > >            Port_WriteBit(0,0);                   // Port 50 zurücksetzen
> > > > > > > >            Port_WriteBit(1,0);                   // Port 51 zurücksetzen
> > > > > > > >     }
> > > > > > > >  }
> > > > > > > >  
> > > > > > > >  void Timer3_ISR(void)
> > > > > > > >  {
> > > > > > > >      int irqcnt;
> > > > > > > >      busy=0;
> > > > > > > >      irqcnt=Irq_GetCount(INT_TIM3COMPA);    
> > > > > > > >  }


    Antwort schreiben


Antworten: