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 ;
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)
);
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Meine Hoffung auf ein besseres Verständnis meinerseits durch Auflösen der Klammern erfüllten sich nie - das wird dadurch eher noch kryptischer.
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) );
}
}
// - - - - - - - - - - - - - - - -
Auch das Studium des entsprechenden Abschnittes der *.lls-Datei half mir nie. Daher die Bitte um Hilfe.
Ausschnitt "*.lls"
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>:
// ============================================================================= =
Danke im Voraus für Eure Mühe.
Lesezeichen