Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

AtMega 16 i FastAvr. LCD działa tylko na porcie A. Odczyt danych z czujnika.

marcinbig123 11 Mar 2006 14:42 3196 25
  • #1
    marcinbig123
    Level 11  
    Witam
    Mam problem z tym atmelem i programem.
    Chciałem zrobić termometr na DS 18B20 lub 1820 z LCD 2x16.
    Najpierw miałem problem z lcd, działa teraz tylko na porcie A.
    Pojawił sie drugi problem z czujnikami albo wogule nie umiał z nich odczytać albo pokażywał różne cyfry.
    Atmel działa na 16 Mhz lcd tez działa.
    Jak kiedys pisałem w fastavr na 2313 niemiałem takich problemów.

    Prosze o pomoc znających sie na FastAvr i AtMega 16.
  • #2
    elektryk
    Level 42  
    Ale na czym polega istota Twójego problemu, bo ja narazie to piszesz że nic nie działa i szukasz wróżki która da Ci gotowe urządzenie.
  • #3
    marcinbig123
    Level 11  
    Prosze kogoś kto zna się na FastAvr.
    Dokładnie jak odczytuje się temperature z ds1820 lub ds12b20
    w tym programie.
  • #4
    M. S.
    Level 34  
    Próbowałem kiedyś z ciekawości pisać w FastAvr lecz jak już po wielu trudach zmusiłem go do kompilacji to i tak prosty program nie chciał działać. Wybrałem ostatecznie Bascoma bo jeszcze mnie nie zawiódł. Termometry i wyświetlacze działają tam bez łaski. Wg mnie jak Basic to Bascom, a jak C to Win AVR.
  • #5
    crazy_phisic
    VIP Meritorious for electroda.pl
    M. S. wrote:
    Próbowałem kiedyś z ciekawości pisać w FastAvr lecz jak już po wielu trudach zmusiłem go do kompilacji to i tak prosty program nie chciał działać. Wybrałem ostatecznie Bascoma bo jeszcze mnie nie zawiódł. Termometry i wyświetlacze działają tam bez łaski. Wg mnie jak Basic to Bascom, a jak C to Win AVR.


    EE to proponuje koledze napisać termometr na Dallasach który bedzie śmigał pod bascomem gdy procek pracuje na 16MHz... Powodzenia ;)
    ja cały dzień się zastanawiałem dlaczego nie działa... okazuje sie że procedury 1wire w bascomie raczej problematyczne działąją przy takich częstotliwościach...
    Co do Fastavr ;) miodzio heheh tylko należy mieć sporo cierpliwości do niego ;)

    Code:

    $Device= mega16
    $Stack = 32
    $Clock = 16.000000
    $1Wire = PORTC.3
    $Source= On
    $Baud = 19200
    $LeadChar="0", Format(2,1)

    Dim T As Word
    Dim T1 As Float
    Dim d0 As Byte, d1 As Byte, d2 As Byte, d3 As Byte
    Dim d4 As Byte, d5 As Byte, d6 As Byte, d7 As Byte
    Dim crc As Byte

    Declare Sub Read1820()
    Declare Sub CalcTmp()

    Print "DS1820 T="   

    Do
       If 1Wreset Then
          1Wwrite &hcc; &h44
          WaitMs 250
          1Wreset
          1Wwrite &hcc; &hbe
          Read1820()
       Else
          Print "---"
       End If
       WaitMs 200
    Loop

    '/////////////////////////////////////////////////////
    Sub Read1820()

    1Wread d0,9            ' read all 9bytes
    If Crc8(d0,9)=0 Then   ' check Crc, if OK
       CalcTmp()         ' calc temp
    Else
       Print "CRC"
    End If
    End Sub

    '/////////////////////////////////////////////////////
    Sub CalcTmp()   ' calc for 0.1C resolution
    ' T is 10 times greater (integer)

    If d0.1 Then Decr d0   ' if odd decrement
    T=(50*d0-25+(100*(d7-d6))/d7)/10
    Format(2,1)
    Print T;" *C"
    End Sub


    działa bez problemów, tylko wynik podawany jest bez przecinka

    aha no i oczywiście procek musi pracować na zewnetrznym kwarcu

    Pozdrawiam
  • #6
    adamusx
    Level 27  
    Witam.

    Tez sie bawilem w FastAvr i uwazam ze jest znacznie szybszy od BASCOMA. Chodzi mi tu glownie o rozmiar kody wynikowego . Poza tym wszystkoe funkcje raczej sprawnie dzialaly. Niestety zrezygnowalem z niego podszas pisania kodu na ATmege 16. Mianowicie po przekroczeniu około 27 % pamieci ukladu program zacza sie sypac i nie moglerm znalesc tego przyczyny :( Wiec wrocilem do Bascoma ( potem przesiadlem sie na C) Mimo wszystko uwazam ze FastAVR bije na glowe Bascoma szczegonie w przypadku programów na procesory z mniejsza iloscia pamieci.
  • #7
    marcinbig123
    Level 11  
    A jak sie da w inny sposub odczytać temperature.
    Sposub wyżej niedziała albo "---" albo "CRC" na Lcd,
    na 99% jest wszystko dobrze podłączone.
    Mam dwa DS 18B20 i 1820 niepowinny się zepsuć.
    Jak je sprawdzić.
  • #8
    crazy_phisic
    VIP Meritorious for electroda.pl
    A jak wygląda podłączenie DS??
    Masz magistrale podciągniętą do plusa przez rezystor??
    Co z wyprowadzeniem Vdd DS?
  • #9
    marcinbig123
    Level 11  
    Podłączyłem normalnie czyli
    plus do plusa
    minus do minusa
    a magistrala jest podciągnięta do plusa 4,7k.
    A jak wygląda program na LM35, myśle ich urzyć zamiast DS.
    Chce zrobić sterownik do kominka wiec dokładny pomiar niejest mi potrzebny.
  • #10
    everyman
    Level 1  
    Dostalem ten program w Bascomie od kumpla, mozesz uzyc do sprawdzenia czy DS18B20 dziala. U mnie dziala.

    $crystal = 1000000
    Config 1wire = Portb.1 'konfiguracja 1wire
    Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32 'znak stopnia
    Dim T1 As Single
    Dim T2 As Single
    Dim B1 As Byte , B2 As Byte , R As Byte
    Dim Tmp As String * 6
    Dim Znak As String * 1
    R = &HFF
    Declare Sub 1wr 'podprogram resetujacy magistrale 1w
    Cursor Off
    Cls
    Do
    1wr 'podprogram 1wr
    1wwrite &HCC 'komenda skip ROM
    1wwrite &H44 'komenda convert T
    Waitms 250
    Waitms 250
    'Waitms 250
    Waitms 250
    1wr 'podprogram 1wr
    1wwrite &HCC 'komenda skip ROM
    1wwrite &HBE 'komenda read


    B1 = 1wread() 'odczyt z termometru
    B2 = 1wread()
    1wr 'podprogram 1wr
    If B2 >= 248 Then 'w przypadku temperatur ujemnych
    B1 = R - B1 'Od 255 Odejmujemy B1
    B2 = R - B2 'od 255 odejmujemy B2
    Znak = "-"
    Else
    Znak = "+"
    End If
    T1 = B1 / 16 'Przesuniecie w pawo o 4 bajty
    T2 = B2 * 16 'przesuniecie w lewo o 4 bajty
    T1 = T1 + T2
    Tmp = Fusing(t1 , "###.&&")
    Cls
    Lcd Znak ; Tmp ; Chr(1) ; "C "
    Waitms 250
    Loop
    Sub 1wr 'podprogram resetujacy magistrale
    1wreset
    End Sub



    powodzenia
  • #11
    maly35
    Level 13  
    Spróbuj napierw czy wogóle ci DS odpowiada:

    Code:
    void _delay_loop_2(uint16_t __count)
    
    {
       __asm__ volatile (
       "1: sbiw %0,1" "\n\t"
       "brne 1b"
       : "=w" (__count)
       : "0" (__count)
       );
    }

    unsigned char ow_reset(void) // reset lini one wire
    {
       unsigned char presence=1;
       DDRC |= _BV(5); //DQ = 0; //pull DQ line
       _delay_loop_2(480);
       DDRC &= ~_BV(5); //DQ = 1; // allow line to //powrót lini 1w do trybu wejścia
       _delay_loop_2(70);// wait for presence pulse(pochodzący od DS-a) //czekamy na ustabilizowanie lini
       if(bit_is_clear(PINC,5)) presence=0; //odczytujemy co wystawił na linię DS
       _delay_loop_2(420);// wait for end
       return(presence); // presence signal
    } // 0=presence, 1 = no part


    Jeśli zwróci ci 0 to znaczy że widzi czujnik, jak 1 to nie:( Pewnie coś jest nie tak z czasami. Pamietaj żeby ewentualnie pozmieniać porty.
  • #12
    lukzak2298
    Level 18  
    Jak to jest? Wgrałem kod :arrow:everyman a tu wynik z 2 miejscami po przecinku, jak to możliwe skoro DS serwuje dokładność 0,5? W zmiennej T1 jest wynik nawet z dokładnością do 4 miejsc. Jak to to mozliwe? :-0
  • #13
    zumek
    Level 39  
    lukzak2298 wrote:
    Jak to jest?...

    Tak to jest , ja się nie rozróżnia pojęć Rozdzielczość i Dokładność
    DS18B20 ma:
    Rozdzielczość maksymalna = 1/16 (0.0625) C
    Dokładność 1/2 (0.5) C
    To wszystko pisze w dokumentacji , tylko jest jeden warunek - trzeba to przeczytać :D

    Piotrek
  • #14
    lukzak2298
    Level 18  
    A najłatwiej to kogoś obrażać.

    Po co komu rozdzielczośc 0,0625 przy dokładności 0,5???

    I czemu jak wrzuce tego DS'a do wrzątku to pokazuje 70 stopni? :( a jak obłoze lodem to 4?
  • #15
    zumek
    Level 39  
    lukzak2298 wrote:
    A najłatwiej to kogoś obrażać.

    Skoro poczułeś się obrażony - przepraszam :|
    lukzak2298 wrote:

    Po co komu rozdzielczośc 0,0625 przy dokładności 0,5???

    Choćby po to , by wykryć zmianę temperatury o 0.0625 C
    lukzak2298 wrote:

    I czemu jak wrzuce tego DS'a do wrzątku to pokazuje 70 stopni? :( a jak obłoze lodem to 4?

    Niestety , jasnowidzem nie jestem :(

    Piotrek
  • #16
    lukzak2298
    Level 18  
    Spox, nie jestem taki obrażalski.
    Dzięki za wyjaśnienie sensu rozdzielczości.
    Mam więcej tych czujników, ale wszystkie tak samo się zachowują.

    A jeszcze z innej beczki - czy jest możliwe że podczas pracy DS wydziela ciepło fałszujące pomiar?
  • #17
    zumek
    Level 39  
    lukzak2298 wrote:

    Mam więcej tych czujników, ale wszystkie tak samo się zachowują.

    Może jakiś błędzik w obliczeniach , albo zaprogramowane na rozdzielczość 9-bitową :?: Trudno tak zgadnąć :(
    lukzak2298 wrote:

    A jeszcze z innej beczki - czy jest możliwe że podczas pracy DS wydziela ciepło fałszujące pomiar?

    Raczej nie , ale jeżeli już , to w granicach tego 0.5-stopniowego błędu.
    Ja się z takim czymś jeszcze nie spotkałem , a parę dziesiątek tego(DS) było :)

    Piotrek
  • #18
    lukzak2298
    Level 18  
    a jak zmienić rozdzielczość DS-a?

    Czemu Sama linijka z Fusing... zajmuje mi 5% flasha atmegi 16?
  • #19
    FireFighter
    Level 11  
    marcinbig123 wrote:
    Prosze o pomoc znających sie na FastAvr i AtMega 16

    Trochę odmłodzę wątek i odpowiem marcinbig123. Fast AVR jak wcześniej wypowiadali się forumowicze jest z zasady lepszym programem od Bascoma, gdyż generuje bardziej zwięzły kod wynikowy ale ja nie o tym...
    Problem z błędami jakie powstają podczas kompilacji (a co po czasie mocno denerwuje i odrzuca od programowania w FASTAVR), powstaje w wyniku nieprawidłowej składni. Przede wszystkim kolejności wpisywania choćby deklaracji przerwań, zmiennych itp. Trzeba nauczyć się trochę sztywnej lokalizacji tych ustawień a potem pójdzie łatwo. gdy program jest już długi wystarczy jeden mały błąd a wszystko się sypie ... a kompilator zgłasza inne błędy niż występują faktycznie.
    poniżej przedstawiam kod działającego kodu termometru. Nie jest to odkrywcza aplikacja, a raczej już wyznaczająca kanon w tej dziedzinie pod czujnik DS18B20.
    Code:
    $Device = m8
    
    $Stack = 32
    $Clock = 4
    Dim T As Word, Znak As String * 1
    Dim B1 As Byte , B2 As Byte
    '/////// temperatura ///////////
    1Wreset
    1Wwrite &HCC                                           
    1Wwrite &H44                                           
    WaitMs 250
    1Wreset
    1Wwrite &HCC                                           
    1Wwrite &HBE 
    b1=1Wread                                               
    b2=1Wread
       If b2 > 250 Then                         
       Znak = "-"
       b1=255-b1
       b2=255-b2
       Else
       Znak = "+"
       End If
    t=(b1+(b2*256))/16
    Lcd (1,2),"Temp: ";znak;t;"'C"


    p.s fakt. Aby program ten działał poświęciłem trochę czasu... :D
    Lecz nie zamienię FAST AVR na Bascom.
  • #20
    pawel129
    Level 16  
    również używam fastAVR i myśle że jest fajniejszy od bascoma, a dziś zacząłem zabawe z 1Wire
    Próbuje uruchomić przez cały dzień DS18B20, próbowałem już róźnych kombinacji i ciągle to samo... zachowuje się tak jakby nie działał.
    Napisałem teraz program FireFighter'a, i wskazuje mi na wyświetlaczu 00000.Nawet jak podgrzewam czujnik.
    Pytanie:
    co może być nie tak? Vdd czujnika podłączone do +5V, GND z GND, linia danych do PC1, jest rezystor podciągający 4,7k.
    jak zrobić aby zamiast postaci 00000 (5 cyfrowej) pokazywał się wynik w postaci 2(3) cyfrowej (dynamicznie) ?

    czy jest wysokie prawdopodobieństwo że mógłby się w jakiś sposób uszkodzić lub mogłem kupic trefną sztuke?Bo nie wiem czy inwestować drugie 8zł w nowy czujnik..


    EDIT:
    poradziłem sobie już z liczbą miejsc (tak m sie wydaje, bo wyświetla jak trzeba).
    Zmieniłem troche kod,tak aby pokazywał na LCD bezpośrednio to co odczyta z DSa. Pokazuje ciągle 255.
    Zapomniałem dodać, że czas w pętli odczytu temp wynosi 800ms (chyba spokojnie wystarczy)
  • #21
    crazy_phisic
    VIP Meritorious for electroda.pl
    Pytanie jakie masz ustawienia zegara systemowaego .... jak możesz zamieśc kod bo trudno strzelać w ciemno..
  • #22
    pawel129
    Level 16  
    $Device= m8 ' użyty ATmega8
    $Stack = 32 '
    $Clock = 8 'zegar 8MHz
    $GLCD HD61202, Data=PORTD, Ctrl=PORTB, 128, 64, 3 'konfiguracja
    $Gctrl CS1=2, CS2=3, DI=0, WR=4, EN=1 'LCD
    $1Wire = PORTC.1
    $Source= On


    Dim cyfry1 As Flash Byte

    Dim T As Word
    Dim B1 As Byte , B2 As Byte
    Dim Znak As String * 1

    GLcdInit
    GCls
    Do

    1Wreset
    1Wwrite &HCC
    1Wwrite &H44
    WaitMs 800
    1Wreset
    1Wwrite &HCC
    1Wwrite &HBE
    b1=1Wread
    b2=1Wread
    If b2 > 250 Then
    Znak = "-"
    'b1=255-b1
    'b2=255-b2
    Else
    Znak = "+"
    End If
    t=(b1+(b2*256))/16
    FontSet cyfry1
    GLcd(40, 4), t

    WaitMs 200
    Loop
  • #23
    crazy_phisic
    VIP Meritorious for electroda.pl
    Sprzedawane procsory M8 są ustawione na wewnętrzy sygnał zegarowy o częstotliwości 1MHz (pdf strona 24) więc jeśli nie zmieniałeś niczego w fuse bitach to może to być żródło problemów z obsługą 1Wire. Albo zmienisz $Clock = 8 na 1 albo przestawisz bity kontrolne (!!!)
  • #24
    pawel129
    Level 16  
    hm..zmieniłem zegar 8 na 1 w programie (właśnie coś mi sie wydawało że 500ms trwa znacznei dłużej niż faktycznie być powinno.Teraz jest dobrze) ale bez efektu w odczycie temp...nadal to samo.A w bitach kontrolnych co trzeba przestawić?

    Dodano po 1 [godziny] 24 [minuty]:

    dobra, zmieniłem we fusebits na external XTAL i 8MHz .Cośtam działa. Ale wskazuje mi 41st, a w otoczeniu jest ze 24...
  • #25
    crazy_phisic
    VIP Meritorious for electroda.pl
    Jeśli zmienia się temperatura jak ogrzewasz czujnik to znaczy że problem tylko z przeliczaniem ewentualnie z faktem że pracujesz na innej rozdzielczości niz przypuszczasz... w tym temacie jest kilka sprawdzonych programów ... Przetestuj je
  • #26
    pawel129
    Level 16  
    problem się rozwiązał - odłaczyłem +5V od Vdd czujnika. Zostawiłem ten pin wolny.Teraz działa aby podłączony na GND i dane do procka.No i zmieniłem 4,7k na 3,3k między 5V a portem danych,ale to bez różnicy.

    No i układzik działa.Dzięki za zainteresowanie.