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.

[ATMEGA8][BASCOM]Serwo dziwnie skacze + DS18B20

killof007 20 Jun 2009 21:32 2145 2
  • #1
    killof007
    Level 10  
    Witam

    To moze zaczne od kodu:
    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2
    Cls
    Config Servos = 1 , Servo1 = Portc.5 , Reload = 10
    Config Portc.5 = Output
    Config Portd.0 = Input
    Set Portd.0
    Cursor Off

    Dim Serworuch As Byte
    Serworuch = 42
    Config 1wire = Portb.1
    Dim Adresy(16) As Byte
    Dim Temp As Byte
    Dim Temp_str As String * 6
    Dim Temp_str2 As String * 6
    Dim W As Byte
    Dim T As Integer
    Dim Wew(9) As Byte
    Dim Zew(9) As Byte
    Adresy(1) = 1wsearchfirst()
    Adresy(9) = 1wsearchnext()
    W = 1wirecount()



    Do
    Disable Interrupts
    1wreset
    1wwrite &H55                                                ' Będę wysyłał adres
    1wwrite Adresy(1) , 8                                       ' Wysyłam adres
    1wwrite &HBE                                                ' Komenda dla czujnika o wysłanym adresie
    Wew(1) = 1wread(9)
    1wreset
    1wwrite &H55
    1wwrite Adresy(9) , 8
    1wwrite &HBE
    Zew(1) = 1wread(9)
    1wreset
    1wwrite &HCC                                                ' Komenda skip ROM, czyli słuchajcie wszyscy
    1wwrite &H44                                                ' Komenda convert T

    Enable Interrupts
    Cls
    T = Makeint(wew(1) , Wew(2))
    T = T * 10
    T = T / 16
    Temp_str = Str(t)
    Temp_str = Format(temp_str , "0.0")
    Locate 1 , 1
    Lcd Temp_str
    Locate 1 , 9
    Lcd Serworuch
    Locate 1 , 13
    Lcd T

      If W = 1 Then
      Locate 2 , 1
        Lcd "Err "                                              'jeśli brak drugiego czujnika
      Elseif Err = 0 Then
    T = Makeint(zew(1) , Zew(2))
    T = T * 10
    T = T / 16
    Temp_str2 = Str(t)
    Temp_str2 = Format(temp_str2 , "0.0")
    Locate 2 , 1
    Lcd "Temp.zew." ; Temp_str2 ; "C  "                         
    End If
    Serworuch = T - 200
    Servo(1) = Serworuch
    Loop
    End


    Wiec problem jest taki że serwo raz na jakiś czas skacze w jedna strone o 10 stopni i nie wiem dlaczego? Ogolnie ze zmiana temperatury serwo zmienia pozycje w skokach innym słowem działa lecz nie wiem dlaczego te skoki sa nagłe i nieregularne. Gdy wyrzucam odczyt temp. i robie zmiane pozycji serwa na "przycisk" serwo zachowuje się lepiej ale dalej ma małe skoki praktycznie tylko je słychać na serwie.
    Poprzedzając pytania zasilanie z zasil. przez 7805 atm. pracuje na wewnętrznym kwarcu 8mhz.
    Za podopowiedzi i uwagi z góry dziękuje.


    P.S. Prosze o nie nadmierne krytykowanie kodu gdyż jestem poczatkujacym programista
    Pozdrawiam
  • #2
    onearton
    Level 11  
    Hi
    :D do sterowania serwem przez ATMEGA8 lepiej podłącz zewnętrzny kwarc i szybszy np. 12MHz
  • #3
    janbernat
    Level 38  
    zumek w lutym napisał żeby ustawić reload=6 i nie pytać dlaczego.

    Dodano po 4 [minuty]:

    A odczyt ds może trwać 700ms-może stąd lepiej.