Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

On serial w BASCOMIE ? Jak to zrobić żeby działało?

Jacek1708 25 May 2007 16:07 1694 13
  • #1
    Jacek1708
    Level 12  
    Witam
    przeczytałem już chyba wszystko na temat komunikacji RS232 co było na elektrodzie i nadal nie wiem jak to zrobić żeby działało

    $regfile = "89c2051.dat"
    $crystal = 1105200
    $baud = 9600
    enable INTERRUPTS
    enable SERIAL
    on SERIAL przerwanie

    do
    loop

    przerwanie:

    if Scon.0 = 1 then Scon.0 = 0

    print "odebralem "

    if Scon.1 = 1 then Scon.1 = 0

    return


    zaraz po enable serial program wpada w przerwanie i powtaża je od print w kółko. Jak zrobić żeby przerwanie było tylko od RS a nie od print
    Proszę o pomoc . Czy to w ogóle jest możliwa?
  • #2
    crazy_phisic
    VIP Meritorious for electroda.pl
    A gdzie "End if" ?
  • #3
    Jacek1708
    Level 12  
    crazy_phisic wrote:
    A gdzie "End if" ?


    w którym miejscu niby ?
    Jeśli można to proszę poprawić kod
  • #4
    crazy_phisic
    VIP Meritorious for electroda.pl
    Funkcja może wygladać np, tak:
    "
    przerwanie:
    if Scon.0 = 1 then Scon.0 = 0
    end if
    print "odebralem "
    if Scon.1 = 1 then Scon.1 = 0
    end if
    return
    "
    Nie sprawdzałem czy ona "ma sens". Jest natomiast poprawna składniowo.
  • #5
    Jacek1708
    Level 12  
    crazy_phisic wrote:
    Funkcja może wygladać np, tak:
    "
    przerwanie:
    if Scon.0 = 1 then Scon.0 = 0
    end if
    print "odebralem "
    if Scon.1 = 1 then Scon.1 = 0
    end if
    return
    "
    Nie sprawdzałem czy ona "ma sens". Jest natomiast poprawna składniowo.


    przy taki zapisie BASCOM wywala :
    Error 14: IF THEN expected in File
  • #6
    zumek
    Level 39  
    crazy_phisic wrote:

    Nie sprawdzałem czy ona "ma sens". Jest natomiast poprawna składniowo.

    Coś Ci się ... pomyliło :(
    Jacek1708 wrote:

    
    przerwanie:
    if Scon.0 = 1 then Scon.0 = 0
    print "odebralem "
    if Scon.1 = 1 then Scon.1 = 0
    return
    

    Źle zbudowałeś warunki :(
    Poniższe zadziała , ale ...
    
    przerwanie:
    if Scon.0 = 1 then 'tylko gdy ustawiony znacznik odbioru
       print "odebralem "
    end if
    reset scon.0
    reset scon.1
    return
    

    ...jeśli nie musisz , to nie używaj Print w przerwaniu portu szeregowego.

    Piotrek
  • #7
    crazy_phisic
    VIP Meritorious for electroda.pl
    Bascom dopuszcza zapis jednolinijkowy (taki jak miałeś na początku), ale domyślna składnia polecenia if wygląda tak:
    
    IF  expression THEN
    
    [ ELSEIF expression THEN ]
    [ ELSE ]
    
     END IF
    

    ważną rolę odgrywa przejście do nowej lini po słowie "THEN"
  • #8
    Jacek1708
    Level 12  
    teraz program staje na print i stoi
    Co zrobić żeby po reset scon.1 działało Print

    Wydaje mi się że musi być na to sposób żeby procek odbierał gdy ktoś nadaje i wysyłał gdy spełnione są warunki np odebrana instrukcja wtedy print , a w między czasie robił coś innego
  • #9
    Jacek1708
    Level 12  
    Czy ktoś z grypowiczów ma pomysł co zrobić żeby print nie powodowało przerwania i jednocześnie było ono dostępne gdy przyjdzie ono z zewnątrz ??
  • #10
    Jacek1708
    Level 12  
    W załączniku jest plik zasilacza cyfrowego który można sterować RS232.
    Z tego co widzę, autor nie korzystał z przerwań on serial . Nie widzę tam również polecenia Print , a jednak podobno działa ?? Czy ktoś bardziej doświadczony może przeanalizować ten kod i wyodrębnić z niego część odpowiadającą za komunikację RS232.

    PS. jak ustawić 0 punktów za pobieranie załączników??
  • #11
    Jacek1708
    Level 12  
    Już wiem
    PC<>uP gadają w obie strony i nic się nie wiesza. Nie stosuję w programie przerwań i jest O.K. I dzieła też PRINT
  • #12
    Jacek1708
    Level 12  
    Komunikacja działa prawidłowo jednak odebrane dane chcę mieć w formie BYTE lub WORD

    Kod Bascom

    dim a as byte
    a = inkey
    print a


    Gdy z terminala wysyłam 2 to procek zwraca mi 50 gdy 1 to 49 gdy 3 to 51 itd Pewnie gdyby a była single to by było O.K.
    Co zrobić by wysłane 2 z terminala = 2 w procku /zmienna BYTE/??
  • Helpful post
    #13
    zumek
    Level 39  
    Jacek1708 wrote:
    ...Gdy z terminala wysyłam 2 to procek zwraca mi 50 gdy 1 to 49 gdy 3 to 51 itd Pewnie gdyby a była single to by było O.K.

    "Kłaniają się" typy zmiennych.
    Kiedy do terminala wpiszesz 2 , to po łączu szeregowym do uC , jest wysyłany kod ASCII cyfry 2 , czyli dziesiętnie 50.Instrukcja print , "przetwarza" owe 50 na ciąg znaków ASCII reprezentujących liczbę 50 , czyli na dwa znaki: "5"(dziesiętnie 53 ) i "0"(dziesiętnie 48 ) i po łączu szeregowym "lecą" 2 bajty , a efektem tego jest to , że w oknie terminala widzisz 50.
    Jacek1708 wrote:

    Co zrobić by wysłane 2 z terminala = 2 w procku /zmienna BYTE/??

    Aby w terminalu zobaczyć 2-kę , zamiast print użyj printbin.Natomiast by zmienna a miała wartość 2 zamiast 50 , trzeba pokombinować z typami zmiennych , czyli przekonwertować kod ASCII 2-ki na wartość binarną 2.
    Przykład 1:
    
    Dim A As Byte
    A=Inkey()
    Printbin A ' terminal wyświetli 2 , ale w A nadal będzie 50
    

    Przykład 1:
    
    Dim Aa As Byte , Ab As String * 1
    Ab = Inkey()
    Aa = Val(ab)
    Print Aa 'terminal wyświetli 2 i w Aa też będzie wartość 2
    

    Cóż , niewiedza kosztuje sporo ... nerwów ;)

    Piotrek
  • #14
    Jacek1708
    Level 12  
    Na koniec jeszcze jedno pytanie. Do komunikacji PC<>uP program piszę w VB6 korzystając z kontrolki mscomm . Czy kończąc program X muszę napisać w programie jakieś polecenie do zamknięcia portu RS, czy dzieje się to automatycznie? Proszę wybaczyć jeśli to pytanie wyda się śmieszne, ale to moje początki z VB i w ogóle z komunikacją RS232