ATMEL 89S52 - zpoždění
Moderátor: Moderátoři
ATMEL 89S52 - zpoždění
potřeboval bych trošku poradit a nakopnout jak vypočítat a naprogramovat zpoždění pro ATMEL 89S52, programuji v C v prostředí KEIL.
U procesoru 8051 jeden strojní cyklus (SC) zabere 12 taktů - takže při použitý krystalu 24MHz trvá jeden SC 500ns. Dejme tomu, že chci dosáhnout zpoždění 20us - což bude 40 SC.
Pro zpoždění jsem použil tento kód:
#include <REGX52.h>
#include <math.h>
delay(unsigned char y){
unsigned char i;
for(i=0;i<y;i++){;}
}
main(){
while(1){
delay(40);
P0_1 = 0;
delay(40);
P0_1 = 1;
}
}
který by měl pokud to dobře chápu fungovat tak, že i by se mělo inkrementovat do 40 a poté se vykoná další instrukce (rožnutí/zhasnutí LED). Dle logiky na začátku uvedeného výpočtu by mělo díky inkrementování do 40 dojít ke zpoždění 40 SC což by mělo být oněch 20us kterých chci dosáhnout.
Nicméně v praxi mi vychází dle osciloskopu doba zpoždění přesně 160us.
Nenapadá někoho čím to může být způsobeno? Moc díky za případné reakce.
Teď je ale otázka jak jednoduše spočítat kolik cyklů budu potřebovat pro požadované zpoždění protože to ještě závisí na tom jak si nadefinuji typ použitého čísla (v tomto případě: unsigned char )
rnbw píše:A nie je tam v kniznici funkcia, ktora robi presne oneskorenie?
no právěže jediné zpoždění je dělané dle toho co jsem napsal - a to jsem prohledával i internet. Zpoždění jsou řešená jen dle této struktury, ale jak přesný čas vypočítat jsem nikde nenašel.
Druhou možností jak realizovat zpoždění je použít časovač - což je ale pro tak krátké časy nesmysl.
unsigned char i;
Kód: Vybrat vše
for(i=0; i<n; i++) {} // n = (cykly-2)/3 5 <= n <= 769Přidáme tolik nopů, kolik je zbytek po dělení.
Příklad:
delay 300 cyklů
(300-2)/3 = 99 ; zbytek=2
Kód: Vybrat vše
for(i=0; i<99; i++) {}
_nop_();
_nop_();Při 12MHz je jeden instrukční cykl 1 mikrosekunda.