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

[at8][bascom] TX i RX danych po rs między dwoma UC

tomson5 04 Lut 2010 19:38 2123 9
REKLAMA
  • #1 7643722
    tomson5
    Poziom 16  
    Witam
    Szykuje do swojego projektu transmisję po RS między dwoma mikrokontrolerami
    Udało mi się już coś uruchomić ale chciałbym się upewnić czy wszystko robię ok

    Nadawanie zrobiłem tak:

    'projekt regulatora temperatury
    $regfile = "m8def.dat"
    $crystal = 8000000
    $baud = 2400
    
    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
    'Nie korzystam z ADC więc Db7 = portc.0
    Config 1wire = Portb.0
    Dim Odczyt(2) As Byte , T As Integer , Temperatura As Single , Temperatura2 As Single
    
    Deflcdchar 1 , 14 , 10 , 14 , 32 , 32 , 32 , 32 , 32       ' replace ? with number (0-7)
    Deflcdchar 2 , 12 , 4 , 6 , 4 , 12 , 4 , 14 , 32       ' replace ? with number (0-7)
    
    Config Serialin = Buffered , Size = 20
    Config Serialout = Buffered , Size = 20
    Enable Interrupts
    
    
      Do
         Gosub Pomiar
         Gosub Wyswietlanie
    
    
        Loop
      End
    
    
      Pomiar:
      1wreset                     'reset
      1wwrite &HCC                'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
      1wwrite &H44                'dokonaj
      Waitms 750                  'przeczekaj czas konwersji
      1wreset                     'reset
      1wwrite &HCC                'rozkaz adresowy SKIP ROM
      1wwrite &HBE                'rozkaz funkcyjny - polecenie odczytu DS18x20
      Odczyt(1) = 1wread(2)       'odczytaj dwa pierwsze bajty
      T = Odczyt(2)               'przepisz starszy bajt do zmiennej typu Integer
      Shift T , Left , 8          'przesuń ten bajt w lewo na wyższe pozycje
      T = T + Odczyt(1)           'przepisz - dodaj młodszy bajt
      Temperatura = T / 2         'wyraź w stopniach Celsjusza, wynik wpisz do zmiennej Single
    
    
       Return
    
      Wyswietlanie:
     If Temperatura <> Temperatura2 Then
      Temperatura2 = Temperatura
        Print Temperatura ; Chr(13) ;     'TUTAJ WYSYŁAM ZMIENNĄ PO RS232
        Cls
         Locate 1 , 1 : Lcd "Temp="
         Locate 1 , 6 : Lcd Temperatura ; Chr(1) ; "C"    'wyświetl wynik ze zmiennej Single
               Cursor Off
       End If
      Return
    



    Następnie mam dwie wersję odbioru i nie wiem która będzie lepsza

    PIERWSZA
    $regfile = "m8def.dat"
    $crystal = 8000000
    $baud = 2400
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    
    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
    Enable Interrupts
    Enable Urxc
    On Urxc Odczyt_rs232
    Dim A As Byte
    Dim Temperatura As Single
     Do
       Cls
        Lcd "pusta pentla"
         Wait 1
    
     Loop
    End
    
    Odczyt_rs232:
    Input Temperatura
    Cls
    Lcd "temp=" ; Temperatura
    Wait 1
    Return
    



    DRUGA
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    $baud = 2400
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    
    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
    'Nie korzystam z ADC więc Db7 = portc.0
    
    Config Serialout = Buffered , Size = 20
    Config Serialin = Buffered , Size = 20
    Enable Interrupts
    
    Dim A As Byte
    Dim Temperatura As Single
    Do
    A = Ischarwaiting()
    If A = 1 Then
      Gosub Odczyt_rs232
     Else
     Cls
     Lcd "Pusta pentla"
     Wait 1
     End If
    Loop
    End
    
    Odczyt_rs232:
    Input Temperatura
    Cls
    Lcd "temp=" ; Temperatura
    Wait 1
    Return
    


    Która jest poprawniejsza politycznie :) ?
  • REKLAMA
  • #2 7644234
    xury
    Specjalista automatyka domowa
    Według mnie obie są błędne, a pierwsza jest karygodna.
    Błędy pierwszej:
    1. Wait w obsłudze przerwania !!!!!!!
    2. Odczyt w przerwaniu przez input, a bez bufora - po odebraniu znaku zawiśnie na Input.
    Błedy drugiej:
    1. Zupełnie nie potrzebny Gosub
    2. Skoro wykorzystujesz bufor to dlaczego nie Bytematch = 13 ?
    3. Znowu Input zawiśnie.
  • REKLAMA
  • #3 7644539
    tomson5
    Poziom 16  
    Już prostuje.
    Odnośnie PIERWSZEGO
    Wait`ów nie będzie to tylko tak dla testów

    Czy w przerwaniu powinno być tak:
    
    Odczyt_rs232: 
    A = Ischarwaiting() 
    If A = 1 Then 
    Input Temperatura 
    end if
    Return 
    


    Odnośnie DRUGIEGO
    GOSUB był tylko dla testu
    Nie kumam o co chodzi z tym bytematch = 13 ??
    Nie wiem dlaczego ale mi to działało i co zrobić aby po tym imput "nie zawisło ??
  • #4 7644886
    Logan
    Poziom 30  
    tomson5 napisał:
    Nie kumam o co chodzi z tym bytematch = 13 ??


    O to, że Kolega jest mało samodzielny! Link .
  • REKLAMA
  • #5 7644994
    tomson5
    Poziom 16  
    Faktycznie teraz się dopatrzyłem, wcześniej korzystałem z polskiego Helpa do Bascoma i tam tego nie było.

    Czy tak będzie dobrze ??
    
    Config Serialout = Buffered , Size = 20 
    Config Serialin = Buffered , Size = 20 , bytematch = 13
    Enable Interrupts 
    
    Dim A As Byte 
    Dim Temperatura As Single 
      
    Do 
    A = Ischarwaiting() 
      If A = 1 Then 
        input temperatura
      End If 
    Loop 
    End 
    
    
  • #6 7645435
    xury
    Specjalista automatyka domowa
    Poczytaj dokładnie angielskiego helpa o config serialin.
    Jak już zrozumiesz to sam się zdziwisz, że to takie proste.
    Bo wystarczą nawet tylko dwie linijki kodu by odbierać z Uarta.
    Mala podpowiedź: Serial0CharMatch
  • REKLAMA
  • #7 7645579
    tomson5
    Poziom 16  
    Już nic mądrzejszego nie wymyśle.
    Czy chodzi o coś takiego ??

    Konfiguracja
    
    Config Serialout = Buffered , Size = 20 
    Config Serialin = Buffered , Size = 20 , bytematch = 13 
    Enable Interrupts 
    



    
    Serial0charmatch: 
      A = Ischarwaiting() 
        If A = 1 Then 
         input temperatura 
      End If 
    Return
    


    Jeżeli to nie tak to proszę o pomoc
  • #8 7645613
    Logan
    Poziom 30  
    W helpie są dwa przykłady, Ty mówisz o tym pierwszym, a my o tym drugim :)
  • #9 7647429
    tomson5
    Poziom 16  
    Znalazłem coś takiego, czy oto chodziło ??

    
    Config Serialin = Buffered , Size = 32 , Bytematch = 13
    
    '...
    If Flaga = 1 Then
       Input String_var
       Reset Flaga
    End If
    '...
    
    Serial0charmatch:
    Set Flaga     'można odczytać znaki z bufora poprzez np. Input String_var
    Return 
    
REKLAMA