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

DS1820 1wire odczyt/zapis numeru seryjnego- pomocy

Rysiek.K 27 Wrz 2004 10:25 3995 5
REKLAMA
  • #1 877419
    Rysiek.K
    Poziom 14  
    Staram sie napisać programik w Bascom, który odczyta mi numery seryjne z termometrów dallasa DS1820 (docelowo 3-4 termometry) ma go zapisać w pamieci eeprom procesora, a nast ma być odczytany. Na końcu użyłem komendę dla wyświetlenia na lcd ale jakoś mi to podejżanie działa ponieważ nie wyświetla mi znaków a tylko jakieś "9". Może źle odczytuje lub zapisuję zmienne tablicowe, bo przyznaję sprawia mi to problem.
    Czy ktoś mógłby zerknąć co napisałem, a może ktoś ma podobną już napisaną procedurę?
    Oto moje wypociny
    Config 1wire = Portb.5
    $crystal = 1000000
    Dim Reg_no(8) As Byte
    
    Dim I As Byte
    Dim W As Word
    
    W = 1wirecount()
    Cls
    Locate 1 , 1
    Lcd "CZUJEK=" ; W
    Wait 1
    
    Reg_no(i) = 1wsearchfirst()
    For I = 1 To 8
    Writeeeprom Reg_no(i) , 10
    Next
    
    Readeeprom Reg_no(i) , 10
    For I = 1 To 8
    Next
    
    'tu pubuje odczytac zmienna dla sprawdzenia czy dobrze zapisalem
    'i czy czy dobrze ja odczytuje.
    Cls
    Locate 1 , 1
    Lcd "nr" ; Reg_no(i)
    For I = 1 To 8
    Waitms 255
    Next


    Przeniesiono z Programowanie Ogólne. - arnoldziq
  • REKLAMA
  • #2 880054
    BoskiDialer
    Poziom 34  
    Reg_no(i) = 1wsearchfirst()
    For I = 1 To 8
    Writeeeprom Reg_no(i) , 10
    Next

    tego całkowicie nierozumiem, najpierw zapisujesz dane do tablicy pod indexem którego nawet nieznasz (zmienna 'i' niejest zainicjalizowana)
    oraz nierozumiem zapisu 8 bajtów, wszystkie pod ten sam adres w pamięci eeprom, pierwsze 7 bajtów zostanie nadpisane i ich nieodzyskasz.

    Readeeprom Reg_no(i) , 10
    For I = 1 To 8
    Next

    hm.. odczytujesz komórke 10 z pamięci eeprom do komórki pamięci o indexsie 'i' w tablicy Reg_no (zmienna i niejest zainicjalizowana, prawdopodobnie bendzie równa 8 po poprzedniej pętli) a potem wprowadzasz program w pętle w której nic się niewykonuje.

    i taki inny kruczek:
    Dim Reg_no( 8 ) As Byte
    z tego co wiem to niema tylko 256 egzemplaży układów 1-wire. każdy ma unikalny numer. do pojedynczego bajtu niezmieścisz całego numeru seryjnego jednego układu.

    Lcd "nr" ; Reg_no(i)
    For I = 1 To 8
    Waitms 255
    Next

    tego również nierozumiem.. wyświetlasz na LCD wartość komórki tablicy Reg_no(i) gdzie i niejest zainicjalowane, po czym czekasz 8*255 = 2040ms czyli 2sekundy, wygląda na to że nieznasz za przeproszeniem podstaw programowania.
  • REKLAMA
  • #3 880083
    Rysiek.K
    Poziom 14  
    O Boski... wiesz to naprawde sprawia mi wielką trudność, a na dodatek w helpie też jest to tylko skrutowo opisane.
    1. Jak zainicjować zmienną "i" ?
    2. Myślałem że podam adres komórki 10 i że od tego momentu zacznie sie zpis przez kolejne komórki, aż zapisze 8 bajtów
    3. Chciałem odczytać 8 kolejnych bajtów a nie jeden i go nadpisywać
    4. Fakt przyznaję z wielkim żalem i bije sie w pierś, że sie ucze programowania, fakt - tu jestem wielkim laikiem, dlatego prosze o pomoc.
    Pochwalić sie jednak moge że kilka prostych już napisałem i wykożystuję je w układach przezmnie wykonanych
  • REKLAMA
  • #4 880158
    BoskiDialer
    Poziom 34  
    1. inicjalizacja zmiennej polega na nadaniu jej konkretnej wartości. np I=1 to jest inicjalizacja ponieważ wiesz, że po tym napewno w I będzie liczba 1, jeśli w pętli stosujesz zmienną I do odliczania to samo zdefiniowanie pętli jest inicjalizacją gdyż nadaje jej pierwszą wartść oraz kolejne według pewnej reguły.
    2. poto podaje sie adres komórki żeby program wiedział gdzie ma co zapisać, jeśli chcesz zapisać do 8 kolejnych bajtów zaczynając od adresu 10 to musisz napisać w adresie zamiast "10" tak: "9+I" (ponieważ zliczanie jest od 1 to: 9+1=10, 9+2 = 11 itd.. tz kolejny adres [dane w formacie little-endian.. ew "18-I" jeśli dane mają być w formacie big-endian])
    3. jeśli zapiszesz 8 bajtów pod ten sam adres to jest tak samo jak z tapetą, przyklejisz jedną warstwe i wszystko widać, nakleisz kolejną to poprzedniej niewidać a widać nową. jedyny problem jest taki że takiej 'tapety' się nieda zdrapać (to nie bufor LIFO) czyli odzyskać poprzednich danych, dlatego trzeba zapisywać wszystkie dane w kolejnych komórkach.
    Pętle się definiuje mniej więcej w ten sposób:
    --------
    inicjalizacja(niemusi wystąpić)
    For zmienna=poczatek_zakresu to koniec_zakresu
    instrukcja wykonywana *
    Next (ewentualnie Next zmienna gdy jest używane zagnieżdzanie np pętla w pętli)
    finalizacja (niemusi wystąpić)
    ----------
    * - koniec_zakresu-poczatek_zakresu) razy, przyczym za pierwszym razem zmienna 'zmienna' przyjmuje wartość poczatek_zakresu, za każdym kolejnym razem zmienna 'zmienna' jest o jeden większa, a jeśli jest większa od koniec_zakresu to pętla przestaje się wykonywać i program przechodzi za pętle.

    poprawionego programu nienapisze ponieważ niepisze w bascomie tylko w assemblerze.
  • REKLAMA
  • #5 881344
    SIEKIERA_666
    Poziom 21  
    Witam

    Czy coś takiego jest do zdobycia w ASM ??. Procesor nie ma znaczenia (51 lub AVR). Dodatkowo nie 1820 tylko o 1990 , 1993 i 1996 ale chodzi jedynie o zczytywanie numerów seryjnych i umieszczanie ich w RAM'ie.

    :sm19:
  • #6 887091
    bambi
    Poziom 2  
    Witam
    Mam podobny problem, z tym że ja chce napisać program w baskomie (może tez być asembler ponieważ baskom umożliwia robienie wstawek asemblerowych) który, odczyta id 3 czujników ds1820 a nast zapisze je w wbudowanej pamieci kontrolera AVR eeprom, a na końcu wyświetli temp na LCD.
    Jest to po to by można było tak skonfigurować program aby przypisać konkretny czujnik do danego wyniku.
    Może ktoś mi w tym pomoże jestem w stanie nawet zapłacić za to.
REKLAMA