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

Re: Interruptroutine Capture Compare Kategorie: Programmierung C (von Josef - 22.08.2009 19:41)
Als Antwort auf Re: Interruptroutine Capture Compare von PeterS - 22.08.2009 12:04
Ich nutze:
C-Control Pro Mega128
> > > > > > hallo
> > > > > > das problem besteht darin, dass die interruptroutine keine abfrage (if, switch usw.)
> > > > > > oder einen Unterprogrammaufruf vertr├Ągt.
> > > > >
> > > > > Hi, das mag Dir so erscheinen ist aber nicht so. If's etc. funktionieren In IRQ Routinen, sonst
> > > > > w├╝rde die ganze DCF Library nicht funkionieren.
> > > > >
> > > > > > sobald ich in die unten angef├╝hrte interruptroutine ein if einbaue verabschiedet sich der prozessor.
> > > > > >
> > > > > > void Timer3_ISR(void)
> > > > > > {
> > > > > >    x[a]=Timer_T3GetPM();
> > > > > >    Irq_GetCount(INT_TIM3CAPT);           // Interrupt zur├╝cksetzen
> > > > > > }
> > > > > >
> > > > > > will man nun ein signal mit unterschiedlichen Pulsl├Ąngen messen, funktioniert das nur
> > > > > > wenn man im hauptprogamm ein while (x[a]==0; einbaut und anschlie├čend die Messung
> > > > > > wieder startet (Bemerkung: ist aber nicht sinn eines interrupts, wenn man wartet bis der interrupt
> > > > > > abgearbeitet ist)
> > > > >
> > > > > Man sollte immer! im Interrupt nur das n├Âtigste erledigen, und den Rest im normalen Programm
> > > > > verarbeiten. Dabei erlaubt der Interpreter seinen IRQ Routinen viel mehr, als eine wirkliche
> > > > > CPU durchgehen liesse.
> > > > >
> > > > > Gruss Peter
> > > > >
> > > > > > oder man l├Ąsst den code durchrasseln und macht immer wieder eine abfrage -> dann ├╝bersieht man
> > > > > > irgendwann einen puls, wenn der codedurchlauf zu lange wird.
> > > > > > gibts hier eine l├Âsung?
> > > > > >
> > > > > > gru├č
> > > > > > josef
> > > >
> > > > :-( -> schwache antwort
> > >
> > > Nein, denn das ist eine Verhaltensregel, und keine Erkl├Ąrung von Fehlern. Eine laufende Interrupt-
> > > routine blockiert das Multithreading und andere Interrupts. Deshalb ist es normalerweise unklug,
> > > zuviel in einer IRQ Routine zu erledigen.
> > >
> > > > ich glaube nicht, wenn man eine if x[a]>0 m++; Abfrage in die interruptroutine einbaut, das eine lange ist.
> > > > beim 10msec interrupt -> DCF 77 programm werden auch unterprogrogramme in der interruptroutine
> > > > ausgef├╝hrt und es funktioniert.
> > > > warum genau beim timer 3 nicht?
> > >
> > > Ich kann Dir versichern, das es keinen Unterschied in der Abarbeitung von 10msec IRQs oder Timer3
> > > IRQs gibt. Ich mu├č es eigentlich wissen, denn ich habe es implementiert. Es gibt aber wie oft,
> > > auch andere Faktoren. Wie lang sind eigentlich die Impulse, die Du messen willst? W├Ąre es m├Âglich,
> > > das Deine Programmlogik durcheinanderkommt, wenn die Impulse k├╝rzer sind, als die Abarbeitung
> > > der IRQ Routine? Da ich Dein Hauptprogramm nicht kenne, ist das nat├╝rlich nur eine von mehreren
> > > m├Âglichen Hypothesen.
> > >
> > > Gruss Peter
> > >
> > > > gru├č josef
> >
> > hallo Peter
> >
> > habe aufgrund deiner ausf├╝hrungen ein setup durchgef├╝hrt und siehe da alles das wie oben beschrieben
> > funktioniert. der UTI Baustein auch  3St├╝ck mit je 3 PT1000 werden einwandfrei abgearbeitet.
> >
> > danke f├╝r deine Hilfe
> > gru├č josef
> > wenn es erw├╝nscht ist k├Ânnte ich das Projekt als Beispiel zur verf├╝gug stellen.
> >
> > noch zwei fragen
> > wird es bei der definition von der seriellen in zukunft auch 9 Datenbits zu definieren geben?
>
> Nein, das ist ziemlich exotisch und arbeitet auch nicht mit dem Modell der seriellen IRQ Buffer
> zusammen. Du kannst aber ├╝ber DirAcc_Write() das UCSRB Register schreiben, und dort den 9-Bit
> Mode setzen. F├╝r den Fall wo das 9. Bit immer Null ist, wie Du es wahrscheinlich brauchst,
> sollte das gehen.
>
> > und kann man die Ports, die auf ausgang geschaltet sind abfragen auf deren zustand?
>
> Du schreibst doch selbst die Werte auf die Ports, merk Dir doch in einer byte Variable
> den Zustand.
>
> Gruss Peter
>
Danke f├╝r die antwort,
werde das mal probieren.
ich habe heute mit Serial_Init_IRQ von der Schnittstelle einlesen k├Ânnen.

Gru├č
josef R


    Antwort schreiben


Antworten: