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

BASCOM odczyt danych i exsport na RS232 z AT89C2051

04 Lut 2005 01:47 3070 12
  • Poziom 17  
    Witam wszystkich

    Nie mam pojęcia o Bascomie a muszę napisać przykłady , Proszę o pomoc
    szybkość 9600
    rezonator 110952

    Mamy 8 klawiszy od (P1.0 do P1.7) oczywiście zwierane do masy

    naciskam klawisz np. (P1.0) i uzyskuję na RS232 komunikat (#70, #13)
    naciskam klawisz np. (P1.1) i uzyskuję na RS232 komunikat (#71, #13)
    naciskam klawisz np. (P1.2) i uzyskuję na RS232 komunikat (#72, #13)
    itd.

    mamy matrycę 4x4

    Nadają (P1.0) , (P1.1) , (P1.2) , (P1.3)
    Odbierają (P1.4) , (P1.5) , (P1.6) , (P1.7) czyli mamy 16 klawiszy
    A efekt jest taki
    Naciśnięcie klawisza powoduje wysłanie „stringa”
    Np.
    Klawisz 1 - powoduje wysłanie komunikatu na RS232 (#70, #13)
    Klawisz 2- - powoduje wysłanie komunikatu na RS232 (#71, #13)
    Klawisz 3- - powoduje wysłanie komunikatu na RS232 (#72, #13)
    Itd.

    Jeszcze przyszedł mi jeden przykład do głowy
    mamy 8 klawiszy na linniach od (P1.0 do P1.7) a na wyjściu RS232
    uzyskujemy po naciśnięciu lub puszczeniu klawisza interpretację
    od 0 do 255

    Myślę że to też bysię wielu osobą przydało




    Oczywiście muszę brać pod uwagę drgania styków

    Proszę o pomoc o jakieś przykłady jak to w BASCOMIE napisać
  • Poziom 34  
    To banalnie proste w petli głównej sprawdzasz klawiature i wpisujesz do zmiennej po znalezieniu wcisnietego klawisza zatrymujesz skanowanie czekasz np 20 ms (tu ustalisz minimalny czas nacisniecia klawisza i pozbedziesz sie drgania stykow ) i ustawiasz jeszcze raz ten port z kturego zbierasz dane i jeszcze raz odczytujesz wartosc tego klawisza jesli jest zero konwertujesz wartosc i wystlasz do zmiennej na końcu pętli sprawdzasz zmienna jesli jest w niej jakas wartosc wysylasz ja i powracasz na poczatek skanowania. A tak na marginesie zmiec 2051 na 2313 i odpal psa jak to ma chodzic ciagle jako klawiatura bo 2051 zaliczy zwieche i klawiaturka stanie ale tylko jesli gdzies to lata na stale .... A jak ziesi sie to go pies postawi ...............
  • Poziom 17  
    kamyczek napisał:
    To banalnie proste w petli głównej sprawdzasz klawiature i wpisujesz do zmiennej po znalezieniu wcisnietego klawisza zatrymujesz skanowanie czekasz np 20 ms (tu ustalisz minimalny czas nacisniecia klawisza i pozbedziesz się drgania stykow ) i ustawiasz jeszcze raz ten port z kturego zbierasz dane i jeszcze raz odczytujesz wartosc tego klawisza jesli jest zero konwertujesz wartosc i wystlasz do zmiennej na końcu pętli sprawdzasz zmienna jesli jest w niej jakas wartosc wysylasz ja i powracasz na poczatek skanowania. A tak na marginesie zmiec 2051 na 2313 i odpal psa jak to ma chodzic ciagle jako klawiatura bo 2051 zaliczy zwieche i klawiaturka stanie ale tylko jesli gdzies to lata na stale .... A jak ziesi się to go pies postawi ...............


    To wiem ale jeżeli się nie zna składni to już nie jest takie proste

    Mogę to napisać np. w paskalu w 30s ale tego nie wcisnę w 2052
  • Poziom 39  
    DariuszEE napisał:

    ...
    To wiem ale jeżeli się nie zna składni to już nie jest takie proste
    Mogę to napisać np. w paskalu w 30s ale tego nie wcisnę w 2052


    A mówi się , że Basic jest pamięciożerny :wink:

    Poniżej programik dla matrycy 4x4 na P1 .

    Pozdrawiam
    Piotrek

    PS
    Ciekaw jestem jak to wygląda w Pascalu :)
  • Poziom 17  
    zumek napisał:
    DariuszEE napisał:

    ...
    To wiem ale jeżeli się nie zna składni to już nie jest takie proste
    Mogę to napisać np. w paskalu w 30s ale tego nie wcisnę w 2052


    A mówi się , że Basic jest pamięciożerny :wink:

    Poniżej programik dla matrycy 4x4 na P1 .

    Pozdrawiam
    Piotrek

    Bardzo dziękuje Piotrek
    umieszczę to jako listing

    ****************************************************************************

    $crystal = 11059200
    $regfile = "89c2051.dat"
    $baud = 9600
    Dim Row As Byte , Col As Byte , I As Byte , Nbit As Byte
    'Printbin 13
    P1 = &HFF
    Do
    For I = 0 To 3
    P1 = P1 Or &H0F
    Reset P1.i
    Col = P1 And &HF0
    Nbit = 3
    While Col > &H7F
    Shift Col , Left , 1
    Decr Nbit
    Wend
    If Nbit <> &HFF Then
    Row = I * 4
    Nbit = Nbit + Row
    Row = Lookup(nbit , Tablica)
    'wyślij dane na RS-232
    Printbin Row ; 13 ; 10
    '---------------------
    Waitms 25
    While P1 < &HF0 : Wend 'czeka na zwolnienie klawisza(y)
    Waitms 25
    End If
    Next
    Loop
    Tablica:
    'Jaka wartość "pójdzie" na RS-232 po wciśnięciu danego klawisza + 13
    'dla 1 2 3 4 5 6 7 8 9 0 A B C D E F
    Data 70 , 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , 80 , 81 , 82 , 83 , 84 , 85
    'klawiatura jest podączona jak poniżej
    'i programik nie wykrywa naciśnięcia kilku klawiszy jednocześnie :(
    '1 2 3 4 - p1.0
    '5 6 7 8 - p1.1
    '9 0 A B - p1.2
    'C D E F - p1.3
    '| | | |
    'p1.4 p1.5 p1.6 p1.7

    ****************************************************************************
    Niestety gdzieś jest błąd

    Koledzy a zapytam jeszcze inaczej
    Może znzcie także inne sposoby proszę o przykłady napewno się przydadzą innym


    PS
    Ciekaw jestem jak to wygląda w Pascalu :)


    Basic pewnie jest pamięciożerny najlepiej coś takiego napisać w asemblerze ale akurat nie mogę

    Pisałem w szkole taki przykład pod LPT
    od D0 do D3 nadawałem a a na kontrolnych czytałem
    wstawiasz coś takiego w autoexec.bat i po boot-cie działa
  • Pomocny post
    Poziom 39  
    Błąd przy kompilacji , czy po załadowaniu do proca :?:

    Piotrek
  • Poziom 17  
    zumek napisał:
    Błąd przy kompilacji , czy po załadowaniu do proca :?:

    Piotrek

    NIE po naciśnięciu jednego klawisza
    Linnia nadawcza PRZECHODZI W STAN NISKI i wszystko staje pewnie brakujre na końcu czegoś
    no i nie stabilnie czyta naciskanie "nie sprawdza drgań styków"

    Darek
  • Poziom 17  
    zumek napisał:
    To jest następna wersja :wink:


    Działa ale bardzo niestabilnie
    tzn np. naciścięcie P1.0 + P1.7 generuje kilka różnych znaków
    i nadal po linnie nadawcze wchodzą w stan niski i nie wracają

    Mam kłopot
    napisałem coś takiego

    Ale wysyłany jest znak a potem #13 , #10
    Jak zrobić by CPU nie wysyłał tego rrugiego znaku (#10)


    **************************************************************************
    $crystal = 11059200
    $baud = 9600

    Wait 1
    Print "s"

    Do
    If P1.0 = 0 Then
    Waitms 100
    Print "A"
    Elseif P1.1 = 0 Then
    Waitms 100
    Print "B"
    Elseif P1.2 = 0 Then
    Waitms 100
    Print "C"
    Elseif P1.3 = 0 Then
    Waitms 100
    Print "D"
    Elseif P1.4 = 0 Then
    Waitms 100
    Print "a"
    Elseif P1.5 = 0 Then
    Waitms 100
    Print "b"
    Elseif P1.6 = 0 Then
    Waitms 100
    Print "c"
    Elseif P1.7 = 0 Then
    Waitms 100
    Print "d"
    Elseif P3.3 = 0 Then
    Waitms 100
    Print "abcdefghijklmnoprstuwxyzABCDEFGHIJKLMNOPRSTUWXYZ"
    Elseif P3.2 = 0 Then
    Waitms 100
    Print "1234567890"
    Elseif P3.4 = 0 Then"
    Waitms 250"
    Print Acc"
    End If
    Loop

    *********************************************************************


    Darek
  • Poziom 39  
    Witam.

    Funkcja "Print" standardowo wysyła znak końca linii CR+LF.
    Aby tak się nie działo , trzeba dodać na końcu polecenia średnik ";" np.
    Print "A" - na RS zostanie wysłany znak "A" czyli chr(65)+chr(13)+chr(10)
    Print "A"; - na RS zostanie wysłany znak "A"
    Print "A";chr(13); - na RS zostanie wysłany znak "A" +chr(13)

    Piotrek

    PS
    Czy pisząc "linie nadawcze" masz na myśli P1.0-P1.3 :?:
    I popraw jescze to:
    Code:

    For I = 0 To 3
    '   P1 = P1 Or &H0F    ' usuń
        Reset P1.i
        ....
        Set P1.i        ' dodaj
    Next
  • Poziom 17  
    zumek napisał:
    Witam.

    Funkcja "Print" standardowo wysyła znak końca linii CR+LF.
    Aby tak się nie działo , trzeba dodać na końcu polecenia średnik ";" np.
    Print "A" - na RS zostanie wysłany znak "A" czyli chr(65)+chr(13)+chr(10)
    Print "A"; - na RS zostanie wysłany znak "A"
    Print "A";chr(13); - na RS zostanie wysłany znak "A" +chr(13)

    Piotrek

    PS
    Czy pisząc "linie nadawcze" masz na myśli P1.0-P1.3 :?:
    I popraw jescze to:
    Code:

    For I = 0 To 3
    '   P1 = P1 Or &H0F    ' usuń
        Reset P1.i
        ....
        Set P1.i        ' dodaj
    Next


    Wielkie dzięki
    pytanko jeszcze
    co znaczy For I = 0 To 3
  • Poziom 39  
    DariuszEE napisał:

    pytanko jeszcze
    co znaczy For I = 0 To 3


    Troszke mnie zaskoczyłeś :wink:
    Code:

    For I=0 To 3 'domyślnie STEP(krok)=1(dosłownie +1): wykonaj pętlę z wartościa początkową I=0
    ... początek pętli
    ...'dowolne operacje
    ...'Exit For 'wyjdź bezwarunkowo z pętli (opcja)
    ...
    Next 'zwiększ I o STEP(domyślnie I=I+1) i jeśli I>3 to koniec pętli , w przeciwnym wypadku skocz do początek pętli.

    Coś w tym guście :wink:

    W Pascalu nie ma pętli FOR:NEXT :?:

    Pozdrawiam
    Piotrek
  • Poziom 17  
    ok dzięki jeszcze jedno pytanko
    Gdzie umieścić no i jak pulsującą linnię
    tzn. żeby było widać iż program chodzi że się nie zawiesił

    Znalazłem jeszcze znalazłem bardzo fajne możliwości obsługi poru
    jest to BARDZO PROSTE

    ****************************************************************
    NADAJNIK procesor wysyła cały czas stany Linni portu (P1)
    ****************************************************************
    Code:
    $baud = 9600                                                 'informacja o prędkości transmisji
    
    $crystal = 11059200                                           'informacja o zastosowanym rezonatorze kwarcowym
    P1 = 255                                                      'port P1 jako wejście

    Do                                                            'początek pętli
    Print P1 ;chr(13);                                      'wysłanie łączem szeregowym stnu portu P1
    Loop                                                            'koniec pętli   

    ****************************************************************

    ****************************************************************
    ODBIORNIK procesor cały czas słucha RS232 i wysyła to na port (P1)
    ****************************************************************
    Code:
    $baud = 9600
    
    $crystal = 11059200


    Dim Dana As Byte
    Do
    Input Dana
    P1 = Dana
    Loop

    ****************************************************************