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

Cyfrowy piórnik- pomysły, problemy

Bambus97 25 Lut 2011 22:09 5421 59
  • #1 9204461
    Bambus97
    Poziom 15  
    Witam
    Od dłuższego czasu próbuję zrobić cyfrowy piórnik, ale niestety utknąłem na odczycie pliku .txt z karty sd...
    Przeczytałem parę softów piórników ale ich nie rozumiem, są napisane dosyć chaotycznie ;)
    Mogli byście jakoś mi to wytłumaczyć, czytałem że w jakimś kompilatorze jest polecenie do odczytu z karty SD, ale niestety nie wiem z jakiej...
    Nie rozumiem też w jaki sposób potem to wysłać na wyświetlacz, ale liczę że sam to jakoś przetrawię :D
    Bascoma dopiero się uczę, opanowałem już sporo rzeczy, ale większość kodów to ciągle czarna magia..., niestety.
    Jeśli podrzucicie jakiś fragment kodu, i pomożecie mi to zrozumieć będę wdzięczny :)

    @Edit
    Może ktoś przybliży mi te kwestie lub podrzuci jakiś artykuł itp napisany po polsku?
  • #2 9220730
    Bambus97
    Poziom 15  
    Trochę poczytałem i spodobała mi się biblioteka: http://elm-chan.org/fsw/ff/00index_e.html

    A dokładniej fragment:

    f_mount - Register/Unregister a work area
    f_open - Open/Create a file
    f_close - Close a file
    f_read - Read file
    f_write - Write file
    f_lseek - Move read/write pointer, Expand file zize

    Moglibyście mi to wytłumaczyć na "chłopski rozum", bariery językowe...
    Pozdrawiam

    @U.P. głópstwo walnęłem, to do C jest :oops:
  • Pomocny post
    #3 9220771
    piotrva
    VIP Zasłużony dla elektroda
    cóż, po pierwsze ucz się Angielskiego - bez tego w elektronice cyfrowej (szczególnie w mikro-kontrolerach) ani rusz...
    a więc po kolei (nie tłumaczę dosłownie, ale sensownie)
    zamontuj partycję, czyli coś w stylu otwarcia dysku dla programu
    otwórz lub utwórz plik (w zależności od podanego parametru otwarcia)
    zamknij plik
    odczytaj z pliku
    zapisz do pliku
    zmień pozycję "wirtualnego kursora" w pliku, zwiększ rozmiar pliku
    ale ciężko Ci będzie przebrnąć przez tę bibliotekę bez Angielskiego...
  • #4 9220800
    Bambus97
    Poziom 15  
    Angielski umiem (no, jako tako ^^ ), to akurat sam zrozumiałem, ale dziękuję.
    mój problem że nie mogę zrozumieć jak to zastosować, teraz zainteresowałem się avr-dosem.
    Myślę że jakiś przykładowy program napisany estetycznie by mi bardzo pomógł, na elce znalazłem napisany dosyć chaotycznie
    Istnieje gdzieś w sieci jakiś opis?
  • Pomocny post
    #5 9220816
    piotrva
    VIP Zasłużony dla elektroda
    ja pisałem dosyć szczegółowy opis avr-dos po polsku w ramach kursu BASCOM, ale nie mogę udostępniać materiałów bez zgody wydawcy.
    możesz dogadać się z firmą http://and-tech.pl i może zgodzą się na udostępnienie tej części całego kursu BASCOM
    http://www.kurs.and-tech.pl/
    a w jakim języku w ogóle umiesz lepiej programować? bascom czy C?
    do nauki C polecam http://atnel.pl/wydawnictwo
    jest tam też mały przykład odczytu danych z karty SD w bibliotece petit-fs
  • #6 9220864
    Bambus97
    Poziom 15  
    W bascomie offc :D
    Kiedyś przeczytałem kursc na diodzie, ale uznałem że najpierw opanuję basica, bo c za trudne jest.
    Hmm, a mógłbyś pokrótce mi to wytłumaczyć czy na pw, czy na forum w wolnej chwili?
    pozdrawiam
  • Pomocny post
    #7 9220906
    piotrva
    VIP Zasłużony dla elektroda
    cóż, niestety to jest złe podejście...
    c wcale nie jest takie trudne na jakie wygląda...
    napisz, jeśli możesz do firmy and-tech, a jak się nie zgodzą to wtedy wrzucę parę programików z komentarzami
  • #8 9225898
    Bambus97
    Poziom 15  
    Nie rozumiem kompletnie polecenia "print#" czy komenda ta wyświetla napis na lcd?
  • #9 9225999
    piotrva
    VIP Zasłużony dla elektroda
    polecenie print #kanał powoduje wysłanie tekstu na określony kanał sprzętowego, programowego lub wirtualnego uartu. w obsłudze kart sd wykorzystywany jest właśnie "wirtualny uart", który jest "połączony" z plikiem na karcie SD...
    a na jakim poziomie Kolega wogóle zna BASCOM'a?
  • #10 9226075
    Bambus97
    Poziom 15  
    Średnio :D
    Ale liczę że jakoś to zrozumie.
    Tak myślałem (tzn gdzieś to przeczytałem), tylko gdy w tym kursie odczytany plik wysyłamy poleceniem #print kanał to jak go odczytać?
    btw. Powołałem się na kolege w mailu i dostałem już "lekcje 10" :D
  • #11 9226295
    piotrva
    VIP Zasłużony dla elektroda
    Tam jeden kanał (bodajże #1) jest przypisany do portu szeregowego mikrokontrolera (uart rzeczywisty). Jeśli podłączysz za pomocą linii Rx(0) i Tx(0) (PD0 i PD1, ale sprawdź w dokumentacji procesora) procesor do portu rs232 w komputerze (albo za pomocą przejściówki USB<>RS232, albo za pomocą układu MAX232 i zwykłego portu COM w komputerze) to wtedy wszystko będziesz miał w terminalu na komputerze wyświetlane.

    Proszę poprawić pisownię.
    Proszę nie żebrać w podpisie o pomógł!
    Robak

    Zmiany dokonane...
  • #12 9226625
    Bambus97
    Poziom 15  
    I tak oto wszystko stało się jasne, teraz jeszcze przyswoić sobie to na stałe :)
    Czy dobrze myślę i print# 1 mogę zapisać jako zmienną a potem ją wysyłac na lcd?
    Czy może poprostu " lcd S " ?
  • Pomocny post
    #13 9226697
    piotrva
    VIP Zasłużony dla elektroda
    hmm, po pierwsze dobrze by było gdybyś trochę się poduczył bascoma, bo obsługa kart sd to wyższa szkoła jazdy,
    możesz po prostu zastąpić polecenia Print #1 na Lcd i resztę pozostawić bez zmian (Print i Lcd są kompatybilne składniowo)
    ale wtedy musisz dodać waity, pozycjonowanie za każdym razem, żeby wogóle cokolwiek zobaczyć z tego mojego programu.
    tak czy siak polecam Ci zakup/wykonanie:
    a) kabelka RS232 z układem max232 (o ile masz port COM w komputerze_
    b) konwertera opartego o układ FT232RL
    powiem szczerze, że przyda się na później, bo ja dokąd nie zaopatrzyłem się w te cuda nie mogłem odpalić wielu programów (m. in. do serwera internetowego)
  • #14 9226726
    Bambus97
    Poziom 15  
    Wiem, ale taki piórnik zmotywuje mnie do działania i da więcej czasu na elektronikę, a daty z historii ciężko wchodzą :D
    Troche nie rozumiem po co waity, komunikat może zostac do wyświetlenia następnego, czy czegoś nie załapałem?
    @ a, rozumiem, niektóre komunikaty przechodzą dość szybko, ale dam radę :D
    @@ Jeżeli kupię atmegę128 na 3,3V to nie będę musiał bawić się w konwertery?
    Piszę tylko aby się upewnić
  • #15 9227072
    piotrva
    VIP Zasłużony dla elektroda
    Wtedy musisz i mieć odpowiedni wyświetlacz, na 3v3
    Poza tym chyba każdą atmegę da się zasilać z 3v3 (zwykłe mają ograniczenie 2,7V, a atmega****V nawet 1,7V)
    Konwerter to ba 6 rezystorów i układ lf33cv lub podobny stabilizator 3v3 low drop lub nawet odpowiednio połączony lm317, więc nie ma sensu bawić się w zasilanie całości z 3v3, chyba, że zależy Ci też na niskim poborze prądu, to można się pokusić na 3v3, ale wtedy już (jeśli całość ma być na 3v3) trzeba specjalny wyświetlacz lcd

    Proszę poprawić pisownię.
    Proszę nie żebrać w podpisie o pomógł!
    Robak
  • #16 9227202
    Bambus97
    Poziom 15  
    Myślę że jednak zrobię jak kolega radzi, bo o wyświetlacz np 2x40 cięzko na 3v3, układ fl33cv do zasilania karty?
  • #18 9230353
    Bambus97
    Poziom 15  
    Swoją drogą, czy taki kod ma prawo dziłac?
    Chodzi mi o zegarek, dopisze jeszcze wyświetlanie na lcd.

    $regfile "m8def.dat"
    $crystal 8000000
    
    Dim Sekundy As Byte
    Dim Minuty As Byte
    Dim Godziny As Byte
    
    
    If Pinb.1 = 1 Then Sekundy + 1
    End If
    
    If Pinb.2 = 1 Then Minuty + 1
    End If
    
    If Pinb.3 = 1 Then Godziny + 1
    End If
    
    If Sekundy = 60 Then Minuty + 1
    End If
    
    If Minuty = 60 Then Godziny + 1
    End If
    
    If Godziny = 24 Then
       Godziny = 0
       Minuty = 0
       Sekundy = 0
    End If
    
    Do
     Sekundy + 1
     Wait 1
    Loop
  • #19 9230432
    piotrva
    VIP Zasłużony dla elektroda
    1. to się w ogóle nie skompiluje
    2. jak nawet poprawisz błędy składniowe (na prawdę naucz się najpierw BASCOM'a zanim zabierzesz się za tworzenie cyfrowego piórnika, bo takto Twoją sytuację można porównać do próby wyjścia na Everest bez przygotowania...) to to NIE BĘDZIE DZIAŁAĆ POPRAWNIE, dlaczego:
    3. polecenia wait odmierzają PRZYBLIŻONY czas. Dodatkowo każda operacja (choćby zwiększenie ilości sekund, potem jeszcze wyświetlanie na LCD) też trwa pewną niewielką chwilę, ale gdy zbierzesz 1000 takich niewielkich chwil to zrobi się większa chwila i np. po 1000 s w rzeczywistości (mierzone stoperem) Twoje urządzenie pokaże np. 998 (bo pozbierają się niewielkie opóźnienia)
    4. do odmierzania czasu używa się albo Timerów w procesorze, albo specjalizowanych układów scalonych (np. pcf8583, pcf8563, ...), ale to wymaga opanowania komunikacji po I2C

    Reasumując:
    Wiem, że zapał masz duży do pracy i to Ci na pewno pomoże, ale z doświadczenia wiem (posłuchaj nieco starszego kolegi, bo jak się nie mylę jesteś z 97'), że porywanie się od razu na bardzo skomplikowane rzeczy może bardzo szybko zniechęcić do dalszych wysiłków. Polecam Ci rozpoczęcie nauki od bardzo prościutkich rzeczy, nie wiem czy masz jakąś płytkę testową i ogólnie jaki masz sprzęt, ale na początek zajmij się obsługą przycisków, zapalaniem gaszeniem diod, itp. Może to się wydawać nudne, ale ja nie zaczynałem inaczej, a nawet teraz programując w C i przesiadając się na nieco inne procesory z serii xmega avr / avr32 też od tego zaczynam.
    Bo teraz pisząc z moją pomocą jakikolwiek kod do tego elektronicznego piórnika wielu rzeczy możesz nie rozumieć - a to będzie bardzo pokutować w przyszłości i lepiej się tego nauczyć teraz.
  • #20 9230503
    Bambus97
    Poziom 15  
    Specjalnie zrobiłem to w ten sposób, i wiem że procek też potrzebuje czasu na operacje, to ma być zegarek do piórnika, najprostszy dla przykrywki :)
    No, jestem '97, ale myślę że to niema nic do rzeczy :)
    Właśnie z tym bascomem mam problem, wcześniej opanowałem autoita(dosyć dobrze, z całą maszynerią funkcji) na kompie, wiem jak powinien wyglądać kod ale nie potrafię go ubrać w bascomowe polecenia ^^
    @ edit
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Portb = Output
    
    Dim Sekundy As Byte
    Dim Minuty As Byte
    Dim Godziny As Byte
    
    If Pinb.1 = 1 Then
    Incr Sekundy
    End If
    
    If Pinb.2 = 1 Then
    Incr Minuty
    End If
    
    If Pinb.3 = 1 Then
    Incr Godziny
    End If
    
    If Sekundy = 60 Then
     Incr Minuty
    End If
    
    If Minuty = 60 Then
    Incr Godziny
    End If
    
    If Godziny = 24 Then
       Godziny = 0
       Minuty = 0
       Sekundy = 0
    End If
    
    Do
     Incr Sekundy
     Wait 1
    Loop
    
    Lcd sekundy ; " : " ; minuty ; " : " ; godziny
    


    Teraz się kompiluje, nie wiem skąd wziąłem to +1 ^^
  • #22 9238701
    Bambus97
    Poziom 15  
    Ja to w 100% rozumiem :D, ale zajmuje mało miejsca, nie zabiera żadnego pinu ( lcd i tak będzie podłączony) i zużywa mniej enegrii.
    Pozdrawiam
    @Edit zaraz zapodam kod, czy będzie działał.

     $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Sda = Portc.1
    Config Scl = Portc.0
    
    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
    
       If Pinb.0 = 1 Then
       Incr Sekundy
       End If
    
       If Pinb.1 = 1 Then
       Incr Minuty
       End If
    
       If Pinb.2 = 1 Then
       Incr Godziny
       End If
    
          I2cstart
          I2cwbyte Ds1307w
          I2cwbyte 0
          I2cwbyte Ustsek
          I2cwbyte Ustmin
          I2cwbyte Ustgodz
          I2cstop
    
       Do
          I2cstart
          I2cwbyte Ds1307w
          I2cwbyte 0
          I2cstart
          I2cwbyte Ds1307r
          I2crbyte Sekundy
          I2crbyte Minuty
          I2crbyte Godziny
          I2cstop
    
          Waitms 500
    
          Cls
    
          Lcd Sekundy ; " : " ; Minuty ; " : " ; Godziny
       Loop 
  • #23 9240177
    piotrva
    VIP Zasłużony dla elektroda
    Powinno działać.
    Nie mam tego zegarka na stanie więc nie sprawdzę ale wygląda ok.
    No poza ustawianiem czasu, bo to totalnie klapa...
  • #24 9240278
    Bambus97
    Poziom 15  
    Hmm, a w jaki sposób było by odpowiedniej?
    Aa, rozumiem, wszystkie liczby w formacie dziesiętnym odczytane lub do zapisu na pamięci muszę przekonwertować na format BCD?
    Zaraz coś zklece :D
    @Edit
    Zampomniałem podmienić zmienne sekundy,minuty,godziny na ustsek, ustmin
    i ustgodz w instrukcjach warunkowych...
    Nowy kod, bedzie ok?
     $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Sda = Portc.1
    Config Scl = Portc.0
    
    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
    
       If Pinb.0 = 1 Then
       Incr Ustsek
       End If
    
       If Pinb.1 = 1 Then
       Incr Ustsek
       End If
    
       If Pinb.2 = 1 Then
       Incr Ustgodz
       End If
    
       Ustgodz = Makebcd(ustgodz)
       Ustmin = Makebcd(ustmin)
       Ustsek = Makebcd(ustsek)
    
       Sekundy = Makebcd(sekundy)
       Minuty = Makebcd(minuty)
       Godziny = Makebcd(godziny)
    
          I2cstart
          I2cwbyte Ds1307w
          I2cwbyte 0
          I2cwbyte Ustsek
          I2cwbyte Ustmin
          I2cwbyte Ustgodz
          I2cstop
    
       Do
          I2cstart
          I2cwbyte Ds1307w
          I2cwbyte 0
          I2cstart
          I2cwbyte Ds1307r
          I2crbyte Sekundy
          I2crbyte Minuty
          I2crbyte Godziny
          I2cstop
    
          Waitms 500
    
          Cls
    
    
          Lcd Sekundy ; " : " ; Minuty ; " : " ; Godziny
       Loop
    
  • #25 9240566
    piotrva
    VIP Zasłużony dla elektroda
    To teraz pytanie na logikę, ile razy po uruchomieniu kodu zostaną sprawdzone przyciski?
    Jak udzielisz poprawnej odpowiedzi to się dowiesz co jest nie tak...
  • #26 9241088
    Bambus97
    Poziom 15  
    Aaaa, rozumiem, chodzi o to że tylko raz?
    Czyli instrukcje warunkowe trzeba umieścić w pętli nieskończonej?
    Pozdrawiam

    Poprawiony kod, zauważyłem małe niedoskonałości oprócz tych o których mówisz
          Config Sda = Portc.1
          Config Scl = Portc.0
    
          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
             Incr Ustsek
             End If
    
             If Pinb.1 = 1 Then
             Incr Ustsek
             End If
    
             If Pinb.2 = 1 Then
             Incr Ustgodz
             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
         loop
          
  • #27 9241116
    piotrva
    VIP Zasłużony dla elektroda
    tak, w pętli nieskończonej i to z odpowiednią obsługą (eliminacją) drgań styków oraz opóźnieniami, bo inaczej klikniesz raz, a zwiększysz godziny o parę tysięcy :D
  • #28 9241420
    Bambus97
    Poziom 15  
    Do zniwelowania drgań styków wystarczy polecenie waitms 25 w instrukcji warunkowej?
    Użyłem go w pilocie rc5, i tak samo zmieniłem kod zegarka.
    Teraz czas na pilota rc5 :D
    Wymyśliłem coś takiego:
    $regfile = "attiny2313.dat"
    $crystal = 1000000
    
    Dim Mikro1 As Byte
    Dim Mikro2 As Byte
    Dim Mikro3 As Byte
    Dim Mikro4 As Byte
    Dim Wlacz As Byte
    
    Dim Togbit As Byte , Command As Byte , Address As Byte
    
    Togbit = 0
    Address = 3
    
    Do
          If Pinb.0 = 1 Then
          Waitms 25
          Command = 10
          Wlacz = 1
          End If
    
          If Pinb.1 = 1 Then
          Waitms 25
          Command = 20
          Wlacz = 1
          End If
    
          If Pinb.2 = 1 Then
          Waitms 25
          Command = 30
          Wlacz = 1
          End If
    
          If Pinb.3 = 1 Then
          Waitms 25
          Command = 40
          Wlacz = 1
          End If
    
       If Wlacz = 1 Then
       Waitms 500
       Rc5send Togbit , Address , Command
       End If
    Loop
    
    End
  • #29 9243582
    piotrva
    VIP Zasłużony dla elektroda
    Drganie styków eliminujesz tak:
    1. sprawdzenie stanu pinu, jeśli 0 to:
    2. czekasz np. te 20 ms
    3. sprawdzenie stanu pinu, jeśli nadal 0 to wykonujesz działanie, w przeciwnym wypadku nie robisz nic
  • #30 9243732
    Bambus97
    Poziom 15  
    aha, soft pilota jest ok, powinien działac?
REKLAMA