logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Rozwiązano] Komunikacja Atmega32 z czujnikiem DS18B20 przy taktowaniu 25MHz - Bascom

elektronockaut 16 Kwi 2021 20:29 627 8
  • #1 19384238
    elektronockaut
    VIP Zasłużony dla elektroda
    Witam,

    Jak w temacie. Mam układ w którym (niestety) pracuje wykręcona do 25MHz Atmega 32. Wszystko działa bardzo dobrze i nie przeszkadza jej taki ovrclock ale mam problem z odczytem danych z czujnika DS18B20. Komunikacja typu RS232, ISP, i2C działa idealnie. Nie mogę zejść z taktowaniem niżej.

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Obecnie mam wskazania 0.0 albo 0.1
    Jest jakieś rozwiązanie ?
  • Pomocny post
    #2 19384283
    bart-projects
    Poziom 29  
    Błąd w logice.
    Twój kod czytam tak -> Dopóki zmienna nie ma 5 to cały czas resetujemy pomiar i startujemy nowy (już Select Case byłoby lepsze). Potem próbujemy to czytać jak zmienna ma powyżej 100.

    No daj spokój. Są tu tego tony jak to obsługiwać.
    Mój/nie mój sposób to dwa suby. Jeden Startuje konwersję a drugi Czyta.
    Sprawa polega na tym by odwrócić kolejność.

    Zawsze najpierw czytasz DS`a i od razu po odczycie startujesz kolejną konwersję. Spokojnie czekasz 750ms i czytasz (albo robisz to w najlepszym dla Twojego programu momencie później, wynik poczeka) i potem od razu startujesz kolejną konwersję. NIE NA ODWRÓT.

    PS. Inna sprawa, że jak widzę Zmienna *256 zamiast Shift Zmienna, Left, 8 ...to się złoszczę pewnie niepotrzebnie :D
  • Pomocny post
    #3 19384317
    ZbeeGin
    Poziom 39  
    Przede wszystkim. Zejdź z taktowaniem do jakiejś normalnej wartości dla ATmega16 i przetestuj czy wtedy komunikacja z DS-ką jest prawidłowa. Jeśli nie to najpierw musisz naprawić sprzęt/algorytm by wszystko działało prawidłowo.

    Jeśli na niskim taktowaniu komunikacja będzie w porządku to będzie to oznaczało tylko to, że specjalne makra opóźniające jakie są wplecione w procedury 1Wire po prostu sobie nie radzą z przeliczaniem cykli maszynowych przy 25MHz i "timing" magistrali się rozjeżdża. (Jeśli masz pełną wersję BASCOM AVR to możesz otworzyć sobie w edytorze plik "msc.lib" i poszukać taga [_1WIRE]).
    Niestety z poziomu wbudowanych w BASCOM poleceń niewiele będzie można wtedy zrobić. Trzeba będzie sobie samemu napisać całą obsługę - i w takim przypadku najlepiej quasi-sprzętową z wykorzystaniem np. wolnego UARTu (Skoro one jak twierdzisz działają prawidłowo), lub z wykorzystaniem liczników.

    ps1. Oczywiście pomijam to, że raczej nie popełniłeś błędu nie deklarując taktowania w $crystal. :)
    ps2. Zamiast podkręcać klasyczną ATmega16 czemu nie użyłeś czegoś z rodziny XMega, którą BASCOM też wspiera?
  • Pomocny post
    #4 19384334
    bart-projects
    Poziom 29  
    Stara mega32 da radę, ale dla pewności taktowałbym ją zewnętrznym generatorem kwarcowym (taniocha) a nie kwarcem.
    Bascom to przeliczy. Widziałem 1wire jak działa z Bascom w Xmedze na 48MHz.
    Wystarczy dobrze zadeklarować prędkośc taktowania, co obstawiam jeśli reszta protokołów działa.
    Dalej obstawiam błąd w oprogramowaniu przez programistę :)
  • #6 19384368
    bart-projects
    Poziom 29  
    Osobiście nic nie mam. Widziałem jedynie WAV player z takim generatorem na 25MHz na MCS.
    Mój największy overclocking to był w projekcie MIKA gdzie użyłem tego USARTfriendly 18432_000Hz bo wyświetlacz był duży i lepiej/płynniej to wyglądało.

    Niemniej wiem, że się da. Wiem, że procesor powinno się dobrać do zadania, ale jak ktoś pisze, że ma tak i tak to się mu pomaga :D ale dobrze, że piszesz by na drugi raz lepiej dobrał uC do zadania.

    [EDIT] Jesli ktoś nie zajarzył toku myślenia/algorytmu to poniżej przykład. Nie kompiluje się tylko dlatego, że OT nie podał deklaracji zmiennych, ale można zobaczyć "o co mi chodzi".

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Zmieniłem tylko kod z pierwszego postu. Sam bym tego tak nie zapisał. Mnożenia i dzielenia przez potęgi dwójki powinno się robić przesunięciami. Mnożenie więc * 256 to powinien być Shift Left 8 a podział przez 16 to Shift Right 4 ewentualnie Signed.
  • #7 19384697
    elektronockaut
    VIP Zasłużony dla elektroda
    Po całym dniu walki słabo opisałem mój problem bo już po prostu nie miałem siły :D
    Wyjaśniam...
    Zrobiłem sobie mikro serwerek LANowy na Atmedze32 i układzie ENC28J60. Z doświadczenia z tym układem i Atmegą wiem że znacznie stabilniej wszystko pracuje gdy mikroporocesor (Atmega) jest taktowana zegarem 25MHz z gotowego modułu ENC a nie własnym kwarcem. [XTAL1 podłączone pod CLKOUT z modułu ENC. Fusebit: Ext clock 000000] W sumie to dość zrozumiałe że jak obydwa układy pracują w jednym takcie to nie ma za każdym razem "trafiają na siebie" i nie ma żadnych przesunięć. Dlaczego wybrałem właśnie Atmega32 ?. Nie potrzebuję więcej zasobów. Na stronie HTTP ma wyświetlać się tylko termometr bez żadnych dodatków ani napisów. Atmega32 mam w domu. Xmegę musiał bym kupować i czekać na dostawę... Tak jak kolega "bart-projects" pisze, takie przetaktowanie to nic strasznego. To nie pierwszy serwerek który już robiłem w ten sposób. Działały w nich magistrale i2C, ISP.... nawet kiedyś pilot RC5 i Bascom dobrze sobie przeliczał częstotliwości dla poszczególnych komunikacji. 1Wire mnie położyło ;)

    To cały kod.
    Linijka 1597 to obsługa 1wire.
    Biblioteka enc28j60.inc, potrzebna do skompilowania jest w załączniku.


    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • #8 19384699
    elektronockaut
    VIP Zasłużony dla elektroda

    Po kilku godzinach (!!!!!!)....


    W pętli programu zrobiłem tak:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    W timerze który już jest w programie (co sekundę!) zrobiłem tak:

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    W teorii po wysłaniu rozkazu wykonania temperatury, po kilku sekundach następuje jej odczyt (spartańsko ale nie umiem inczaje) - Dalej nie działa! Co mam robić panowie? ;) Help!

    PS: Nie wiem jak to się stało że poprzedni post się skasował. Próbowałem zaimplementować szkielet kolegi @Bart-Projects ale niestety nie potrafię stąd te moje bazgroły w programie powyżej.
    Po jakimś czasie....
    Zmieniłem na próbę na taktowanie wewnętrzne 8MHz i działa! serwerek chodzi jak padlina ale działa. Co teraz ?
  • #9 19385149
    elektronockaut
    VIP Zasłużony dla elektroda

    Po kilku godzinach (!!!!!!)....


    W pętli programu zrobiłem tak:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    W timerze który już jest w programie (co sekundę!) zrobiłem tak:

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    W teorii po wysłaniu rozkazu wykonania temperatury, po kilku sekundach następuje jej odczyt (spartańsko ale nie umiem inczaje) - Dalej nie działa! Co mam robić panowie? ;) Help!


    Po jakimś czasie....
    Zmieniłem na próbę na taktowanie wewnętrzne 8MHz i działa! serwerek chodzi jak padlina ale działa. Co teraz ?

    Dodano po 6 [godziny] 12 [minuty]:

    ehhh.... tak to jest jak się nie czyta DTRek

    Gotowe modłuy ENC28j60 które kupuje się na portalach aukcyjnych mają wstawiony kwarc 25MHz. Pin 3 CLK samego układu ENC28j60 to wyjście zegarowe, ale nie koniecznie taktowane taką samą częstotliwością jak kwarc. Z DTR układu ENC jasno wynika że można tą częstotliwość dzielić przez 1, 2, 3, 4 lub 8 i podział ten programowany jest zaraz na początku mojego programu (nie mojego autorstwa). Jest to linijka 393 [Call Enc28j60_writecontrolregbyte(ecocon , &B00000010)]. Z linijki tej wynika że taktowanie podzielone jest na 2 czyli na wyjściu powinienem mieć 12,5MHz całkowicie zjadliwe dla Atmegi32. Zmieniłem w programie bascom na $crystal = 12500000 i wszystko działa pięknie aż miło ;)
    Zastanawia mnie tylko jedna rzecz... tak jak pisałem. Zawsze wpisywałem 25MHz i działały mi takie komunikacje jak i2C, ISP, RC5(!) Jak!? Są one przecież wrażliwe na czas trwania stanów - szczególnie RC5. To już temat na inny raz ;)

    W załączniku PDF układu ENC - polecam :D
    Dziękuję wszystkim za pomoc.
REKLAMA