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

[Atmega8]pomoc w zaprogramowaniu

batkm 15 Gru 2009 20:28 1844 1
REKLAMA
  • #1 7393964
    batkm
    Poziom 11  
    Witam,potrzebuję pomocy w dokończeniu programu (jeśli istnieje możliwość) schemat znalazłem na elektrodzie [Atmega8]pomoc w zaprogramowaniu ,kod też który przerobiłem pod siebie (docelowo ma być to zamontowane w motocyklu) ma za zadanie dokonywać pomiary temp układu chłodzenia i oleju oraz pomiaru napięcia akumulatora i tu mam problem jak to zrobić żeby w pozycji nr 3 wyświetlało mi napięcie i do jakiego portu atmegi podać sygnał (napięcie) czyli jednym słowem pewna pomiary temp. i pomiar ładowania aku.W zamian oferuję 15 pkt.
    program pisany w bascomie
    $regfile = "m8def.DAT"
    $crystal = 1000000
    
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
    
    Config Lcd = 16 * 2
    Config 1wire = Portd.5
    
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    
    
    Dim I1(9) As Byte
    Dim I2(9) As Byte
    
    Dim I As Byte , Tmp As Byte
    Dim Crc As Byte
    Dim T As Integer , T1 As Integer
    Dim X As Integer
    Dim Ia As String * 4
    Dim Ib As String * 4
    
    Dim W As Byte
    
    Deflcdchar 1 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32
    Deflcdchar 2 , 31 , 27 , 19 , 27 , 27 , 17 , 31 , 32
    Deflcdchar 3 , 31 , 17 , 29 , 17 , 23 , 17 , 31 , 32
    Deflcdchar 4 , 31 , 17 , 29 , 17 , 29 , 17 , 31 , 32
    Deflcdchar 5 , 31 , 21 , 21 , 17 , 29 , 29 , 31 , 32
    Deflcdchar 6 , 32 , 32 , 32 , 14 , 32 , 32 , 32 , 32        ' replace ? with number (0-7)
    
    
    
    
    X = 0
    Cursor Off
    Cls
    Lcd "  YAMAHA FAZER " ;
    Lowerline
    Lcd "    FZS 600   "
    Wait 3
    Cls
    
    W = 1wirecount()
    Lcd "liczba czujnikow"
    Lowerline
    Lcd "temperatury: "
    Waitms 500
    Lcd W
    Wait 1
    Cls
    Dsid1(1) = 1wsearchfirst()
    Dsid2(1) = 1wsearchnext()
    
    
    Gosub Stupne
    
    Do
    If X < 120 Then
       1wreset
       1wwrite &H55
       1wverify Dsid1(1)
       1wwrite &HBE
       I1(1) = 1wread(9)
    
       1wreset
       1wwrite &H55
       1wverify Dsid2(1)
       1wwrite &HBE
       I2(1) = 1wread(9)
    
    
    
       1wreset
       1wwrite &HCC
       1wwrite &H44
    Waitms 300
    Waitms 300
    
    
    
    If I1(8) = Crc8(i1(1) , 7) Then
    Crc = 0
    End If
    If Crc = 0 Then
    Tmp = I1(1) And 1
    If Tmp = 1 Then Decr I1(1)
    T = Makeint(i1(1) , I1(2))
    T = T * 50 : T = T - 25 : T1 = I1(8) - I1(7) : T1 = T1 * 100
    T1 = T1 / I1(8) : T = T + T1 : T = T / 10
    End If
    If Crc = 1 Then
    Locate 1 , 1 : Lcd "-- "
    Else
    If Crc = 0 Then
    Locate 1 , 1
    Ia = Str(t)
    Lcd Left(ia , 2) : Lcd "."
    Lcd Mid(ia , 3 , 1)
    Else
    Locate 1 , 1 : Lcd "** "
    End If
    End If
    
    If I2(8) = Crc8(i2(1) , 7) Then
    Crc = 0
    End If
    If Crc = 0 Then
    Tmp = I2(1) And 1
    If Tmp = 1 Then Decr I2(1)
    T = Makeint(i2(1) , I2(2))
    T = T * 50 : T = T - 25 : T1 = I2(8) - I2(7) : T1 = T1 * 100
    T1 = T1 / I2(8) : T = T + T1 : T = T / 10
    End If
    If Err = 1 Then
    Locate 2 , 1 : Lcd "-- "
    Else
    If Crc = 0 Then
    Locate 2 , 1
    Ib = Str(t)
    Lcd Left(ib , 2) : Lcd "."
    Lcd Mid(ib , 3 , 1)
    Else
    Locate 2 , 1 : Lcd "** "
    End If
    End If
    
    
    X = X + 1
    
    Else
    Cls
    Gosub Wpis1
    Gosub Wpis2
    
    X = 0
    Cls
    Gosub Stupne
    End If
    Loop
    End
    
    Wpis1:
    Cls
    Lcd Chr(2) ; " TEMP. SILNIKA" ;
    Lowerline
    Lcd "     "
    Lcd Left(ia , 2) : Lcd "."
    Lcd Mid(ia , 3 , 1)
    Lcd Chr(1) ; "C"
    Wait 6
    Return
    
    Wpis2:
    Cls
    Lcd Chr(3) ; " TEMP. OLEJU" ;
    Lowerline
    Lcd "     "
    Lcd Left(ib , 2) : Lcd "."
    Lcd Mid(ib , 3 , 1)
    Lcd Chr(1) ; "C"
    Wait 6
    Return
    
    
    
    Stupne:
    Locate 1 , 5 : Lcd Chr(1) ; "C"
    Locate 1 , 15 : Lcd Chr(6) ; "V"
    Locate 2 , 5 : Lcd Chr(1) ; "C"
    
    
    Locate 1 , 8 : Lcd Chr(2)
    Locate 2 , 8 : Lcd Chr(3)
    Locate 1 , 9 : Lcd Chr(4)
    
    Return


    w schemacie są 4 czujniki w wykorzystanę są dwa


    lub z korzystać z tego kodu
    'Termometr 4 punktowy DS18b20 by Duch na podstawie materiałów znalezionych w sieci
    'Kontakt duszkowski@o2.pl
    
    
    $regfile = "m8def.DAT"                                      'deklaracja procesora, w tym wypadku Atmega8
    $crystal = 1000000                                          'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza)
    'Deklaracja portów od wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
    
    Config Lcd = 16 * 2                                         'ustawiamy typ wyświetlacza (soft jest dostosowany do pracy z wyświetlaczem 2x20, przy pracy z innym wyświetlaczem trzeba będzie skorygować wyświetlanie znaków)
    
    '*************************************WAŻNE**********************************************
    'Pamiętać o podłączeniu rezystora podciągającego o wartości 4.7kohm między linią DQ a VCC
    Config 1wire = Portd.5                                      'deklaracja portu na którym będą podpięte DS18b20
    
    Dim I1 As Integer , Ss As String * 6
    Dim I2 As Integer
    
    
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    
    Dim B As Byte                                               'deklaracja zmiennej do odczytu kodów ID
    Dim W As Byte                                               'deklaracja zmiennej do odczytu ilośc czujników
    
    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia Celsjusza
    
    Cursor Off                                                  'Wyłącza kursor
    Cls                                                         'Funkcja CLS czyści ekran
    Lcd "  YAMAHA FAZER " ;                                     'ekran startowy (pojawia się tylko podczas włączania urządzenia)
    Lowerline
    Lcd "    FZS 600   "
    Wait 3
    Cls
    W = 1wirecount()
    Lcd "liczba czujnikow"
    Lowerline
    Lcd "temperatury: "
    Waitms 500
    Lcd W
    Wait 1
    Cls                                                         'Znajdź pierwszy czujnik podpięty do portu
    Dsid1(1) = 1wsearchfirst()                                  'Znajdź kolejny czujnik podpięty do portu
    Dsid2(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu
    
    
    '*******************Odczyt numerów ID czujników temperatury*********************
    
    If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       'ta opcja pojawia się tylko przy włączaniu urządzenia
     Locate 1 , 1
     Lcd "    Silnik OK   "
     Wait 1
     Locate 1 , 1
     For B = 1 To 8
     Lcd Hex(dsid1(b))
     Next
    End If
    Wait 1
    
    If Dsid2(8) = Crc8(dsid2(1) , 7) Then
     Locate 2 , 1
     Lcd "     Olej OK   "
     Wait 1
     Locate 2 , 1
     For B = 1 To 8
     Lcd Hex(dsid2(b))
     Next
    End If
    Wait 1
    
    
    Cls
    
    '*******************koniec odczytu ID czujników temperatury*********************
    
    Do
       1wreset
       1wwrite &H55
       1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
       1wwrite &HBE
       I1 = 1wread(2)
    '---------------------------------
       1wreset
       1wwrite &H55
       1wverify Dsid2(1)                                        'wysylam adres drugiego czujnika
       1wwrite &HBE
       I2 = 1wread(2)
    '---------------------------------
    
    '--------konwersja temp dla wszystkich dsow
       1wreset
       1wwrite &HCC
       1wwrite &H44
    Wait 1
    
    '****Jeśli pracujesz z wyświetlaczem innym niż 2x20 to tutaj trzeba wprowadzić zmiany w LOCATE********
    
       I1 = I1 * 10
       I1 = I1 / 16
       'If I1 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")
       Locate 1 , 1                                             'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Lcd "Silnik " ; Ss ; Chr(0) ;
    
       I2 = I2 * 10
       I2 = I2 / 16
       'If I2 > 0 Then Cls
       Ss = Str(i2)
       Ss = Format(ss , " 0.0")
       Locate 2 , 1
       Lcd "Olej   " ; Ss ; Chr(0) ;
    
    
    Loop

    w tym przypadku może być użyte w pętli, czyli najpierw pokaże temp, silnika i oleju
    a za chwile ładowanie.
  • REKLAMA
REKLAMA