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

[atmega8][Bascom]Ustawienie czestotliwosci na 1 wire ds18b20

semper fidelis 08 Nov 2010 11:04 4386 13
  • #1
    semper fidelis
    Level 13  
    Witam.

    Chciałbym zrealizować coś na bazie tego https://www.elektroda.pl/rtvforum/topic1770011-0.html kolegi łuki_mar44 lecz mam pewien problem, od razu mowie ze nie chce tego ominąć bo mogę zmienić tą częstotliwość i działa chce wiedzieć jak to działa więc do rzeczy:


    Pierwszy raz w życiu zabieram się za programowanie jakiekolwiek więc proszę o wyrozumiałość...

    Chciałbym zbudować układ na bazie ww kolegi pomiar czasu daty i temp na ds18b20, czas i datę chciałbym odczytywać dzięki wewn. RC atmegi czyli rozumiem że do tego dołączam kryształ 32k Hz do nóżek tosc1 i tosc2 jak kolega to jakoś działało.
    Problem mam natomiast z 1820 (nie zapominajmy ze jest to symulacja w programie o nazwie Proteus nie gotowy układ) więc jeżeli ustawione mam w programie $crystal na 8Mhz i w procesorze ustawiam parametr CKSEL fuses na Int.RC 8 MHz to termometr wysyła mi śmieci jeżeli zmienię w programie $crystal na 11005900 to wysyła mi to co powinien albo jak zmieniam na 1Mhz i w programie ten parametr na Int. RC 1Mhz.

    Mógłby mi ktoś wytłumaczyć, gdzie jest błąd z tym 8Mhz kolega w programie ma taka właśnie częstotliwość?
    Jak się ma częstotliwość kwarcu zegarkowego do tego co piszemy w programie pod $crystal albo pod ustawieniami atmegi na jakiej częstotliwości ona pracuje?

    Rozumiem że kwarc zegarkowy jest do timera2 który będzie odpowiedzialny za mój czas i datę a ja mogę pracować na częstotliwości 8Mhz ale tego np nie łapie u mnie w symulacji ten termometr...


    P.S Wybaczcie jeżeli napisałem to trochę chaotycznie.
    P.S 2. Przeniosłem post do nowego tematu stary usunąłem.
  • #2
    hotdog
    Level 26  
    Z tego co napisałeś jak masz właczony rezonator wewnętrzny na 8MHz, i jak masz zadeklarowane te 8M w crystal to masz śmieci? A jak natomiast ustawisz crystal na 11005900 (czemu taka wartość, nie masz na myśli 11095200) to działa Tobie wszystko OK?

    To bardzo dziwne, bo wtedy procesor raczej nie będzie odczekiwał poprawnych czasów. Będzie wtedy ten czas zawsze dłuższy o około x1,37 (czyli jak zrobisz wait 1ms, będziesz czekał 1,37ms). Timingi na 1wire nie są aż tak krytyczne i nie wiem czy są jakoś konfigurowalne w bascomie.

    Oczywiście kwarc zegarkowy po poprawnym skonfigurowaniu będzie tylko źródłem sygnału zegarowego dla timera2, i nic tutaj nie ma do rzeczy.

    Pozdrawiam
  • #3
    semper fidelis
    Level 13  
    Tak dokładnie, jeżeli ustawie crystal na 8M i w procesorze wewnętrzny na 8M to wyrzuca mi śmieci, a jak dam 11095200 ( to miałem na myśli mój błąd ), a w atmedze jest wewn. 8M (więcej sie nie da) to działa dobrze tak samo jak crystal dam na 1M w atemedze 1M też jest dobrze.

    Inna sprawa jest taka, że nie wiedzieć czemu symulacja nie idzie mi w czasie rzeczywistym ale to nie ma chyba nic do rzeczy...

    Mogę wrzucić schemat mój z Proteusa oraz plik .bas, ale mówię że to nie ma żadnej filozofii bo wyrzuciłem wszystko i zostawiłem tylko ten termometr na 1wire i lcd podpięty do sprawdzenia co się wysyła.

    I jeszcze jedna kwestia, jeżeli podglądnę sobie co jest w scrach padzie tego termometra to są dobre dane, a odczytuje się coś dziwnego.

    //Edit:
    Zamieszczam pliki do Proteusa ver 7.6 oraz Bascoma, a także screeny z programu ustawień oraz wyświetlania. Zaznaczyłem na jednym co mi wyświetla z pamięci procesora a co powinno ze scrach pada termometru.

    [atmega8][Bascom]Ustawienie czestotliwosci na 1 wire ds18b20 [atmega8][Bascom]Ustawienie czestotliwosci na 1 wire ds18b20
  • #4
    łuki_mar44
    Level 18  
    Witam!

    Nigdy nie używałem tego programu symulacyjnego, zawsze wolę wszystko testować w realu. Ale do rzeczy najpierw proponował bym zwiększyć czas do 750mS po starcie pomiaru temp zaznaczone na obrazku. Oraz wyrzucić te zbędne opóźnienie 250mS.

    [atmega8][Bascom]Ustawienie czestotliwosci na 1 wire ds18b20

    pozdrawiam
  • #5
    semper fidelis
    Level 13  
    Fragment kodu załączony na obrazku to nie mój :D chyba koledze się pomyliły. Tam mam dokładnie 750ms bo tyle wymaga termometr to tam tyle dałem.
    Najdziwniejsze jest to, że na innych czestotliwościach działa dobrze wysyła co powinien, a tylko na 8Mhz szaleje. Nie mogę dać zewn kryształu bo będę tam miał zegarkowy. Pech chciał, że się uparłem na ten termometr i na tą czestotliwość i mu nie odpuszcze.

    Wiem, symulacja a rzeczywistość 2 różne rzeczy, ale nigdy się w te klocki nie bawiłem i chciałbym wiedzieć co będę robił i widzieć, że jest dobrze napisany program.

    Jak ktoś ma sugestie to niech pisze jak mi się uda to dam znać.

    P.S I jeszcze pytanie koledze działa bez problemu ten termometr na 8Mhz na 1 wire i nie było z nim problemów?
  • #6
    łuki_mar44
    Level 18  
    Rzeczywiście to nie kod kolegi mam za bardzo zaśmiecony pulpit i za dużo tych różnych basów więc sorki za pomyłkę. Wewnętrzny kwarc na 8Mhz i musi hulać nie ma innej opcji.
    Dzisiaj nie mam możliwości sprawdzenia lecz jutro postaram się wrzucić kolegi program do mojej atmegii i sprawdzę czy wszystko gra.

    semper fidelis wrote:


    Wiem, symulacja a rzeczywistość 2 różne rzeczy, ale nigdy się w te klocki nie bawiłem i chciałbym wiedzieć co będę robił i widzieć, że jest dobrze napisany program.


    Dlatego wystarczy zbudować jakiś prostą płytkę testową i sprawdzać na bieżąco postępy w pracy:D

    Jednak nie dam rady tego sprawdzić gdyż nie mam DSa.Wszystkie zapasy wykorzystane. Niech kolega skopiuje mój fragment obsługi czujnika i zobaczy co się będzie działo, jeśli nie będzie działać znaczy że coś jest nie tak z tą symulacją i że nie ma się co przejmować bo w układzie na pewno będzie musiało działać.

    pozdrawiam
  • #7
    semper fidelis
    Level 13  
    Próbowałem chyba 5 różnych możliwości obsługi czujnika jednak żaden nie działał przy 8Mhz poprawnie. Próbuje teraz na 4M, ale też kiepsko.
    Choć zastanawiam się czy przy takim programie 6 wyświetlaczach i multipleksowaniu ich, plus odczytywanie czasu i daty i obsłudze czujnika to nie będzie za mała częstotliwość?
  • #8
    xury
    Automation specialist
    Nie rozumiem czemu uparłeś się na ten kwarc zegarkowy ? Przecież zegar równie dobrze można zrealizować dzięki np. Timer1 taktowany rezonatorem kwarcowym 8Mhz. A drugi timer wykorzystać do multipleksowania wyświetlaczy. Z kolei na czas odczytu z DS'ów trzeba wyłączać przerwania, bo czasy 1 wire są ściśle określone.
  • #9
    semper fidelis
    Level 13  
    Czas odczytu DS jest określony na 750ms, przecież nie mogę wyłączyć przerwań na taki czas...

    Chodzi Ci o to, że będę sobie sam sekundę odliczał timer1, a potem zwiększał jakąś zmienną która będzie odp za moje sekundy i tak dalej? Trochę zabawy zwłaszcza że każdy mies ma inna liczbę dni itp. Chyba, że coś nie zrozumiałem do końca.

    Edit: Sprawdzałem teraz nawet z zewn. kwarcem mi nie działa poprawnie. Dopiero od 2Mhz w dół jest poprawnie. Nie wiem co z tym jest, ale jak dojdę do tego w czym tkwi błąd dam znać.
  • #10
    xury
    Automation specialist
    Mi nie chodziło o wyłączanie przerwań na czas konwersji tylko na czas wysyłania komend 1 wire.
    Zresztą zobacz na mój kod.
    '$sim
    $regfile = "m168def.dat"
    $crystal = 8000000
    $hwstack = 64
    $swstack = 16
    $framesize = 32
    Tccr1a = &H00                                               'ustawienie timera1 w tryb ctc
    Tccr1b = &H0C
    Ocr1ah = &H7A                                               'liczba do porównania .
    Ocr1al = &H12
    Config Pind.7 = Output                                      'przekaźnik
    Config 1wire = Portb.0
    Config Rc5 = Pind.2
    Config Lcd = 16 * 1a
    Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portb.5 , Rs = Portc.5
    Const Zero = 0
    
    Dim Sekunda As Byte
    Dim Minuta As Byte
    Dim Godzina As Byte
    Dim I As Byte
    Dim Dsilosc As Integer
    Dim Tempw As Integer
    Dim Address As Byte
    Dim Command As Byte
    Dim Tekst1 As String * 10
    Dim Tekst2 As String * 10
    Dim Dsadres1(8) As Byte
    Dim Dsadres2(8) As Byte
    Dim Lsb As Byte
    Dim Msb As Byte
    Dim Rc5flag As Bit
    Dim Capture As Bit
    Dim Odd As Bit
    Dim Show As Bit
    Dim Wyswietlanie As Byte
    
    On Int0 Rc5get
    On Compare1a Odmierz_1s
    Enable Compare1a
    Tcnt1h = &H00                                               'zerowanie timera1
    Tcnt1l = &H00
    Enable Int0
    Enable Interrupts
    Cursor Off Noblink
    
    '-----------------------Inicjalizacja czujnikow---------------------------------
    'Dsilosc = 1wirecount()
    'If Dsilosc = 2 Then
    '   Lcd "Czujniki obecne"
    ' Else
    '   Lcd "Brak czujnika"
    'End If
    Dsadres1(1) = 1wsearchfirst()
    1wverify Dsadres1(1)
    'If Err = 1 Then
    '   Lcd "Brak czujnika"
    '   Err = 0
    'End If
    
    
    'For I = 1 To 8
    'Lcd Hex(dsadres1(i))
    'Next
    Dsadres2(1) = 1wsearchnext()
    1wverify Dsadres2(1)
    'If Err = 1 Then
    '   Lcd "Brak czujnika"
    '   Err = 0
    'End If
    'Deflcdchar 0 , 2 , 5 , 5 , 2 , 32 , 32 , 32 , 32            ' replace ? with number (0-7)
    
    '----------------------Pętla główna---------------------------------------------
    Do
    If Odd = 0 And Capture = 0 Then
          Disable Int0
          1wreset
          1wwrite &HCC                                          'skip ROM
          1wwrite &H44
          Capture = 1
          Enable Int0
    End If                                                      'start konwersji
    If Odd = 1 And Capture = 1 Then                             'sprawdzanie flagi
          Disable Int0
          1wreset
          1wwrite &H55
          1wwrite Dsadres1(1) , 8
          1wwrite &HBE
          Tempw = 1wread(2)
          Tempw = Tempw * 10
          Tempw = Tempw / 16
          Tekst1 = Str(tempw)
          Tekst1 = Format(tekst1 , "+0.0")
    
          1wreset
          1wwrite &H55
          1wwrite Dsadres2(1) , 8
          1wwrite &HBE
          Tempw = 1wread(2)
          Tempw = Tempw * 10
          Tempw = Tempw / 16
          Tekst2 = Str(tempw)
          Tekst2 = Format(tekst2 , "+0.0")
          1wreset
          Capture = 0
          Enable Int0
    End If
    
    
    
    If Rc5flag = 1 Then
          Getrc5(address , Command)
    If Address = 5 Then
          Command = Command And &B01111111
    End If
       Select Case Command
          Case 32 : Incr Godzina
          Case 33 : Decr Godzina
          Case 16 : Incr Minuta
          Case 17 : Decr Minuta
          Case 12 : Toggle Portd.7
          Case 13 : Sekunda = 0
          Case 1 : Incr Wyswietlanie
    
    
       End Select
     Reset Rc5flag
     Command = 0
    End If
    '    Tgodzina = Str(godzina)
    '    Tminuta = Str(minuta)
    '    Tsekunda = Str(sekunda)
    '    Tgodzina = Format(tgodzina , "00")
    '    Tminuta = Format(tminuta , "00")
    '    Tsekunda = Format(tsekunda , "00")
    
    If Wyswietlanie = 0 Then
      If Odd = 0 And Show = 0 Then
             Cls
             Lcd "W " ; Tekst1 ; " " ; "Z " ; Tekst2
             Set Show
      End If
      If Odd = 1 And Show = 1 Then
             Reset Show
             Cls
    
             If Godzina > 9 And Minuta > 9 Then
    
                    Lcd Spc(6) ; Godzina ; ":" ; Minuta
             End If
             If Godzina > 9 And Minuta < 10 Then
    
                    Lcd Spc(6) ; Godzina ; ":" ; Zero ; Minuta
             End If
             If Godzina < 10 And Minuta > 9 Then
                    Lcd Spc(6) ; Zero ; Godzina ; ":" ; Minuta
             End If
             If Godzina < 10 And Minuta < 10 Then
                    Lcd Spc(6) ; Zero ; Godzina ; ":" ; Zero ; Minuta
             End If
    
      End If
    
    End If
    If Wyswietlanie = 1 Then
    
        If Odd = 0 And Show = 0 Then
             Set Show
             Cls
             Lcd "W " ; Tekst1 ; " " ; "Z " ; Tekst2
        End If
        If Odd = 1 And Show = 1 Then
             Reset Show
             Locate 1 , 1
             Lcd "W " ; Tekst1 ; "-" ; "Z " ; Tekst2
    
    
        End If
    End If
    
    If Wyswietlanie = 2 Then
       If Odd = 0 And Show = 0 Then
          Set Show
             Cls
    
             If Godzina > 9 And Minuta > 9 Then
    
                    Lcd Spc(6) ; Godzina ; ":" ; Minuta
             End If
             If Godzina > 9 And Minuta < 10 Then
    
                    Lcd Spc(6) ; Godzina ; ":" ; Zero ; Minuta
             End If
             If Godzina < 10 And Minuta > 9 Then
                    Lcd Spc(6) ; Zero ; Godzina ; ":" ; Minuta
             End If
             If Godzina < 10 And Minuta < 10 Then
                    Lcd Spc(6) ; Zero ; Godzina ; ":" ; Zero ; Minuta
             End If
    
       End If
    
       If Odd = 1 And Show = 1 Then
            Reset Show
            Cls
            If Godzina > 9 And Minuta > 9 Then
    
                    Lcd Spc(6) ; Godzina ; " " ; Minuta
            End If
            If Godzina > 9 And Minuta < 10 Then
    
                    Lcd Spc(6) ; Godzina ; " " ; Zero ; Minuta
            End If
            If Godzina < 10 And Minuta > 9 Then
                    Lcd Spc(6) ; Zero ; Godzina ; " " ; Minuta
            End If
            If Godzina < 10 And Minuta < 10 Then
                    Lcd Spc(6) ; Zero ; Godzina ; " " ; Zero ; Minuta
            End If
    
       End If
    End If
    Enable Int0
    If Wyswietlanie > 2 Then
          Wyswietlanie = 0
    End If
    
    Loop
    End
    '---------------------------Koniec pętli ---------------------------------------
    
    '------------------------Odmierzanie czasu CTC----------------------------------
    Odmierz_1s:
    
    Incr Sekunda
    Toggle Odd
    If Sekunda > 59 Then
          Sekunda = 0
          Incr Minuta
    
    End If
    
    If Minuta > 59 Then
          Minuta = 0
          Incr Godzina
    
    End If
    
    If Godzina > 23 Then
          Godzina = 0
    End If
    Return
    '-----------------------Odbiór RC5----------------------------------------------
    Rc5get:
    Disable Int0
    Enable Interrupts
    Set Rc5flag
    Return
  • #11
    semper fidelis
    Level 13  
    Rozumiem, musiałbym rozdzielić konwersje i odczyt i robić to np po sekundzie bez waita.
    A zegar wiem, że mogę zrobić odliczając sekundę, ale kalendarz już gorzej.

    Dowiedziałem się jak rozwiązać problem z symulacją, trzeba $crystal ustawić na np 11Mhz, a w procku 8M wewnętrzny i teraz działa...
  • #12
    xury
    Automation specialist
    Głównie chodziło mi o sposób wysyłania poleceń 1 wire:

    Disable Int0             'wyłączenie przeszkadzającego przerwania
          1wreset 
          1wwrite &HCC                                          
          1wwrite &H44 
          Capture = 1 
          Enable Int0               'załączenie przerwania po wszystkim
    


    Jeśli nie wiesz, które przerwanie może powodować u Ciebie problemy z 1 wire to możesz wyłączyć globalną obsługę przerwań.
    Czas po rozkazie odczytu temperatury nie musi być dokładnie 750ms. Jest to minimalny czas, po którym można odczytać prawidłową temperaturę z czujnika.
    Przy programie takim jak mój nie jest to istotne tak bardzo i mogę robić odczyt co 2 sekundy, a nawet i rzadziej.
    Najważniejsze jest by sekwencja tych trzech poleceń 1 wire nie była przerywana przez przerwania, które by opóźniały ściśle określone czasy magistrali 1 wire.
  • #13
    semper fidelis
    Level 13  
    Z tego co się dowiedzieć mi udało problem polegał na samym fakcie ustalenia $crystal na 8MHz i Int 8MHz i to wina bascoma lub programu symulującego.
    Problem można było rozwiązać wpisując np na $crystal 11Mhz a w procku zostawić 8Mhz, wtedy działa.
  • #14
    arktik1
    Level 27  
    W ISIS DS18B20 nie będzie działał ci szybciej niż chyba 2MHz.
    Jest to ograniczenie symulatora, poczytaj sobie w HELPIE ISISa.
    Też walczyłem z tym jakiś czas, potem się wyjaśniło.
    Przecież to tylko symulator, chociaż i tak chyba najlepszy.
    Ustaw w ISIS procek i program na 2 MHz i będzie śmigało, potem przy wgraniu do rzeczywistego Uc zwiększysz.
    Jeśli inaczej ustawisz częstotliwość programu i Uc to popsuje się odmierzanie czasu i program może nie działać prawidłowo.