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

[bascom] pomoc w analizie programu

wsk175 16 Paź 2009 23:23 1199 8
REKLAMA
  • #1 7137953
    wsk175
    Poziom 11  
    Witam! programuje w bascomie już troche czasu i mam już jakieś pojęcie o tym programie, ale od czterech dni próbuje rozgryźć kod i narazie żadnych postępów.
    Kod wygląda tak:



    Pewnie wiecie o co chodzi w programie ale opisze działanie i problem.
    Otóż program zczytuje znaki z wewnętrznej pamięci eeprom atmegi8 i wyświetla go znak po znkau na lcd, a gdy tekst wyswietlany osiągnie 16 znaków (LCD 16*2), wtedy wszystkie znaki są przesuwane o jedno miejsce w lewo i jest wyświetlany jeden następny znak i znowu tekst jest przesuwany w lewno i tak do wyczerpania tesktu.

    I nie rozumiem jak to jest, że:
    -zadeklarowana jest zmienna zn_w_lini i skąd bascom wie, że chodzi o to aby wyswietlil 16 znakow ?
    -jest zadeklarowany "adres" i skąd bascom bierze ten adres ?
    -adres = adres +128 ??
    -potem mamy "readeeprom znak, adres" skąd on wie, że gdy ma czytać znak czyta jedną literke z eepromu ?
    -potem jest incr adres (wiem ze inkrtementacja)? najpierw wyjaśnijmy skąd wziął sie adres.
    -i adres = adres - 15 czyli przesuwa wszystkie znaki w lewo ?
    -ostatnie juz ;) jak zrobic żeby tekst leciał w drugą strone czyli nie w lewo a w prawo ?

    wiem, że moge go wrzucić do procka i działa...ale chce poznać zasade działania tego programu.

    Pozdrawiam.
  • REKLAMA
  • #2 7138129
    alien_audio
    Poziom 21  
    Witam.
    Program nie pobiera po jednym znaku ale pobiera 16 znaków, odczekuje 2ms następnie pobiera znowu 16 znaków z tym , że zaczyna pobierać o jedną komórkę pamięci dalej. W sumie daje to złudzenie przesuwania sie napisu. Można przerobić aby przesuwał sie w drugą stronę.
  • REKLAMA
  • #3 7138216
    wsk175
    Poziom 11  
    jak puści się program linijka po linijce to widać, że z każdym wykonaniem sie pętli do loop jest pobierany jeden znak i wypisywany na lcd. wiem, że sie da... a jakies wskazówki do tego ?
  • #4 7138234
    pini0
    Poziom 14  
    na starcie ustawiasz kierunek=15.
    Dochodzisz do końca tekstu np adresu 80 i wtedy zmienna kierunek przyjmuje wartość
    kierunek=17.
  • #5 7138298
    wsk175
    Poziom 11  
    wtedy tekst przeskakuje o kilka liter dalej a nie o jedną ale wciąż do przodu, a nie do tyłu... a jakieś odpowiedzi na wcześniej postawione pytania ?
  • REKLAMA
  • #6 7138331
    pini0
    Poziom 14  
    wsk175 napisał:



    -zadeklarowana jest zmienna zn_w_lini i skąd bascom wie, że chodzi o to aby wyswietlil 16 znakow ?
    -jest zadeklarowany "adres" i skąd bascom bierze ten adres ?
    -adres = adres +128 ??
    -potem mamy "readeeprom znak, adres" skąd on wie, że gdy ma czytać znak czyta jedną literke z eepromu ?
    -potem jest incr adres (wiem ze inkrtementacja)? najpierw wyjaśnijmy skąd wziął sie adres. -nie wiem jak to wytłumaczyć
    -i adres = adres - 15 czyli przesuwa wszystkie znaki w lewo ?
    -ostatnie juz ;) jak zrobic żeby tekst leciał w drugą strone czyli nie w lewo a w prawo ?

    wiem, że moge go wrzucić do procka i działa...ale chce poznać zasade działania tego programu.

    Pozdrawiam.


    -16 razy jest powtórzona procedura for next
    -na początku adres przyjmuje 1 a później oblicza go 16*(+1) -15
    -pominięcie jakiejś części eepromu (tekstu)
    -on nie wie, on czyta zaadresowaną wartość
    -nie wiem jak to wytłumaczyć
    -adres = adres - kierunek
  • REKLAMA
  • #7 7138550
    wsk175
    Poziom 11  
    dobra juz cos mi rozjaśniłes. wiem skąd sie wziął adres i jak są czytane litery. teraz kminie jak zrobić żeby tekst przesuwał się w lewo... próbuje zrobić tak jak Ty mówisz ale jakoś mi to nie działa... zamieszczam kod:

    $regfile = "m8def.dat"
    $crystal = 8000000
    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 Portd = Input
    $data
    Cls
    Dim Zn_w_lini As Byte
    Dim Znak As Byte
    Dim Adres As Integer
    Dim Osiem As Byte
    Dim Kierunek As Byte
    Kierunek = 15
    Waitms 100
    
    Cursor Off
    
    Cls
    Do
    Home
    For Zn_w_lini = 0 To 15
    Readeeprom Znak , Adres
    Do
    Loop Until Pinc.0 = 1
    Lcd Chr(znak)
    Incr Adres
    Next
    If Adres = 16 Then
    Kierunek = 17
    Adres = Adres - Kierunek
    End If
    Loop Until Pind.1 = 1
    
    
    $eeprom
    Data "Nikola Tesla1111111111111,"
    Data " (ur. 10 lipca 1856 w Smiljanie, zm. 7 stycznia 1943 w Nowym Jorku)"
    Data "Nikola Tesla2222222222,"
    Data " (ur. 10 lipca 1856 w Smiljanie, zm. 7 stycznia 1943 w Nowym Jorku)"
    Data "Nikola Tesla33333333333,"
    Data " (ur. 10 lipca 1856 w Smiljanie, zm. 7 stycznia 1943 w Nowym Jorku)"
    Data "Nikola Tesla44444444444444,"
    Data " (ur. 10 lipca 1856 w Smiljanie, zm. 7 stycznia 1943 w Nowym Jorku)"
    End


    i mam do Ciebie sugestje:
    -bascom musi wiedziec co ma czytac i wiedzieć skąd to wziąść. nie moge mu zrobic petli for 15 to 0 bo on nie przeczyta tych liter wspak. Bedzie musiał w pamieci przechowac adresy komorek ktore juz pobral (wyswietlil) i ewentualnie je dekrementowac i dopiero wyswietlac znak po znaku. ma to jakis sens ?
  • Pomocny post
    #8 7138834
    pini0
    Poziom 14  
    Ten powinien działać musisz wszystko wykonywać w odpowiedniej kolejności.
    A wspak to on może też czytać sensu to nie będzie miało (2 znacznie nawet objaśnienie :D )musisz zmienić na adres-1,
    kierunek musi być dodawany zakres adresu dla zmiany kierunku zamienione miejscami i adres musi się zaczynać na 80.
    A Pętla for next jest tylko po to aby wykonać odczyt znaku 16razy.

    
    $regfile = "m8def.dat"
    $crystal = 8000000
    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 Portd = Input
    $data
    Cls
    Dim Zn_w_lini As Byte
    Dim Znak As Byte
    Dim Adres As Integer
    Dim Osiem As Byte
    Dim Kierunek As Byte
    'Kierunek = 15
    'Waitms 100
    
    Cursor Off
    
    Cls
    Do
    Home
    If Adres = 80 Then Kierunek = 17                            'na 80-tym znaku z pamięci zmień kierunek
    If Adres < 2 Then Kierunek = 15                             ' w tym miejscu jest lepiej nadać kierunek nie przeszło przez wstempne obliczenia a bez tej wartości by się źle wykonały
    For Zn_w_lini = 0 To 15
    Readeeprom Znak , Adres
    'Do
    'Loop Until Pinc.0 = 1
    Lcd Chr(znak)
    Incr Adres                                                  'adres +1   for next adres 16*(+1)
    Next
    'If Adres = 16 Then                  'właśnie w tym miejscu jest 16 adres po wyświetleniu '16 liter na wyswietlaczu wychodzi na to że na 16 literze chcesz cofać text
    'Kierunek = 17                                               'o ile liter zostanie przesunienty text -16
    Adres = Adres - Kierunek 
    'End If
    Loop Until Pind.1 = 1
    
    
    $eeprom
    Data "Nikola Tesla1111111111111,"
    Data " (ur. 10 lipca 1856 w Smiljanie, zm. 7 stycznia 1943 w Nowym Jorku)"
    Data "Nikola Tesla2222222222,"
    Data " (ur. 10 lipca 1856 w Smiljanie, zm. 7 stycznia 1943 w Nowym Jorku)"
    Data "Nikola Tesla33333333333,"
    Data " (ur. 10 lipca 1856 w Smiljanie, zm. 7 stycznia 1943 w Nowym Jorku)"
    Data "Nikola Tesla44444444444444,"
    Data " (ur. 10 lipca 1856 w Smiljanie, zm. 7 stycznia 1943 w Nowym Jorku)"
    End
    
  • #9 7139355
    wsk175
    Poziom 11  
    Teraz już wszystko jasne ! :D dzięki za pomoc, jestes wielki ;)
REKLAMA