Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Odczyt danych szeregowych - BASCOM

Bonmis 25 Oct 2005 20:39 2975 20
Tespol
  • #1
    Bonmis
    Level 21  
    Witam
    Mam taki problem, potrzebuję odczytać dane szeregowe nadawane w/g załączonego wykresu i nie bardzo wiem jak się za to zabrać.
    Procesor ma dostać sygnał zegarowy i szynę danych, potrzebuję odczytać dane (8bitów) i zapisać je do jakiejś zmiennej. Proszę o naprowadzenie lub jakieś podpowiedzi bo na razie jestem początkującym w dziedzinie mikrokontrolerów.

    Bonmis
    [28-30.06.2022, targi] PowerUP EXPO 2022 - zasilanie w elektronice. Zarejestruj się za darmo
  • Tespol
  • #2
    Press
    Level 23  
    Poczytaj o poleceniu SHIFTIN
  • #3
    prokopcio
    Level 29  
    witam

    jeśli to ma być tylko proste odebranie jednego bajtu to w assemblerze (bo nie znam bascoma) ale można zrobić wstawkę :

    _______CLR A_____________stan początkowy = 0
    _______CLR C_____________
    _______MOV R2,#8_________ilość bitów
    loop:___JB CLK,$___________czekaj na clk = 0
    _______JNB CLK,$__________czekaj na zbocze narastjące (na clk = 1)
    _______MOV C,DATA________kopiuj dane (jeden bit) do bitu c
    _______RLC A______________przesuń bity w lewo i wpisz do akumulatora c na najmłodszą pozycję
    _______DJNZ R2,loop________licz bity


    gdzie:
    CLK - wejście zegarowe np. P1.0
    DATA - wejście danych np. P1.2

    odebrany bajt jest w akumulatorze

    jest to "prymitywny" programik dla naprowadzenia...
    jak coś to pytaj.
  • #4
    Bonmis
    Level 21  
    @Press

    Chyba o to chodziło.

    @prokopcio

    Nie to nie ma być jeden bajt, ma to robić nonstop i to co odbierze wysyłać portem równoległym.

    Bonmis
  • #5
    desa
    Level 14  
    Jeżeli piszesz w bascome to proponuje funkcje:


    INPUT ["tekst_zachęty" ] , zmienna1 [ , zmiennan ] [ NOECHO ] [ TIMEOUT = xx ]

    gdzie:

    tekst_zachęty opcjonalnie - tekst pojawiający się w oknie terminala,
    zmienna1zmiennan zmienna której przypisana zostanie odebrana wartość.
    xx opcjonalnie, czas opóźnienia.
    Instrukcja INPUT może być używana gdy system mikroprocesorowy posiada interfejs RS-232, połączony z portem COM komputera osobistego. W ten sposób za pomocą programu emulatora terminala, mogą być wprowadzane dane z klawiatury. Środowisko BASCOM posiada wbudowany emulator terminala.

    Podanie parametru NOECHO powoduje, że odczytywane znaki nie będą przesyłane z powrotem do terminala.

    Jeśli podano dodatkowy parametr TIMEOUT należy podać czas po upłynięciu którego działanie instrukcji zostanie przerwane, jeśli nie zostaną wprowadzone znaki. Wpisanie zera powoduje oczekiwanie przez maksymalnie dostępny czas.

    Do odmierzania czasu nie jest używany żaden z liczników. Natomiast są rezerwowane 4 bajty składające się na programowy licznik.

    Uwaga! Jeśli podano parametr TIMEOUT to wszystkie instrukcje INPUT/INPUTHEX muszą posiadać tą opcję.



    A wieć w twoim przypadku np
    Code:

    $baud = 1200                           
    $crystal = 12000000
    Dim V As Byte
    start:
    input V
    p0=V
    goto start


    Zasada jest taka program czeka na w lini "input V" na odebranie czegos przez port RS jesli mikrokontroler odbierze to przechodzi do nastepnej lini i ustawia port p0 w wartosc odczytana z rsa nastepnie powraca spowortem i oczekuje kolejnego bajtu.
  • Tespol
  • #6
    Bonmis
    Level 21  
    @desa

    To nie zadziała. Po pierwsze nie wiem z jaką częstotliwością jest taktowany zegar, po drugie dane muszą być odbierane w takt zegara, zegar nie jest podawany cały czas, tylko w momencie wysyłania danych.

    Próbuje z Shiftin, tylko nie wiem jaki mam podać parametr -opcje ( z helpa)??

    4 najpierw bit MSB jest wpisywany przy niskim poziomie logicznym na końcówce zegarowej
    5 najpierw bit MSB jest wpisywany przy wysokim poziomie logicznym na końcówce zegarowej
    6 najpierw bit LSB jest wpisywany przy niskim poziomie logicznym na końcówce zegarowej
    7 najpierw bit LSB jest wpisywany przy wysokim poziomie logicznym na końcówce zegarowej




    Moj kod:

    Code:

    $regfile = "8515def.dat"
    $crystal = 8000000

    Config Portc = Output
    Config Pinb.5 = Input
    Config Pinb.7 = Input

    Dim Dane As Byte



    Do

       Shiftin Pinb.5 , Pinb.7 , Dane , 4 , 8 , 10
       Portc = Dane

       Loop
    End


    Bonmis
  • #7
    Bonmis
    Level 21  
    Trochę odświeżę temat bo nie mogę sobie poradzić. Ciągle odczytuję śmieci. Pin RS steruje czy to jest instrukcja dla LCD czy dane do LCD.
    Wydaje mi się patrząc na wykres że gdy jest wysyłana instrukcja to idzie najpierw impuls L a potem komenda. Podłączyłem się oscyloskopem (niestety mam tylko analogowy) i widać że cały czas jest stan H i lecą impulsy L. No i teraz pytanie jak zrobić w Bascomie aby po odczytaniu impulsu L na RS procesor wiedział że ma odczytać instrukcję??? To co wymłodziłem załączam poniżej:

    Code:

    Do

       If Pind.3 = 0 Then                                       'jeśli RS=0 to LCD przyjmuje instrukcje
       Shiftin Pind.1 , Pind.0 , Komendy_we , 4 , 8             'odczytanie instrukcji i zapisanie do zmiennej Komendy_we
       Gosub Konwersja                                          'konwersja komend sterujących
       Else
       Shiftin Pind.1 , Pind.0 , Dane , 4 , 8
       Glcddata Dane                                            'wysłanie danych do LCD
       End If

       Set Portd.7                                               'zapalenie diody LED

    Loop
    End                                                         'koniec pętli głównej


    Bonmis
  • #8
    zumek
    Level 39  
    Z załączonego przez Ciebie wykresu wynika , że ważny bit na SID , należy odczytać przy zboczu narastającym - Shiftin Pind.1 , Pind.0 , Dane , 5 , 8 .

    Piotrek
  • #9
    Bonmis
    Level 21  
    Robię to na Atmega8.

    Zmiana na Shiftin Pind.1 , Pind.0 , Dane , 5 , 8 nic nie daje. Już wcześniej próbowałem. Może któryś z kolegów podałby konkretny wpis jak ma to wyglądać w tym konkretnym przypadku? Zastanawiam się jeszcze czy może być jakaś inna przyczyna moich problemów z odczytem. Może macie jakieś pomysły?

    Bonmis
  • #10
    prokopcio
    Level 29  
    Proponuję spróbować jednak w assemblerze (jak napisałem na początku) czy wogóle odbierzesz choć jeden bajt... zawsze można nieco rozbudować programik.

    POWODZENIA
  • #11
    Bonmis
    Level 21  
    Niestety Bascoma się dopiero uczę a ASM-a to nie znam wogóle. Czy mógłbyś napisać gotową procedurkę odczytu i zapisania do jakiejś zmiennej, wtedy mógłbym to wkleić do mojego programu i sprawdzić czy zadziała.

    Bonmis
  • #12
    prokopcio
    Level 29  
    no przecież Ci napisałem gotowca (trzeci post) - bascoma nie znam ani troszkę więc Ci ni powiem jak to wkleić ale napewno bardzo prosto...
  • #13
    Bonmis
    Level 21  
    Tak też zrobiłem tylko chyba nie za bardzo dobrze. Przepisałem to w ten sposób:
    Code:

    $asm

    clr A                                                       'stan początkowy = 0
    CLR C
    mov R2 , #8                                                 'ilość bitów
    Loop : Jb Clk , $                                           'czekaj na clk = 0
    Jnb Clk , $                                                 'czekaj na zbocze narastjące (na clk = 1)
    mov C , Data                                                'kopiuj dane (jeden bit) do bitu c
    Rlc A                                                       'przesuń bity w lewo i wpisz do akumulatora c na najmłodszą pozycję
    Djnz R2 , Loop                                              'licz Bity

    $end Asm


    Napisałeś że odczytany bajt jest w akumulatorze, możesz wskazać mi dokładnie gdzie??? Nie bardzo wiem jak go mam odczytać, jest w jakiejś zmiennej???

    Bonmis
  • #14
    zumek
    Level 39  
    prokopcio napisał kod w asm , tylko nie dla Twojego proca.Jego kod jest dla procków MCS-51 , a nie AVR i u Ciebie nie zadziała , a nawet się nie skompiluje :(
    Napisz , czy shiftin wogóle coś wczytuje :?:

    Piotrek
  • #15
    prokopcio
    Level 29  
    1. wyrzuć wszystkie komentaże
    2. zamiast słów clk wstaw nazwę pinu gdzie masz wpięty sygnł zegarowy np. p3.0
    3. zamiast słów data wstaw nazwę pinu gdzie masz wpięty sygnł danych np. p3.1
    5. Jak program dojdzie do tej wstawki to będzie czekał na dane (na sygnał zegarowy)...
    4. Akumulator jest zmienną o nazwie A i w niej będzie odebrany bajt...
  • #16
    Bonmis
    Level 21  
    Tak shift in wczytuje dane. Widzę na lcd jak zmieniają się piksele natomiast nie działa żadne adresowanie czyli dane są nieprawidłowe. Myślę że mój problem jest tu:
    Code:

    If Pind.3 = 0 Then
    Shiftin Pind.1 , Pind.0 , Komendy_we , 5 , 8
    Gosub Konwersja


    Program zaczyna czytać dane w momencie gdy na RS jest L a wtedy jest jeszcze wysyłany bit DB0 poprzedniego bajtu a powinien zacząć od bitu DB7. Jak mam zrobić by zaczął czytać dane w momencie opadania lub narastania zbocza na pinie RS???

    Bonmis
  • #17
    prokopcio
    Level 29  
    Prawda - przepraszam nie doczytałem dla jakiego to procka....
  • #18
    zumek
    Level 39  
    Bonmis wrote:

    ...
    Program zaczyna czytać dane w momencie gdy na RS jest L a wtedy jest jeszcze wysyłany bit DB0 poprzedniego bajtu a powinien zacząć od bitu DB7. Jak mam zrobić by zaczął czytać dane w momencie opadania lub narastania zbocza na pinie RS???
    Bonmis

    Z wykresu nie wynika , kiedy się zmienia stan linii RS , a jedynie to , że sterownik wyświetlacza przy odbieraniu 8-go(ostatniego bitu z bajtu) bada stan lini RS i na tej podstawie interpretuje czy to dane czy komenda.W którym momencie sterownik aktualizuje linię RS , tego niestety nie wiemy , a to może następować , w dowolnym momencie transmisji bajtu , byle stan był ustalony gdy wysyłany jest ostatni.Bez assemblera , raczej sie nie obędzie.
    Rozumiem , że chciałbyś "wyśledzić" , w jaki sposób jest sterowany ten wyświetlacz i jakie dane otrzymuje :D

    Piotrek
  • #19
    Bonmis
    Level 21  
    A myślałem że Bascom da radę.
    Dokładnie chodzi mi o to aby odebrać te dane, przekonwertować instrukcje, bo danych nie trzeba i wysłać do innego LCD.
    Czy któryś z kolegów byłby wstanie napisać mi taką wstawkę w assemblerze? Z całą resztą mam nadzieję że sobie z Waszą pomocą poradzę.

    Bonmis
  • #20
    zumek
    Level 39  
    Bonmis wrote:
    A myślałem że Bascom da radę.
    Dokładnie chodzi mi o to aby odebrać te dane, przekonwertować instrukcje, bo danych nie trzeba i wysłać do innego LCD.
    Czy któryś z kolegów byłby wstanie napisać mi taką wstawkę w assemblerze? Z całą resztą mam nadzieję że sobie z Waszą pomocą poradzę.

    Bonmis

    Z tym assemblerem , to może się pośpieszyłem(choć byłoby najprościej) :D Jak dla mnie , problemem jest wykrycie początku transmisji. Czy można by skorzystać dodatkowo z linii CS2 lub CS1B :?: Jeśli tak , to ... jest to chyba do opanowania :D

    Piotrek
  • #21
    Bonmis
    Level 21  
    LCD dostaje sygnały na pinach:

    CS1B
    RS
    SCLK
    SID
    RESET

    Na wszystkich oprócz RESET pojawiają się impulsy, RESET ma na stałe H.
    Jak w takim razie wykorzystać sygnały na CS1B??
    Podejrzewam że chcesz policzyć bity i przy 8 sprawdzić stan na pinie RS.


    Skleciłem coś takiego:
    Code:


       If Pind.2 = 0 Then                                       'odczyt CSB1
       Shiftin Pind.1 , Pind.0 , Komendy_we1 , 5 , 7            'odczyt 7 bitów
       Stan_rs = Pind.3                                         'sprawdzenie stanu RS
       Shiftin Pind.1 , Pind.0 , Komendy_we2 , 5 , 1            'odczyt 1 bitu
       Shift Komendy_we1 , Left , 1
       Komendy_we = Komendy_we1 + Komendy_we2                   'złożenie całego bajtu
       End If

    Jest lepiej bo śmieci pojawiają się na całym LCD, czyli coś z adresowania zaczęło działać. Nie wiem tylko czy składnia tego co stworzyłem jest prawidłowa i czy w ten sposób zamierzałeś to zrobić.

    Bonmis