Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Atmega8] kwarc a PB6 i PB7. Jak to działa?

lukash90 22 Apr 2012 23:45 4504 26
  • #1
    lukash90
    Level 16  
    Witam, na początku dodam, że nie mam żadnego problemu, wszystko to co chcę działa i wgl, ale nurtuje mnie jedna sprawa. Otóż używam Atmegi8 na zestawie uruchomieniowym, która taktowana jest kwarcem. W dokumentacji odszukałem, że kwarc podpina się do tych samych nóżek co piny PB6 i PB7. Co się zatem dzieje na tych pinach, jeśli ja w moim programie je wykorzystuje jako wyjścia/wejścia? A może ja w ogóle nie korzystam z kwarcu i wcale o tym nie wiem? Można jakoś sprawdzić z jakiego źródła jest taktowany procesor?
    Dodam, że używam programatora usbasp, programy piszę w Programers Notepad a jedyna "konfiguracja" jaką widziałem na oczy to plik Makefile, który też w większości został przeze mnie wyklikany. Tam właśnie mam wpisaną częstotliwość zegara ale nie widziałem linijki, która mówiła by czy to ma być wewnętrzny oscylator czy kwarc. Nigdy też nie używałem Fuse Bitów (nawet nie wiem gdzie się je ustawia).
    Będę bardzo wdzięczny za proste i zwięzłe przybliżenie mi tego tematu i rozwianie wątpliwości.
  • #2
    Goofy1991
    Level 11  
    Witaj!
    Zazwyczaj pomaga odpowiedni rozdział noty katalogowej.
    Natomiast nie napisałeś jakiego programu używasz do programowania.
    Jeśli jest to avrdude to możesz odczytać łatwo fusebity - one zawierają informację o źródle taktowania mikrokontrolera. Jeśli używasz zewnętrznego kwarcu to linie są poprostu nieaktywne/niedostępne dla programisty, nie ważne co do nich zapiszesz po prostu są wewnętrznie odłączone od portu.
    Jeśli nie wiesz z jakiego źródła korzystasz najlepiej odczytaj fusebity avrdude'm (polecam avrdude + burn-o-mat)
    możesz też wyjąć kwarc i jeśli będzie dalej układ pracował znaczy to że korzysta z wewnętrznego oscylatora RC.
    Powodzenia.

    P.S. a mógłbyś jeszcze pokazać ten Makefile, że mówisz, że masz tam częstotliwość zegara ?
    wydaje mi się, że jeśli już to masz coś podobnego:
    Code: c
    Log in, to see the code

    one są wykorzystywane przez nagłówki avr/delay.h
  • #3
    mirekk36
    Level 42  
    To jednak zacznij od Fusebitów to dobra porada. Z poziomu programu czy makefile nigdzie się nie określa skąd pochodzi taktowanie procesora. To właśnie zależy tylko od fusebitów. A w makefile definiuje się co najwyżej wartość częstotliwości jaką jest taktowany procek. Ale to ty jako programista musisz wiedzieć jak on jest fizycznie przez ciebie albo fabrycznie ustawiony.

    Jeśli lubisz się tak katować i pisać programy w PN rzeźbiąc jednocześnie własnoręcznie makefile to trudno - ale co zrobić - niektórzy tak lubią......

    Gdybyś jednak zmienił kiedyś zdanie to pomyśl o normalnym środowisku programistycznym jak np Eclipse w którym możesz zapomnieć o rzeźbieniu makefile bo będzie automatycznie generowane i to na pewno zawsze dobrze....

    Jak chcesz przybliżyć się do fusków to zapoznaj się z programem MkAvrCalculator - pozwoli ci to zrobić bezboleśnie z twoim prockiem m8 - bo będzie działał w pełni i za free

    Jeśli w procku używasz wewn. oscylatora to normalne że piny PB6 i PB7 działają normalnie jako piny I/O

    ale jeśli Fusebitami przeprogramujesz procka na zewn taktowanie, np zewn kwarc - to piny te przestają działać jako I/O to chyba zrozumiałe. Możesz wprawdzie w programie sobie coś do nich zapisywać albo odczytywać ale to nie da żadnego skutku - ot cała tajemnica pinów PB6 i PB7

    dlatego reasumują - jak było na początku - poczytaj jednak n/t fusków
  • #4
    lukash90
    Level 16  
    i o takie odpowiedzi mi chodziło. Dziękuję bardzo. Wiem już, że nie korzystam jednak z kwarcu, bo portu B w całości używam do sterowania wyświetlaczem. Co do pliku makefile, może nie będę go całego zamieszczał bo jest strasznie duży, ale linijka odpowiedzialna za częstotliwość wygląda po prostu tak:
    Code:
    F_CPU = 16000000

    i to starcza. W kodzie nie mam nigdzie zdefiniowanej F_CPU i nie mam warningów.
    A co do tych fuse bitów, to można tak łopatologicznie prosić? Gdzie kliknąć, żeby je odczytać/ustawić?
    Jak się koledzy już domyślili, korzystam z avrdude
  • Helpful post
    #5
    mirekk36
    Level 42  
    Twoje ustawienie w makefile jest całkowicie błędne niestety i albo twój makefile nie jest brany pod uwagę przy kompilacji tylko jakiś inny albo może pomylił ci się makefile z kodem programu.

    w makefile to musiałoby być tak: -DF_CPU 16000000 a nie tak jak ty to napisałeś wyżej :(


    co do fusebitów to już ci podpowiedziałem - zassaj program MkAvrCalculator i będziesz miał łopatologicznie a szczególnie w jego zakładce "Fusy uproszczone", już bardziej łopatologicznie się nie da ..... ale widzę że wolisz większy hardcore i upierasz się przy samym avrdude bez nakładki graficznej - więc masz nie daleko od tego żeby szybko przyblokować sobie procka przez pomyłkę jak każdy początkujący.

    Z programem MkAvrCalculator nie uda ci się zablokować procka i to jest ta różnica. Ale jak wolisz ;)
  • #6
    lukash90
    Level 16  
    ale ja Makefila wyklikałem w programie Mfile Generator, który był dołączony do pakietu WinAVR. Atym programem MkAvrCalculator nie tylko dowiem się jak ustawiać te Fuse bity ale też je ustawie, tak? Będzie to jedyny program jakiego mi do szczęścia potrzeba?

    p.s nie korzystam do tej pory z żadnej nakładki graficznej, bo bardzo dużo pracuję na Linuxie i tutaj i tak takie nakładki nie działają, ale żeby te Fuse bity przestawić, mogę się poświęcić i przejść na Win. bo jak rozumiem, te Fusebity ustawiam tylko raz i one już będą ustawione na zawsze, póki znowu ich nie zmienię?
  • Helpful post
    #7
    Goofy1991
    Level 11  
    No to było tak od razu :)
    Sprawdź to: Link

    możesz sobie ustawić fusebity jak chcesz i na dole masz od razu wygenerowane parametry do programu avrdude, tylko sobie to kopiujesz i wklejasz do avrdude. Korzystam z tego i nie jest zbytnio uciążliwe. Niestety może on tylko generować te parametry. Fusebitów nim raczej nie odczytasz, możesz za to odczytać je avrdude'm i jakoś pokombinować :)

    MkAvrCalculator kolegi mirekk36 też jest fajny, ale o ile mi wiadomo nie ma tego na linuxy.
  • #8
    lukash90
    Level 16  
    Dzięki serdeczne. Sporo się już dowiedziałem, myślę że już dam sobie radę dalej
  • #9
    lukash90
    Level 16  
    Ponownie proszę o pomoc! Ściągnąłem polecany przez kolegów program MkAvrCalculator, w zakładce Fuse uproszczone wybrałem zewnętrzny kwarc >8MHz, ponieważ na płytce mam aktualnie kwarc 16MHz, w zakładce programator zaznaczyłem Fuse i wybrałem zapis.
    I jak już się domyślacie, mikrokontroler jest zablokowany :(, nie daje się zaprogramować ani zmienić tych fuse z powrotem. Nawet gdy klikam "sprawdź podłączony AVR" pokazuje się błąd AVRdude. Jak sobie z tym szybko poradzić? (ATmega nie jest moja, głupio było by oddać kiedyś zablokowaną)
  • #10
    Goofy1991
    Level 11  
    Nic nie rozumiem, jeśli ustawiłeś fusebity na zewnętrzny kwarc >8MHz to powinno działać jeśli masz teraz kwarc podłączony do mikrokontrolera. Po czym twierdzisz, że jest zablokowany?
  • #11
    mirekk36
    Level 42  
    lukash90 wrote:
    Ponownie proszę o pomoc! Ściągnąłem polecany przez kolegów program MkAvrCalculator, w zakładce Fuse uproszczone wybrałem zewnętrzny kwarc >8MHz, ponieważ na płytce mam aktualnie kwarc 16MHz, w zakładce programator zaznaczyłem Fuse i wybrałem zapis.
    I jak już się domyślacie, mikrokontroler jest zablokowany :(, nie daje się zaprogramować ani zmienić tych fuse z powrotem. Nawet gdy klikam "sprawdź podłączony AVR" pokazuje się błąd AVRdude. Jak sobie z tym szybko poradzić? (ATmega nie jest moja, głupio było by oddać kiedyś zablokowaną)


    A ja może zadam inne pytanie - a skąd wiesz czy nie był zablokowany wcześniej ? Specjalnie to pytanie zadaję bo chciałbym wiedzieć jak sprawdzałeś przed zaprogramowaniem na zewn. kwarc - że działa ? to bardzo istotne

    Poza tym czy masz w ogóle podłączony ten kwarc do nóżek XTAL1 i XTAL2 ?

    czy na pewno ten kwarc działa i ma 16MHz ?

    Bo już nie raz się spotkałem z tym że ktoś albo źle go podłączył, albo coś niekontaktowało, albo sam kwarc z jakiegoś wylutu nie działał, albo było na nim jakieś dziwne oznaczenie itd

    no nic nie powiedziałeś ?

    czy po zaprogramowaniu na zewn. kwarc pojawił się komunikat że operacja wykonana poprawnie ? Jeśli się taki pojawił a programowałeś przez zakładkę "Fusy uproszczone" to ja ci gwarantuję że procek nie jest zablokowany tylko ty po prostu panikujesz - a jak mówię wyżej - prawdopodobnie coś źle podłączyłeś.
  • #12
    lukash90
    Level 16  
    Hmmm. Był na nim działający program, który nagle przestał się wykonywać, jak już pisałem ATmega nie daje się zaprogramować, żaden program w ogóle jej "nie widzi". Może nie jest zablokowana całkowicie, ale nie działa. Może dodam, że ustawiłem tylko opcję >8MHz a nie zaznaczyłem dodatkowo CKOPT. Innych opcji nie zmieniałem.

    Jeśli chodzi o kwarc, to jest podłączony i raczej sprawny.
  • #14
    lukash90
    Level 16  
    Nie wiem co da fotka, bo jak już pisałem jest to zestaw uruchomieniowy gotowy, kupiony i w dodatku nie mój. Nic z podłączeniem kwarcu nie zmieniałem ale jeśli to pomoże rozwiązać problem, to proszę
    [Atmega8] kwarc a PB6 i PB7. Jak to działa?

    Kwarc 16MHz dołączony zworkami. Kondensatory do kwarcu są. Zasilanie z programatora USBAsp podłączonego do złącza ISP.
  • #15
    mirekk36
    Level 42  
    No dobrze - a masz innego procka żeby sprawdzić czy działa w tym zestawie z kwarcem ? Bo zestaw zestawem ale czy to działa tzn przynajmniej czy wiesz że działało ? Próbowałeś albo kolega próbował z kwarcem ?
  • #16
    lukash90
    Level 16  
    Wcześniej kwarc nie był używany nigdy, to fakt. Ja mam jeszcze jedną ATMegę88 ale zupełnie nową, więc pewnie fabrycznie ustawioną na wewnętrzny oscylator i obawiam się, że zmienię te fuse na kwarc to stracę drugi procek. Mogę poszukać jeszcze innego kwarcu, ale obawiam się, że maks 12MHz znajdę. Będzie to działać skoro ostawiłem fuse na >8 ale nie ustawiłem tego CKOPT mówiącego, że kwarc jest między 8 a 16?
  • Helpful post
    #17
    mirekk36
    Level 42  
    Zostaw ten CKOPT w spokoju, czy on byłby włączony czy nie to i tak procek by działał na kwarcu. Na razie źle rozumiesz działanie tego fusebita ckopt więc go pomińmy w rozważaniach.

    Jak się ustawi zewn. kwarc czyli większy niż 8MHz to znaczy że możesz dać DOWOLNY kwarc z zakresu od 8MHz do 16MHz ..... więc jak myślisz 12MHz może być czy nie ?

    Nawet jakbyś dał kwarc 4MHz też by działał, nawet jakbyś dał kwarc 20MHz też by działał

    ale..... jakbyś dał kwarc 24MHz to już bez ustawionego fusebita CKOPT mógłby nie działać. Tyle że wystarczyłoby wstawić mniejszy kwarc i znowu by ruszył. Może to ci coś powie.

    A skoro w tym zestawie nigdy nie działał żaden procek na zewn. kwarcu to być może jest on nieżywy a ty w panikę wpadasz niepotrzebnie.

    po pierwsze to weź miernik i "przedzwoń" ścieżki od nóżek procka XTAL1 i 2 do nóżek kwarca żeby się jeszcze nie okazało że w ogóle gdzieś przejścia nie ma - bo widzę tam jumperki nie wiadomo po co ? ..... No i na początek żeby koledze nie zniszczyć płytki to nie wylutowuj tego oryinalnego kwarca - bo jeśli on w ogóle nie działa to możesz tylko od spodu na chwilę podlutować takiego jakiego znajdziesz (dowolny kwarc) ... jeśli jednak nie ruszy to zobacz czy te jumperki są od odłączania tego kociego kwarca na PCB , odłącz je i spróbuj tam jakoś podłączyć do nich ten swój znaleziony kwarc.
  • #18
    lukash90
    Level 16  
    Ok, podłączyłem kwarc z drugiej płytki 8MHz, połączyłem masy obu płytek i układ zaczął pracować, także dziękuję za pomoc, no i za cierpliwość :D No i oczywiście przepraszam, że takie zamieszanie narobiłem, ale skąd mogłem wiedzieć, że nigdy nie używany kwarc na kupionej ze sklepu płytce będzie niesprawny?
  • #19
    tmf
    Moderator of Microcontroller designs
    Niekoniecznie jest niesprawny. Dla kwarcu 16 MHz CKOPT musi być zaprogramowany - za manualem "For resonators, the maximum frequency is 8MHz with CKOPT unprogrammed and 16MHz with CKOPT programmed.". Niestety takie porady typu u mnie działa to i tobie będzie właśnie tyle są warte, że potem same problemy wynikają. Należy trzymać się wytycznych producenta i tyle. Także zaprogramuj ten CKOPT, dodatkowo sprawdź jakie masz kondensatory przy kwarcu. Czy w ogóle je masz? Jeśli ich nie ma, lub jeśli są za duże to mogą być kłopoty z oscylacjami. Powinny być dwa koło 8-12 pF. Ważny jest też sposób poprowadzenia ścieżek, ale to oczywiste. Także ostatnią rzeczą jaką bym posądzał o niedziałanie to kwarc.

    Dodano po 1 [minuty]:

    Gratuluję też firmie Kamami pomysłu, żeby kwarc 16 MHz łączyć z procesorem przy pomocy jumperów :) Genialne :) O ile oczywiście dobrze się domyślam, że służą one do odłączania kwarcu.
  • #20
    mirekk36
    Level 42  
    lukash90 wrote:
    ... ale skąd mogłem wiedzieć, że nigdy nie używany kwarc na kupionej ze sklepu płytce będzie niesprawny?


    No to teraz już będziesz wiedział że można trafić na super płytkę z uszkodzonym kwarcem. I nie daj sobie wciskać rewelacji o tym, że dla kwarca 16MHz musisz mieć zaprogramowanego CKOPT bo inaczej procek nie ruszy - bo porady teoretyków oderwanych od praktyki doprowadzają właśnie do powstawania takich płytek. Tacy teoretycy będą ci też np na podobnej zasadzie wciskać, że np procek ci nie ruszy gdy nie podłączysz kondensatorów 22pF (lub podobnych) do kwarca i masy ;) .... A tymczasem gdy na płytce stykowej coś się na szybko projektuje to najspokojniej w świecie można sobie darować wkładanie tych kondków. Inna sprawa czy pomijać je w docelowych rozwiązaniach. Czasem można a czasem się nie opłaca aby je pomijać.

    Cieszę się że udało się uruchomić wszystko ;)
  • #21
    Dar.El
    Level 40  
    Witam
    CKOPT włączałem tylko gdy inny uP korzystał z wyjścia generatora kwarcowego. W niezliczonej ilości przypadków, gdy nie był podłączany inny uP, CKOPT nie był włączony, dla kwarców w przedziale 11MHz do 18MHz.
  • #22
    tmf
    Moderator of Microcontroller designs
    A ja przestrzegam przed domorosłymi "praktykami", którzy zalecają ignorowanie zaleceń producenta układu. W nocie katalogowej ATMega8 wyraźnie pisze, że CKOPT dla kwarcu >8MHz ma być zaprogramowany i nie ma o czym dyskutować - strona 27 - crystal oscillator:
    XTAL1 and XTAL2 are input and output, respectively, of an inverting amplifier which can be configured for use as an On-chip Oscillator, as shown in Figure 11. Either a quartz crystal or a ceramic resonator may be used. The CKOPT Fuse selects between two different Oscillator amplifier modes. When CKOPT is programmed, the Oscillator output will oscillate a full rail-torail swing on the output. This mode is suitable when operating in a very noisy environment or
    when the output from XTAL2 drives a second clock buffer. This mode has a wide frequency range. When CKOPT is unprogrammed, the Oscillator has a smaller output swing. This reduces power consumption considerably. This mode has a limited frequency range and it cannot be used to drive other clock buffers.
    For resonators, the maximum frequency is 8MHz with CKOPT unprogrammed and 16MHz with CKOPT programmed. C1 and C2 should always be equal for both crystals and resonators. The optimal value of the capacitors depends on the crystal or resonator in use, the amount of stray capacitance, and the electromagnetic noise of the environment. Some initial guidelines for
    choosing capacitors for use with crystals are given in Table 4. For ceramic resonators, the capacitor values given by the manufacturer should be used.

    To powinno każdemu wyjaśnić o co chodzi.

    Dodano po 2 [minuty]:

    BTW, mam propozycję do autora tematu - niech wyśle mi ten rzekomo uszkodzony kwarc. Jeśli jest rzeczywiście uszkodzony to zobowiązuję się odesłać mu 100 nowych tego typu kwarców i jako bonus dodać za darmo moją książkę o AVR.
  • #23
    gaskoin
    Level 38  
    lukash90 wrote:
    linijka odpowiedzialna za częstotliwość wygląda po prostu tak:
    Code:
    F_CPU = 16000000


    +

    mirekk36 wrote:
    w makefile to musiałoby być tak: -DF_CPU 16000000 a nie tak jak ty to napisałeś wyżej :(


    =

    Prawidłowa odpowiedź, czyli -DF_CPU=16000000UL Źródło http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html i doświadczenia własne :)
  • #24
    mirekk36
    Level 42  
    gaskoin wrote:

    Prawidłowa odpowiedź, czyli -DF_CPU=16000000UL Źródło http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html i doświadczenia własne :)


    Tak pomyliłem się, przepraszam, bo na szybko pisałem, dziękuję za sprostowanie. Oczywiście że ma być tak jak napisałeś.
  • #25
    Dar.El
    Level 40  
    Proszę pisać tylko na temat, albo post do kosza.

    Producent w ten sposób asekuruje się, ale nie ma potrzeby włączać CKOPT gdy nie potrzeba tak silnego sygnału do innych celów. Bez ustawionego CKOPT zmniejsza się pobór prądu i zakłócenia elektromagnetyczne. Zawsze można włączyć i sprawdzić czy jest lepiej a jak nie to wyłączyć.
    Bez CKOPT w ATMega128, jako sterownik twardego lasera, było źle skonstruowane rozładowanie kondensatorów, powstał nadajnik 5MHz dużej mocy. Stojący obok cyfrowy oscyloskop Tektronixa wieszał się a sterownik na ATMega128 nie. Ważne jest prawidłowe zaprojektowanie PCB i bardzo blisko umieszczone kondensatory odsprzęgające.
  • #26
    mirekk36
    Level 42  
    Dar.El wrote:
    Bez ustawionego CKOPT zmniejsza się pobór prądu i zakłócenia elektromagnetyczne. Zawsze można włączyć i sprawdzić czy jest lepiej a jak nie to wyłączyć.


    Ja tylko dodam, że np Fusebit CKOPT dla Low-frequency Crystal Oscillator (np kwarc zegarkowy) - załącza nieco inny układ i załączane są np wewn. kondensatory. Użytkownik ma prawo wybrać kondensatory wewn. lub zewnętrzne.. Gdyby więc była konieczność obligatoryjna włączania CKOPT dla kwarców 8-16MHz to równie dobrze mógł to Atmel zrobić na siłę - czyli przy wyborze kwarca powyżej 8MHz na siłę załączać "rail to rail" .... ale tego nie zrobił, dlaczego? - dał wybór, tylko właśnie - trzeba wiedzieć po co ten wybór i kiedy z niego skorzystać a nie uczepić się jednego zdania z noty, wyrwanego z kontekstu.
  • #27
    tmf
    Moderator of Microcontroller designs
    No cóż, widać na elektrodzie zamiast fachowych porad opartych o zalecenia producenta, zaczynają dominować wieści gminne.
    Po pierwsze, oscylator niskiej częstotliwości dla kwarców zegarkowych ma inną budowę niż oscylator zegara CPU - nota katalogowa AVR042, strona 11. Po drugie w AMega8 kondensatorów dla oscylatora niskiej częstotliwości się nie wybiera - dlaczego to odsyłam do noty procesora.
    Kolejna sprawa - CKOPT zasadniczo zawsze powinien być zaprogramowany, wtedy stan CKSEL1-3 nie ma znaczenia, a CKSEL0 wybiera wraz z SUT czas startu procesora. Po co więc CKOPT? To dodatkowa możliwość dana użytkownikowi ograniczenia poboru prądu w środowiskach o małych zakłóceniach, kiedy procesor jest taktowany do 8 MHz. Ponieważ Atmel uznał to za typowe warunki pracy (stąd też wewnętrzny generator RC ma max 8 MHz) ATMegi są sprzedawane z CKOPT niezaprogramowanym.
    Ok, podałem odniesienia do do oficjalnych dokumentów Atmela, not procesora, gdzie wyraźnie piszą, że ten fusebit musi być zaprogramowany. Jako kontrargumenty przedstawiono nie poparte niczym własne opinie, czytającym pozostawiam rozsądzić kto ma rację.
    Niemniej nie tylko inżynierowie Atmela uważają tak jak napisałem, proponuję przejrzeć krótki wątek na AVRFreaks (forum założonym przez firmę Atmel):
    http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=78111
    Wypowiadające się tam osoby są konsultantami firmy Atmel, oto co mają do powiedzenia:

    Quote:
    DO NOT UNDER ANY CIRCUMSTANCES USE THE LOW POWER CRYSTAL OSCILLATOR. (was that sufficiently emphasized?)
    Now it is. Laughing


    Dla osób niezorientowanych - low power cristal == CKOPT niezaprogramowany.