Problem z ATMega 8

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
Kamil 1
-
Posty: 70
Rejestracja: 01 cze 2007, 15:20

Problem z ATMega 8

Post autor: Kamil 1 » 19 cze 2008, 21:52

Witam.

Mam pewien problem z ATMega 8. Odrazu zaznaczam że dopiero się uczę programować. uC taktowany jest oscylatorem 8MHz. Otóż napisałem program który migał diodą LED. Odstępy zrobiłem komendom Wait 1 - czyli ok 1 sek. I tu zaczyna się problem. Zamiast 1 sek. odstęp wynosi dobre pare sekund. Nie wiem dlaczego tak się dzieje. Proszę o pomoc.

Awatar użytkownika
Zenerek
Użytkownik
Posty: 335
Rejestracja: 21 lip 2006, 11:23
Lokalizacja: Bydgoszcz
Kontakt:

Post autor: Zenerek » 19 cze 2008, 22:16

ATmega ma chyba wewnętrzny oscylator. Pewnie mniejszy niż 8MHz i stąd to opóźnienie.
Musisz wyłączyć wewnętrzny oscylator... jeśli się mylę, przepraszam...

Awatar użytkownika
RcTomek
Moderator
Posty: 243
Rejestracja: 27 wrz 2007, 21:15
Lokalizacja: Głogów / Wrocław

Re: Problem z ATMega 8

Post autor: RcTomek » 20 cze 2008, 1:12

Kamil 1 pisze:Witam.

Mam pewien problem z ATMega 8. Odrazu zaznaczam że dopiero się uczę programować. uC taktowany jest oscylatorem 8MHz. Otóż napisałem program który migał diodą LED. Odstępy zrobiłem komendom Wait 1 - czyli ok 1 sek. I tu zaczyna się problem. Zamiast 1 sek. odstęp wynosi dobre pare sekund. Nie wiem dlaczego tak się dzieje. Proszę o pomoc.
Wewnętrzny generator RC jest w miarę poprawnie skalibrowany. Twój problem tkwi w innym miejscu. Musisz wyłączyć dzielnik częstotliwości zegara przez 8 (Clock divisor by 8 ), odpowiada za to fusebit CKDIV8. Standardowo ustawiony jest wew. osc. 8MHz i do tego włączony w/w dzielnik co daje ostatecznie 1MHz, stąd tak długi czas opóźnienia.

Dodatkowo pisząc program w Bascom'ie musisz na samym początku podać częstotliwość taktowania uC w Hz ($crystal=8000000), aby komendy typu wait mogły poprawnie odmierzyć czas.

Kamil 1
-
Posty: 70
Rejestracja: 01 cze 2007, 15:20

Post autor: Kamil 1 » 20 cze 2008, 11:55

Pisząc program zawsze pamiętam aby na początku wstawić komendy $regfile i $crystal. Co do tych fusebit to jak pisałem na początku dopiero zaczynam programować i ostatnio przez grzebanie w tych fusebit zablokowałem Attiny 2313 :sad: Dlatego prosiłbym o wytłumaczenie co i jak poprzestawiać aby atmega działał poprawnie i abym go nie zablokował.

aktus
Użytkownik
Posty: 379
Rejestracja: 06 sie 2007, 20:44
Lokalizacja: Tychy

Post autor: aktus » 20 cze 2008, 15:28

No świetnie! Nawet głównej strony nie oglądasz? https://elportal.pl/modules.php?op=modl ... =0&thold=0
Ostatnio zmieniony 01 lip 2008, 16:57 przez aktus, łącznie zmieniany 2 razy.

Kamil 1
-
Posty: 70
Rejestracja: 01 cze 2007, 15:20

Post autor: Kamil 1 » 01 lip 2008, 16:20

Witam po długiej przerwie (kłopoty z kompem).

Przeczytałem ten artykuł ale nic nie rozumiem w nim nie ma nic o dzielniku częstotliwości zegara (CKDIV8) tak jak napisał o tym Ddevil . Ja też używam ISProg. Prosiłbym o wytłumaczenie co mam przestawić bo boję się że sam zablokuję uC.

Awatar użytkownika
PiotrekEl
Użytkownik
Posty: 251
Rejestracja: 02 mar 2007, 19:39
Lokalizacja: Znad Jezioraq

Post autor: PiotrekEl » 01 lip 2008, 16:30

A ATmega8 ma wogóle fusebit CKDIV8?
Tutaj masz link do kalkulatora fusów:
http://www.engbedded.com/cgi-bin/fc.cgi
Przydaje się.

Kamil 1
-
Posty: 70
Rejestracja: 01 cze 2007, 15:20

Post autor: Kamil 1 » 02 lip 2008, 16:01

W tym artykule:
https://elportal.pl/index.php?module=Co ... y&ceid=243
pisze że ustawiając CKOPT na 1 i CKSEL3...1 na 111 częstotliwość wynosi tylko 8MHz :!: A jeżeli będę taktował wyższym rezonatorem to jak należy ustawić te bity :?:

Awatar użytkownika
RcTomek
Moderator
Posty: 243
Rejestracja: 27 wrz 2007, 21:15
Lokalizacja: Głogów / Wrocław

Post autor: RcTomek » 02 lip 2008, 20:45

A ATmega8 ma wogóle fusebit CKDIV8?
Oczywiście, że ma.
Kamil 1 pisze:W tym artykule:
https://elportal.pl/index.php?module=Co ... y&ceid=243
pisze że ustawiając CKOPT na 1 i CKSEL3...1 na 111 częstotliwość wynosi tylko 8MHz :!: A jeżeli będę taktował wyższym rezonatorem to jak należy ustawić te bity :?:
Fusebity decydują o źródle sygnału taktującego i rodzaju wybranego oscylatora (karta katalogowa -> rozdział "Clock Sources"). Fusy ustawiasz adekwatnie do zastosowanego rezonatora, tzn. otwierasz data sheet'a i patrzysz, które ustawienia najbardziej będą pasowały do zastosowanego przez Ciebie oscylatora (zajrzyj do tabieli w rozdziale "Crystal Oscillator").

Kamil 1
-
Posty: 70
Rejestracja: 01 cze 2007, 15:20

Post autor: Kamil 1 » 03 lip 2008, 15:15

Dzisiaj zaprogramowałem fuse bity w następujący sposób:
CKOPT = 1
CKSEL3 = 1
CKSEL2 = 1
CKSEL1 = 1
CKSEL0 pozostawiłem bez zmian czyli 1
wszystko zgodnie z tym artykułem https://elportal.pl/index.php?module=Co ... y&ceid=243 i po załadowaniu sygnatury uC wyskakuje mi CHIP LOCKED. Na szczęście odblokowałem go zegarem 1MHz.

Aha i jeszcze jedno:

Na początku prosiłem aby mi wytłumaczyć jak należy ustawić te fusebity a wy odsyłacie mnie do stronek w których się nie mogę połapać.

Proszę o pomoc.
Ostatnio zmieniony 04 lip 2008, 10:22 przez Kamil 1, łącznie zmieniany 1 raz.

spark
Użytkownik
Posty: 412
Rejestracja: 25 lis 2004, 15:50
Lokalizacja: Wrocław

Post autor: spark » 03 lip 2008, 16:05

Ddevil pisze:
A ATmega8 ma wogóle fusebit CKDIV8?
Oczywiście, że ma.
Błąd... ATmega8 nie posiada takiego bitu konfiguracyjnego jak CKDIV8 a dokumentacja ATmega8(L) na 308 stronach przydatnych informacji nie wspomina o nim nawet słówkiem.
Radzę się zastanowić zanim się cokolwiek napisze aniżeli wprowadzać ludzi w błąd.
Kamil 1 pisze:W tym artykule:
https://elportal.pl/index....isplay&ceid=243
pisze że ustawiając CKOPT na 1 i CKSEL3...1 na 111 częstotliwość wynosi tylko 8MHz :!: A jeżeli będę taktował wyższym rezonatorem to jak należy ustawić te bity :?:
A co na to karta katalogowa?
Datasheet ATmega8(L) pisze:For resonators, the maximum frequency is 8 MHz with CKOPT unprogrammed and 16 MHz with CKOPT programmed.
W wolnym tłumaczeniu: "Dla rezonatorów, maksymalna częstotliwość wynosi 8MHz z niezaprogramowanym fusebitem CKOPT oraz 16MHz z zaprogramowanym CKOPT".

Wystarczy wpisać 0 do CKOPT jeśli chcesz wykorzystać rezonator 16MHz.

Pozdrawiam
spark

[ Dodano: 2008-07-03, 17:13 ]
Kamil 1 pisze:Na początku prosiłem aby mi wytłumaczyć jak należy ustawić te fusebity a wy odsyłacie mnie do stronek w których się nie mogę połapać.

Proszę o pomoc.
A powiedz mi z czym masz problem to jakoś zaradzimy.
W art starałem się wyjaśnić teoretycznie jak najprościej się da, jak zaprogramować "fuse bity".

Po pierwsze: Czy masz programator ISP? Jeśli tak to jaki?
Po drugie: Z jakiego źródła chcesz taktować uC i jaką wartością częstotliwości? Czy to ma być kwarc zewnętrzny, RC, czy możne wewnętrzny generator?

Awatar użytkownika
PiotrekEl
Użytkownik
Posty: 251
Rejestracja: 02 mar 2007, 19:39
Lokalizacja: Znad Jezioraq

Post autor: PiotrekEl » 03 lip 2008, 16:26

Spark89 pisze:
Ddevil pisze:
A ATmega8 ma wogóle fusebit CKDIV8?
Oczywiście, że ma.
Błąd... ATmega8 nie posiada takiego bitu konfiguracyjnego jak CKDIV8 a dokumentacja ATmega8(L) na 308 stronach przydatnych informacji nie wspomina o nim nawet słówkiem.
Radzę się zastanowić zanim się cokolwiek napisze aniżeli wprowadzać ludzi w błąd.
Tak też mi się zdawało że nie ma bo się nie spotkałem z nim ani nie widziałem.
Ale głowy nie dam :wink:

Kamil 1
-
Posty: 70
Rejestracja: 01 cze 2007, 15:20

Post autor: Kamil 1 » 03 lip 2008, 16:41

Spark89 pisze: Po pierwsze: Czy masz programator ISP? Jeśli tak to jaki?
Po drugie: Z jakiego źródła chcesz taktować uC i jaką wartością częstotliwości? Czy to ma być kwarc zewnętrzny, RC, czy możne wewnętrzny generator?
Więc tak:
Posiadam programator ISP (http://dybkowski.net/elka/ispprog.html), a uC ma być taktowny z zewnętrznego rezonatora o częstotliwości 8MHz.

Proszę Cię Spark89 o pomoc.

spark
Użytkownik
Posty: 412
Rejestracja: 25 lis 2004, 15:50
Lokalizacja: Wrocław

Post autor: spark » 04 lip 2008, 15:36

Kamil 1 pisze:Posiadam programator ISP (http://dybkowski.net/elka/ispprog.html), a uC ma być taktowny z zewnętrznego rezonatora o częstotliwości 8MHz.
Ustaw proszę fuse bity tak jak to jest napisane w artykule https://elportal.pl/index.php?module=Co ... y&ceid=243 na takie wartości:

BOOTRST - 1
BOOTSZ1 - 1/0 (jeden lub zero) daj 0...
BOOTSZ2 - 1/0 ...i tu też 0
BODLEVEL - 0
BODEN - 0
WDTON - 1
RSTDISBL - 1
EESAVE - 1
CKSEL3...1 - 111
CKOPT - 1
CKSEL0 - 1
SUT1 - 0
SUT0 - 1

Jak nie możesz sobie poradzić z jakimkolwiek etapem zaprogramowania fusebitów to mów, pytaj... jak coś się będzie działo np. nie możesz zaprogramować uC też krzycz... na wszystko zwracaj uwagę i o wszystkim pisz...

no to wsadź te wartości do uC i odpal program, napisz jakie są efekty...

Kamil 1
-
Posty: 70
Rejestracja: 01 cze 2007, 15:20

Post autor: Kamil 1 » 04 lip 2008, 18:18

Wielkie dzięki Spark89 za odpowiedź.

Niestety dzisiaj ok. 11.00 bawiąc się fusebit-ami chyba zablokowałem ATmega8 (ustawiłem wszystkie CKSEL3...0 na 0). Próbowałem nawet do XTAL1 dołączyć zewnętrzny generator 1MHz ale to nic nie dało.

Spróbuję pozmieniać te fusebity na nowym uC (jak kupię).

[ Dodano: 2008-07-04, 21:52 ]
Uff... w porządku odblokowałem go, okazało się że zewnętrzny generator (1MHz) podpinałem do XTAL2 uC zamiast do XTAL1.

Co do tych fusebitów ustawiłem je tak jak napisałeś Spark89. Jednak co najdziwniejsze po kliknięciu na READ SIGNATURE wyskakują losowo 3 rodzaje napisów: CHIP LOCKED, ATmega8 (czyli go widzi) i NOT KNOWN. Nie wiem o co tu chodzi raz go widzi a raz nie.

A czytałem gdzieś że jeśli jest mowa że np. CKSEL1 ma być ustawiony na 0 to trzeba w programatorze miejsce CKSEL1 ustawić na 1. Może tu robię błąd?

ODPOWIEDZ