Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Error 31 i error 93 bascom atmega8 lcd ds1820

08 Sie 2008 23:14 2579 8
  • Poziom 9  
    Witam.

    Mam taki problem ze po probie skompilowania programu przepisanego z ksiazki marcina wiazani. wyskakuja mi bledy ktore wskazuja na ostatnia linie kodu:

    Code:

    Error : 31    Line :   185   Invalid datatype [ 0]  , in File : C:\PROGRAM FILES\MCS ELECTRONICS\BASCOM-AVR\term.BAS
    Error : 93    Line :   185   Variable not dimensioned [ 0-> 8]  , in File : C:\PROGRAM FILES\MCS ELECTRONICS\BASCOM-AVR\term.BAS
    Error : 31    Line :   185   Invalid datatype [ 0]  , in File : C:\PROGRAM FILES\MCS ELECTRONICS\BASCOM-AVR\term.BAS
    Error : 93    Line :   185   Variable not dimensioned [ 0-> 8]  , in File : C:\PROGRAM FILES\MCS ELECTRONICS\BASCOM-AVR\term.BAS
    Error : 31    Line :   185   Invalid datatype [ 0]  , in File : C:\PROGRAM FILES\MCS ELECTRONICS\BASCOM-AVR\term.BAS
    Error : 93    Line :   185   Variable not dimensioned [ 0-> 8]  , in File : C:\PROGRAM FILES\MCS ELECTRONICS\BASCOM-AVR\term.BAS


    a oto caly program. wydaje mi sie ze przepisalem go bezblednie

    Code:
    $regfile = M8def.dat
    
    $crystal = 8000000

    Config Pinb.1 = Input
    Config Lcd = 16 * 2

    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5

    Config 1wire = Portb.0

    Declare Sub Odcz_temp(czujnik As Byte)

    Declare Sub Zapisz_id

    Dim Temperatura(2) As Byte

    Dim Id(8) As Byte

    Dim I As Byte
    Dim J As Byte
    Dim K As Byte
    Dim Liczba_ukl As Byte

    S1 Alias Pinb.1

    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32

    Set Portb.1

    Cls

    Liczba_ukl = 1wirecount()

    If S1 = 0 Then

          Lcd "Liczba ukladow: " ; Liczba_ukl

          If Liczba_ukl > 0 Then

             Id(1) = 1wsearchfirst()

             For I = 1 To 8

                Writeeeprom Id(i) , I

                Next I

          End If

          If Liczba_ukl > 1 Then

             Id(1) = 1wsearchnext()

             J = 0

             For I = 9 To 16

                Incr J

                Writeeeprom Id(j) , I

             Next I

          End If

          Lowerline

          Lcd "Prog ok"

          Do

          Loop

       End If

       Do

          Home

          For K = 1 To Liczba_ukl

          Call Odcz_temp(k)

          If Temperatura(2) = 0 Then

             Lcd "Temp" ; K ; ":" ; Temperatura(1) ; Chr(0) ; "C"

             Else

             Lcd "Temp" ; K ; ": -" ; Temperatura(1) ; Chr(0) ; "C"

          End If

          Lowerline

          Next K

          Loop

          End



       Sub Odcz_temp(czujnik As Byte)

          If Czujnik = 1 Then

             For I = 1 To 8

                Readeeprom Id(i) , I

                Next I

          End If

          If Czujnik = 2 Then

          J = 0

             For I = 9 To 16

                Incr J

                Readeeprom Id(j) , I

              Next I

         End If


           1wreset

           Call Zapisz_id

           1wwrite &H44

           Waitms 750


           1wreset

           Call Zapisz_id

           1wwrite &HBE

           Temperatura(1) = 1wread(2)

           1wreset

             If Err = 1 Then

                Cls

                Lcd "Brak ukladu"

                Do

                Loop

             End If


          If Temperatura(2) > 0 Then

             Temperatura(1) = 256 - Temperatura(1)

          End If

          Temperatura(1) = Temperatura(1) / 2


    End Sub


         Sub Zapisz_id

       1wwrite &H55

       For I = 1 To 8

          1wwrite Id(i)

       Next I

       End Sub



    Prosze o pomoc i z góry dziekuje.
  • Poziom 24  
    Przepisujesz z ksiazki? :cunning: Popatrz dobrze czy np. jest tam cos takiego:
    Code:
    $regfile = M8def.dat


    Tutaj masz poprawny kod:
    Code:
    'Program  sterowania dwoma układami DS1820 dołączonymi
    
    'do tej samej magistrali 1-Wire

    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
          'dyrektyw mikrokontrolera
    $crystal = 8000000                                          'informuje kompilator
          'o częstotliwości oscylatora
          'taktującego mikrokontroler
    Config Pinb.1 = Input                                       'linia PB1 jako wejściowa
    Config Lcd = 16 * 2                                         'konfigurowanie typu
          'wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5       'konfigurowanie linii
          'mikrokontrolera, do których
          'jest dołączony wyświetlacz LCD
    Config 1wire = Portb.0                                      'konfigurowanie linii magistrali
          '1-Wire
    Declare Sub Odcz_temp(czujnik As Byte)                      'procedura odczytu temperatury
          'z układu DS1820 z parametrem,
          'który wskazuje numer czujnika
          'temperatury
    Declare Sub Zapisz_id                                       'procedura zapisu numeru ID do
          'układu DS1820
    Dim Temperatura(2) As Byte                                  'tablica dwóch zmiennych typu
          'Byte na zmierzoną temperaturę
    Dim Id(8) As Byte                                           '8-elementowa tablica na numer
          'ID
    Dim I As Byte                                               'zmienna licznikowa
    Dim J As Byte                                               'zmienna licznikowa
    Dim K As Byte                                               'zmienna licznikowa
    Dim Liczba_ukl As Byte                                      'zmienna, do której wpisywana
          'jest liczba układów dołączonych
          'do magistrali 1-Wire
    S1 Alias Pinb.1                                             'przypisanie nazwie Pinb.1
          'nazwy S1

          'definicja znaku stopnia
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32

    Set Portb.1                                                 'dołączenie do linii PB1
          'rezystora podciągającego
    Cls                                                         'czyszczenie LCD
    Liczba_ukl = 1wirecount()                                   'odczytanie liczby układów
          'dołączonych do magistrali
          '1-Wire
    If S1 = 0 Then                                              'jeśli przycisk S1 naciśniety,
          'to
     Lcd "Liczba ukladow: " ; Liczba_ukl
          'wyświetlenie na LCD liczby
          'układów dołączonych do
          'magistrali
     If Liczba_ukl > 0 Then                                     'jeśli liczba układów większa od
          '0‚ to
      Id(1) = 1wsearchfirst()                                   'odczytanie numeru seryjnego
          'pierwszego dołączonego do
          'magistrali układu
      For I = 1 To 8                                            'pętla wykonywana 8 razy
       Writeeeprom Id(i) , I                                    'zapisanie odczytanego ID do
          'pamięci EEPROM w słowach 1...8
      Next I                                                    'zwiększenie wartości I o jeden
     End If
     If Liczba_ukl > 1 Then                                     'jeśli liczba układów jest
          'większa od 1, to
      Id(1) = 1wsearchnext()                                    'odczytanie numeru seryjnego
          'kolejnego układu (drugiego
          'DS1820)
      J = 0                                                     'wartość początkowa zmiennej
          'J = 0
      For I = 9 To 16                                           'pętla wykonywana 8 razy od
          'I = 9 do I = 16
       Incr J                                                   'zwiększenie wartości J o jeden
       Writeeeprom Id(j) , I                                    'zapisanie numeru ID drugiego
          'układu do pamięci EEPROM
          'w słowach 9...16
      Next I                                                    'zwiększenie o jeden wartości I
     End If
     Lowerline                                                  'kursor do drugiej linii LCD
     Lcd "Prog ok"                                              'wyświetlenie komunikatu
          'o zakończeniu odczytu numerów
          'ID
     Do                                                         'pętla nieskończona Do...Loop
     Loop
    End If

    Do                                                          'początek pętli programu
          'głównego
     Home                                                       'kursor na początek pierwszej
          'linii
     For K = 1 To Liczba_ukl                                    'pętla wykonywana od K = 1 do
          'liczby układów dołączonych do
          '1-Wire
      Call Odcz_temp(k)                                         'wywołanie procedury pomiaru
          'temperatury z parametrem K
      If Temperatura(2) = 0 Then                                'jeśli wartość Temperatura(2)
          '= 0 to temperatura dodatnia
          'wyświetlenie temperatury
          'dodatniej
       Lcd "Temp" ; K ; ": " ; Temperatura(1) ; Chr(0) ; "C"
      Else                                                      'w przeciwnym razie wyświetlenie
          'temperatury ujemnej
       Lcd "Temp" ; K ; ": -" ; Temperatura(1) ; Chr(0) ; "C"
      End If
      Lowerline                                                 'kursor w drugiej linii LCD
     Next K                                                     'zwiększenie o 1 wartości K
    Loop                                                        'koniec pętli Do...Loop
    End                                                         'koniec programu

    Sub Odcz_temp(czujnik As Byte)                              'procedura pomiaru temperatury
          '- parametr Czujnik określa
          'numer czujnika
     If Czujnik = 1 Then                                        'jeśli Czujnik = 1 to
          'odczytywany jest z pamięci
          'EEPROM numer ID czujnika 1
      For I = 1 To 8                                            'pętla wykonywana od I = 1 do
          'I = 8
       Readeeprom Id(i) , I                                     'odczyt ID z pamięci EEPROM
          'czujnika pierwszego
      Next I                                                    'zwiększenie o 1 wartości I
     End If
     If Czujnik = 2 Then                                        'jeśli Czujnik = 2 to
          'odczytywany jest z pamięci
          'EEPROM numer ID czujnika 2
      J = 0                                                     'wartość początkowa zmiennej
          'J = 0
      For I = 9 To 16                                           'pętla wykonywana 8 razy od
          'I = 9 do I = 16
       Incr J                                                   'zwiększenie wartości J o jeden
       Readeeprom Id(j) , I                                     'odczyt numeru ID z pamięci
          'EEPROM z słów 9...16 dla
          'czujnika 2
      Next I                                                    'zwiększenie o 1 wartości I
     End If

     1wreset                                                    'reset magistrali 1-Wire
     Call Zapisz_id                                             'wybranie czujnika poprzez zapis
          'do niego numeru ID aktualnie
          'obsługiwanego układu DS1820
     1wwrite &H44                                               'start pomiaru przez układ
          'DS1820
     Waitms 750                                                 'opóźnienie na czas pomiaru
     1wreset                                                    'reset magistrali 1-Wire
     Call Zapisz_id                                             'wybranie czujnika poprzez zapis
          'do niego numeru ID aktualnie
          'obsługiwanego układu DS1820
     1wwrite &HBE                                               'komenda odczytu układu DS1820
          'zmierzonej temperatury
     Temperatura(1) = 1wread(2)                                 'odczyt zmierzonej temperatury
          'do tablicy Temperatura
     1wreset                                                    'reset magistrali 1-Wire
     If Err = 1 Then                                            'jeśli brak układu DS1820
          'dołączonego do 1-Wire, to
      Cls                                                       'czyszczenie LCD
      Lcd "Brak ukladu"                                         'wyświetlenie komunikatu o braku
          'układu
      Do                                                        'nieskończona pętla Do...Loop
          'w celu wstrzymania działania
          'programu
      Loop
     End If
     If Temperatura(2) > 0 Then                                 'jeśli zmienna Temperatura(2)
          '> 0, to temperatura ujemna
          'przeliczenie temperatury
          'ujemnej
      Temperatura(1) = 256 - Temperatura(1)
     End If                                                     'koniec warunku
     Temperatura(1) = Temperatura(1) / 2
          'dalsze przeliczenie odczytanej
          'temperatury dodatniej jak
          'i ujemnej
    End Sub                                                     'koniec procedury pomiaru

    Sub Zapisz_id                                               'definicja procedury zapisu
          'numeru ID do układów DS1820
     1wwrite &H55                                               'wysłanie komendy zapisu numeru
          'ID do układów
     For I = 1 To 8                                             'pętla wykonywana od I = 1 do
          'I = 8
      1wwrite Id(i)                                             'wysłanie do czujników numeru ID
          'z tablicy Id
     Next I                                                     'zwiększenie o 1 wartości I
    End Sub                                                     'koniec procedury
  • Poziom 39  
    189183 napisał:
    ...wydaje mi sie ze przepisalem go bezblednie

    Tak , wydaje Ci się :P

    Code:

    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5

    W tej linii brakuje przecinka - znajdź w którym miejscu.

    Piotrek
  • Poziom 24  
    :arrow: 189183: Oczywiscie mozesz przepisywac kazdy listing z ksiazki ale gdybys jednak znudzil sie tym po 10 blednie przepisanym to poszukaj na google: Przyklady do ksiazki [Programowanie mikrokontrolerow AVR w BASCOM]. Pewnie bedzie szybciej i bardziej niezawodnie! :D
  • Poziom 9  
    Wielkie dzieki. Bledy zniknely.

    Zumek musze przyznac ze jestes mistrzem. tyle tematow czytalem i rzadko ktory odnosnie avrow nie jest spostowany przez ciebie.

    temat do zamkniecia
  • Poziom 24  
    Code:
    Zumek musze przyznac ze jestes mistrzem

    No a JA? :D Tez mialem swoj wklad w poprawe tych bledow ;)
  • Poziom 9  
    JmL(TM) napisał:
    Code:
    Zumek musze przyznac ze jestes mistrzem

    No a JA? :D Tez mialem swoj wklad w poprawe tych bledow ;)


    Ok. przyznaje ze pomogliscie.

    Ale mam drugie pytanko:

    chce wyeliminowac ten przycisk i zeby zawsze po wlaczeniu sprawdzal numer czujnika z numerem czujnika zapisanego wczesniej w pamieci eprom.

    tzn wlaczam do zasilania >procek sprawdza czy nr czujnika jest taki sam jak w pamieci eprom jezeli nie to zapisuje do eprom numer uzytego teraz.
  • Poziom 32  
    Cytat:
    chce wyeliminowac ten przycisk i zeby zawsze po wlaczeniu sprawdzal numer czujnika z numerem czujnika zapisanego wczesniej w pamieci eprom.


    Rozumiem tylko żeby sprawdzał nr użytego teraz i zapisanego w eepromie to najpierw musisz zapisac tam ten nr (wlasnie po to jest ten przycisk).

    Proponuje: zaspisac raz w eepromie nr czujnika, po zapisie go w eepromie piszesz sobie prosty warunek w ktorym sprawdzasz czy numery sa identyczne czy sie roznia. Jesli sie roznia to wklepujesz do eepromu nowy numer jesli nie to idziesz dalej.
  • Poziom 9  
    chce wyeliminowac przycisk bo nawet przy zwarciu przy pomocy kabelka nie chce mi odczytac numerow id ds-ow :/

    probowalem juz przeniesc ten przycisk na inne pory i dalej nic.