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

Cyfrowy piórnik- pomysły, problemy

Bambus97 11 Mar 2011 20:00 5016 59
  • #31 11 Mar 2011 20:00
    Bambus97
    Poziom 15  

    Witam po raz kolejny.
    Po dokładnym przemyśleniu wszystkiego postanowiłem użyć na razie odczytu tekstu z eeprom, tylko za bardzo nie wiem jak na eeprom zapisać tekst.
    Z drugiej strony (czyli odczytu) mogę po prostu podać komórkę eepromu, zczytać ją i wyświetlić na LCD, dobrze myślę?
    Zaraz przeszukam help bascoma i zobaczę, może coś znajdę.
    Pozdrawiam

  • #32 11 Mar 2011 20:26
    piotrva
    Moderator na urlopie...

    Tak podajesz adres i odczytujesz z niego jeden bajt co odpowiada jednej literze (jednemu znakowi w kodzie ASCII). Co do zapisu tekstu to ja bym to ugryzł za pomocą rs232. Mianowicie używasz przejściówki USB<>RS232 i np. po wysłaniu z komputera znaku ESC wchodzisz w tryb programowania i z klawiatury wpisujesz tekst do zapisania. Ewentualnie zawsze możesz potraktować to łopatologicznie i wgrywać wsad do pamięci EEPROM procesora poprzez programator.
    EDIT:
    Bardzo cieszę się, że trochę zrzuciłeś z tonu i dostosowujesz trochę plany do umiejętności ;-)

  • #33 12 Mar 2011 21:14
    Bambus97
    Poziom 15  

    Muszę, po małej przymiarce do odczytu z SD uznałem że na razie nie warto, koszt samej ATmegi128 to koło 30zł prawdopodobnie bym źle ustawił fusebity i ją zablokował, dostępna jest tylko w smd, a tego się wystrzegam (nie posiadam HotAira ani stosownego programatora SMD, choć progrmamator nie jest większym problemem), dodatkowo nie wiem czy "podołam", to dosyć trudne zadanie.
    Bascom ma jakieś polecenie które dekoduje ASC2 na litery?
    Zaraz poszukam.
    Pozdrawiam
    @edit
    Znalazłem, polecenie ASC() dekoduje literę na ASC(2?), a CHR() dekoduje liczbę na literę.
    Dobrze trafiłem?

    Mogę użyć eepromu AT24C256? (wolę się upewnić)

    W jaki sposób mogę utworzyć katalogi w eepromie?
    Dobrze myślę, i można zrobić to tak: utworzyć pętlę która przeszukuje eeprom i zaczyna wyświetlać tekst od jakiegoś znaku np "shift in", a naciśnięcie danego przycisku (podanie komendy przez rc5) wyszukiwało by następny "shift in"?

  • #35 13 Mar 2011 11:20
    Bambus97
    Poziom 15  

    Witam.
    Eeprom 256kb daje nam 32k znaków, a to daje 8 stron a4 z najmniejszymi marginesami zapisanych czcionką 10, więc ciężko będzie wszystko przewinąć, a rozważam jeszcze eeprom 512kb i 1mb.
    Zamierzam użyć wyświetlacza 2x40, a podzielenie eepromu na całe "skriny" ekranu będzie ok, zawsze ściąga będzie czytelniejsza, np tylko jedna data na jedną linijkę, teraz tylko jakiego znaku użyć do informacji o :
    - katalogu
    - linijce1 ekranu
    - linijce2 ekranu
    Postaram się zacząć pisać program dzisiaj.
    Pozdrawiam

    @edit

    No i zacząłem, ale już pojawił się pierwszy problem, do wyszukiwania znaku początku "skrinu" lcd użyłem shiftin (czyli 0000 1111 w ASCII), tylko jak powinna wyglądać procedura która po znalezieniu tego pobiera 20 kolejnych znaków?
    Nie mam pomysłu...

    Jaki jest adres write i read dla 24c256, 160 i 161?

    Narazie taką część kodu zmęczyłem, w miejsce kropek powinna być instrukcja pobierania 40 znakow i wyswietlania ich w pierwszej linijce lcd a potem pobiernia kolejnych 40 i wyswietlanie ich w drugiej linijce.

    Code:
    If Mode1 = 1 Then
    

          Config Sda = Portd.6
          Config Sc1 = Portd.5

          Const Adresw = 174
          Const Adresr = 175

       Do
          I2cstart
          I2cwbyte Adresw
          I2cwbyte Komorka
          I2cstart
          I2cwbyte Adresr
          I2crbyte A , Ack
          I2cstop

          If A = &B00001111 Then
          .............

          Else
          Komorka = Komorka + 20
          End If
       Loop

  • #37 13 Mar 2011 14:39
    Bambus97
    Poziom 15  

    Czyli mogę zrobić to tak z pętlą for? Od razu czuję że coś jest nie tak...
    Ponawiam pytanie o adres eepromu 24c256 do zapisu i odczytu, tu wpisałem dla 24c04 chyba
    Jakiego typu powinny być zmienne komorka, komorka1 i komorka2?

    Code:

    Dim Mode1 As Byte
    Dim Command As Byte
    Dim Address As Byte
    Dim Komorka As Byte
    Dim Komorka1 As Byte
    Dim Komorka2 As Byte
    Dim A As Byte


    If Mode1 = 1 Then

          Config Sda = Portd.6
          Config Sc1 = Portd.5

          Const Adresw = 174
          Const Adresr = 175

       Do
          I2cstart
          I2cwbyte Adresw
          I2cwbyte Komorka
          I2cstart
          I2cwbyte Adresr
          I2crbyte A , Ack
          I2cstop

          If A = &B00001111 Then

          I2cstart
          I2cwbyte Adresw
          I2cwbyte For Komorka1 To Komorka2
          I2cstart
          I2crbyte A , Ack
          I2cstop

          Else
          Komorka = Komorka + 20
          End If
       Loop

  • #38 18 Mar 2011 20:18
    Bambus97
    Poziom 15  

    Mógłby kolega poprawić, dopisać, fragment kodu odpowiadający za zczytanie kolejnych 40 znaków do 1 linijki i 40 do drugiej?
    Bo ja nie mam pomysłu jak to rozwiązać.
    Podrawiam

  • #39 18 Mar 2011 20:33
    piotrva
    Moderator na urlopie...

    1. dokumentacja: http://www.atmel.com/dyn/resources/prod_documents/doc0670.pdf strona 11. Nie czytałeś tego dokumentu? Od tego MUSISZ zacząć jak bierzesz nową i nieznaną kość do ręki. Nie musisz czytać wszystkiego od A do Z, ale wypada choćby przekartkować, żeby odnaleźć te informacje...
    2. kod mógłbym napisać, ale jakoś nie mam na to czasu ani motywacji.
    3. masz błędy: w odczycie: powinno być:
    a)START
    b)Adres_ukl (z 2 niższymi bitami jako page address)
    c)Adres_komorki z danej strony
    d) START
    e)zczytanie bajtu i tu możesz albo pobrać kilka bajtów albo jeden, ale pamiętaj ZAWSZE ostatni bajt (lub jedyny), musi mieć parametr NACK. Parametr Ack dajesz tylko dla wcześniejszych bajtów przy odbieraniu wielu bajtów w jednej sekwencji z auto-inkrementacją adresu
    f)STOP
    4. nieły kwiatek:

    Code:

    I2cwbyte For Komorka1 To Komorka2

    Może najpierw kup sobie książkę o bascomie autorstwa choćby P. Wiązani i poucz się nieco, bo widzę, że nie do końca rozumiesz pętle...
    Jak zrozumiesz pętle to wtedy zczytywanie znaków i ich wyświetlanie na LCD to będzie pestka.
    - - - - - - - - - - - -
    Cóż, mógłbym Ci to napisać, nawet cały kod takiego piórnika (oczywiście o ile odpowiednio bym się "zmotywował"), ale przecież chcesz się czegoś nauczyć przy tym, projekcie, a nie posiadać tylko takowe urządzenie?
    Cóż, widzę, że i tak trochę wziąłeś sobie do serca to co mówiłem o stopniu trudności, ale dalej mimo wszystko polecałbym zacząć od migania diodą, wyświetlania w pętli liczb 0-9 itp. Może na początku wydawać się nudne, ale potem stopniowo rozszerzysz informacje i ani się nie obejrzysz jaką będziesz miał satysfakcję z samodzielnie wykonanego projektu.

  • #40 18 Mar 2011 21:52
    Bambus97
    Poziom 15  

    To juz mam za sobą, zegarek nawet działa :D
    I wiem, ze w takiej pętli pewnie zczytalo by mi tylko ostatnią komórkę, ale nie mam pomysłu, muszę napisać procedurę odczytu mozolnie dla każdego bajtu, czy jak?
    Chcę się nauczyć, jakąś książkę nawet zacząłem czytać, ale jest napisana jakoś chaotycznie.
    Pozdrawiam
    ps.
    Nawet widziałem ten rysunek, tylko nie wiem jak go zinterpretować...

  • #41 05 Kwi 2011 21:48
    Bambus97
    Poziom 15  

    Ostatnio miałem trochę czasu żeby pomyśleć...
    Nie wiem jak tu użyć intrukcji for...to, ale można by to zrobić na piechotę :D
    Zajmie troche miejsca więcej, ale sam napiszę :D
    Co kolega o tym myśli?

  • #43 06 Kwi 2011 13:37
    Bambus97
    Poziom 15  

    Wiem jak działa pętla for, ale nie wiem jak ją odnieść do tego wypadku?
    Poprostu podaje się skok i do ilu ma odliczać, tylko gdy program napotka na pętlę for to najpierw odliczy do tych 40 a potem dopiero wyśle 40 do eepromu z opuźnieniem...

  • #44 10 Kwi 2011 11:22
    Bambus97
    Poziom 15  

    Wczoraj, około północy chyba to zrozumiałem !:D
    Czy dobrze myślę, i pętla for zwiększa liczbę o dany skok za każdym razem kiedy program napotka parametr next?
    Dobrze myślę?

  • #46 11 Kwi 2011 13:54
    Bambus97
    Poziom 15  

    Tak trzeba było od razu :D
    Teraz się zastanawiam czy
    -Najpierw odczytać te 80 komórek i potem przekonwertować na bcd?
    -Za każdym razem kiedy odczytam jedną komórkę konwertować ją na literę?
    Jakim poleceniem?
    Jaka zmienna może przechowywać te 80 znaków?
    Pozdrawiam
    btw. https://www.elektroda.pl/rtvforum/viewtopic.php?t=1968883&highlight=
    Dziękuję za pomoc :D

  • #48 11 Kwi 2011 20:25
    Bambus97
    Poziom 15  

    Yhmmm, chyba kolega mnie nie zrozumiał...
    W bascomie nie ma czegoś takiego jak ord()
    (przynajmniej kompilator go nie rozpoznaje).
    Wiem ze np
    b=chr(a)
    b musi być w kodzie asc2, a wtedy a to będzie litera.

    Tylko jak przechować dwa znaki i dodać do tych dwóch trzeci aby powstał wyraz?
    Chodzi mi o cos w stylu funkcji makeint()

  • #49 12 Kwi 2011 16:13
    piotrva
    Moderator na urlopie...

    nie ord, ale ASC() i CHR()
    pomyliło mi się z PHP, w którym ostatnio dużo siedziałem :D
    a co do sklejania znaków to jest ziemma typu String * N (przechowująca N znaków) i potem dodajesz do niej literki, jakbyś sumował liczby....
    NA PRAWDĘ polecam lekturę możliwej do znalezienia polskiej wersji pomocy do bascoma* - wiele wątpliwości wyjaśnisz sobie sam...

    *pomoc dotyczy "archaicznej" wersji bascoma, ale poza funkcjami specyficznymi (jak np. obsługa graficznych lcd, czy nowych procesorów xmega) wszystkie podstawowe pratycznie się nie zmieniły
    LINK: http://www.mcselec.com/index.php?option=com_docman&task=cat_view&gid=86&Itemid=54

  • #50 12 Kwi 2011 18:38
    Bambus97
    Poziom 15  

    Helpa zassałem od razu, kiedy zechciałem się uczyć bascoma.
    Moje poprzednie wątpliwości dotyczyły właśnie dodawania literek :D
    Teraz już wszystko wiem, pozdrawiam

    Dodano po 52 [minuty]:

    Cos takiego na tą chwilę splodzilem:
    Nawet się kompiluje :boss:
    Jak kolega go ocenia?

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

    Config Lcd = 40 * 2
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.0 , Rs = Portb.1
    Config Sda = Pind.6
    Config Scl = Pind.5
    Config Rc5 = Pind.2

    Dim Mode1 As Byte
    Dim Command As Byte
    Dim Address As Byte
    Dim Komorka As Byte
    Dim Komorka1 As Byte
    Dim Komorka2 As Byte
    Dim Zawartosc As String * 80
    Dim Znak1 As String * 1
    Dim Znak As Byte
    Dim Shift_t As Byte

    Enable Interrupts



    Goto Mode1
       Mode1:
          Const Adresw = 174
          Const Adresr = 175
       Goto Szukanie_folderu

    Szukanie_folderu:
       Do
       For Komorka = 0 To 131000
          I2cstart
          I2cwbyte Adresw
          I2cwbyte Komorka
          I2cstart
          I2cwbyte Adresr
          I2crbyte Shift_t Nack
          I2cstop
          Next Komorka

          Komorka = Komorka1



          If Shift_t = &B00001111 Then
          Goto Czytanie
          End If
       Loop

    Czytanie:
       Do
          Komorka2 = Komorka1 + 80
          For Komorka1 = Komorka1 To Komorka2
             I2cstart
             I2cwbyte Adresw
             I2cwbyte Komorka1
             I2cstart
             I2cwbyte Adresr
             I2crbyte Znak , Nack
             Znak1 = Chr(znak)
             Zawartosc = Zawartosc + Znak1
          Next Komorka1

             Getrc5(address , Command)

             If Command = 1 Then
                Goto Szukanie_folderu
             End If

             If Command = 2 Then
                Goto Mode2
             End If





             If Command = 3 Then
                Komorka1 = Komorka + 20
             End If

             Lcd Zawartosc
       Loop




    Mode2:
          Config Sda = Portb.0
          Config Scl = Portd.7

          Const Ds1307w = 208
          Const Ds1307r = 209


          Config Portb = Output

          Dim Sekundy As Byte
          Dim Minuty As Byte
          Dim Godziny As Byte
          Dim Ustsek As Byte
          Dim Ustmin As Byte
          Dim Ustgodz As Byte


             I2cstart
             I2cwbyte Ds1307w
             I2cwbyte 0
             I2cwbyte Ustsek
             I2cwbyte Ustmin
             I2cwbyte Ustgodz
             I2cstop

          Do

             If Pinb.0 = 1 Then
             Waitms 25
             Incr Ustsek
             End If

             If Pinb.1 = 1 Then
             Waitms 25
             Incr Ustsek
             End If

             If Pinb.2 = 1 Then
             Incr Ustgodz
             Waitms 25
             End If

             Ustgodz = Makedec(ustgodz)
             Ustmin = Makedec(ustmin)
             Ustsek = Makedec(ustsek)

             Sekundy = Makebcd(sekundy)
             Minuty = Makebcd(minuty)
             Godziny = Makebcd(godziny)

             I2cstart
             I2cwbyte Ds1307w
             I2cwbyte 0
             I2cstart
             I2cwbyte Ds1307r
             I2crbyte Sekundy
             I2crbyte Minuty
             I2crbyte Godziny
             I2cstop

             Waitms 500

             Cls

             Lcd Sekundy ; " : " ; Minuty ; " : " ; Godziny

             Getrc5(address , Command)

             If Command = 1 Then
             Goto Mode1
             End If
          Loop

  • #51 13 Kwi 2011 16:42
    piotrva
    Moderator na urlopie...

    1. a od kiedy to zmienna byte przechowuje wartości od 0 do 131000 ?
    2. a cio to?:

    Code:

    Goto Mode1
       Mode1:
          Const Adresw = 174
          Const Adresr = 175
       Goto Szukanie_folderu

    a) stałe są stałe i nie ważne czy umieścisz je w takim ifie, czy nie i tak nie zmienisz ich wartości
    b) zapomnij o goto... to da się rozwiązać pętlą... i paroma warunkami... goto się w takich wypadkach nie stosuje...
    3. jeśli chcesz z pamięci odczytać więcej niż 256 komórek, poczytaj jak to się robi (rzucę hasło page address i modyfikacja adresu bazowego do zapisu/odczytu - potraktuj tak jakbyś w jednej pamięci miał klika różnych kości po 256 komórek każda)

  • #52 13 Kwi 2011 18:09
    Bambus97
    Poziom 15  

    1.Wlasciwie to nie wiem, pomylka :D
    Użyć stringa*6?
    2.
    a)Właściwie to poprostu napisałem dwa bloki i zapomniałem o tym
    b)Czemu? nie widzę powodu...
    3.Poczytam!

    Dodano po 6 [minuty]:

    Chyba poprostu zmienię eeprom na 256kb, po "polskiemu" mało o tym jest.

  • #53 13 Kwi 2011 18:44
    piotrva
    Moderator na urlopie...

    Bambus97 napisał:
    (...)po "polskiemu" mało o tym jest.

    To trzeba się angielskiego zacząć uczyć :D
    Gwarantuje Ci, że to o wiele ułatwia życie. Ja dopiero po przejściu na poziom w miarę dobry z języka byłem wstanie zrobić cokolwiek poza miganiem diodą, napisami na lcd i termometrem :D
    ----
    ale że mam dziś dobry dzień do dobrych uczynków...
    na przykładzie at24c16:
    Cyfrowy piórnik- pomysły, problemy
    mamy 4 najstarsze bajty jako stały adres, kolejne 3 to właśnie page address, a ostatni to bit R/W (1 dla odczytu, 0 dla zapisu)
    czyli mamy ogólną postać:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    strona to jakby numer jednej z (w tym przypadku) ośmiu 256 elementowych tablic w pamięci EEPROM, tak więc np. komórki o "numerach" 0-255 będą miały PPP=000 i adres wewnętrzny równy jej numerowi. Z kolei komórki o numerkach 256-511 będą miały PPP=001 i adresy wewnętrzne pomniejszone o 256, czyli od 0 do 255, gdyż poprzez magistralę i2c możemy przesłać maksymalnie 1 bajt.
    Nietrudno zauważyć, że PPP to adres/256, czyli:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    to tyle w kwestii pamięci
    1. ja bym w ogóle stringów nie używał - tylko jeśli mamy interesujący nas fragment to od razu literka po literce na ekran
    2. co do goto, to to po prostu gmatwa program, powoduje niepotrzebne skoki i jest mało profesjonalne. Cóż, ale to jest temat na dłuższą dyskusję :D

  • #54 13 Kwi 2011 20:07
    Bambus97
    Poziom 15  

    Hmm, i wtedy można podawać komórki nawet do ograniczenia czyli 256*7 stron, też jest zaletą.
    O co chodzi z address,kolega tylko tak przykładowo go nazwał?
    Address mam użyty przy RC5.

    A nie lepiej dać instrukcję warunkową jak np.:

    if komorka>256 then
    komorka=0
    ppp=ppp+1
    endif

    Trochę prostsze- przynajmniej krótsze :D

    ps. "ale że mam dziś dobry dzień do dobrych uczynków..."
    Taki delikatny (abym nie usiadł na laurach) komplement? :D
    Warto wydrukować screena na okładce każdego zeszytu :vamp:
    Zresztą, pewnie sam bym do tego nie doszedł, bez pomocy kolegi...
    Zaraz coś pokombinuję z tym eepromem.
    Pozdrawiam

    @edit
    Czyli tak będzie ok?

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

  • #57 14 Kwi 2011 13:56
    Bambus97
    Poziom 15  

    Elementy i cała reszta była "najpierw (o ile?) napiszę program, potem kupię elementy".
    Jeszcze rozważam zmianę zegarka- polecacie jakiś?

  • #58 14 Kwi 2011 18:55
    piotrva
    Moderator na urlopie...

    Freddy napisał:
    piotrva napisał:
    Code:

    if komorka>256 then
    komorka=0
    ppp=ppp+1
    endif

    ale to nie ma prawa zadziałać
    ...

    Niby dlaczego ?

    to znaczy zadziała przy inkrementacji, ale wtedy trzeba dać inny warunek pętli i zastosować inną pętlę, lub dać zagnieżdżone pętle

  • #59 07 Maj 2011 17:24
    Bambus97
    Poziom 15  

    Narazie sobie odpuściłem piórnik z kilku względów, ale doskwiera mi brak stacji lutowniczej...
    Zamówiłem jako sample MAX6675, jakieś trafo się znajdzie, garść drobnicy i jest :D

    Wypociłem taki kod:

    Co o nim sądzisz?

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod