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

Dziwne pomiary, 1-wire i timer

decompiled 03 Mar 2009 20:58 1476 19
REKLAMA
  • #1 6232242
    decompiled
    Poziom 10  
    Witam

    Mam dwa układy DS1820 podłączone do atmegi48. Obsługa transmisji przez 1wire jest wykonywana cyklicznie w timerze.
    Problem jest taki, że przy timerze przeskalowanym na 8 co kilka pomiarów pojawiają się dziwne wartości. Gdy przeskaluję timer powyżej 8 to pomiary zawsze dają wynik -1.
    Używam bascoma.

    Z góry dziękuję
  • REKLAMA
  • #2 6233352
    Konto nie istnieje
    Poziom 1  
  • #3 6233703
    decompiled
    Poziom 10  
    Oczywiście, że nie dałem.

    Oto cały kod:
    
      $crystal = 1000000
      $baud = 1200
      $regfile = "m48def.dat"
    
      Enable Interrupts
      Config 1wire = Portd.5
      Config Timer1 = Timer , Prescale = 8       'docelowo ma być 256
      On Timer1 Pomiar
      Enable Timer1
    
      Dim Adr(16) As Byte , X As Byte , T1 As Integer , T2 As Integer
      Dim Temp(2) As Integer
    
      X = 1 : Adr(x) = 1wsearchfirst()       
      X = 9 : Adr(x) = 1wsearchnext()    
    
    Do
    
    Loop : End
    
    Pomiar:
      X.3 = 0
      Gosub Zmierz
      T2 = T1
      X.3 = 1
      Gosub Zmierz
    
      Print T1 ; "    " ; T2 
    Return
    
    Zmierz:
      Enable Interrupts
      1wreset : 1wwrite &H55 : 1wwrite Adr(x) , 8 : 1wwrite &HBE
      T1 = 1wread(2)
      Shift T1 , Right , 1
      If T1.13 = 1 Then
        T1 = T1 Or &B1100000000000000
      End If
      1wreset : 1wwrite &H55 : 1wwrite Adr(x) , 8 : 1wwrite &H44
      Disable Interrupts
    Return
    
  • #4 6233780
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #5 6233802
    decompiled
    Poziom 10  
    Bez tych dwóch linijek pomiary zawsze dają wynik -1.
  • #6 6233811
    Konto nie istnieje
    Poziom 1  
  • #7 6233840
    decompiled
    Poziom 10  
    Prescale ustawiłem na 64(tyle najmniej się dało) ale dalej pomiary zwracają -1.
  • #8 6233885
    Konto nie istnieje
    Poziom 1  
  • #9 6234064
    decompiled
    Poziom 10  
    Dzięki ale ja nie mam pojęcia zmienić częstotliwość, spróbowałem wyłączyć fusa ckdiv8 i nie mogę się teraz połączyć z procesorem. Mam programator usbasp i avrdude.
  • #10 6234139
    Konto nie istnieje
    Poziom 1  
  • #11 6234183
    decompiled
    Poziom 10  
    Nie wiem dlaczego ale gdy dodałem w pętli głównej programu wait 1 to pomiary stały się poprawne przy prescale równym 64.
    A co do fusebitów to chyba przez pomyłkę wyłączyłem za dużo. W avrdude odczytałem high fuse na 0x01 i ustawiłem na 0x81 sprawdziłem potem konfigurację domyślną i zamiast cksel1 mam odznaczony cksel0. Mogę to jakiś naprawić jeśli procesor się nie zgłasza w programatorze??
  • REKLAMA
  • #12 6234192
    Konto nie istnieje
    Poziom 1  
  • #13 6235260
    decompiled
    Poziom 10  
    Konfiguracji nie sprawdziłem. Zapisałem sobie na wartość którą zmieniłem.
  • #14 6235358
    Konto nie istnieje
    Poziom 1  
  • #15 6235559
    decompiled
    Poziom 10  
    Wychodzi na to, że tak.
  • Pomocny post
    #16 6235707
    Konto nie istnieje
    Poziom 1  
  • #17 6236615
    decompiled
    Poziom 10  
    Dzięki. Podłączyłem rezonator kwarcowy 1,8Mhz i procesor zaczął pracować i komunikować się z programatorem, w avrdude przywróciłem domyślną wartość low fusa. Odnośnie tego high fusa to źle napisałem chodziło mi o low.

    Zastanawia mnie dlaczego jak dodałem w pętli głównej programu "wait 1" to pomiary stały się poprawne.
  • REKLAMA
  • #18 6237074
    Konto nie istnieje
    Poziom 1  
  • #19 6237212
    decompiled
    Poziom 10  
    Niestety nic to nie dało.

    Czy gdy w czasie wykonywania "wait 1" zostanie zgłoszone jakieś przerwanie to procesor przerwie czekanie i obsłuży to przerwanie??
  • #20 6237329
    Konto nie istnieje
    Poziom 1  
REKLAMA