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

Jak połączyć multipleksowanie LED na ATMEGA32 z odczytem DS18B20 w Bascom AVR?

Myler 10 Kwi 2005 18:06 10562 34
Najlepsze odpowiedzi LABEL_AI_GENERATED

Jak pogodzić multipleksowanie 4 wyświetlaczy LED na ATmega32 w Bascom AVR z jednoczesnym odczytem temperatury z DS18B20 bez wygaszania wyświetlaczy?

Tak — można obsługiwać multipleksowanie z timera i równolegle mierzyć DS18B20, pod warunkiem że nie blokujesz programu długim `Waitms`, tylko wysyłasz `Convert T`, a odczyt robisz dopiero po ok. 750 ms, gdy timer dalej przełącza cyfry [#1414784][#4906582] Przy 4 wyświetlaczach można ustawić przerwanie multipleksujące np. na 244 Hz, co daje ok. 61 Hz na cyfrę i jest wystarczające [#1403544] Zamiast czekać „na żywca” użyj licznika albo flagi w przerwaniu lub pętli głównej, która po odmierzeniu czasu inicjuje odczyt temperatury [#4906582][#5618909] Jeśli Bascomowe 1-Wire sypie błędami, wyłączaj przerwania tylko na czas pojedynczych komend `1wreset/1wwrite/1wread` i włączaj je ponownie zaraz po transmisji; przy dłuższym wyłączeniu wyświetlacz może lekko mignąć, ale układ działał poprawnie [#4905207] Klucz jest więc taki: wyświetlanie ma chodzić cały czas z timera, a DS18B20 ma tylko dostać zlecenie pomiaru i późniejszy odczyt bez blokowania CPU [#1414784][#4906582]
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA
  • #1 1393168
    Myler
    Poziom 11  
    Posty: 7
    Cześć!
    Mam problem z pogodzeniem obsługi 4 wyświetlaczy LED (multipleksowanych za
    pomocą ATMEGA32) i odczytem temperatury z Dallasa :(
    Programuje w BascomieAVR.
    Jest możliwość korzystania z obsługi przerwań (TIMER0) w celu
    multipleksowania wyświetlaczy i równocześnie "rozmawiać" szyną 1wire z
    czujnikiem DS18B20 bez konieczności wyłączenia wyświetlaczy na czas odczytu
    temp??

    Dzięki za pomoc
    Pozdrawiam
    Marcin
  • REKLAMA
  • #2 1393266
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Jest możliwe pod warunkiem że z każdym "slotem" dla 1-Wire zmieścisz się między okresami multipleksowania wyświetlacza.
  • #3 1393483
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    Niekoniecznie, możesz po resecie DS-a zmienić wyświetlanie na następną cyfrę i dopiero robić odczyt temperatury (można podzielić jeszcze drobniej).
  • #4 1403544
    gotan
    Poziom 12  
    Posty: 19
    Jeżeli masz np 4 wyświetlacze to ustawiasz przerwanie do obsługi wyświetlaczy na 244 Hz i przy każdym wywołaniu zmieniasz cyfrę i świeci ona do następnego wywołania a w miedzyczasie wykonywane są polecenia programu czyli np odczyt ds 18b20. W ten sposób cyfra miga z czętotliwoscia 61 Hz co w zupełności wystarczy. Umieszczenie w takim układzie w programie funkcji wait czy waitms nie wpływa na wyświetlanie cyfr.
  • #5 1403913
    PioTherm
    Poziom 16  
    Posty: 134
    Pomógł: 11
    Ocena: 19
    Ja też miałem ten problem, że ATMEGA32 była już tak "załadowana", że multipleksowanie 2 wyśw. 7-segmentowych w TIMERze na chwilę potrafiło się zaklockować. Problem rozwiązałem stosując drugi mały uP dedykowany tylko do wyświetlacza, ATTiny2313 za 5 zł ;-)
    Procesory komunikują się komendami Bascomowymi SHIFTOUT SHIFTIN
    ramka danych 32-bity.

    Jeśli jesteś zainteresowany tym rozwiązaniem mogę udostępnić program do uP
  • #6 1410989
    euromatic
    Poziom 21  
    Posty: 422
    Pomógł: 17
    Ocena: 14
    witam,
    ja od dawna stosuję do ledowskich wyświetlaczy Cmosa 4094
    działa to super i zajmuje mało wyjść procka( 3 lub 4) , wyświetlanie jest statyczne.
    Jeżeli masz gotowy układ to potrenuj trochę z przerwaniami, ale i tak nie unikniesz migania podczas komunikacji z dallasem. cudów nie ma, procek nie może być w dwóch miejscach jednocześnie a oko ludzkie wyłapie tą przerwę.
    jeżeli zgasisz segment podczas obsługi dallasa to oko wykryje spadek jasności led, jeżeli pozostawisz go zapalonym ( jedna cyfra!!!!) to zapali się jaśniej przez chwilkę, to też zawsze zostanie zauważone.
    pozdrawiam
  • #7 1411454
    jacur
    Poziom 32  
    Posty: 1748
    Pomógł: 166
    Ocena: 295
    Ja robiłem multipleksowanie 8 cyfr i odczyt 2 ds_ów i jedynie co to trzeba liczyc CRC bo jesli przerwanie wystąpi w chwili komunikacji z ds_em to wyswietla głupoty. Pozatym zero migania lub przerw w działaniu wyswietlacza.
  • #8 1412592
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 124
    Kiedyś ludzie robili to na 2051 i spokojnie i ładnie im to działało. Moja rada:
    Zamiast ATMEGA32 użyj ATMEGA 128, nie będziesz musiał nic multipleksować, bo ma dość pinów. 4*8 = 32, do tego 2 na DSa =34 + klawiatura 4 przyciski mamy 38, więc jeszcze pare zostanie :) :)
  • REKLAMA
  • #9 1414656
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    W przewlekanych to ATmega8515 ma dostępnych 35 pinów do wykorzystania (PORTA - PORTD =- 4x8pin; PORTE - 3pin)
    Light'I
  • REKLAMA
  • #10 1414679
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 124
    Light'I < daj spokuj tylko 8KB - nie starczy na kod przecież :)
  • #11 1414784
    dj_rav_
    Poziom 11  
    Posty: 5
    u Ciebie glownym problemem jest przymusowe czekanie na konwersje temperatury ktora moze wyniesc nawet kilkaset ms. Mozesz np. wyslac rozkaz do DS-a o rozpoczecie pomiaru a nastepnie po kilkudziesieciu(lub kilkuset-w zaleznosci od czestotliwosci przerwania timera) wyswietlen wyniku - co zajmie ok. kilkaset ms po prostu sprawdzac temperatue na czujniku i ponownie wyslac rozkaz powodujacy rozpoczecie pomiaru co zajmie ledwo 1ms. innym przypadku moze ci sie zdarzyc ze raz na np.10 pomiarow wyswietlic bledny wynik(mialem kiedys taki problem ktory zniknal po zrobieniu tego co napisalem wyzej)
    pozdrawiam
  • #12 1414830
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    McRancor napisał:
    Light'I < daj spokuj tylko 8KB - nie starczy na kod przecież :)
    No tak, zapomniałem że mowa o Bascomie... ;)
    P.S. Swoją droga to Atmel mógłby wymyśleć taką rozszerzoną wersję ATmega1615/3215 ;)
    Light'I
  • #13 1417539
    robson_s-ec
    Poziom 15  
    Posty: 98
    Pomógł: 7
    Ocena: 4
    Ludzie momentami mnie PRZERAŻACIE.
    Ja robiłem multipleksowanie 4 cyfr 7-segm., linijki swietlnej i klawiatury z DS1820 w systemie pod AT89C2051 i nie mam żadnych problemów - blokuje przerwanie po całym kompletnum obiegu wykonuje transmisję przez 1wire po czym wlaczam przerwanie i dziala mi TAAK.
    p.s. nie uzywajmy bascoma i wszystko sie da
  • #14 1627753
    john_t
    Poziom 29  
    Posty: 1070
    Pomógł: 127
    Ocena: 89
    A gdyby TAK:
    (od razu mówię że tego nie próbowałem) ... ale może ktoś z Was?

    Ta sekwencja:

    'Odczyt danych z przyrządu podlączonego do 1WIRE
    Sub Odczyt_temp
    1wreset 'inicjacja magistrali 1WIRE
    If Err = 1 Then 'W Przypadku Braku czujnika coś tam wyświetl

    End If
    1wwrite &HCC 'żądanie zgloszenia się ukladu podlączonego do linii 1WIRE
    1wwrite &H44 'Convert T
    Waitms 255 'czekaj 255 milisekund
    Waitms 255
    1wreset
    1wwrite &HCC 'żądanie zgloszenia się ukladu podlączonego do linii 1WIRE
    1wwrite &HBE 'żądanie odczytania temperatury
    T(1) = 1wread() 'odczytaj 1-szy bajt z 1WIRE
    T(2) = 1wread() 'odczytaj 2-gi bajt z 1WIRE
    1wreset
    If T(2) = 0 Then
    Tempr_real = T(1) / 2 'Obliczona dodatnia wartość temperatury forma DEC
    Else
    X = 256 - T(1)
    Tempr_real = X / 2
    Tempr_real = Tempr_real * -1 'Obliczona ujemna wartość temperatury forma DEC
    End If
    End Sub


    bez Waitms 255 wykonuje się w czasie ok. 10.2 ms (na kwarcu 11,05MHz)
    czyli głównym "czasożercą" jest podwójna komenda Waitms 255.
    Pomyślałem sobie jakby tę komendę zastąpić inną procedurką w której wykonuje się multipleksowanie ???
    Nie wiem czy dobrze myślę ale Waitms 255 potrzebne jest tylko dallasowi a procek może w tym czasie robić coś pożyteczniejszego niż czekać.
    Co Wy na to, czy ktoś to testował ?
  • #15 1627815
    jacur
    Poziom 32  
    Posty: 1748
    Pomógł: 166
    Ocena: 295
    Pewnie ze ktoś to testował i nawet działa :) a dokładnie to odliczasz sobie czas na timer_ku i jak sie odliczy to odczytujesz dane z ds-a
  • #16 2145763
    pablo666gliwice
    Poziom 14  
    Posty: 115
    Pomógł: 6
    Ocena: 38
    mam procesor mega8 na 4MHz do tego 3 wyswietlacze multipleksowane na przerwaniu timer0 (okolo 66Hz na jeden wyswietlacz) i niestety sa bledy w transmisji z dsa i to srednio co 10 odczytow Bez CRC uklad wariuje Dla unikniecia nieszczesnego polecenia wait 1 zliczam w przerwaniu ilosc przerwan i co 200 ustawiam pomocniczy bit ktory powoduje w petli glownej wyslanie polecenia odczytu a pozniej konwersji dzieki temu czujnik ma cala sekunde na konwersje :) W celu unikniecia bledow transmisji mozna wylaczac przerwanie..ale wtedy wyswietlacze co sekunde migną.. ledwo widac ale denerwuje.
  • #17 2145905
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Nie ma bata. Z ds na 1wire i multiplexem led musi mignać. I nie słuchajcie zadnych zapewnień że "mi nie miga". Napewno miga. rygory czasowe w ds to są us (mikrosekundy) i nie ma takiej możliwości żeby bascom się wyrobił.
    Rozwiazanie? Zacząć stosować czujniki na I2C zamiast 1wire. Transmisja moze być całkowicie zatrzymana i nic to nie przeszkadza. Do tego komendy do i2c nie są az tak czasochłonne (w bascomie oczywiście) żeby cokolwiek migało. To tylko dwe linie portu i też można zasilić z lini danych (potrzebne dwie diody i kondensator). Do tego termometry na I2c Mozna kupić taniej niż ds na 1wire. DS1621, TMP100, TMP101, DS75 i inne podobne. One maja taki sam adres i taka samą obsługę (można zmieniać czujniki bez zmiany programu(nawet rozdzielczość)). A i również można podłączyć kilka czujników do jednej szyny danych.
  • REKLAMA
  • #18 2146296
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    szymtro napisał:
    Nie ma bata. Z ds na 1wire i multiplexem led musi mignać. I nie słuchajcie zadnych zapewnień że "mi nie miga". Napewno miga. rygory czasowe w ds to są us (mikrosekundy) i nie ma takiej możliwości żeby bascom się wyrobił.

    Mylisz się , jest bat :D
    szymtro napisał:

    Rozwiazanie? Zacząć stosować czujniki na I2C zamiast 1wire.
    ...

    A da radę na 100m lub dalej :?:

    Piotrek
  • #19 2146403
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Zumek jesteś fachowcem, piszesz w asemblerze więc jesteś w stanie samemu napisać sobie obsługę 1wire z wykorzystaniem tajmera (co 17us)i specjalna tablicę komend. Ale pytanie dotyczyło zrobienia czegoś takiego w bascom avr.

    Co do tych 10mm to sa specjalne układy tzw. nadajniki lini do I2C ale to nie o to chodzi. Podpinałeś kiedys ds1820 z 4,7K opornikiem podciagajacym na 20m kablu? I co udało się? Bo mi nie chciało zadziałąć - zawsze albo 0 stopni albo te magiczne 85 stopni.
    Wiadomo ze na takie odległości tylko pętle prądowe i nic innego.

    Do całej reszty pytajacych:
    Teoretycznie dało by sie zrobić taką transmisje bez "migania" wyświetlaczy, ale.
    Ale trzeba zrobić przerwanie od tajmera co ok 17us, i co przerwanie ładować kolejne bity z tabeli (albo ze słowa) na port wyjściowy.
    Zumek moze i byłby w stanie coś takiego uruchomić ale początkujacy użytkownicy bascoma niestety nie poradzą sobie z takim zadaniem. Niestety przykro mi to stwierdzić ale prościej jest uruchomić wewnetrzny przetwornik A/D (to też nie jest proste) niż uruchomić 1wire razem z wyświetlaczami multipleksowanymi programowo(bez tego nieszczesnego migania). I wiem co mówię.
  • #21 2146515
    UDMA
    Poziom 16  
    Posty: 133
    Pomógł: 16
    Ocena: 2
    szymtro napisał:
    Podpinałeś kiedys ds1820 z 4,7K opornikiem podciagajacym na 20m kablu? I co udało się? Bo mi nie chciało zadziałąć - zawsze albo 0 stopni albo te magiczne 85 stopni.
    Wiadomo ze na takie odległości tylko pętle prądowe i nic innego.


    W nocie aplikacyjnej AN244 od Dallasa jest projekt drivera 1-wire dla kabli do 500m.
  • #22 2146546
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    szymtro napisał:
    Zumek jesteś fachowcem, piszesz w asemblerze więc jesteś w stanie samemu napisać sobie obsługę 1wire z wykorzystaniem tajmera (co 17us)i specjalna tablicę komend. Ale pytanie dotyczyło zrobienia czegoś takiego w bascom avr...
    .

    Nie,nie nie :!: Miałem na myśli "czysty" Bascom :D
    Działa to mniejwięcej w taki sposób dla 4-ch 7-segmentowych LED-ów:
    
    $crystal=11059200
    $regfile="m32def.dat"
    Dim Flaga As Bit
    ...
    do
    ...
    gosub wait_intr : 1wreset
    gosub wait_intr : 1wwrite&HCC
    gosub wait_intr : 1wwrite&HHH
    ...
    loop
    Multiplex_4ms:
    'obsługa wyświetlaczy+licznik w dół+cośtam jeszcze =~1ms
       reset Flaga
    Return
    ...
    wait_inr:
       set flaga
       bitwait flaga,RESET
    return
    ...
    

    Teraz mam pewność(?) , że przerwanie nie zakłóci transmisji na 1wire.
    Wystarczy tylko "umiejętnie zbudować" i przeanalizować kod , na okoliczność czasu w jakim się wykonuje(debugger AVRStudio).Nie twierdzę , że zawsze można tak postępować , ale w przypadku prostych zegarko-termometro-sterowników - jak najbardziej tak ;)

    Piotrek
  • #23 2146637
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Przerwanie żeczywiście wtedy nie zakłuci pracy 1wire ale sam odczyt 1wire zakłuci czestość występowania przerwania - it o jest powazym ograniczeniem w stosowaniu tego. Na ten problem równiez ja ostatnio wpadłem i nie udało się tego rozwiazać przyzwoicie. Moze atmega z najszybszym zegarem (20MHz) da radę ale jest to porywanie sie z motyka na księżyc. Zastanawia mnie też sytuacja rozbicia poleceń bascoma (1wreset itp) na podkomendy ale to też zachacza o napisanie komunikacji w asemblerze.
    Co tu durzo mówic: Jezeli 1wire to polecam tylko i wyłącznie LCD - no chyba ze owe mruganie klient zaakceptuje "bez szemrania".
  • #24 2146844
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    szymtro napisał:
    Przerwanie żeczywiście wtedy nie zakłuci pracy 1wire ale sam odczyt 1wire zakłuci czestość występowania przerwania - it o jest powazym ograniczeniem w stosowaniu tego.
    ...

    A w jaki sposób 1wire , zakłóci częstotliwość występowania przerwań :?: Nie rozumiem :| Ostatecznie , można zastosować automat i obsługę 1wire upchać do procedury przerwania.Jeśli możesz , to pokaż jak obsługujesz przerwanie timera , w którym momencie "mrugają" Ci wyświetlacze , przy 1wreset czy przy a(1)=1wread(8) i iloma Mhz popędzasz proca :?:

    Piotrek
  • #25 2146937
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Muszę zrobić disable interrupts przed jakąkolwiek komendą 1wire a potem załaczyć. Albo wyłaczyć przerwania odczytać 1wire i dopiero załaczyć. To drugie jest gorsze bo powoduje dłuższe mignięcie wyświetlacza. Przy wyłączaniu przerwania tylko na jedna komendę 1wire wyświetlacz miga krócej ale jednak miga. Jak tego nie zrobie to odrazu mam bład komunikacji i albo 0 stopni albo 85. Proc to 90s2313 @ 10MHz. Sprawdzałem też na 89c2051 @ 24MHz i jest podobnie (tez miga, n=nie umiem powiedzieć czy dłuzej czy krócej). Projek musiałbyć juz oddany wiec na szybko zmieniłem płytkę i dałem czujnik na I2C i nie migało a klientowi nie przeszkadzał grubszy kabel do czujnika.
  • #26 4905207
    Nosio
    Poziom 12  
    Posty: 39
    Ocena: 1
    Ja również miałem problem z multiplesowaniem wyświetlaczy i jednoczesnym odczytem 1wire.
    Pomysł z wyłaczeniem przerwań od timera na czas transmisji 1wire okazał się prawidłowy. Ponieważ w trakcie pomiaru świeci się jeden wyświetlacz aby efekt był nie zauważalny możemy dokonywać pomiaru temeperatury rzadziej. Oto mój programik :

    $regfile = "m8def.dat"
    $crystal = 4000000
    Config Portd = Output
    Config Portb = Output
    Config 1wire = Portb.0
    Config Timer0 = Timer , Prescale = 256
    Portb = &B11111111
    Portd = &B11111110
    Dim I As Byte
    Dim D As Byte
    Dim J As Byte
    D = 11
    J = 10
    Dim D1 As Byte
    Dim Trzyms As Byte
    I = 0
    Trzyms = 0
    Dim Temperatura(2) As Byte
    On Timer0 Wysw
    Enable Interrupts
    Enable Timer0
    Load Timer0 , 150
    Do
    Disable Interrupts
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Enable Interrupts
    Waitms 750
    Disable Interrupts
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Temperatura(1) = 1wread(2)
    Temperatura(1) = Temperatura(1) / 16
    Temperatura(2) = Temperatura(2) * 16
    Temperatura(1) = Temperatura(1) + Temperatura(2)
    If Temperatura(1) < 84 Then
    D = Temperatura(1) \ 10
    D1 = D * 10
    J = Temperatura(1) - D1
    End If
    Enable Interrupts
    Waitms 5000


    Loop
    End


    Wysw:
    Load Timer0 , 150
    Set Portb.1
    Set Portb.2
    If I = 0 Then
    Portd = Lookup(j , Kody7seg)
    Reset Portb.2
    I = 1
    Else
    Portd = Lookup(d , Kody7seg)
    Reset Portb.1
    I = 0
    End If
    Return



    Kody7seg:
    Data &B00000010 , &B01101110 , &B01000001 , &B01001000 , &B00101100 , &B00011000,
    Data &B00010000 , &B01001110 , &B0000000 , &B00001000 , &B01110101 , &B00000101
  • #27 4905224
    don diego
    Poziom 32  
    Posty: 1557
    Pomógł: 165
    Ocena: 63
    Myślę, że autor tematu już rozwiązał swój problem:)
  • #28 4906582
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    Witam,

    a ja jeszcze nieco inaczej rozwiązałem w czystym Bascomie to żeby nie było migotania i to przy użyciu pomiaru z 4 czunjników DS

    .... rozwiązanie jest prawie identyczne jak podał kolega Zumek, tylko, że w przerwaniu lub w pętli głównej inkrementowana jest pewna zmienna i w zależności jakie wartości ona przyjmuje to w pętli głównej wysyłany jest rozkaz do czujników o rozpoczęciu pomiaru, natomiast po osiągnięciu kolejnej wartości wysyłany jest cyklicznie rozkaz do poszczególnych czujników w/s odczytu temperatury. Oczywiście wartości tej zmiennej trzeba tak dobrać aby zachować odstęp pomiędzy rozkazem pomiaru a odczytu na poziomie tych 750ms

    i wszystko śmiga że hej

    działa to z powodzeniem w moim projekciku
    https://www.elektroda.pl/rtvforum/topic960729.html

    wprawdzie nie obsługuje on wyświetlacza LED ale za to kody IR z pilota i zasada działania jest b.podobna, dzięki czemu żadnych zachiachów nie ma

    jak więc widać nie ma co tak narzekać i psioczyć na biednego Bascoma, bo można w nim dużo zrobić tylko trza pokombinować

    pozdrówka
  • #29 4906779
    MarasK
    Poziom 18  
    Posty: 231
    Pomógł: 19
    Ocena: 4
    a jakby multipleksować wyświetlacze co 100us ? (timeslot dla dallasa) Rozumiem przez to, że tuż po nadaniu/odebraniu bitu przełączyć wyświetlacz i transmitować następny bit.
  • #30 4907168
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    MarasK -> ale przecież opóźnienia tzn to migotanie nie powstaje z powodu samej transmisji pomiędzy DS'ami tylko z tego powodu, że większość ludzi po wysłaniu polecenia pomiaru temperatury do czujników stosuje w tym miejscu pętlę opóźniającą 750ms aby po nie odczytać te temperatury i to tu jest pies pogrzebany. Bo obojętnie gdzie czy w przerwaniu, zy pomiędzy przerwaniami czy gdziekolwiek wstawi się tak na żywca takie opóźnienie to nie dziwne, że powstanie mała przerwa w wyświetlaniu już zauważalna dla oka

    pozdr

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemu jednoczesnej obsługi multipleksowanych wyświetlaczy LED (4 sztuki) na mikrokontrolerze ATMEGA32 oraz odczytu temperatury z czujnika DS18B20 za pomocą Bascom AVR. Uczestnicy wskazują, że możliwe jest korzystanie z przerwań TIMER0 do multipleksowania wyświetlaczy i równoczesnej komunikacji 1-Wire, pod warunkiem odpowiedniego dopasowania czasów transmisji i przerwań. Zalecane jest unikanie blokujących opóźnień (wait, waitms) podczas komunikacji z DS18B20, zamiast tego stosując asynchroniczne wysyłanie poleceń pomiaru i odczytu temperatury z odstępem około 750 ms, co pozwala na płynne wyświetlanie bez zauważalnego migotania. Wskazano, że wyłączanie przerwań na czas transmisji 1-Wire powoduje krótkie migotanie wyświetlaczy, które może być nieakceptowalne wizualnie. Alternatywnie proponowano zastosowanie dodatkowego mikrokontrolera (np. ATTiny2313) dedykowanego do sterowania wyświetlaczami lub użycie mikrokontrolerów z większą liczbą pinów (ATMEGA128, ATMEGA8515) eliminujących konieczność multipleksowania. Wskazano również, że czujniki temperatury na magistrali I2C (DS1621, TMP100, TMP101, DS75) mogą być lepszym rozwiązaniem, gdyż komunikacja I2C jest mniej krytyczna czasowo i nie powoduje migotania wyświetlaczy. W dyskusji pojawiły się przykładowe fragmenty kodu Bascom AVR pokazujące implementację przerwań i asynchronicznego odczytu DS18B20 oraz sugestie dotyczące synchronizacji flag i przerwań. Podkreślono, że pełna eliminacja migotania przy 1-Wire jest trudna ze względu na mikrosekundowe rygory czasowe transmisji i ograniczenia Bascom AVR, a najlepsze efekty uzyskuje się przez odpowiednie zarządzanie czasem pomiaru i multipleksowaniem.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA