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

[BASCOM][atmega16] Przerwanie zewnętrzne co 4ms i komunikacja 1wire - kolizja

Mad Jaro 25 Lip 2011 11:51 4574 30
  • #1 9755966
    Mad Jaro
    Poziom 16  
    Mam problem z komunikacją 1wire i jej kolizją z przerwaniami zewnętrznymi.

    Próbowałem wyłączać przerwania zewnętrzne na czas obsługi 1wire efekt jest taki, że temperaturę odczytuje bezbłędnie, niestety rozjeżdża mi się przerwanie zewnętrzne.

    Gdy, nie wyłączam przerwań zewnętrznych na czas obsługi 1wire program po czasie się wysypuje.

    Przerwania zewnętrzne INT0 są z przedziału 40ms na wolnych obrotach do około 4ms na wysokich obrotach. Przeglądnąłem chyba wszystkie możliwe tematy o podobnej problematyce i nie potrafię znaleźć rozwiązania. Myślę, że musi istnieć jakieś rozwiązanie. Proszę o pomoc.

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #2 9758501
    xury
    Specjalista automatyka domowa
    A widzial kolega to:
    https://www.elektroda.pl/rtvforum/topic1758870.html
    Zwróć uwagę co robię z INT0 podczas odczytu 1W
    Poza tym u Ciebie w podprogramie odczytu temperatury nie dajesz nic wytchnienia dallasowi i czytasz temperaturę zaraz po rozkazie konwersji. Kolejna sprawa to czy zawsze przed odczytem musisz szukać czujników? Nie lepiej jest to zrobić raz po przy uruchamianiu układu ?
  • Pomocny post
    #3 9758648
    tomhandyman
    Poziom 13  
    Kolega Mad Jaro mierzy czas pomiedzy INT-em i przelicza na obroty. zablokowanie INT spowoduje pływanie obrotów( INT nie liczy impulsow). Kolega xury ma rację odnośnie jednokrotnego użycia szukania czujników. A poza tym zsynchronizuj odczyt 1wire z przerwaniem INT tzn. komunikację z 1wire podziel na max -5 bajtowe odcinki i wykonuj je po przerwaniu INT. Pauza w transmisji 1wire nie zaszkodzi, reset i potwierdzenie też się zmieści w 4 milisekundowym okienku. Możesz użyć instrukcji case, której krok zmieniasz w przerwaniu i wykonujesz następne polecenia 1wire.
  • #4 9758786
    Mad Jaro
    Poziom 16  
    xury dzięki za poprawkę w komunikacji 1wire.

    Co do wyłączania INT0 to tak jak napisał już tomhandyman, każde wyłączanie czy blokowanie tych przerwań będzie miało wpływ na zakłócenie pomiaru obrotów.
    Dlatego tak trudno mi coś wymyślić.

    Propozycja tomhandyman wydaje się być stosowna, teraz zapewne będę przez kolejne kilka dni główkował jak to zapisać w kodzie (na tym projekcie dopiero uczę się BASCOMA)

    EDIT:
    Szukam coś na temat podobnego rozwiązania. Nie wiem jak podzielić tą transmisję na bloki po 5 bajtów.

    Doczytałem, że 1wreset trwa około 1ms.
    Odczyt dwóch bajtów trwa około 1ms. Ale nie wiem jak to podzielić na te bajty.
  • #5 9783343
    Mad Jaro
    Poziom 16  
    Niestety, nie daję sobie rady z napisaniem tego. Mogę liczyć na waszą pomoc ?
    Jakąkolwiek podpowiedz jak to zacząć pisać.
  • #6 9784108
    piotrva
    VIP Zasłużony dla elektroda
    Hmm, a jakbyś obroty mierzył za pomocą timera w trybie licznika? Wtedy impulsy są zliczane niezależnie od programu głównego, a dajesz przerwanie od drugiego timera co większy odcinek czasu i w nim wykonujesz transmisję 1w oraz przeliczanie obrotów.
    oczywiście przeszukiwanie układów wystarczy raz na początku a potem coś na kształt:
    
    Przerwanie_co_100ms:
    Select Case I
    Case 1:
    'reset1w, polecenie konwersji temp dla wszystkich
    Case 2:
    'reset danych do pomiaru obrotów
    Case 3:
    'przeliczenie obrotów (zliczanie impulsów trwało 100ms)
    Case 8:
    'odczyt temperatury z 1. termometru
    Case 9:
    'odczyt temp. z 2. termometru
    Case 10:
    I=1
    end Select
    Incr I
    Return
    
  • #7 9788776
    Mad Jaro
    Poziom 16  
    Sam nie wiem już jak to rozwiązać.

    Wcześniejsze rozwiązanie powinno się sprawdzić, bo czytałem, ze tak się to powinno robić. Tylko nigdzie nie mogę znaleźć jakiegoś kodu do podglądu, żeby zobaczyć jak to ma być zapisane.

    Nie wiem jak powinien wyglądać zapis:
    - rozbicia 1wire na bajty
    - warunku po którym uC będzie wiedział, że przerwanie się zakończyło i przejdzie do instrukcji case w której będzie odczytywać te bajty z 1wire
  • #8 9788994
    zumek
    Poziom 39  
    Mad Jaro napisał:
    Sam nie wiem już jak to rozwiązać...

    Prawie gotowiec...
  • #9 9792200
    Mad Jaro
    Poziom 16  
    Nawet jeśli jest to gotowiec jak piszesz, zapewne więcej się z niego nauczę niżeli próbując pisać z palca.

    Nie jestem z takich co dostaje, wrzuca, działa, zapomina tylko analizuje to co dostałem, zapamiętuję i wykorzystuję w przyszłości.
  • #10 9816564
    Mad Jaro
    Poziom 16  
    Wyczytałem także, że można zastosować funkcję while wend.
    Po przerwaniu wstawić warunek resetowania flagi.

    Następnie pod tym kodem umieszczać procedurę odczytu z DS'a.
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Procedura powinna wykonać się gdy przerwanie będzie zakończone.

    Co o tym sądzicie ?
  • #11 10362073
    Mad Jaro
    Poziom 16  
    Witam, w związku z tym, że nie udaje mi się pogodzić zewnętrznych przerwań z obsługą 1-wire (zatrzymywanie przerwań na czas obsługi 1-wire co zakłóca mi odczyt z zewnętrznych przerwań) mam pytanie do bardziej doświadczonych:

    Czy możliwym jest wgranie "dwóch" programów do jednego uC, żeby działało to mniej więcej tak:

    1-szy program tylko z obsługą 1-wire ładowany po podaniu zasilania
    2-gi program tylko z obsługą przerwań zewnętrznych ładowany, gdy trzymany jest przycisk i podane zasilanie
  • #12 10362109
    tmf
    VIP Zasłużony dla elektroda
    A czy AVR ma dwa rdzenie?
    Napisz tą obsługę jak należy to problem zniknie bez cudowania. Np. od czego masz USART? Żeby się nudził? Nie, żeby na nim zrobić sprzętowo obsługę OW.
  • #13 10362196
    Mad Jaro
    Poziom 16  
    Jest to Atmega16.

    Nie tylko ja jeden miałem problem z pogodzeniem mojego przypadku, inna osoba stwierdziła, że w moim przypadku istnieje możliwość pogodzenia 1-wire i przerwania ale nie w języku BASCOM.

    O USART jeszcze nie słyszałem, jak mniej więcej miało by to wyglądać ?
  • #14 10362256
    tmf
    VIP Zasłużony dla elektroda
    Wiesz, lepiej już tej osoby się nie radź :)
    Atmel udostępnia notę aplikacyjną demonstrującą użycie USART do realizacji mastera OW. W skrócie - USART można wykorzystać do generowania impulsów ujemnych OW. W tym czasie odbiornik USART działa jako 8-bitowy układ samplujący magistralę z zadaną prędkością.
  • #15 10362373
    Mad Jaro
    Poziom 16  
    U mnie jest jeszcze o tyle skomplikowana sytuacja, że płytka jest już wykonana i nie mogę sobie pozwolić na przeróbki. Z tego co wstępnie czytam to tym USART przesyłamy sygnał po rs232 czyli komputer. Ja natomiast wynik z 1-wire muszę przesyłać na 2x8 LCD.

    Próbowałem, dzielić 1-wire na bloki i odczytywać w przerwie od przerwania, ale nie dawało to efektów.

    Tutaj jest stary wątek mojego problemu, tak to mniej więcej wyglada:
    Link
  • #17 10362759
    tmf
    VIP Zasłużony dla elektroda
    Mirku jak już dajesz link reklamujący twoją stronę to chociaż podaj taki, który coś wnosi. Bo tam widzę tylko teksty typu "Bzdura", podczas gdy nie ma tam nic wartościowego dla kogoś kto twojej książki nie kupił. Nikt nie pisze, że OW nie da się zrobić bez UARTa, UART po prostu jest najprostszym rozwiązaniem w sytuacji w której intensywnie są wykorzystywane przerwania. Ponieważ obecnie większość AVR ma przynajmniej 2 UARTy pisanie, że szkoda poświęcić jeden świadczy tylko o tym, że ktoś od d... strony zabrał się do projektu. Taka jest brutalna prawda. Szczególnie w sytuacji w której autor wątku nic nie pisze o naturze problemów z przerwaniami. Kto wie na jaką latencję w ich obsłudze może sobie pozwolić, może jest to np. 500 us, a może 200ns?

    Mad Jaro: no to masz problem. Dobra strona jest taka, że patrząc na to co piszesz, bez urazy, ale widać, że masz niewielkie pojęcie o programowaniu :) To akurat dobrze, bo najpewniej twój problem wynika z niezbyt dobrze napisanego kodu i da się go rozwiązać poprawiając kod. W każdym razie to byłoby dla ciebie lepsze, bo inaczej czeka cię jednak zmiana płytki :)
    Napisz więc co to za przerwania i jakie są wymogi czasowe. Wtedy może się coś wymyśli.
  • #18 10363106
    Mad Jaro
    Poziom 16  
    Przerwania pochodzą od obrotomierza. Przerwanie INT co:

    4ms przy 15k obr
    40ms przy 1.5k obr

    Chyba, że coś pomieszałem,

    Kwarc wewnętrzny: 8 000 000
    Prescale timera: 256
    przy 1500 obr/min otrzymuję wynik 50 000
    Mierzę czas trwania impulsu i przeliczam na obr.

    tmf wcale nie mam powodu żeby się obrażać, wiem, że moja wiedza jest na poziomie powiedzmy podstawowym, ale po to są fora żeby zdobywać więcej wiedzy. A czasami uczyć się na błędach.
  • #19 10363270
    tmf
    VIP Zasłużony dla elektroda
    Te czasy to chyba chodzi o mikrosekundy a nie milisekundy? Przy odstępach rzędu ms nie byłoby najmniejszego problemu, jako że najdłuższe co może być, czyli reset pulse trwa zaledwie 480 us.
    Ale ok, napisz coś więcej o tym pomiarze obrotów. Dlaczego wykorzystałeś wejście INT, zamiast wejście taktujące timer? Jeśli zastosowałbyś timer to problem znika, gdyż liczenie masz sprzętowo zrealizowane.
    Jeśli istotnie przerwanie od obrotomierza masz co 15us, to przy 8MHz na instrukcję masz 125ns, czyli zaledwie 120 instrukcji. W BASCOMie istotnie robi się problem, przerwanie trzeba by napisać w assemblerze i trochę skomplikować obsługę OW jeśli już musi być robiona na pinach. Czyli albo dłubanie nad wstawkami w asmie, albo zmiana płytki :)
  • #20 10363454
    Mad Jaro
    Poziom 16  
    Powiem szczerze, że z tym INT to po prostu gdzieś zobaczyłem, że ktoś tak zliczał obroty podpatrzyłem i tak po prostu zostało.

    Tak zapewne chodziło o us.

    W asemblerze to w ogóle nie będę w stanie nic napisać, wiem tylko, że można dawać wstawki z asa do bascoma.

    Sugerujesz wykorzystać któryś z timerów ? T0 lub T1 (T0 mam akurat wolny na schemacie więc tylko dorobić na płytce)

    Tylko czy przez timer będę mógł mierzyć czas trwania impulsu jak do tej pory ? Bo to jest dokładniejsze od mierzenia impulsów w czasie.
  • Pomocny post
    #21 10363779
    tmf
    VIP Zasłużony dla elektroda
    Tak, będziesz mógł. Jeśli chcesz liczyć w czasie (a nie chcesz) to mierzony przebieg doprowadzasz do wejścia zegarowego timera, w efekcie każdy impuls powoduje zwiększenie wartości licznika o jeden. Skoro chcesz mierzyć szerokość impulsu to wykorzystujesz wejście ICP timera - timer taktujesz z maksymalną częstotliwością, z kolei impulsy z obrotomierza na wejściu ICP powodują przepisanie wartości licznika timera do specjalnego rejestru ICP. Odejmując kolejne wartości uzyskujesz ilość okresów zegara timera jakie minęły pomiędzy impulsami z obrotomierza, czyli czas. To co ważne, jest to robione całkowicie sprzętowo, w efekcie nie bruździ z odczytem OW. Powinna to u ciebie być dosyć proste do zrealizowania, co najwyżej zajdzie konieczność dolutowania kabelka do pinu procesora na przygotowanej płytce.
  • #22 10364731
    Mad Jaro
    Poziom 16  
    Duzo sie wyjasnilo. Czyli liczac czas trwania podaje impulsy na ICP. O ile z T0 maly problem bo mam wolna noge uC o tyle z noga ICP bede musial przerabiac plytke bo mam ten port wykoszystany do czegos innego. Ale juz sie z tym pogodzilem w sumie mam jeszcze na niej jedna rzecz do poprawy.
    Mam jedynie nadzieje ze po takich zmianach bedzie wszystko dzialalo poprawnie.
    Jeszcze mam pytanko bo uzywam tez przerwan wewnetrznych co 4 ms czy to bedzie mialo jakis wplyw na prace ICP i 1-wire?

    Na te chwile to bylo by wszystko. Jak sie uporam z plytka i nie bede czegos wiedzial bede informowal o problemach.

    Dla Ciebie tmf leci pomogl.
  • #23 10366130
    tmf
    VIP Zasłużony dla elektroda
    Przerwania co 4ms nie powinny mieć wpływu na ICP, na OW też nie, bo sekcje krytyczne czasowo zamykasz w bloki atomowe (cli/sei). Jedyne co się może stać to nieznaczne opóźnienie reakcji na przerwanie spowodowane jego blokowaniem. Jeśli jednak przerabiasz płytkę to pomyśl o tym wykorzystaniu USART.
  • #24 10366760
    Mad Jaro
    Poziom 16  
    Przerwania wewnetrzne wykorzystuje, aby skakac do podprogramow gosub. W petli kolejno co 4ms(odczyt, obliczenie obr. i wyswietlenie na lcd), 1s(odczyt temp i wyswietlenie na lcd).
  • #25 10595030
    marian.dxd
    Poziom 11  
    tmf napisał:
    Mirku jak już dajesz link reklamujący twoją stronę to chociaż podaj taki, który coś wnosi. Bo tam widzę tylko teksty typu "Bzdura", podczas gdy nie ma tam nic wartościowego dla kogoś kto twojej książki nie kupił. Nikt nie pisze, że OW nie da się zrobić bez UARTa, UART po prostu jest najprostszym rozwiązaniem w sytuacji w której intensywnie są wykorzystywane przerwania. Ponieważ obecnie większość AVR ma przynajmniej 2 UARTy pisanie, że szkoda poświęcić jeden świadczy tylko o tym, że ktoś od d... strony zabrał się do projektu. Taka jest brutalna prawda. Szczególnie w sytuacji w której autor wątku nic nie pisze o naturze problemów z przerwaniami. Kto wie na jaką latencję w ich obsłudze może sobie pozwolić, może jest to np. 500 us, a może 200ns?

    Mad Jaro: no to masz problem. Dobra strona jest taka, że patrząc na to co piszesz, bez urazy, ale widać, że masz niewielkie pojęcie o programowaniu :) To akurat dobrze, bo najpewniej twój problem wynika z niezbyt dobrze napisanego kodu i da się go rozwiązać poprawiając kod. W każdym razie to byłoby dla ciebie lepsze, bo inaczej czeka cię jednak zmiana płytki :)
    Napisz więc co to za przerwania i jakie są wymogi czasowe. Wtedy może się coś wymyśli.


    Mirekk3 pisze tylko po to, żeby się zareklamować i żeby więcej osób kupiło jego książkę, chwała ci tmf, że nie robisz tego samego. Pewnie tak samo będzie z kodami, ze już na dniach już dopracuję, uporządkuję i będziecie mieli itp. A potem się okaże, ze tak będziecie mieli jak sobie kupicie książkę. Jak chcesz reklamować książkę to nie na tym forum bo to nie jest śmietnik i basta.

    Co do tematu to nie widzę problemów z poświęceniem jednego uarta na ds18b20 jak mamy 2 jak to w niektórych mikrokontolerach.
  • #26 10596266
    Logan
    Poziom 30  
    Mad Jaro napisał:
    Przerwania wewnetrzne wykorzystuje, aby skakac do podprogramow gosub. W petli kolejno co 4ms(odczyt, obliczenie obr. i wyswietlenie na lcd), 1s(odczyt temp i wyswietlenie na lcd).


    Może wystarczy po prostu skrócić czas obsługi przerwania? Zamiast robić "wszystko" w przerwaniu - ustawiasz jedynie flagę. Dzięki temu przerwanie trwa maksymalnie krótko i następuje powrót do funkcji main, w której sprawdzasz flagę. Mam nadzieje, że w miarę jasno to opisałem.
  • #27 10599138
    Mad Jaro
    Poziom 16  
    W tym tygodniu będę robił nową płytkę, i sugerując się podpowiedziami tmf będę kierował impulsy z obrotomierza na nogę ICP i zobaczymy czy się sprawdzi. Mam taką nadzieję, ponieważ to już 3-cia zmiana płytki w tym projekcie...a chciałbym go już definitywnie zakończyć.
  • #28 10645597
    Mad Jaro
    Poziom 16  
    Mam już gotową płytkę, impulsy z obrotomierza kieruję na ICP tak jak zasugerował tmf.

    I teraz pytanie do Was czy pomożecie w pisaniu programu, żeby odpalić obsługę tego ICP ?

    Obecnie mój program wyglada tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #29 10646499
    piotrva
    VIP Zasłużony dla elektroda
    ICP w BASCOM będziesz musiał i tak zrobić na rejestrach, o ile dobrze wiem - czyli zajrzyj do dokumentacji procesora.
  • #30 10647944
    Mad Jaro
    Poziom 16  
    No właśnie tylko u mnie dość cienko z programowaniem i obawiam się, że może mnie to przerosnąć. Do tej pory udało mi się odpalić wiele rzeczy, ale nie wiedziałem ze z tym będą takie problemy.

    Dobrze by było jakbyście rzucili też okiem na całość programu, czy jest jakoś w miarę poskładany.


    Edit:
    Znalazłem coś takiego:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Timer Capture Mode to to samo co ICP ?
    Jak to połączyć z moimi wypocinami ? Mam tam już użytych kilka timerów.
REKLAMA