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

[Atmega88/32] [bascom] [usart rs485]

solar1 25 Lut 2009 08:09 6559 15
REKLAMA
  • #1 6201119
    solar1
    Poziom 15  
    Witam Mam pare pytan odnosnie rs485 i atmeg...
    Naogladalem sie paru prostych projektow na tej szynie tj rs485 i chcialem zrobic cos swojego - Sterownik pieca CO z panelem sterowania na 2 pietrze domu...
    Modol wykonawczy oparlem na atmega88 - sa to 3 przekazniki, ds18b20.. i pare wejsc

    Modol "sterowania" oparlem na atmega32 lcd2x16.
    Oba urzadzenia chce spiac maxem485. W ep kiedys byl podobny projekt z ta kostka.. no wiec wszysko gotowe - z tym ze nie moge uruchomic poprawnej komunikacji miedzy dwoma uC
    Testujac caly sprzet na piechote przy pomocy kompa i przejsciowki rs232<>rs485 wszystko dziala genialnie ale jak razem wszytko polacze to na lcdiku mam jakies #@

    Predkosc komunikacji to 9600b
    obie atmegi sa na kwarcach 3,6864Mhz

    Po 1 co robie zle ?
    <listing zalacze na dole ale podpinajac kompa wszystko dziala POPRAWNIE!>

    Po 2 czy max485 wymaga jakis rezystorow po stronie uC ?
    Jezeli nie mam podpietego rezystora na pinie rx 10k do GND za max485 <pin RX atmegi 88> to komunikacja wogole nie zachodzi

    - procesory jak i max485 wymienialem juz na inne kostki - podejrzewajac uszkodzenie elementu

    - steruje odpowiednio pinami nadajnika
    Nie wiem czy to problem sprzetowy czy programowy...

    
    odbiornik
    $regfile = "m32def.dat"
    $crystal = 3686400
    $baud = 9600
    (....)
    Cls
     Do
    Input Odb Noecho
      Lcd Odb
      Input Odb Noecho
      Lcd Odb
      Input Odb Noecho
      Lcd Odb
      Input Odb Noecho
      Lcd Odb
      Input Odb Noecho
      Lcd Odb
      Input Odb Noecho
      Lcd Odb
      Input Odb Noecho
      Lcd Odb
      wait 1
      cls
    loop
    end
    

    nadajnik
    
    $regfile = "m88def.dat"
    $crystal = 3686400
    $baud = 9600
    (...)
    do
     set txx ' wlacz pin nadajnika max485
      Print "a"
      Print Chr(13)
      Waitms 1
      Print "b"
      Print Chr(13)
      Waitms 6
      Print "c"
      Print Chr(13)
      Waitms 6
      Print "d"
      Print Chr(13)
      Waitms 8
      Print "e"
      Print Chr(13)
      Waitms 1
    
     Loop
    End
  • REKLAMA
  • #3 6201316
    solar1
    Poziom 15  
    Balu napisał:
    Poka schemat:>

    Schemat jest taki sam jezeli chodzi o czesc rs485 jak w ep 9/2004
    Re i De max485 spiete razem pod pin PD2
    rx pod RO
    tx pod DI
    Linia rs485 ma 1 metr - na skretce masy urzadzen sa spiete razem ze soba rezystory ograniczajce sa
  • REKLAMA
  • #4 6201362
    hotdog
    Poziom 26  
    omiń rs485 i sprawdź. Podpinasz rx z jednego pracko do tx drugiego, a tx do rx drugiego procka, masy muszą być spięte rezem. Będziesz wtedy wiedział czy to błąd softu czy błąd rs485. Przy rs485 masy spięte być nie muszą, przynajmniej u mnie tak działało wszystko.

    pozdrawiam hot-dog

    Dodano po 7 [minuty]:

    a to że schemat jest w ep 9/2004 to trochę głupawo brzmi. nie każdy ma do tego dostęp, więc jak oczekujesz pomocy to przydało by się go wkleić. ;)
  • REKLAMA
  • #5 6201994
    solar1
    Poziom 15  
    hotdog napisał:
    omiń rs485 i sprawdź. Podpinasz rx z jednego pracko do tx drugiego, a tx do rx drugiego procka, masy muszą być spięte rezem. Będziesz wtedy wiedział czy to błąd softu czy błąd rs485. Przy rs485 masy spięte być nie muszą, przynajmniej u mnie tak działało wszystko.

    pozdrawiam hot-dog

    Dodano po 7 [minuty]:

    a to że schemat jest w ep 9/2004 to trochę głupawo brzmi. nie każdy ma do tego dostęp, więc jak oczekujesz pomocy to przydało by się go wkleić. ;)

    spielem rx i tx procesorow bez max485 - wszystko dziala bardzo dobrze
    po dodaniu maxow mam "szczescie" jak dojdzie to co wysle

    zalacam schemat


    zgodnie z nota aplikacyjna, i standardem rs485 wymaga spiecia mas dla odbiornikow ...
    przelacanie odbirnikow nastepuje po 1ms przerwie ...
  • #7 6202662
    solar1
    Poziom 15  
    Balu napisał:
    A czekasz chwilę po nadaniu a przed wyłączeniem nadajnika?

    1ms odczekuje po wlaczeniu
    nadaje
    1ms
    wylaczam nadawanie
    dodalem do programu buforowanie portu uart i to tez nie wiele dalo...
    odbiorniki sa polaczone 1m przewodem skretka 1 para
  • REKLAMA
  • #9 6202838
    kamyczek
    Poziom 38  
    problem polega na tym że tego typu transmisja jeśli wykonywana jest przy pomocy uarta sprzętowego wymaga użycia przerwań do sterowania kierunkiem transmisji. Z tego co pamiętam był jakiś bug w procesorze i trzeba było usarta konfigurować ręcznie. Swój program napisałem w asemblerze i działał bez problemu ...
  • #11 6205011
    hotdog
    Poziom 26  
    ale pojawiają się tam jakieś śmieci, czy nic się nie pojawia, czy czasami ok czasami nie?
    Jeżeli mówisz ze po uarcie czystym wszystko działa, i na pewno nadając ustawiasz PD2 w stan wysoki i po nadaniu ustawiasz w stan niski (sprawdź multimetrem czy na pewno na tym pinie się stany zmieniają), to 100% masz błąd w hardware. Jakieś zimne luty lub zwarcie.

    Ewentualnie w sterowniku ustaw PD2 w wysoki (nadawanie) na stałe, w tym z wyświetlaczem w niski (odbiór) i wyświetlaj odebrane znaki na LCD to zobaczysz czy działa tak jak chcesz.

    pozdrawiam
  • #12 6229267
    solar1
    Poziom 15  
    Sprawa jest dosc ciekawa - moim zdaniem - wszystko swietnie dziala gdy lacze procesory bezposrednio - natomiast gdy komunikuje sie juz miedzy nimi przy pomocy rs485 mam duze straty w komunikacji - na 100 wyslanych bajtow 60% dociera do drugiego procoesora i na odwrot ..
    Co ciekawe im mniejsza predkosc tym gorzej - teraz mam ustawione dwa procesory na 115k przy kwarcach 14Mhz polaczone sa ze soba przewodem skretka komputerowa (jedna para do komunikacji reszta to masa)
    Rezystory terminujace 120ohm - mam 10 kostek max485 i wszystkie zachowuja sie podobnie .
    Udalo mi sie zmniejszyc ilosc strat pakietow dzieki zastosowaniu podciagow wymuszajacych stany na lini A/B
    .
    Jednak nadal uwazam ze to ogromna ilosc strat jak na krotka linie ! to przeciez jest 1 metr a nie 100
  • #14 6229665
    MarasK
    Poziom 18  
    Jak czekasz 1ms to może być za mało na 'dosłanie' końcówki bajtu przy niskich prędkościach. Tak jak mówił to już ktoś wcześniej czekaj na pusty bufor i wtedy dodaj 1ms, a nie wysyłanie + 1ms
  • #15 6233852
    solar1
    Poziom 15  
    Czekam 100ms po instrukcji print dla 115K nic to nie pomoglo zmniejszylem predkosc do 9600 nadal nic ;/

    kod nadajnika
    
    $regfile = "m32def.dat"
    $crystal = 14745600
    $baud = 9600
    
    Config Serialin = Buffered , Size = 10 , Bytematch = 13
    
    '##### Definicja wyswietlacza #####################
    Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.3 , Rs = Porta.1
    Config Lcd = 16 * 2
    
    Config Pinc.3 = Input                                       'klaiwsze 1
    Config Pinc.4 = Input                                       'klawisze  2
    Config Pinc.5 = Input                                       'klawisze   3
    Config Pinc.6 = Input                                       'klawiesze   4
    Config Pinc.2 = Output                                      ' kierunek transmisji rs485
    Config Pind.7 = Output
    '####### Def port
    Buzer Alias Portd.7
    Txx Alias Portc.2
    Kl1 Alias Pinc.3                                            'stop
    Kl2 Alias Pinc.4                                            'dol
    Kl3 Alias Pinc.5                                            'gora
    Kl4 Alias Pinc.6                                            ' start
    Set Portc.6                                                 'stan wysoki dla klawiszy
    Set Portc.5
    Set Portc.4
    Set Portc.3
    
    Dim Flaga As Bit
    Dim Nca As Byte
    Dim Odebrane As String * 4
    
    '###### ATR sterownika 
    Toggle Buzer
    Waitms 250
    Waitms 110
    Toggle Buzer
    
    
    Enable Interrupts                                           ' odblokuj przerwania
    
    
    
    Nca = 21
    
     Reset Txx
     Waitms 25
     Cls
     Waitms 25
     Lcd "Prosze czekac"
     Lowerline
     Waitms 250
     Lcd "*"
     Locate 2 , 16
     Lcd "*"
     Cls
     Do
      If Kl1 = 0 Then
        Wait 1
        Set Txx
        Waitms 1
       Print Chr(13) ; "0" ; "P" ; Nca ;
        Waitms 100
        Reset Txx
      End If
      If Kl2 = 0 Then
      Wait 1
       Set Txx
       Waitms 1
       Print Chr(13) ; "0" ; "p" ; Nca ;
       Waitms 100
       Reset Txx
      End If
      If Kl3 = 0 Then
        Wait 1
        Set Txx
        Waitms 1
         Print Chr(13) ; "0" ; "T" ; Nca;
       Waitms 10
      Waitms 100
      Reset Txx
      End If
    
      If Kl4 = 0 Then
       Cls
      End If
    
      If Flaga = 1 Then
       Reset Flaga
       Odebrane = Inkey()
       Lcd Odebrane
       Waitms 250
       Waitms 250
      End If
    
     Waitms 100
    
      Loop
    End
    
    
    Serial0charmatch:
    Set Flaga
    Return
    



    kod odbiornika :
    
    $regfile = "m88def.dat"
    $crystal = 14745600
    
    $baud = 9600
    
    Config 1wire = Portc.5
    Config Pind.7 = Output                                      ' Wylotowy
    Config Pind.6 = Output                                      ' Mieszajacy
    Config Pind.5 = Output                                      ' Wlotowy
    Config Pinb.0 = Output                                      ' Led sygnalizaujcy
    Config Pind.3 = Output
    
    Config Serialin = Buffered , Size = 10 , Bytematch = 13
    
    Dioda Alias Portb.0
    Pompa Alias Portd.7
    Wentyl Alias Portd.6
    Zawor Alias Portd.5
    Txx Alias Portd.3
    
    Dim Tempe(9) As Byte                                        ' temperatura z termometru
    Dim Tme As Byte                                             ' czas w sekundach
    Dim Minuty As Byte                                          ' minuty
    Dim Odb As String * 6                                       'Odbierane zmienne
    Dim Byt0 As Byte
    Dim Byt1 As Byte
    Dim Byt2 As Byte
    Dim Liczn As Byte
    Dim Flaga As Bit
    Dim Crc As Byte
    Dim Cr As Byte
    
    Dim Tem As Integer
    Dim Ulamek As Integer
    
    Declare Sub Odczyt
    Declare Sub Stan
    
    
    '####### ATR sterownika - dzialam poprawnie 
    Toggle Dioda
    Toggle Pompa
    Wait 1
    Toggle Wentyl
    Wait 1
    Toggle Zawor
    Wait 1
    Zawor = 0
    Pompa = 0
    Wentyl = 0
    Dioda = 0
    
    
    
    Waitms 140
    Reset Txx
    
    Liczn = 1
    
     Do
      If Flaga = 1 Then
       Reset Flaga
       'Odb = Inkey()
         If Liczn = 1 Then
          Byt0 = Inkey()
          Incr Liczn
         End If
         If Liczn = 2 Then
          Byt1 = Inkey()
          Incr Liczn
         End If
         If Liczn = 3 Then
          Byt2 = Inkey()
          Liczn = 1
          Waitms 250
          Waitms 250
          Set Txx
          Waitms 1
          Print Chr(13) ; " " ; Byt0 ; " " ; Byt1 ; " " ; Byt2;
          Waitms 100
          Reset Txx
         End If
    
       End If
    
      If Byt0 = 48 And Byt1 = 84 Then
        'Call Odczyt
        'Waitms 5
        Waitus 100
        Set Txx
        Set Dioda
       Waitms 3
       Reset Dioda
       Reset Txx
       End If
       If Byt0 = 48 And Byt1 = 80 Then
        Set Pompa
       End If
       If Byt0 = 48 And Byt1 = 112 Then
       Reset Pompa
       End If
    
      Waitms 5
    
    
    
    
     Loop
    End
    
    Serial0charmatch:
    Set Flaga
    Return
    
    Sub Odczyt
        1wreset
        1wwrite &HCC
       1wwrite &H44
       Waitms 250
       Waitms 250
       1wreset
       1wwrite &HCC
       1wwrite &HBE
       Tempe(1) = 1wread(9)
       1wreset
       Tem = Makeint(tempe(1) , Tempe(2))
       Tem = Tem * 10
       Tem = Tem / 16
       Ulamek = Tem Mod 10
       Tem = Tem / 10
    End Sub
    Return
    
    Sub Stan
    Print Pompa
    Print Zawor
    Print Wentyl
    End Sub
    Return
    


    Gdy podsłuchuje sobie transmisje przy pomocy max232 wpietego miedzy linie RX procesora atmegi88 a max485 w hyperterminalu uzyskuje to co powinenem:
    0p21
    lub
    0P21
    natomiast wyslane przez atmege88 wartosci przez linie TX <prosze zobaczyc kod w odbiorniku > sa inne - czasem sie zgadzja ale czesciej sa to lekko przesuniete wartosci <przesuniete w tablicy ascii>

    czekam 100ms po wyslaniu ciagu znakow i przelaczam na odbieranie
    z mojego nasluchu wynika ze do atmegi88 dochodzi to co powinno - ale na wyjsciu atmegi juz nic sie nie dzieje
    transmisja jest buforowana ...
    skorzystalem z Serial0charmatch , na poczatku zawsze wysylam znak 13 ..
REKLAMA