Hallo Programmierkundige - in C.
Vor Jahren war ich über eine Waitroutine gestolpert die ich nicht selten in meinen Quellen benutze besondes dann, wenn Warten angesagt ist ohne dass Timer, insbes. Interrupts erwünscht/zugelassen sind. Das übliche "delay" aus den Codesammlungen hatte ich eigentlich nie benutzt, weil ich der Hoffnung war, irgendwann in die Geheimnisse der erwähnten Routine einzdringen. Is nicht! Leider. Statt C klingt die mir immer noch wie Kantonesisch, Mandarin, Spanisch oder so - mit zusätzlichen Defekten in der Tastatur. Daher meine Bitte mir zum Verständnis des Ablaufes zu helfen.
Bei der Anwendung ist mir klar, dass die Routine ein Behelf ist - interuptgetriebene Timer wären da meist sinnvoller, die verwende ich auch. Nichts desto trotz würde ich gerne die Geheimnisse dieses Codes verstehen ;
Meine Hoffung auf ein besseres Verständnis meinerseits durch Auflösen der Klammern erfüllten sich nie - das wird dadurch eher noch kryptischer.Code:// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void wms ( uint16_t ms ) // 128 kHz-wms; Pausenwert ist nur experimentell ! // M E I S T keine Millisekunde ! ! ! // - - - - - - - - - - - - - - - - { // Weiter Messwerte in L3_tmr10.c und früher (siehe dort) for(; ms>0; ms--) { // uint16_t __c = 26; // Ergibt am 14Dez21,17h34 1,001 sec bei wms=1000 // => bei wms ( 100) ist der (periphere) Einfluss // des Programmablaufs deutlich messbar !! __asm__ volatile ( // "1: sbiw %0,1" "\n\t" // schwankt >> mit Temperatur ! ! ! "brne 1b" : "=w" (__c) : "0" (__c) ); } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Auch das Studium des entsprechenden Abschnittes der *.lls-Datei half mir nie. Daher die Bitte um Hilfe.Code:// - - - - - - - - - - - - - - - - { // for(; ms>0; ms--) { // uint16_t __c = 26; // Dieser Wert dient zur Anpassung an ControllerClock etc. __asm__ volatile ( "1: sbiw %0,1" "\n\t" "brne 1b" : "=w" (__c) : "0" (__c) ); } } // - - - - - - - - - - - - - - - -
Ausschnitt "*.lls"
Danke im Voraus für Eure Mühe.Code:00000032 <wms>: for(; ms>0; ms--) { // uint16_t __c = 26; // Ergibt am 14Dez21,17h34 1,001 sec bei wms=1000 // => bei wms ( 100) ist der (periphere) Einfluss // des Programmablaufs deutlich messbar !! __asm__ volatile ( // 32: 2a e1 ldi r18, 0x1A ; 26 34: 30 e0 ldi r19, 0x00 ; 0 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void wms ( uint16_t ms ) // 128 kHz-wms; Pausenwert ist nur experimentell ! // M E I S T keine Millisekunde ! ! ! // - - - - - - - - - - - - - - - - { // Weiter Messwerte in L3_tmr10.c und früher for(; ms>0; ms--) 36: 04 c0 rjmp .+8 ; 0x40 <__SREG__+0x1> { // uint16_t __c = 26; // Ergibt am 14Dez21,17h34 1,001 sec bei wms=1000 // => bei wms ( 100) ist der (periphere) Einfluss // des Programmablaufs deutlich messbar !! __asm__ volatile ( // 38: f9 01 movw r30, r18 3a: 31 97 sbiw r30, 0x01 ; 1 3c: f1 f7 brne .-4 ; 0x3a <__CCP__+0x6> // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void wms ( uint16_t ms ) // 128 kHz-wms; Pausenwert ist nur experimentell ! // M E I S T keine Millisekunde ! ! ! // - - - - - - - - - - - - - - - - { // Weiter Messwerte in L3_tmr10.c und früher for(; ms>0; ms--) 3e: 01 97 sbiw r24, 0x01 ; 1 40: 00 97 sbiw r24, 0x00 ; 0 42: d1 f7 brne .-12 ; 0x38 <__CCP__+0x4> "1: sbiw %0,1" "\n\t" // schwankt >> mit Temperatur ! ! ! "brne 1b" : "=w" (__c) : "0" (__c) ); } } 44: 08 95 ret 00000046 <main>: // ============================================================================= =







Zitieren

Lesezeichen