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

RS485 pod Bascoma. Sterowanie, Układ MAX485, ST485CN.

KaJakKrzysztof 05 Lip 2007 12:12 3416 4
REKLAMA
  • #1 4051218
    KaJakKrzysztof
    Poziom 14  
    Posty: 143
    Ocena: 5
    Witam

    Mam mały problem o którym kiedyś już pisałem. Układzik na Atmedze8, MAX485 całość taktowana kwarcem 16 MHz.
    Fabryczny konwerter 232/485 GV-COM podlaczony 2 kabelkami, a do kompa przez USB (zainstalowany USB-to-Serial Bridge jako COM9)

    http://www.geovision.com.tw/english/product/GV-Com.pdf

    W Bascomie napisałem:

    $regfile = "m8def.dat"
    $crystal = 16000000
    $baud = 9600
    
    Dim Znak As String * 6
    
    Config Portd.2 = Output
    
    Config Serialin = Buffered , Size = 15
    
    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
    
    Wait 5
    Set Portd.2
    Print "BABABABABA"
    Portd.2 = 0
    Cls
    Lcd "Podaj slowo"
    Input, Znak
    Cls
    Lcd "Odebralem " ; Znak
    
    End


    Do kompa dociera napis BABABABABA bez problemu natomiast kiedy piszę np. w Pythonie:

    import serial
    uart = serial.Serial(8, 9600) 
    uart.write("LALALALALA") 
    uart.close() 


    spowrotem nie dociera nic - na LCD ciągle widnieje napis "Podaj slowo" nie mam pojecia co to moze byc sprawdzilem juz wszystko, port do ktorego wysylam jest ok COM9 (w Pythonie podaje 8 bo liczy od zera), wymienilem nawet procka i max485, prosze o pomoc.

    W dokumentacji konwertera jako Flow Control podano

    Flow Control
    RTS/CTS, XON/XOFF

    ale przeciez nie jestem w stanie sterowac tym w magistrali 485 i to dwoma przewodami? nic nie kumam

    Update

    Układ MAX485 ktory mam wlutowany to ST485CN - czytalem ze to model LOW VOLTAGE - hmm moze tutaj jest problem? zasilam go standardowymi +5V
  • REKLAMA
  • #2 4069497
    cyberdar
    Poziom 31  
    Posty: 1465
    Pomógł: 161
    Ocena: 73
    Witam

    Nie widzę programu ale nie widziałem żadnej wzmianki o tym, że po wysłaniu informacji do komputera przełączasz MAXa w tryb odbioru. Bez tego nawet bzdury do procka nie dotrą.

    --
    pozdrawiam
  • REKLAMA
  • #3 4069563
    KaJakKrzysztof
    Poziom 14  
    Posty: 143
    Ocena: 5
    Przeciez powyzej zamiescilem kod programu ktory ma wgrany Atmega

    $regfile = "m8def.dat"
    $crystal = 16000000
    $baud = 9600

    Dim Znak As String * 6

    Config Portd.2 = Output

    Config Serialin = Buffered , Size = 15

    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

    Wait 5
    Set Portd.2 <- tutaj ustawiam na nadawanie
    Print "BABABABABA"
    Portd.2 = 0 <- tutaj ustawiam na odbiór
    Cls
    Lcd "Podaj slowo"
    Input, Znak
    Cls
    Lcd "Odebralem " ; Znak

    End


    najdziwniejsze jest to iz nawet nie wprowadzajac MAX485 w stan nadawania po podaniu komendy Print komputer odbiera dane - to mnie dziwi
  • REKLAMA
  • #4 4070000
    kamyczek
    Poziom 38  
    Posty: 3994
    Pomógł: 394
    Ocena: 573
    Problem w tym że nieprawidłowo sterujesz portem , uart jest urządzeniem peryferyjnym i print coś tam sprowadza sie do wysłania do właściwego rejestru wartości kodu ASCII przestawiając port na odbiór wyłaczysz nadajnik zanim skończy gadać ... tak samo trzeba odpowiednio sterować nadajnikiem od strony komputera . Przerobiłem to zagadnienie w bascomie i stwierdzam że szkoda prądu na ten mierny kompilator napisalem wszystko w asemblerze i działa. Bascom nie radzi sobie zbyt dobrze z nowymi prockami i ich peryferiami...
  • #5 4070148
    KaJakKrzysztof
    Poziom 14  
    Posty: 143
    Ocena: 5
    kamyczek fajnie ale to nie było to... :) po kilkunastu chyba juz dniach doszedłem co to było wreszcie działa.
    Otóż brakowało w tym kodzie jak widzisz magicznej komendy

    Enable Interrupts z racji uzycia Config Serialin

    nastpną rzeczą jest to iż z racji użycia funkcji Input nasza Atmega czeka na sygnał CR a ja pisząc w Pythonie...

    import serial
    ser = serial.Serial(8, 9600)
    ser.write("DUPA") #write a string
    ser.close() #close port

    na LCD niczego nie widziałem bo moja Atmega nadal czekała na CR.
    Wystarczy w kodzie Pythona na końcu stringu dodać \r

    import serial
    ser = serial.Serial(8, 9600)
    ser.write("DUPA\r") #write a string
    ser.close() #close port

    i wszystko gra i buczy :D. bardzo dziękuję wszystkim za pomoc a zwłaszcza Dee Jay Voltowi i Cyberdarowi

    Pozdrawiam!
REKLAMA