Elektroda.pl
Elektroda.pl
X
CControls
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega328 - Arduino ds18b20 wewnętrzny kwarc brak komunikacji

solek1315 02 Lut 2013 21:17 5262 16
  • #1 02 Lut 2013 21:17
    solek1315
    Poziom 10  

    Witam
    Mój problem polega na tym, że chciałem zrobić termometr na mikrokontrolerze Atmega328pu z wgranym bootloaderem na wewnętrznym zegarze 16 MHz. Program ten działa poprawnie na płytce Duemilanove. Na samej atmedze wczytuje się tylko ekran startowy i potem lcd czyste. Dodam tylko, że na samodzielną atmege program wrzucam przez ArduinoIDE i programator USBASP, ale to chyba nie ma znaczenia bo inne programy wrzucane w ten sposób działają ok.

    0 16
  • CControls
  • #2 03 Lut 2013 14:38
    paavo91
    Poziom 19  

    mega328 ma wewnętrzny zegar 16MHz? Chyba nie ma. Jak nie jest na płytce due to również musi być rezonator jeśli używasz 16Mhz. Ewentualnie możesz dać wewnętrzny oscylator ale musisz zmienić fusebity.

    0
  • CControls
  • #4 03 Lut 2013 15:51
    solek1315
    Poziom 10  

    Inne programy działają bez zewnętrznego kwarcu. Wzorowałem się na tych stronach:
    KLIK
    KLIK2
    KLIK3

    0
  • #5 03 Lut 2013 16:48
    piotrva
    Moderator na urlopie...

    paavo91 napisał:
    piotrva napisał:
    1. M328p nie ma wewnetrznego kwarcu, co najwyżej oscylator RC 8MHz.
    2. Żeby kody z Arduino działały musisz podpiąć pod procesor zewnętrzny kwarc 16MHz i ustawić odpowiednio fusebity.


    Co do pkt 2 - nie prawda. Często robię jakieś urządzenie na mega328 i procesor jest na osobnej płytce bez kwarcu 16MHZ. Używam wew. RC 8Mhz i wszystko jest ok.

    Nie wiem czy przeczytałeś moją wiadomość dokładnie, ale piszę, że żeby kody z Arduino (oryginalnego, bez modyfikacji i grzebania w plikach programu) działały musi być kwarc 16MHz. Oczywiście, że obsługa 1-wire zadziała i na 8MHz i na 1MHz i na 11059200Hz, tylko program też musi tę częstotliwość uwzględnić. A Arduino domyślnie kompiluje wszystko dla 16MHz.
    Także ja też robię duuuużo rzeczy na różnych procesorach i wiem co działa a co nie, a że pisałem kurs Arduino to wiem też jakie warunki narzuca to środowisko bez modyfikacji, więc Twój komentarz jest właśnie błędny, bo wynikający z nieprzeczytania ze zrozumieniem mojego tekstu.

    Teraz pytanie, dlaczego inne kody działały - ano dlatego, że były wgrywane przez programator zewnętrzny (czyli nie ma problemu z prędkością bootloadera), a po drugie, zapewne nie zawierały funkcji zależnych od czasu (tak jak obsługa 1-wire, która jest ściśle zależna od czasu).
    A 1-wire nie działa bo prawdopodobnie Arduino kompiluje jego obsługę tak jakby był podłączony kwarc 16MHz, a w rzeczywistości jest 2 razy wolniej, więc zależności czasowe protokołu 1-w nie są zachowane i nie działa.
    (No chyba, że Autor wątku grzebał w plikach Arduino oraz bibliotekach i wszystko pozmieniał pod 8MHz - wtedy albo o czymś zapomniał - np. o deklaracjach w bibliotekach Arduino, albo coś innego idzie źle).

    BTW na zdjęciach zalinkowanego w pierwszym poście projektu widzę kwarc zewnętrzny, zapewne 16MHz, więc jeśli Autor skompilował wszystko bez modyfikacji Arduino i programu to nie ma prawa działać przy 8MHz.

    także na koniec pytanie do Autora wątku - czy zmieniłeś w Arduino ustawienia na kompilację dla 8MHz?

    0
  • #6 03 Lut 2013 16:55
    solek1315
    Poziom 10  

    [quote="piotrva"][quote="paavo91"]

    piotrva napisał:

    także na koniec pytanie do Autora wątku - czy zmieniłeś w Arduino ustawienia na kompilację dla 8MHz?


    Zmieniałem plik boards.txt zgodnie z zaleceniami z linków które już podałem. Czyli żeby uruchomić ten projekt należy wgrać bootloader na zewnętrzny zegar 16 MHz i dołyć taki kwarc?

    Edit:
    Myślałem, że uzbrajając ArduinoIDE w umiejętność programowania oddzielnych uC będzie kompilowało ok. Taki fragment pliku boards.txt jest pod zewnętrzny kwarc czy wewnętrzny?
    Code:
    majsterkowo_atmega328p16.name=ATmega328P @ 16 MHz
    

    majsterkowo_atmega328p16.upload.maximum_size=30720
    majsterkowo_atmega328p16.upload.using=arduino:arduinoisp

    majsterkowo_atmega328p16.bootloader.low_fuses=0xE2
    majsterkowo_atmega328p16.bootloader.high_fuses=0xDA
    majsterkowo_atmega328p16.bootloader.extended_fuses=0x05

    majsterkowo_atmega328p16.bootloader.path=atmega
    majsterkowo_atmega328p16.bootloader.file=ATmegaBOOT_328.hex
    majsterkowo_atmega328p16.bootloader.unlock_bits=0x3F
    majsterkowo_atmega328p16.bootloader.lock_bits=0x0F

    majsterkowo_atmega328p16.build.mcu=atmega328p
    majsterkowo_atmega328p16.build.f_cpu=16000000L
    majsterkowo_atmega328p16.build.core=arduino
    majsterkowo_atmega328p16.build.variant=standard

    0
  • Pomocny post
    #7 03 Lut 2013 17:02
    paavo91
    Poziom 19  

    Przeczytałem ze zrozumieniem. Zdanie "(oryginalnego, bez modyfikacji i grzebania w plikach programu)" to teraz dopisałeś. Kody z arduino to chyba kody, co nie? Nic nie pisałeś o zmianach z pliku boards.txt . Jakbyś napisał to wcześniej to bym nic nie komentował ;)

    Nie myśl, że się wymądrzam, tylko po prostu usprawiedliwiam bo mówisz, że nie czytam ze zrozumieniem ;)

    Dodano po 6 [minuty]:

    [quote="solek1315"][quote="piotrva"]

    paavo91 napisał:
    piotrva napisał:

    także na koniec pytanie do Autora wątku - czy zmieniłeś w Arduino ustawienia na kompilację dla 8MHz?


    Zmieniałem plik boards.txt zgodnie z zaleceniami z linków które już podałem. Czyli żeby uruchomić ten projekt należy wgrać bootloader na zewnętrzny zegar 16 MHz i dołyć taki kwarc?


    W tych linkach w większości jest opisane jak programować w arduino ale np. na attiny..
    Jak masz mega328 to ja bym nic więcej nie ruszał tylko:
    1. Zmieniasz w boards.txt linijkę odpowiedzialną za częstotliwość

    atmega328.build.f_cpu=8000000L

    Zamiast 16MHZ jest 8MHz.

    2. Kompilujesz program i wgrywasz go na płytce.
    3. Zmieniasz fusebity na wewnętrzny oscylator 8MHz( programatorem)

    Ja tak to robię i wszystko ok. Może da się lepiej/łatwiej ;)

    0
  • #8 03 Lut 2013 17:12
    piotrva
    Moderator na urlopie...

    Cóż, założyłem że Arduino nie modyfikowane, bo Autor nic o tym nie pisał. Oczywiście wszystko bez urazy - forum jest po to żeby dyskutować ;)

    Teraz już wiemy nieco więcej więc dalej:
    1. Jak podłączony jest DS18B20? Czy masz rezystor podciągający magistralę? Czy nie pomyliłeś kiedyś pinów zasilania i masy (w dokumentacji jeden z rysunków jest BOTTOM VIEW o czym 50% ludzi zapomina i podłącza VCC zamienione z GND zabijając DS18B20) - chyba że korzystasz z trybu pasożytniczego. Jak daleko jest DS od układu?
    2. Pokaż źródła biblioteki, której używasz.
    3. Jaka wersja Arduino?
    4. zidentyfikuj (wyświetlając np. cyfry) w którym miejscu program się zawiesza.

    0
  • #9 03 Lut 2013 20:48
    solek1315
    Poziom 10  

    Rezystor podciągający jest, biblioteka standardowa <OneWire.h> nie wiem jak wyświetlić jej kod, Arduino 1.0.3, połączenie ok nie pomyliłem polaryzacji - przewód ok. 10cm. Natomiast pkt. 4 nie wiem jak zrealizować. Dodam tylko, że jestem początkujący w programowaniu uC dlatego zaczynam od Arduino a chce zrobić woltomierz i termometr do samochodu właśnie na ds18b20 ale na osobnym scalaku tak żeby płytka duemilanove mogła mi służyć dalej. Ten sam program tylko wgrany na due działa ok, ten sam lcd, ten sam ds, te same przewody, tylko wrzucam przez usbasp.

    0
  • #11 04 Lut 2013 07:35
    solek1315
    Poziom 10  

    piotrva napisał:
    Musisz w pliku boards.txt wpisać w swoim fragmencie zamiast xxx.build.f_cpu=16000000L i wpisujesz po 8000000L zamiast 16000000L
    I jeśli m328p jest ustawiona we fusebitach na 8MHz to będzie działać.


    Witam
    Pomogło, dziękuje za pomoc. Pytanie tylko dlaczego nie ruszyło na bootloaderze 16 MHz?

    0
  • #12 04 Lut 2013 17:18
    piotrva
    Moderator na urlopie...

    Bo program miał domierzanie czasu skompilowane dla 16MHz, a ty miałeś 8MHz.
    Innymi słowy np. dla odmierzenia 1s program chciał liczyć do 16000000, a ty podawałeś 8MHz, więc w rzeczywistości liczył 2s. A 1-w jest protokołem, w którym czas jest kluczem...

    0
  • #13 04 Lut 2013 17:50
    solek1315
    Poziom 10  

    Chyba odwrotnie, teraz mam 8 MHz i działa a przedtem nie.

    0
  • #15 06 Lut 2013 10:31
    solek1315
    Poziom 10  

    Witam
    Jeszcze takie pytanko: wypalenie bootloadera ustawia fusebity?
    Wiem, że głupie pytanie ale czytałem że najpierw powinno sie ustawić fusy potem wgrać bootloader a potem lockbity...

    0
  • #16 06 Lut 2013 15:03
    piotrva
    Moderator na urlopie...

    1. Bootloader nie zmienia fusebitów, nawet nie ma takiej możliwości. Fusebity ustawia się przed wgraniem wsadu (na ogół)
    2. Lockbity jest sens ustawiać tylko i wyłącznie wtedy, gdy układ trafia do klienta i nie chcesz, aby podejrzał Twój program wgrywany szyfrowanym bootloaderem.

    0
  • #17 06 Lut 2013 23:30
    solek1315
    Poziom 10  

    W takim razie czego dotyczą te linijki w boards.txt:

    Code:
    majsterkowo_atmega328p16.bootloader.low_fuses=0xE2 
    
    majsterkowo_atmega328p16.bootloader.high_fuses=0xDA
    majsterkowo_atmega328p16.bootloader.extended_fuses=0x05
    majsterkowo_atmega328p16.bootloader.unlock_bits=0x3F
    majsterkowo_atmega328p16.bootloader.lock_bits=0x0F

    ?

    0