W funkcji dl(unsigned char x) można zrobić to dwojako:
-jeśli jest pewność, że nie będzie wywoływana nigdy z parametrem większym od 127 (dla przejścia z 8 na 16 MHz), lub od 63 (dla przejścia z 4 na 16 MHz), to można dodać mnożenie x przez 2 (lub odpowiednio przez 4), najprościej poprzez przesunięcie w lewo:
Kod: Zaznacz cały
void dl(unsigned char x)
{
x<<=1; //dla mnożenia przez 4 przesunięcie o 2, a nie o 1
TCCR0=0x02;
....
Jeśli takie ograniczenie jest niedopuszczalne, to trzeba chyba powtórzyć pętlę opóźniającą:
Kod: Zaznacz cały
void dl(unsigned char x)
{
TCCR0=0x02;
OCR0=x;
while(1)
{
if(TCNT0>=OCR0)
break;
}
TCNT0=0;
while(1)
{
if(TCNT0>=OCR0)
break;
}
TCCR0=0;
TCNT0=0;
}
W przypadku drugiej funkcji sztuczka z mnożeniem x przez 2 lub 4 również może być zastosowana (pod tym samym warunkiem, co poprzednio), ale mamy też inne rozwiązanie. Możemy zmienić wartość 8 w instrukcji
na 16 (lub 32 dla przejścia z 4 na 16 MHz).
Przedstawione rozwiązania wydłużają w przybliżeniu dwukrotnie lub czerokrotnie czas wykonania funkcji liczony w okresach zegara procesora, więc powinny w efekcie dać mniej więcej ten sam czas wykonywania tych funkcji opóźniających. W przypadku rozwiązania z modyfikacją wartości wpisywanej do OCR0 być może lepszą zgodność uzyska się nieznacznie modyfikując tę nową wartość (np. może nie 16, a 17). Trzeba sprawdzić na symulatorze, jak to wygląda dla różnych wartości x.
Życzę sukcesów.