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 PeterS - 10.07.2006 10:39)
Als Antwort auf Re: Timer mit 100µs von Klaus B. - 10.07.2006 10:08

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:

Re: Timer mit 100µs (von Klaus B. - 10.07.2006 16:03)
    Re: Timer mit 100µs (von PeterS - 10.07.2006 17:53)
        Re: Timer mit 100µs (von Klaus B. - 11.07.2006 7:43)
            Re: Timer mit 100µs (von Klaus B. - 13.07.2006 6:44)