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

Bascom AVR i odczyt danych z DS1820 w przerwaniu od Timera1

byrrt 05 Sie 2005 13:10 3843 6
REKLAMA
  • #1 1708583
    byrrt
    Poziom 21  
    Posty: 726
    Pomógł: 2
    Ocena: 833
    Witam! Mam takowy problem. Pisze sobie program zegarka polaczonego z termometrem oraz wspolpracujacym z komputerkiem (uklad posiada RS oraz kilka wejsc wyjsc). Same zczytywanie z DS'a nie jest dla mnie problemem - jezeli program jest wielka petla typu:

    Do
    Gosub 1wire
    Gosub I2c_read
    Gosub Lcd_wys
    Loop

    to wszystko dziala. Jednak chciałem zrobić to na przerwaniu - układ będze się wymieniał danymi z komputerem i byłoby mi to bardziej przydatne. Przerwanie ustawiłem na co 1s (żeby napewno się DS wyrobił chociaż u mnie spokojnie w 200ms wszystkie te operacje się zdążą wykonać - sprawdziałem ile czasu trwa jedna pętla. I zaczynają się schody bo błędnie zczytuje z DS'a (pokazuje zawsze -0,5'C). Co ciekawe zmienna Err ciągle jest 0 - nawet jak wyjmę DS'a!! Czy ktoś wie żeby przerwanie mogło zakłucać pracę 1wire? Proc to ATMega8, 1wire na Portb.1. Układ napewno się wyrabia bo wpisałem sobie aby migał mi podświetlaniem po każdym pełnym wykonaniu przerwania - więc wszystko się wyrabia ale nie działa... ma ktoś pomysły? :)

    Pozdrawiam
    Piotr
  • REKLAMA
  • #2 1708624
    john_t
    Poziom 29  
    Posty: 1070
    Pomógł: 127
    Ocena: 89
    "Czy ktoś wie żeby przerwanie mogło zakłucać pracę 1wire?"

    Oczywiście że może jeśli wypadnie podczas transmisji danych z DS'a
    Przed każdą komunikacją z DS'em zablokuj przerwania. Np: Disable Timer1 a po komunikacji odblokuj Enable Timer1.
  • REKLAMA
  • #3 1708727
    byrrt
    Poziom 21  
    Posty: 726
    Pomógł: 2
    Ocena: 833
    Tak tez robilem na wszelki wypadek - nic! Przerwanie nie wypada na czas transmisji 1wire bo jak pisalem wszystko juz dawno sie konczy.. Zrobilem tak ze w gl petli programu (czyli Do..Loop) wstawilem aby czytal DS'a a w przerwaniu reszte - dziala :| w tym przypadku przerwanie moglo by zaklucac transmisje do i z DS'a a tego nie robi... pojecia nie mam o co chodzi :)
  • REKLAMA
  • #4 1716241
    john_t
    Poziom 29  
    Posty: 1070
    Pomógł: 127
    Ocena: 89
    A podłączyłeś pullup'a do DS'a ?
    (lepiej jednak jest podłączyś DS'a trzema kablami z zasilaniem na stałe)
    I drobna uwaga, nie wiem jakiego procka masz ale procedura obsługi przerwania nie może być zbyt długa (program będzie pracował niestabilnie, może też się wieszać.)
  • REKLAMA
  • #5 1716288
    byrrt
    Poziom 21  
    Posty: 726
    Pomógł: 2
    Ocena: 833
    Tak DS podłączony jest prawidłowo - po 3 przewodach i na lini sygnałowej 4k7 do Vcc... Poniewaz mozna sprawdzic czy DS juz pomierzyl temperature (po stanie nozki sygnalowej) program mam napisany tak ze zaraz po pomiarze program czeka az DS zmierzy temp i dopiero odczytuje... wsadzilem to w petle z licznikiem i sprawdzilem ile trwa petla... A wiec odczyt z I2C oraz 1Wire zapis ustawien do I2C, wyslanie danych przez UART oraz obsługa wyświetlacza zajmuje nie więcej niż 80ms!! I jak wsadze te wszystkie programy w petle działa bezbłędnie!!! Ale jak ustawie to w przerwaniu że ma się wykonać np co 1s to się cuda dzieja!

    Narazie problem ominołem tak, że wszystko działa w pętli...

    Pozdrawiam
    Piotr

    ps. procek to jak pisałem ATMega8
  • #6 4464504
    irekkwck
    Poziom 12  
    Posty: 14
    Ocena: 1
    przerwanie nie powinno mieć waitms i dlatego nie czyta się DS-a na przerwaniu, często niektórzy piszą waitms 750 bo tak wymaga DS i zdziwienie dlaczego DS wali błędy a BASCOM ma waitms tylko do 255, ale można 3 razy wpisać waitms 255. Nie wiem jak ma AVR ale to inny temat chodziło tylko o to że na przerwaniu nie robi się pętli czasowych.
  • #7 4465186
    byrrt
    Poziom 21  
    Posty: 726
    Pomógł: 2
    Ocena: 833
    Temat utworzony ponad 2 lata temu i dawno rozwiązany.. :) Co do tych 255 sekund w waitms to się akurat kolega myli.. Pozatym nigdy nie robiłem petli czasowych w przerwaniu.. Proponuje czytać poprzednie posty przed odpowiedzią.. Pozdrawiam i zamykam temat..

Podsumowanie tematu

LABEL_AI_GENERATED
Problem dotyczy odczytu danych z czujnika temperatury DS1820 za pomocą protokołu 1-Wire w przerwaniu timera Timer1 na mikrokontrolerze ATMega8. W przypadku wykonywania odczytu w głównej pętli programu (Do...Loop) komunikacja przebiega poprawnie, natomiast próba realizacji odczytu w przerwaniu powoduje błędne wyniki (np. stała wartość -0,5°C) mimo braku błędów w zmiennej Err. Dyskusja wskazuje, że przerwania mogą zakłócać transmisję 1-Wire, szczególnie jeśli przerwanie wystąpi podczas komunikacji z DS1820. Zaleca się blokowanie przerwań na czas komunikacji z czujnikiem (np. wyłączenie Timer1) i odblokowanie ich po zakończeniu transmisji. Ponadto, procedura obsługi przerwania nie powinna zawierać długich opóźnień ani pętli czasowych, gdyż może to powodować niestabilność programu. Prawidłowe podłączenie DS1820 z rezystorem podciągającym 4,7 kΩ do Vcc oraz zasilaniem na stałe trzema przewodami jest potwierdzone. Ostatecznie, najlepszym rozwiązaniem okazało się wykonywanie odczytu DS1820 w głównej pętli programu, a pozostałych zadań w przerwaniu, co eliminuje zakłócenia transmisji 1-Wire.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA