Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Kod w C. Przeróbka z zegara 8MHz(4MHz) na 16MHz.Pomocy.

mazi1984
-
-
Posty:1
Rejestracja:28 lut 2008, o 19:52
Lokalizacja:Polska
Kod w C. Przeróbka z zegara 8MHz(4MHz) na 16MHz.Pomocy.

Postautor: mazi1984 » 8 paź 2008, o 23:03

Witam wszystkich
Jak przerobić ten kod aby odpowiadał zegarowi 16MHz?

Kod: Zaznacz cały

void dl(unsigned char x) { TCCR0=0x02; OCR0=x; while(1) { if(TCNT0>=OCR0) break; } TCCR0=0; TCNT0=0; } void dlms(unsigned char x) { TCCR0=0x05; OCR0=8; for(;x>0;x--) { TCNT0=0; while(1) { if(TCNT0>=OCR0) break; } } TCCR0=0; TCNT0=0; }
Z góry dzięki

tg3a
-
-
Posty:243
Rejestracja:26 maja 2008, o 19:46
Lokalizacja:Warszawa

Re: Kod w C. Przeróbka z zegara 8MHz(4MHz) na 16MHz.Pomocy.

Postautor: tg3a » 9 paź 2008, o 11:11

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

Kod: Zaznacz cały

... OCR0=8; ....
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.

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 29 gości