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 AVR RS485 – brak wysyłania przez COM2, zawieszanie na Input #2, analiza kodu

prim0 17 Cze 2006 20:10 3602 8
REKLAMA
  • #1 2737835
    prim0
    Poziom 12  
    Posty: 51
    Pomógł: 2
    Ocena: 1
     
    
    
    $regfile = "m128def.dat"
    $crystal = 16000000
    $baud1 = 38400
    Config Com2 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0  
    
    Dim Znak As String * 5  
    Open "com2:" For Binary As #2
    
    Print #2 , "start"
    Wait 1
    
    Pg:
    Input #2 , Znak 
    Waitms 500
    
    Print #2 , "Odebrano znak : " ; Znak
    Goto Pg
    End    

    To moj kod
    a problem w tym ze nie dziala nawet nie podaje wysyła "start" na poczatku
    co dziwne jak wywale
    Input #2 , Znak 
    
    to dziala
    probowalem z waitkey inkey i co prawda podaje start ale nie odpowiada
    tak jakby byl jakis blad w samym programie a konkretnie w funkcji odbierajacej znaki
  • REKLAMA
  • REKLAMA
  • #3 2739680
    prim0
    Poziom 12  
    Posty: 51
    Pomógł: 2
    Ocena: 1
    probowalem
    jutro wymienie konwerter przy pececie rs232<->rs485
    moze to jego wina
  • REKLAMA
  • #5 2743744
    prim0
    Poziom 12  
    Posty: 51
    Pomógł: 2
    Ocena: 1
    wymienilem konwerter przy pccie i to samo
    przy atmelu mam 75176
    gdzie r oraz d idzie na tx1 i rx1 na atmege
    re i de sa zwarte i leca na pd7


    zrobilem tak



    
    $regfile = "m128def.dat"
    $crystal = 16000000
    '$baud = 9600
    $baud1 = 38400
    
    Config Portd.7 = Output
    
    Config Spi = Soft , Din = Pinb.4 , Dout = Portb.2 , Ss = None , Clock = Portb.1
    
    'Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    Config Com2 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    
    Dim Znak As String * 5
    
    
    Wait 1
    Echo On
    
    Pg:
    Waitms 100
    Open "com2:" For Binary As #2
    
    Reset Portd.7
    Print #2 , "start d7=0"
    Waitms 100
    
    Reset Portd.7
    Waitms 100
    Znak = Waitkey(#2)
    Waitms 100
    
    Set Portd.7
    Print #2 , "Odebrano znak : " ; Znak
    Waitms 100
    Close #2
    Goto Pg
    
    End

    no i teraz odbiera ale waitkey nie czeka na znak tylko leci jakby odbieral nulle

    Dodano po 54 [minuty]:

    teraz wyglada to tak
    $regfile = "m128def.dat"
    $crystal = 16000000
    '$baud = 9600
    $baud1 = 9600
    
    Config Portd.7 = Output
    
    Config Spi = Soft , Din = Pinb.4 , Dout = Portb.2 , Ss = None , Clock = Portb.1
    
    'Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    Config Com2 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    
    Dim Znak As String * 15
    
    Open "com2:" For Random As #2
    Wait 1
    
    
    Pg:
    
    
    Waitms 100
    
    
    Reset Portd.7
    'Znak = Waitkey(#2)
     'Input #2 , Znak
    Znak = Inkey(#2)
    Waitms 100
    
    If Znak <> "" Then
       Set Portd.7
       Print #2 , "Odebrano znak : " ; Znak
       Waitms 100
    End If
    
    
    
    Goto Pg
    Close #2
    End


    na 38400 sa same smieci
    na 9600 nawet nie ma ale
    input nadal nie dziala
    waitkey zbiera tylko pierwszy znak
    a inkey jakies losowe znaki z wyslanej calosci ( dotego odbiera to tak jakby lecialo to osobno a nie w calosci)
  • REKLAMA
  • #6 2745860
    prim0
    Poziom 12  
    Posty: 51
    Pomógł: 2
    Ocena: 1
    doszedlem do pewnego momentu wyglada to tak
    
    $regfile = "m128def.dat"
    $crystal = 16000000
    '$baud = 9600
    $baud1 = 38400
    
    Config Portd.7 = Output
    
    Config Spi = Soft , Din = Pinb.4 , Dout = Portb.2 , Ss = None , Clock = Portb.1
    
    
    Config Com2 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 1
    
    Dim Znak As String * 1
    Dim Znak1 As String * 15
    Open "com2:" For Binary As #2
    Wait 1
    
    
    Pg:
    
    Waitms 20
    
    Reset Portd.7
    Znak = Waitkey(#2)
    
    If Znak = "~" Then
       Set Portd.7
       Print #2 , "Odebrano znak : " ; Znak1
       Znak1 = ""
    Else
        Znak1 = Znak1 + Znak
        Goto Pg
    End If
    
    Goto Pg
    Close #2
    End
    
    "~" oznacza koniec transmisji ale zmieenna znak1 zapisuje mi tylko 3 pierwsze znaki nie wiem dlaczego tak jest
    ???
  • #7 2747254
    prim0
    Poziom 12  
    Posty: 51
    Pomógł: 2
    Ocena: 1
    dodalem
    On Urxc Onrxd                           
    Enable Urxc                                  
    Enable Interrupts 

    oraz
    
    config serialin1

    i smiga
    ale do czego ten urxc jest to nie wiem ???
  • #9 2798224
    prim0
    Poziom 12  
    Posty: 51
    Pomógł: 2
    Ocena: 1
    thx

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z komunikacją RS485 na porcie COM2 w BASCOM AVR na mikrokontrolerze ATmega128. Autor zgłasza brak wysyłania danych ("start") oraz zawieszanie się programu podczas odbioru znaków za pomocą polecenia Input #2. Próby obejmowały zmianę trybu otwarcia portu z BINARY na RANDOM oraz dodanie zamknięcia portu (CLOSE #2). Wymiana konwertera RS232-RS485 przy komputerze nie rozwiązała problemu. Używany konwerter to układ 75176, z pinami RE i DE połączonymi i sterowanymi z portu PD7 mikrokontrolera. W kodzie zastosowano konfigurację portu COM2 jako Dummy, bez synchronizacji, z parametrami 8N1 i prędkością 38400 baudów. Wprowadzono obsługę przerwań URXC i włączono je, co umożliwiło poprawne działanie odbioru znaków. Dyskusja zawiera także link do opisu przerwań serialowych. Problemem było niewłaściwe oczekiwanie na znak w funkcji odbierającej, które zostało rozwiązane przez obsługę przerwań URXC.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA