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

Error 31 i error 93 bascom atmega8 lcd ds1820

189183 08 Aug 2008 23:14 2840 8
Computer Controls
  • #1
    189183
    Level 10  
    Witam.

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

    
    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

    $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.
  • Computer Controls
  • #2
    JmL(TM)
    Level 24  
    Przepisujesz z ksiazki? :cunning: Popatrz dobrze czy np. jest tam cos takiego:
    $regfile = M8def.dat


    Tutaj masz poprawny kod:
    '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
  • Computer Controls
  • #3
    zumek
    Level 39  
    189183 wrote:
    ...wydaje mi sie ze przepisalem go bezblednie

    Tak , wydaje Ci się :P

    
    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
  • #4
    JmL(TM)
    Level 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
  • #5
    189183
    Level 10  
    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
  • #7
    189183
    Level 10  
    JmL(TM) wrote:
    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.
  • #8
    dawid512
    Level 32  
    Quote:
    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.
  • #9
    189183
    Level 10  
    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.