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ę

M8L na 3V i Timer0

Awatar użytkownika
XAX
-
-
Posty:48
Rejestracja:4 kwie 2003, o 06:11
Lokalizacja:Krakow
M8L na 3V i Timer0

Postautor: XAX » 20 sie 2007, o 23:37

Witam

Procesor Atmel Mega8 zasilamy 3V
Taktowany 8MHz z wewnętrznego zegara procesora
Potrzebuje odmierzać równe impulsy co 1 sekundę i chciałem wykorzystać do tego celu Timer0. I tu pojawia mi się problem. W obrębie pętli Do Loop wszystko działa poprawnie (led gaśnie i zapala się na okres 5 sekund). Jednak wygląda tak jakby przerwania nie działały i nie wiem czemu. Zastanawiam się czy przypadkiem powodem problemu nie jest sposób taktowania procesora bo podobny program w innym układzie z prcesorem taktowanym z kwarcu działa poprawnie

Kod: Zaznacz cały

$regfile = "m8def.dat" ' typ procesora Config Pind.5 = Output 'led zielony Config Pind.6 = Output 'led czerwony Set Portd.5 'led zielony Set Portd.6 'led czerwony Dim X As Byte 'zmienna do obliczen Dim Tl As Byte 'licznik Timer0 Config Timer0 = Timer , Prescale = 256 'konfigoracja timera On Timer0 Odmierz Enable Interrupts Enable Timer0 Load Timer0 = 250 Start Timer0 Do Toggle Portd.6 Wait 5 Loop '------------------------------------------------------------------- Odmierz: Load Timer0 = 250 Incr Tl If Tl = 125 Then Tl = 0 Toggle Pind.5 End If Return

RcTomek
-
-
Posty:357
Rejestracja:18 lip 2005, o 17:28
Lokalizacja:Głogów / Wrocław

Postautor: RcTomek » 21 sie 2007, o 10:18

Jeżeli chodzi o samo działanie programu, to taktowanie nie ma nic do rzeczy. Jeżeli chciałbyś precyzyjnie odmierzać czas (w Twoim przypadku co 1s), to musisz zastosować rezonator kwarcowy. Wewnętrzny generator RC jest niestabilny, więc precyzja nie będzie zadowalająca. Na końcu programu głównego zawsze umieszczamy instrukcję END. Zapis Timer0 = 6 daje większą precyzję niż polecenie Load Timer0 = 250. I ostatnia uwaga: do rejestru PINx nie możemy wpisac żadnej wartości. Służy on jedynie do odczytywania rzeczywistego stanu końcówki Px.x. To właśnie było przyczyną "niedziałających" przerwań :)
Poniżej poprawiony program:

Kod: Zaznacz cały

$regfile = "m8def.dat" $crystal = 8000000 'częstotliwość oscylatora Config Pind.5 = Output Config Pind.6 = Output Set Portd.5 Set Portd.6 Dim Tl As Byte Config Timer0 = Timer , Prescale = 256 Enable Interrupts Enable Timer0 Tl = 0 On Timer0 Odmierz Do Toggle Portd.6 Wait 5 Loop End 'ZAWSZE na końcu programu głównego! '------------------------------------------------------------------- Odmierz: Timer0 = 6 'skracamy cykl Incr Tl If Tl = 125 Then Tl = 0 Toggle Portd.5 'z rejestru PIND możemy tylko odzczytywać wartość! End If 'musi być PORTD.5 Return

Awatar użytkownika
XAX
-
-
Posty:48
Rejestracja:4 kwie 2003, o 06:11
Lokalizacja:Krakow

Postautor: XAX » 21 sie 2007, o 20:10

Witaj

Dzięki program działa :)
Tak to jest jak się pisz program po 12 godzinach pracy i późno w nocy.

Źle się wyraziłem nie potrzebuje super dokładności więc generator w M8 mi wystarcza tym bardziej że układ elektroniczny ma być minimalistyczny.

Zamykamy temat.

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 18 gości