Skocz do zawartości
ghost1313

Problem z wewnętrznym oscylatorem ATMEGA8A-PU

Pomocna odpowiedź

Napisano (edytowany)

Witam,

dzisiaj, po całym dniu walki, udało mi się podłączyć mikrokontroler ATMEGA8A-PU i wgrać na niego pierwszy, migający diodą, program. Użyłem do tego następującej sekwencji poleceń:

avr-gcc -mmcu=atmega8 -DF_CPU=8000000 dioda.c -o dioda
avr-objcopy -O ihex dioda dioda.hex
avrdude -c usbasp -p m8 -U flash:w:dioda.hex

Wszystko działa jeśli oscylator jest skonfigurowany do pracy z częstotliwością 1MHz lub 2MHz. Jednak jeśli przestawię oscylator na 4MHz lub 8MHz dioda gaśnie i nic się nie dzieje. Oczywiście dostosowuję odpowiednio parametr DF_CPU. Co zrobić, aby układ działał również na wyższym taktowaniu zegara?

Edytowano przez ghost1313

Udostępnij ten post


Link to post
Share on other sites

Rozumiem, że w celu zmiany częstotliwości taktowania ustawienia fuse bit'ów również zmieniasz za pomocą avrdude.

Jakiego polecenia używasz, aby zmienić źródło taktowania na wewnętrzny oscylator 8MHz?

Udostępnij ten post


Link to post
Share on other sites

Tylko że tak naprawdę program mkAVR Calculator zapisuje bajty konfiguracyjne (fuse bity) do mikrokontrolera właśnie używając avrdude. 

Jedną z przyczyn Twoich problemów (skoro przy innych ustawieniach taktowania program działa) mogą być źle ustawione fuse bity, dlatego chciałem, żebyś podał wartości bajtów konfiguracyjnych fuse low byte oraz fuse high byte, jakie ustawiłeś, zanim program przestał działać, aby sprawdzić, czy ustawiłeś je prawidłowo. W mkAVR Calculator  wartości te powinny być podane na górze okna programu (dwie dwucyfrowe wartości w formacie szesnastkowym oznaczone jako LOW i HIGH).

Mógłbyś też dokładniej opisać, jakie kolejne kroki podejmujesz, aby zmienić częstotliwość taktowania. Skoro przy niższej częstotliwości program działa prawidłowo, to przy wyższej też musi, więc jeśli nie działa, to coś na pewno robisz nieprawidłowo.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Właśnie sprawdziłem to jeszcze raz i teraz układ działa dla 8MHz. Wczoraj jednak zdecydowanie nie działał, ale wieczorem jeszcze się z tym bawiłem, więc musiałem coś przypadkowo naprawić. Układ nie działa jednak z zewnętrznym kwarcem 16MHz. Fuse bity są ustawione na FF(low) CA(high), testowałem też dla FF(low) DA(high). Dla tych drugich dioda miga, ale w czasie świecenia jakby migocze, nie świeci stabilnie i czasem się wyłącza na dłuższą chwilę, generalnie działa, ale chaotycznie, niezgodnie z kodem programu. Dla tych pierwszych nie działa wcale. Co prawda, podłączyłem kwarc bez kondensatorów, ale przy tak prostym programie podobno nie powinno to mieć żadnego znaczenia.

Dla 8MHz mam ustawienie E4(low) DA(high) i układ działa. Bity ustawiam tylko i wyłącznie poprzez zakładkę Fusy uproszczone programu mkAVR Calculator.

Edytowano przez ghost1313

Udostępnij ten post


Link to post
Share on other sites
20 godzin temu, ghost1313 napisał:

Co prawda, podłączyłem kwarc bez kondensatorów, ale przy tak prostym programie podobno nie powinno to mieć żadnego znaczenia.

Stopień komplikacji programu nie ma związku ze stabilnością pracy oscylatora. Proponuję jednak podłączyć te kondensatory (z zakresu12-22pF).

20 godzin temu, ghost1313 napisał:

Fuse bity są ustawione na FF(low) CA(high), testowałem też dla FF(low) DA(high).

Jeśli chodzi o wartość bajtu low, powinno być OK.

Jeśli chodzi o wartość bajtu high, to obydwie użyte przez Ciebie wartości włączają fuse bit BOOTRST, który powinien być zaprogramowany w przypadku używania w mikrokontrolerze tzw. bootloadera. Z Twojej wypowiedzi wynika, że nie używasz bootloadera, więc ten bit powinien być wyłączony.

Dodatkowo wartość high równa DA oznacza wyłączenie fuse bitu CKOPT, który w przypadku użycia kwarcu 16MHz powinien być włączony.

Podsumowując, w Twoim przypadku (po zastosowaniu kwarcu 16MHz prawidłową wartością bajtu high będzie C9. Oczywiście program również wymaga ponownego skompilowania z odpowiednio ustawioną wartością -DF_CPU=16000000UL oraz wgrania do mikrokontrolera. No i pamiętaj o dołożeniu kondensatorów.

Udostępnij ten post


Link to post
Share on other sites

Ustawiłem fuse bity na FF(low) C9(high), podłączyłem kondensatory ceramiczne 22pF do oscylatora i przekompilowałem program. Dioda nie działa. Sprawdziłem dla 1MHz i przy takich ustawieniach nadal działa. Niemniej, kiedy wspomniałeś o bootloaderze przypomniało mi się, że wgrywałem na ten mikrokontroler bootloader Arduino. Chciałem spróbować wgrać na niego szkic Arduino, ale obecnie czekam na zamówiony konwerter USB->TTL. Może to fakt wgrania tego bootloadera powoduje tu jakieś problemy?

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
5 godzin temu, ghost1313 napisał:

Może to fakt wgrania tego bootloadera powoduje tu jakieś problemy?

Nie sądzę, że to powoduje problemy. Przed zaprogramowaniem nowego wsadu zawsze wykonywana jest komenda Chjp Erase, która kasuje zawartość FLASH, EEPROM oraz lock bity, więc jeśli tam miałeś jakiś bootloader, to już powinien zostać wykasowany po wgraniu programu przez avrdude. Chip Erase nie kasuje tylko fuse bitów, więc trzeba je zmienić samodzielnie. Stąd zapewne ta "pozostałość" w postaci ustawionego fuse bitu BOOTRST.

5 godzin temu, ghost1313 napisał:

Ustawiłem fuse bity na FF(low) C9(high), podłączyłem kondensatory ceramiczne 22pF do oscylatora i przekompilowałem program. Dioda nie działa.

Napisałeś, że przekompilowałeś program. Zakładam, że wgrałeś go do mikrokontrolera przed sprawdzeniem, czy dioda działa?

Przy takich ustawieniach fuse bitów z prawidłowo podłączonym rezonatorem kwarcowym program musi działać. Jesteś pewny, że fuse bity zostają faktycznie prawidłowo zmienione w mikrokontrolerze? Odczytywałeś je z mikrokontrolera po ich ustawieniu? Czy na pewno program jest prawidłowo wgrany i zweryfikowany? avrdude nie wyświetla żadnych błędów w konsoli? Zasilanie masz stabilne i dobrze odfiltrowane? Operujesz na płytce stykowej? Połączenia dobrze kontaktują? Z Twoich postów wynika, że raz coś działa, raz nie, więc może problem nie jest w fuse bitach tylko po stronie sprzętowej (np. niestabilne połączenia).

Jeśli w programie nic nie zmieniasz, tylko ponownie go kompilujesz przed wgraniem z odpowiednio zmienioną wartością F_CPU, to raczej nie jest to wina kodu, skoro działa przy wewnętrznym oscylatorze.

Trudno tak zdalnie doradzić co jeszcze może być nie tak. Podałeś trochę mało informacji, więc trudno się domyślać. Mógłbyś ewentualnie pokazać jednak mimo wszystko kod programu i może jakieś zdjęcie, jak to masz połączone.

 

Edytowano przez andrews

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...