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, Rs232, input, przesyłanie znaku z PC do avr

wojno 27 Cze 2008 12:50 5504 35
REKLAMA
  • #1 5290280
    wojno
    Poziom 12  
    Witam
    Potrzebuje porady jak zrobić przesyłanie znaku z PC do avr.

    Dokładnie o co mi chodzi.
    Mam układ, który mierzy temperaturę z jednego czujnika 1 wire i wysyła pomiar do komputera, co 1 sekundę.
    Chciałbym teraz rozbudować układ o możliwość wpisywania danych z komputera do avr. (0 lub 1)
    Wyczytałem ze do tego służy komenda input tylko ze ów komenda czeka na wprowadzony znak. Dane z komputera przesyłane będą nieprzewidywalnie, raz, co godzina raz, co tydzień. Chciałbym napisać procedurę, która sprawdzałaby czy na RS232 zostało coś wysłane, jeśli tak to wpisz do zmiennej, jeśli nie to nie czekaj na znak tylko idź dalej.
    Za wszelką pomoc będę wdzięczny dziękuje.
  • REKLAMA
  • #3 5290365
    wojno
    Poziom 12  
    Teraz widzę ze to troszeczkę inaczej będzie działało, będą 3 zmienne p1, p2, p3 i w każdej zmiennej będą albo 0 albo 1.
    Jeśli na p1 będzie 1 to zapal diodę, jeśli 0 to zgaś
    Jeśli na p2 będzie 1 to zapal druga diodę, jak zero to zgaś.
    Itd.
  • REKLAMA
  • #5 5290423
    wojno
    Poziom 12  
    Tylko jak powinien wyglądać kod, który będzie czekał na te dane, albo jak sprawdzić czy i co przyszło na UDRa. Podkreślę ze jestem początkującym
  • #6 5290431
    Balu
    Poziom 38  
    No i tutaj już Twoje zadanie:>
    UDR to normalny rejestr, jak go odczytujesz to znikają z niego dane:)
    Więc robisz zmienna=UDR,
    i teraz if zmienna=0 then <nic> else <jest dana w zmiennej>

    Coś na ten deseń:) Odpytuj gdzieś w pętli głównej :)
  • #7 5290491
    wojno
    Poziom 12  
    Czyli mam rozumieć że jak wyślę cos na port RS to te dane pojawią się w rejestrze UDR.

    I teraz
    if zmienna=0 then <nic> else <zapisz te dane do rejestru np. I i potem wyświetl>
    I jak wyświetlę na LCD tą zmienna to powinien wyświetlić te dane?
  • REKLAMA
  • #9 5290581
    wojno
    Poziom 12  
    Zadeklarowałem sobie zmienna w pętli głównej.
    P = UDR
    I wyświetlam ja na LCD
    Lcd "p: " ; P
    I wyświetla się 49 potem 54 potem 10 i tak dalej 13, 48.
    Czy to są poprawne dane i jak je zdekodować.
  • #10 5290589
    Balu
    Poziom 38  
    I to jest główny problem użytkowników bascom:/
    NIE MACIE POJĘCIA O SPRZĘCIE:>

    Poczytaj kolego o UART poczytaj o znakach sterujących, pomyśl!
    Nie ma wszystkiego na wyciągnięcie ręki..
    (10 i 13 patrz do tablicy ascii).
  • #11 5290906
    wojno
    Poziom 12  
    Nie jest to takie proste :(.
    Nigdzie nie mogę znaleźć znaków sterujących do UART
  • #13 5290967
    wojno
    Poziom 12  
    Misiu :)

    Te znaki sterujące to tylko tyle?
    Znalazłem ze to znaki końca linii, dobrze znalazłem?
  • #15 5291099
    wojno
    Poziom 12  
    No mam 2 pomysły .
    1) Po pierwsze, dlatego ze wysłałem to z komputera i automatycznie zostało dopisane znacznik końca linii przez system
    2) A po drugie to może, dlatego ze wyświetlam to komendą
    LCD "p: " ; P
    I to automatycznie dopisuje te znaki.

    Trafiłem?
  • #17 5292627
    dawid512
    Poziom 32  
    Balu dobrze radzi: zmienna zadeklarowana jako bajt(byte) posiada 8 bitów.
    A więc co musisz zrobić? Sprawdzać poszczególne bity tej zmiennej i na podstawie tego wykonywać całą resztę :).
  • #18 5293387
    wojno
    Poziom 12  
    Gdy wyświetlam zawartość zmiennej to na LCD widzę nie cala wartość tylko po kolei kody jak zrobić żeby wyświetlał cały 8 bitów za jednym razem.
  • REKLAMA
  • #19 5293399
    Balu
    Poziom 38  
    Ależ on wyświetla tylko w zapisie dziesiętnym:)

    Jak prosto zrobić? Nie weim.
    Napisz Sobie procedurę piszącą na LCD 1 lub 0 w zależności do danego bitu, zapętlij i go.

    Dodano po 58 [sekundy]:

    Mam nadzieję, że z Terminala w PC wysyłasz np. C D E F a nie 0101010110
  • #20 5293431
    wojno
    Poziom 12  
    Po prawdzie to wpisywałem 01111000. Nie mam tego jak sprawdzić teraz, ale czy może być taka sytuacja ze rs232 wysyła do komputera temperaturę t1 24.5 i ta temperatura jakoś wpada do rejestru UDR i gdy ją wyświetlam komenda LCD <ta zmienna> to pokazuje w kodzie ASCII właśnie tą temperaturę. ?
  • #21 5293442
    Balu
    Poziom 38  
    Co proszę?
    Ja się kiedyś załamię:/
    Czemu Wy młodzi Bascupowcy nie myślicie:(
    Może Ci ktoś innny pomoże, mnie ręce opadają.
    Wpisujesz 01111000 to wysyłasz 8 bajtów:> HELLO!
    Nie dziw się, że potem masz dużo śmieci na lcd;/
    co znaczy RS232 wysyła temperaturę? I W ogóle, wysyła do komputera, potem ona jakoś wpada do UDR i nagle się na LCD pokazuje? No to w którą stronę ją w końcu wysyłasz? W ogóle to pokaż kod i opisz DOKŁADNIE CO ROBISZ I CO CHCESZ UZYSKAĆ.
    AVE.

    Dodano po 31 [sekundy]:

    P.S. Kod ascii należy do liczb naturalnych...
  • #22 5293552
    wojno
    Poziom 12  
    Kod podeśle później, bo nie jestem przy komputerze, na którym to programuje.
    Chce uzyskać takie cos.
    Mierze temperaturę T1 co 1 sekundę wysyłam ją na rs232
    Print T1
    No i co jedną sekundę widzę kolejny rekord w pliku, bo dopisuje mi to do pliku.

    Teraz chce sterować przekaźnikiem z tego komputera np.(w drugim pliku pk1 mam dane 00000001) i jak wyśle zawartość tego pliku do atmegi to ma się załączyć przekaźnik.
  • #24 5293629
    wojno
    Poziom 12  
    Dziękuje powalczę z tym jak będę mógł

    Wiem że denerwują Was pytania dla Was proste, bo jesteście ekspertami, ale chce się czegoś nauczyć, w trakcie nauki pojawiają się pytania, na które trzeba odpowiedzieć, i naprawdę nie chcę wszystkiego podanego na tacy, szukam w Google, w książkach, ale niestety nie wszystko rozumiem. I tylko drugi człowiek, który też kiedyś zaczynał i może napotkał na podobne pytania.

    Pozdrawiam Wszystkich pasjonatów
  • #25 5293841
    Pituś Bajtuś
    Poziom 28  
    wojno napisał:
    Wiem że denerwują Was pytania dla Was proste, bo jesteście ekspertami, ale chce się czegoś nauczyć

    "Pisząc" w Bascomie za wiele się nie nauczysz. Ten wątek jest tego przykładem. Najpierw musisz zrozumieć sprzęt - tu konieczne jest czytanie dokumentacji procesora. Pozatym masz problem z rozróżnianiem liczb, znaków, systemów liczbowych itp. Bez podstaw cyfrówki nie warto się brać za programowanie. I nawet "cudowny" Bascom nie pomoże jak nie będziesz odrózniał liczby 1 od znaku 1.
  • #26 5299488
    wojno
    Poziom 12  
    To, od czego według Was powinienem rozpocząć żeby zacząć raczkować.

    Wspomniany kod
    
    $regfile = "m32def.dat"
    $crystal = 16000000
    $baud = 9600
    
    Config Lcdpin = Pin , Rs = Portc.7 , E = Portc.6 , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7
    Config Lcd = 16 * 2
    Config 1wire = Portd.7
    
    
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    
    Dim I1 As Integer , Ss As String * 6
    Dim I2 As Integer
    Dim Pk1 As Integer
    Deflcdchar 0 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32
    Cursor Off
    
    Cls
    
     Dsid1(1) = 1wsearchfirst()
     Dsid2(1) = 1wsearchnext()
    
    Do
      Pk1 = Udr
    
      Locate 2 , 1
       Lcd "pk1: " ; Pk1
       1wreset
       1wwrite &H55
       1wverify Dsid1(1)
       1wwrite &HBE
       I1 = 1wread(2)
       '---------------------------------
       1wreset
       1wwrite &H55
       1wverify Dsid2(1)
       1wwrite &HBE
       I2 = 1wread(2)
    '---------------------------------
       1wreset
       1wwrite &HCC
       1wwrite &H44
    
    
    
     Wait 1
    
    
     I1 = I1 * 10
       I1 = I1 / 16
       'If I1 > 0 Then Cls
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")
       Locate 1 , 1
       Lcd "T1 " ; Ss ; Chr(0) ; "C"
       Print "T1 " ; Ss
    
       I2 = I2 * 10
       I2 = I2 / 16
       'If I2 > 0 Then Cls
       Ss = Str(i2)
       Ss = Format(ss , " 0.0")
       Locate 2 , 1
       Loop
    


    Program teraz zachowuje się następująco włączam, LCD pokazuje 10 jak coś wyślę to rzeczywiście po odkodowaniu w tablicy ASCII jest to ten znak. Np. A kod który otrzymuje to 65.

    Problemy, jakie powstawiają
    1)Jeśli nic nie wysyłam to od czasu wyskakuje kod 84(T) i potem wraca do 10
    2)Jeśli wyśle na port 2 znaki RS to na LCD wyświetla się czasami, 82 83 ale przeważnie tylko 83
  • #28 5299538
    wojno
    Poziom 12  
    Jak to nie?

    1)$baud = 9600 - predkosc transmiji
    2)Pk1 = Udr - rejestr buforu
    3)Print "T1 " ; Ss - wysylanie na port do komputera zmiennej ss
  • #29 5299686
    Balu
    Poziom 38  
    No tak nie zauważyłem w gąszczu innych rzeczy tego PK1=UDR:)

    (Szkoda, że elka nie koloruje składni:/)
    Cytat:

    1)Jeśli nic nie wysyłam to od czasu wyskakuje kod 84(T) i potem wraca do 10

    A jak odepniesz COM od PCta to też się losuje coś?:>

    Przyjrzyj się kolego może funkcji CHR ( w połączeniu z LCD:) i tym, że sam te znaczki przeliczasz a niepotrzebnie)

    Oprócz tego zaprzyjaźnij się z IsCharWaitin i InKey...

    Pozdro.

    P.S. Zajrzyj do przykładów;) (Samples)
  • #30 5300167
    dawid512
    Poziom 32  
    Cytat:
    $crystal = 16000000
    $baud = 9600 


    Przy tej prędkości transmisji i tym kwarcu będziesz miał spory błąd. Jeżeli chcesz używać tej prędkości to zmień kwarc na 8MHz.

    Osobiście gdy potrzebuje transmisji RS232 to używam programu który odbiera i wysyła znaki w przerwaniu od UARTA.
REKLAMA