Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Bascom AVR i odczyt danych z DS1820 w przerwaniu od Timera1

byrrt 05 Aug 2005 13:10 3723 6
  • #1
    byrrt
    Level 21  
    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
  • #2
    john_t
    Level 29  
    "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.
  • #3
    byrrt
    Level 21  
    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 :)
  • #4
    john_t
    Level 29  
    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ć.)
  • #5
    byrrt
    Level 21  
    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
    irekkwck
    Level 11  
    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.