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

[mega8][BASCOM]Jak zapisać i odczytać dane z 24Cxx ?

02 Lip 2008 18:05 16169 143
  • Poziom 18  
    Witam wszystkich.

    UWAGA !!
    ZMIANA KONCEPCJI :)
    Na początku miało to być zapisywanie i odczytywanie plików na karcie SD
    ZREZYGNOWAŁEM Z SD, ZAMIAST TEGO WSADZAM PAMIĘĆ SZEREGOWĄ


    Mam krótkie pytanie.
    Czy któryś z szanownych kolegów i koleżanek próbował już swoich sił w temacie komunikacji AtMegi8 z kartą SD/MMC ??

    Napisałem kilkulinijkowy program, który odczytuje mi numer seryjny z pastylki DALLAS - DS1990A oraz wyświetla go na LCD (16x1). W związku z tym, że bascom to dla mnie (prawie) nowy temat (prawie, bo dawno temu pisałem troszkę w QBasic, na Commodore 64 :) ) program ten pisałem prawie 2 dni, posiłkując się tym NIEZASTĄPIONYM forum oraz polskim HELPem do BASCOMa, ściągniętym też z elektrody.

    Konkretnie chodzi mi o program, który zapisywał by, na dołączonej do AtMegi, karcie SD lub MMC, pliku tekstowego (lub dowolnego innego pliku). Plik miał by mieć nazwę taką samą jak numer seryjny odczytanej pastylki.

    W dalszej kolejności (jak by powyższe założenia działały) chciał bym wewnątrz pliku zapisać wartość liczbową z przedziału 0-255.

    Widzę to w ten sposób, że:

    - przykładam pastylkę do czytnika. [ to potrafię ;) ]
    - program odczytuje pastylkę [ to potrafię ]
    --- i wyszukuje na karcie SD/MMC pliku o takim numerze seryjnym, który właśnie został odczytany. [ do tego się przymierzam ]
    - jeżeli go nie znajduje to tworzy plik i pyta mnie jaką wartość (z przedziału od 0-255) mam w nim zapisać (przyciskami + i - oraz ZAPISZ) [ do tego się przymierzam ]
    - jeżeli po odczytaniu pastylki, znajdzie na karcie plik to pokazuje jaka jest wartość zapisana w pliku, oraz pyta o ile ją zwiększyć/zmniejszyć (przyciskami + i - oraz ZAPISZ) [ do tego się przymierzam ]

    Nie liczę, że od razu będę miał tu wszystko napisane :) Chętnie się podszkolę w BASCOMie. Proszę tylko o pomoc w temacie.

    Proszę też o nie pisanie postów w stylu: "To już było 1000 razy", lub "Google --> Search, Search na elektrodzie" bo zanim napisałem tego posta, siedziałem na wyszukiwarkach sporo czasu. Albo tego nie ma, albo ja nie potrafię wykorzystać wyszukanych informacji :)

    Z góry dziękuję za jakieś sugestie.
  • Computer ControlsComputer Controls
  • Poziom 35  
    Mozesz sie zorientować na temat kilku starych numerow Elektroniki Praktycznej, moze znajdziesz gdzies w necie skany lub archiwa...

    Pamietam ze wlasnie w EP kiedys taki kurs był.

    Chcesz sterować kartą po SPI?

    I mała dygresja:

    OLEJ BASCOMA W CHOLERE!! C się ucz i assemblera, a nie bascoma. W bascomie mozliwosci skonczą ci się za miesiąc jak bedziesz chciał napisać mocno rozbudowany program, no i bascom przyda ci się tylko i wyłącznie do AVR i 8051....Nie ma bascoma na inne procki (np. PIC, eCOG, ARM...) a C jest wszędzie - poza tym mozesz boleśnie poczuć ograniczenia bascomowego kompilatora - dlatego doradzam ci WinAVR+AVRStudio albo jakis komercyjne środowisko (polecam CodeVision)
  • Poziom 18  
    nsvinc napisał:
    Chcesz sterować kartą po SPI?


    Pewnie tak. W tej chwili jestem na etapie poszukiwania bniazda SD bo szkoda mi karty (nie chcę jej lutować.

    nsvinc napisał:
    OLEJ BASCOMA W CHOLERE!! C się ucz i assemblera...

    Ja to potrzebuje tylko na 1-2 projekty. Nie jest mi to tak bardzo do szczescia potrzebne :) Musze tylko przeskoczyc ten temat i tyle :)

    nsvinc napisał:
    Pamietam ze wlasnie w EP kiedys taki kurs był.


    W takim razie przewertuję ich strony :)

    Dzieki za nakierowanie
  • Poziom 22  
    Witam,

    Czy chcesz przenosić te pliki AVR - PC?
    Jeśli tak to będziesz musiał użyć FAT a do tego atmega8 może okazać się za mała. Ja używam atmega32 i mam zrobiony rejestrator temperatury na karcie sd. Program obsługi karty masz w samplach bascoma w katalogu AVRDOS.

    Przejrzyj te pliki a na pewno dasz sobie radę!

    Pozdrawiam.
  • Poziom 35  
    Szukasz gniazda do SD/MMC?

    tutaj znajdziesz ich ile chcesz....
  • Poziom 18  
    Nie trzymam się kurczowo ATmega8-semki. Może być inna. Akurat taką miałem gdzieś w złomach :)

    W takim razie zaopatrzę się w ATmega32 :) Czy jest możliwość wyszukiwania przez program plików na karcie i modyfikowania ich zawartości ?? (tych znalezionych plików) :)

    mega32 kosztuje max 10zl :)
    a jaką konkretnie powinienem wziąć??
    ATMEGA32 -16P
    ATMEGA32 -16A
    ATMEGA32L -8A

    Tak jak pisze wyzej, ten procek ma tylko zapisywac pliki na karte, wyszukiwac te pliki po nazwie (nazwa pliku = SN DALLASA DS1990A) i edytowac zawartosc tego pliku.


    Cytat:
    Szukasz gniazda do SD/MMC?

    Mam parę kilogramów płyt głównych z telefonów komórkowych. Mam gdzieś to gniazdo na 1000% :)
    ...ale dzięki !!

    ...a w ostateczności mojego starego PHOTONa 484 (aparat) poświęcę. Leży nieżywy :)
  • Poziom 22  
    Użyj 32L będziesz mógł zasilić ją 3,3V. Tyle też potrzebuje karta więc będziesz mógł bezpośrednio podłączyć.

    AVRDOS umożliwia większość operacji na plikach m in tworzenie, zmianę nazwy, edycję zawartości itp w zasadzie to wszystko co oferował DOS.
    W helpie pl bascoma masz wszystko dokładnie opisane.

    Pozdrawiam.


    ps. na m16 też by poszło.
  • Computer ControlsComputer Controls
  • Poziom 18  
    Między M16 a M32 nie ma żadnej różnicy cenowej. Zamawiam m32. W przyszłym tygodniu dostanę części, zacznę się w to bawić, za ten czas pogrzebie w plikach, o których istnieniu napisaliście wyżej :)

    @pixel7
    A czy mógł bym jeszcze prosić o kawałeczek schematu?
    Piszesz, że masz rejestrator temperatury z zapisem na SD. Jeżeli nie jest to tajemnicą, to pokaż jak to połączyłeś :)

    Dziękuję wam za pomoc. Jeszcze tu na pewno napiszę a na razie zagłębiam się w lekturę HELPa i w poszukiwania artykułów na ten temat :)


    ...wyczytałem właśnie w HELPie, że:
    "...najlepszymi kontrolerami do tego celu są układy Mega103 lub Mega128. Inne układy posiadają zbyt mało wewnętrznej pamięci. Można także używać układu Mega8515 czy Mega162 z dołączoną pamięcią XRAM"

    Ale skoro to uruchomiłeś na m32 to znaczy, że i to będzie :)

    Dodano po 28 [minuty]:

    Znalazłem 3 sztuki ATmega16L :) Nie wiem tylko, czy nie są zablokowane, bo urządzenie w którym chodziły, nie odpowiada na programator.
  • Poziom 22  
    Tu masz schemat podłączenia:
    Link
    przy zasilaniu 3,3V nie musisz stosować rezystorów.

    Co do procesora to sprawa dotyczy bufora 512 bajtów w pamięci - tyle musisz odczytać i zapisać naraz przy FAT16. M16 ma 1 kb, M32 2 kb pamięci więc spokojnie wystarczą do twoich zastosowań.

    Pozdrawiam.
  • Poziom 18  
    Działają mi te megi16 :D

    Mam ich teraz nadmiar :D COs trzeba bedzie dla nich wymyslec :D:D


    Ale do rzeczy. Pixel, zrobiles uklad wg tego schematu, ktory podales mi wyzej? Co tam wstawic zamiast tego stabilizatora 3,3V ? Tego nie dostane tak latwo. Mam w plycie glownej kompa stabilizator regulowany. Jest to AMS1117 oprocz tego oznaczenia jest jeszcze napis 0133. Moze to jest 3,3V ?? :) Zasililem to z USB i na wyjsciu mam kolo 4,5V :) .
    Chyba ze dziala to jak LM317. Wtedy latwo by bylo obliczyc sobie oporniczki :) Wtedy calosc zasilac mozna z tego i faktycznie, pozbede sie wtedy tych opornikow idacych do SD. Tylko nie wiem, czy wtedy na wejsciu tego stabilizatora wystarczy mi 5V. Dla LM317 by bylo za malo.
  • Poziom 22  
    Kartę podłącz wg schematu - do sprzętowego SPI. W zasadzie można podłączyć pod dowolny port i korzystać z programowego SPI.

    Jako zasilacz z 5V możesz użyć lm317 - minimalny spadek na nim to 1,2V więc spokojnie wystarczy do 3,3V, w każdym razie ja mam właśnie tak zrobione zasilanie i działa bez zarzutu.

    Zwróć uwagę, iż karta SD potrafi pociągnąć do 200 mA przy zapisie więc zasilanie musi tyle wydać.

    Pozdrawiam.
  • Pomocny post
    Poziom 24  
    A tak z ciekawosci zapytam czy to koniecznie musi byc karta SD? A nie moglbys tego zrobic na jakims zewnetrznym eeprom'ie o duzej pojemnosci na I2C? Pozniej tylko wyciagasz kosc lub podpinasz przewod do kompa i sciagasz dane a juz reszta zajmie sie oprogramowanie na PC. W sumie to bylaby bulka z maslem i w sumie efekt podobny chyba, ze jednak MUSI byc karta SD...
  • Poziom 18  
    Powiem szczerze, ze nie brałem pod uwagę pamięci na I2C ale nie mowie, ze nie może jej być.

    Powiedz tylko, czy będę sie mógł swobodnie poruszać po tej pamięci?

    Chodzi mi o to, ze muszę zapisywać 8-znakowa nazwę i przypiąć do niej wartość. Czy używając pamięci będzie można wyszukać w niej interesującego mnie ciągu znaków i odczytać przypisana do tego ciągu wartość ??
  • Pomocny post
    Poziom 24  
    Oczywiscie, ze tak. Sam mam cos takiego zrobione dla kluczy DS1990. Pamiec na I2C w prawdzie nie bedzie tak szybka jak SD na SPI ale chyba nie planujesz zapisywac 5 tys. uzytkownikow z kluczami wiec moim zdaniem eeprom bedzie tu bardziej na miejscu i przede wszystkim w znacznym stopniu uprosci konstrukcje i spokojnie na ATTiny2313 to zrobisz...
  • Poziom 18  
    Bardzo ciekawy pomysł :):):)

    Ja mam na stanie ATmega8L i 3x ATmega16L. Może bym wykorzystał te procki.

    Jak dużą pamięć trzeba, żeby zmieściła max 500 wpisów, które składały by się z ośmiu znaków numeru seryjnego i wartości z przedziału 0-255 podpiętej do każdego z tych SN-ów. ??

    ...mam np. kość biosu z karty graficznej. AT27C512R. Można tego użyć?

    Dodano po 6 [minuty]:

    znalazlem na starej karcie sieciowej 93CC46. Do testów będzie. Jak sie uda to wrzucę coś dużego :) Jak można odszukać konkretny wpis w pamięci ?? Od czego zacząć ??

    ...wracam do mega8 bo łatwiej to w powietrzu lutować :)
  • Pomocny post
    Poziom 24  
    8 znakow SN da sie bez problemu zapisac w 4 bajtach + 1 bajt na dodatkowa dane, czyli 5 bajtow na kazdy "rekord". I teraz: 500 * 5 = 2500 bajtow. Pamiec 24c32 ma pojemnosc 4096 bajtow a 24c64 - 8192 bajty co pozwala w Twoim przypadku zapisac ~1638 "rekordow" czyli az nadto. Pamieci te sa tanie i latwo dostepne. Zatem karta SD jest w tym przypadku raczej bezcelowa i niepotrzebnie komplikuje budowe urzadzenia i czesc programowa. Jesli zdecydowalbys sie na rozwiazanie z pamieciami eeprom na I2C to polecalbym ATMega16 ze wzgledu na sprzetowa obsluge Two-wire. Poza tym obsluga w BASCOM jest bajecznie prosta...

    Pozdrawiam!
  • Poziom 18  
    OK, piszę się na to. Jak to ugryźć?? Mógł byś się podzielić tym programem, który ty masz? Ja w BASCOMie jestem cieniutki. Bardzo by mi to pomogło w pracy.

    Masz kawałeczek schematu ?
  • Poziom 18  
    OK, układ złożony. ATmega8 +24c16 zgodnie ze schematem, który mi podałeś.

    Udało mi sie zapisać i odczytać bajt :) <hura> ;-)

    A jak mogę zapisać odczytany z pastylki SN?
  • Pomocny post
    Poziom 24  
    Odczyt ID klucza:

    Code:
    Dim Key_id(8) As Byte
    

    1wreset
    1wwrite &H33

    Key_id(1) = 1wread(8)


    Mozesz jeszcze sprawdzic chceck-sume:

    Code:
    key_crc = Crc8(key_id(1) , 8)


    Wyswietlanie ID odczytanego klucza na LCD

    Code:
    Sub Display_key_id()
    
       'Lcd "ID: "

       For I = 8 To 1 Step -1
          Lcd Hex(key_id(i))
       Next I
    End Sub


    Jednak teraz widze, ze sie pomylilem! Do zapisu klucza potrzebujesz 8 bajtow. Wiec organizacja danych w pamieci eeprom moze wygladac np. tak:

    Code:
    [adres:00][ilosc_rekordow]
    
    [adres:01][dane_klucza]
    [adres:02][dane_klucza]
    [adres:03][dane_klucza]
    [adres:04][dane_klucza]
    [adres:05][dane_klucza]
    [adres:06][dane_klucza]
    [adres:07][dane_klucza]
    [adres:08][dane_klucza]
    [adres:09][dodatkowe_dane]
    [adres:0A][dane_klucza]
    [adres:0B][dane_klucza]
    [adres:0C][dane_klucza]
    [adres:0D][dane_klucza]
    [adres:0E][dane_klucza]
    [adres:0F][dane_klucza]
    [adres:10][dane_klucza]
    [adres:11][dane_klucza]
    [adres:12][dodatkowe_dane]
    {...}


    Mam nadzieje, ze cos z tego zrozumiales... :D
    A tak w ogole to moze wklej swoj kod to bedzie latwiej.
  • Poziom 18  
    Odczyt pastylki zrobiłem już wcześniej. To mi akurat wyszło. Działa normalnie.

    Oto cały program:

    Code:
    $regfile = "m8def.dat"
    
    $crystal = 1000000

    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.6 , Rs = Portb.7

    Config Lcd = 16 * 1a

    Config 1wire = Portd.5
    Config Scl = Portd.0
    Config Sda = Portd.1

    Dim Dsid(8) As Byte

    Dim B As Byte

    Cursor Off
    Cls
    Lcd " START PROGRAMU "
    Wait 1

    Cls

    Do
    Reset Portd.5
    Waitms 100
    1wreset
    Set Portd.5
    Waitms 100
    If Err = 0 Then

    Dsid(1) = 1wsearchfirst()

    If Dsid(8) = Crc8(dsid(1) , 7) Then
     Cls
     For B = 1 To 8
     Lcd Hex(dsid(b))
     Next
    End If

    Waitms 500
    Else
    Cls
    Lcd "Brak Pastylki"
    Waitms 100
    End If
    Loop

    End



    Program "nasłuchuje" czy jest podłączona pastylka.
    Jeżeli jest, wyświetla jej SN.

    Teraz jak sprawdzić czy ten numer jest zapisany w pamięci i jaka dodatkowa wartość jest do tego przypisana ??
    Jeżeli SN nie jest zapisany, to program ma go zapisać i zapytać o to jaką dodatkową wartość mu przypisać.

    :)
  • Pomocny post
    Poziom 38  
    A może odrobinę swojej inwencji?
    Chociaż troszkę?
    Odczytujesz te komórki z eepromu odpowiedzialne za numery seryjne do ramu i szuka wzorca?
    Jak? A jak chcesz:)
  • Poziom 18  
    To co podałem powyżej, robiłem z 2 dni. Odczyt i zapis Eproma zrealizowałem na bazie linku, który podesłał JmL(TM)

    Kod wygląda tak:
    Code:

    Dim D_w As Byte , D_r As Byte


    D_w = 100

    '********** write byte to EEPROM ***********************************************
    I2cstart                                                    'generate start
    I2cwbyte &B1010_0000                                        'send device address
    I2cwbyte 0                                                  'H adress of EEPROM
    I2cwbyte 0                                                  'L adress of EEPROM
    I2cwbyte D_w                                                'data to EEPROM
    I2cstop                                                     'stop condition
    Waitms 10

    '********** read byte from EEPROM **********************************************

    I2cstart                                                    'generate start
    I2cwbyte &B1010_0000                                        'send device adsress
    I2cwbyte 0                                                  'H address of EEPROM
    I2cwbyte 0                                                  'L address of EEPROM
    I2cstart                                                    'repeated start
    I2cwbyte &B1010_0001                                        'slave address (read)                                                 'slave address (read)
    I2crbyte D_r , Nack                                         'read byte from EEPROM
    I2cstop                                                     'generate stop

    Lcd "D_w= "
    Lcd D_w                                                     'show byte on LCD
    Wait 1
    Cls
    Lcd "D_r= "
    Lcd D_r
    Wait 1


    Program zapisuje do Epromu wartosc "100" i odczytuje ją poprawnie.

    Nie wiem jak by miał zapisać odczytany SN z DALLASa, tym bardziej nie wiem jak by miał go odnaleźć w czeluściach zewnętrznej pamięci.
  • Pomocny post
    Poziom 38  
    Zapisać -> Nie wiem w jakim stanie go masz, ale pewnie jako 8 bajtów:) Wytnij z tego bajty rodziny etc, zostaw sam SN właściwy, i jak pisał chyba JmL masz "tablice" w eepromie, no to siup zapisujesz pod ta i ta komórkę, co potrzeba. - tyle apropo zapisu
    Odczyt -> odczytujesz co któryś bajt(same SNy) do jakiejś innej tablicy w ramie i szukasz w niej (czy nawet na bieżąco szukasz SNa bez tablicy wszystko jedno)...
  • Poziom 18  
    Jeszcze parę dni zajmie mi samo zapisanie odczytanego SNa do zewnętrznej pamięci :(

    Teoretycznie wiem jak to ma wyglądać ale ciężko mi to wykonać nie znając składni BASCOMa.

    Dodano po 1 [minuty]:

    ...a Sn wyświetla mi się jako 16 znaków.

    np. 01DA176100000004
  • Pomocny post
    Poziom 38  
    No świetnie, teraz się dowiedz z datsgeeta które numerki są numerem seryjnym:)
    A potem spakuj to w BCD i zapisz:)
  • Poziom 18  
    numer seryjny to pierwsze 8 znakow z tego co podałem wyżej.

    Jak użyłem funkcji MAKEBCD() żeby wyświetlić SN na LCD, to wyświetliło mi się coś takiego:
    7273738472727272

    O to chodzi?
  • Pomocny post
    Poziom 38  
    Niewiem co robi makebcd mistrzu:)
    OK no to pierwsze 4 bajty musisz zapisać w eepromie i potem zczytywać i porównywać:)
  • Pomocny post
    Poziom 24  
    http://pl.wikipedia.org/wiki/Kod_BCD

    Tez ostatnio w moim projekcie mialem przeprawe z BCD ale na szczescie balu postawil mnie na rowne nogi :D

    A na koniec jeszcze tylko caly EEPROM skompresowac ZIP'em i gotowe! ;]
  • Pomocny post
    Poziom 38  
    Nie, to bcd to mea culpa jest :) Tam nie ma być nic z BCD, poprostu 4 pierwsze bajty :)