Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > 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); > > > > > > > > > }