oberallgeier
17.12.2021, 10:52
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 ;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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.
// - - - - - - - - - - - - - - - -
{ //
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"
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.
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 ;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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.
// - - - - - - - - - - - - - - - -
{ //
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"
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.