krychu0505 napisał:
A może wyłumaczyć mi ktoś tak jaśniej niż whelpie bascoma

co to jest ten prescaler i co on dzieli.
Może tak po kolei jak twój program widnieje:
1. Jeżeli PORTB jest przeznaczony do obsługi LCD to nie konfiguruj go w ogóle w stylu jaki podałeś w pierwszym poście.
Config Portb = &B11111111 : Portb = &B11111111
===> źle!!!
Może to powodowac zakłócenia w inicjacji LCD.
Port ten dla LCD zostanie poprawnie skonfigurowany przez kompiler instrukcją:
Config Lcdpin = ......
Owszem, jeżeli chcesz wykorzystac któryś z pozostałych (nie użytych) pinów tego portu możesz to zrobic selektywnie np. (pinb.0 i pinb.1 są wolne), więc każdy z nich możesz skonfigurowac zupełnie dowolnie jako wejście lub wyjście. Powiedzmy że potrzebujesz coś sygnalizowac diodą na jednym z nich, zatem byłoby:
Config PORTB.0 = output
Następny problem: timery i prescaler
Najpierw, 'co to jest prescaler?' - jest to wielostopniowy dzielnik (najczęściej 10 bit) z pewną ilością wyjśc/ dzielników: 1,8,64,256,1024 (w pewnym sensie podobna analogia do "odczepów" trafo ), Zasilany jest bezpośrednio z głównego zegara taktującego i pracuje stale niezależnie od pracy pozostałych peryferiów. Wykorzystywany jest tylko przez timery z możliwością wybrania dowolnego wyjścia.
Wyjście z wybranym dzielnikiem jest określone wpisem konfigurującym timer. W momencie sconfigurowania timera i jego prescalera następuje załączenie odpowiedniego wyjścia prescalera do wejścia timera, a wtedy timer zaczyna pracowac z odpowiednio zmniejszoną częstotliwością.
W twoim przypadku: podmiany Timera0 przez Timer1 nie jest poprawne stosownie dokładnie tej samej procedury.
Twój cel to odmierzanie przedziałów 1-sekundowych(!)
Ponieważ przy taktowaniu 8MHz i nawet maxymalnym prescalerze, Timer0 nie jest w stanie odmierzyc 1 sekundę, więc musiałeś to robic stopniowo: 4 msec; razy 25, otrzymałeś 100 msec; razy 10 ; -> dopiero miałeś 1 sekundę. Po drodze potrzebowałeś dodac kilka dodatkowych zmiennych i instrukcji warunkowych. Do niczego nie wykorzystywałeś tych 4-msec i 100 msec interwałów czasowych.
Na szczęście Timer1 jest dostatecznie "długi" (16-bit) co pozwoli odmierzyc 1 sekundę w jednym odcinku w wyjątkowo prostej konfiguracji, a nawet przy tej samej, a jedynie subrutyna przerwania wymaga korekty.
Zaloguj się, aby zobaczyć kod
Naturalnie zamiast
Timer1 = 34286 możesz zastosowac równoważny wpis:
Load Timer1, 31250
Przy takim rachunku wiele zmiennych i instrukcji może byc wyeliminowane z twojego listingu.
Aby nie robic większego zamieszania to tylko wspomnę że nie jest to najprostsza metoda odmierzenia czasu. Timer1 może byc skonfigurowany w trybie CTC, wtedy nie ma potrzeby każdorazo w przerwaniu wpisywania do timera1 wartości początkowej (preload).
Dla ułatwienia proponowałbym używac jakis AVR Timer Calculator.
Nezły jest ten:
http://www.planet-ian.com/start_e.htm
wybierz: 'Software tools'
e marcus