Elektroda.pl
Elektroda.pl
X
e-miernikie-mierniki
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Attiny 2313] [Bascom] Echo sygnału RS

27 Maj 2010 22:44 2294 7
  • Poziom 2  
    Witam

    Mój problem wiąże się z zaprogramowaniem "Echa" które obijało by sygnał w standardzie RS. Układ buduję w celu sprawdzania poprawności działania konwertera USB-RS485. Aby nie programować układu dla każdej szybkości transmisji chcę użyć pinów PB0-PB3 gdzie za pomocą zworki możliwy byłby wybór jednej z 4 przygotowanych szybkości transmisji: 921600, 460800, 230400 i 115200.
    Rys. schematu
    http://img176.imageshack.us/img176/8224/echo2.png

    Niestety jeśli chodzi o kod, to sobie nie radzę, zmodyfikowałem co prawda kod odbioru danych RS jaki znalazłem w książce M.Wiązania "Programowanie mikrokontrolerów AVR w języku Bascom" ale nie wiem jak wziąć się za sterowanie wyjściem PD2 oraz jak trzeba określać wyjścia na które dany sygnał będzie podawany i czy jest to konieczne (czy wystarczy zdefiniowanie pinów PD0, PD1 jako we/wy) również nie mam pojęcia pomysł na sterowanie prędkością transmisji jest właściwy.
    Próbowałem znaleźć gotowe programy, lub chociaż fragmenty kodu które realizowały to co jest mi potrzebne, ale niestety poza fragmentem na samą transmisje RS nie udało mi się. I tutaj prośba do Was o wskazanie błędów i/lub wskazanie czego powinienem szukać bo wydaje mi się że takie programy powinny być dostępne, tylko ja źle do tego podchodzę.

    Code:

    'Tell the compiler which AVR chip we use
    $regfile = "attiny2313.dat"                 'określenie typu proca

    'Tell the compiler which crystal frequency was used
    $crystal =  14745600      '14.7456 MHz  'taktowanie pracy


    config pinD.0=output    ' wyprowadzenie PD0 jako wyjście
    config pinD.1=input      ' wyprowadzenie PD1 jako wejście
    config pinD.2=output    ' wyprowadzenie PD2 jako wyjście


    config pinb.0=input   ' wyprowadzenie PB0 jako wejście
    config pinb.1=input   ' wyprowadzenie PB1 jako wejście
    config pinb.2=input   ' wyprowadzenie PB2 jako wejście
    config pinb.3=input   ' wyprowadzenie PB3 jako wejście


    If pinb.0=1 then $baud = 921600 ' jeśli wyprowadzenie PB0 = 1 wtedy predkosc transmisji 921600 bodów
    Else
    If pinb.1=1 then $baud = 460800 ' jeśli wyprowadzenie PB1 = 1 wtedy predkosc transmisji 460800 bodów
    Else
    If pinb.2=1 then $baud = 230400 ' jeśli wyprowadzenie PB2 = 1 wtedy predkosc transmisji 230400 bodów
    Else
    If pinb.3=1 then $baud = 115200 ' jeśli wyprowadzenie PB3 = 1 wtedy predkosc transmisji 115200 bodów
    end If

    Dim I as byte                ' definicja zmiennej I
    Dim znak as string * 1         ' definicja zmiennej znak
     
    Do                              ' początek pętli
       Input , I                   ' pobranie wartości przez RS232 do zmiennej I
       Print , I               ' odesłanie wartości przez RS232
       If I = 1 Then             ' jeśli I = 1 to
          Do                  ' początek pętli         
             Znak = Waitkey ()         ' czeka na odebranie znaku przez RS
             Print ; znak            ' wysłanie znaku z RS
             Loop until znak = "k"      ' jeśli odebrany znak to "k" opuszcza pętle
                                  
          End If                     '
          If I = 2 Then                ' jeśli I = 2 to
             Do                      ' początek pętli
                I = Ischarwaiting ()   ' sprawdzenie czy jest cos do odczytu w buforze
              Print ; I               ' wysłanie wartości I
             Znak = Inkey ()            ' odebranie znaku z RS, funkcja nie czeka na znak
             Print znak               ' wysłanie przez RS wartości zmiennej Znak
          Loop until znak = "k"         ' jeśli odbierze "k" to opuszcza pętle
          
          End If                     '   
       Loop                        ' koniec pętli głownej
       End                           ' koniec programu   
  • e-miernikie-mierniki
  • Pomocny post
    Poziom 14  
    Code:
    If pinb.0=1 then $baud = 921600 ' jeśli wyprowadzenie PB0 = 1 wtedy predkosc transmisji 921600 bodów
    
    Else
    If pinb.1=1 then $baud = 460800 ' jeśli wyprowadzenie PB1 = 1 wtedy predkosc transmisji 460800 bodów
    Else
    If pinb.2=1 then $baud = 230400 ' jeśli wyprowadzenie PB2 = 1 wtedy predkosc transmisji 230400 bodów
    Else
    If pinb.3=1 then $baud = 115200 ' jeśli wyprowadzenie PB3 = 1 wtedy predkosc transmisji 115200 bodów
    end If


    Co prawda nie pisze w bascomie ale lata temu próbowałem sił w tym środowisku

    wracając do tematu to w/w kod wydaje mi się trochę nie logiczny, strasznie wchodzisz warunkiem w warunek albo zakończ każdy z tych warunków "niczym" albo użyj odpowiednika c-eowskiego "swith" to tak od strony programowej

    druga sprawa to brak "podciągów" na jamperach bez nich to może w ogóle nie działać. Wykonaj je programowo lub sprzętowo.
  • e-miernikie-mierniki
  • Poziom 28  
    (c) Zbigniew Gibek, 2002-2005 (c) MCS Electronics, 1999-2005 napisał:

    Instrukcja BAUD

    Przeznaczenie:

    Zmienia szybkość transmisji urządzenia typu UART.

    Składnia:

    BAUD = szybkość

    BAUD #kanał , stała

    gdzie:

    szybkość szybkość transmisji jaka ma obowiązywać od tej pory,
    kanał numer kanału transmisji w programowym urządzeniu typu UART,
    stała liczba określająca szybkość transmisji w danym kanale.
    Opis:

    Można zmienić szybkość pracy urządzenia UART w trakcie działania programu. Format pierwszy BAUD = odnosi się do wbudowanego w procesor łącza szeregowego. Drugi format BAUD # odnosi się do programowej transmisji w symulowanym urządzeniu typu UART.

    Nie należy mylić instrukcji BAUD z dyrektywą $BAUD. Dyrektywa $BAUD zmienia domyślne ustawienia w opcjach kompilatora, a instrukcja BAUD programowo zmienia bieżącą szybkość transmisji.

    Na marginesie dodam by nie mylić także dyrektywy $CRYSTAL ze zmienną CRYSTAL.

    Zobacz także: $CRYSTAL, $BAUD


    Przykład:


    $baud = 2400
    $crystal = 14000000 'kwarc 14 MHz

    Print "Witaj"

    'teraz zmienimy szybkość transmisji
    Baud = 9600
    Print "Czy zmieniłeś szybkość także w terminalu?"

    End
  • Poziom 2  
    Dzięki za pomoc. Zamieszczam zmodyfikowaną część kodu.

    Jeśli chodzi o instrukcje IF to sugerowałem się się książką "Programowanie mikrokontrolerów AVR w języku Bascom M. Wiązania: cyt. „Bascom pozwala na zagnieżdżanie instrukcji If...Then, ale aby nie stosować dość złożonych zagnieżdżonych bloków instrukcji If...Then, przewidziano instrukcję Eleseif, w której testowane mogą być dodatkowe warunki po stwierdzeniu że pierwszy warunek jest fałszywy (występujący po słowie If)” (str.46).
    Jednak widzę że moje rozdzielenie tych instrukcji to błąd, bo zamiast Elseif miałem dwie instrukcje Else i If


    Cytat:

    'Tell the compiler which AVR chip we use
    $regfile = "attiny2313.dat" 'określenie typu proca

    'Tell the compiler which crystal frequency was used
    $crystal = 14745600 '14.7456 MHz 'taktowanie pracy


    Set Portd.3 ' podłączenie pod nieużywane piny rezystora podciągającego
    Set Portd.4 '
    Set Portd.5 '
    Set Portd.6 '
    Set Portb.4 '
    Set Portb.5 '
    Set Portb.6 '
    Set Portb.7 '


    config pinD.0= input ' wyprowadzenie PD0 jako wejście
    config pinD.1= output ' wyprowadzenie PD1 jako wyjście
    config pinD.2= output ' wyprowadzenie PD2 jako wyjście

    Reset portD.2 ' ustawienie na porcie D2 stanu niskiego, // ustawia jednocześnie Maxa w tryb odbioru. (str.76)

    config pinb.0=input ' wyprowadzenie PB0 jako wejście
    config pinb.1=input ' wyprowadzenie PB1 jako wejście
    config pinb.2=input ' wyprowadzenie PB2 jako wejście
    config pinb.3=input ' wyprowadzenie PB3 jako wejście



    If pinb.0=1 then baud = 921600 ' jeśli wyprowadzenie PB0 = 1 wtedy predkosc transmisji 921600 bodów
    ElseIf pinb.1=1 then baud = 460800 ' jeśli wyprowadzenie PB1 = 1 wtedy predkosc transmisji 460800 bodów
    ElseIf pinb.2=1 then baud = 230400 ' jeśli wyprowadzenie PB2 = 1 wtedy predkosc transmisji 230400 bodów
    ElseIf pinb.3=1 then baud = 115200 ' jeśli wyprowadzenie PB3 = 1 wtedy predkosc transmisji 115200 bodów
    End If
  • Poziom 14  
    Witam
    jeśli najpierw ustawisz stan wysoki Set Portd.3 a potem przełączysz port jako wejście to efekt będzie taki że jeśli pin masz już zwarty do masy to go upalisz
    najpierw ustaw jako wejście a potem dodaj podciąg. zamień kolejność bo pójdzie "dym"
  • Poziom 2  
    Zmodyfikowałem kod, oraz schemat.

    Schemat:
    http://img710.imageshack.us/img710/866/echo3.jpg
    Odnośnie sugestii w powyższym poście, to nie widzę niczego nieprawidłowego w wcześniejszym połączeniu (port PD3 nie jest później używany) ale dołożyłem dwa rezystory 10k, przez które chcę zewrzeć niewykorzystane piny do masy ustawiając je jako wyjścia w stanie niskim, co powinno wykluczyć stany nieustalone na tych pinach.


    Natomiast jeśli chodzi o kod, to zmodyfikowałem część odpowiedzialną za odsyłanie danych i jeśli dobrze rozumiem to program będzie czekał aż "coś" zostanie nadane, zapisze odebrany bajt i odeśle go z powrotem.

    Niestety nie wiem jak zmodyfikować program żeby odsyłał więcej danych.
    Drugim problemem jest działanie układu w przypadku gdy układ nadawczy podaje kolejne bajty, bo wtedy oba układy są w stanie nadawania i nastąpi wytłumienie obu sygnałów.

    Byłbym wdzięczny za sugestie jak to zrobić.

    Code:

    'Tell the compiler which AVR chip we use
    $regfile = "attiny2313.dat"                 'określenie typu proca

    'Tell the compiler which crystal frequency was used
    $crystal =  14745600      '14.7456 MHz  'taktowanie pracy


    ' KONFIGURACJA PINÓW    
             
    config pinB.0=input      ' wyprowadzenie PB0 jako wejście
    config pinB.1=input      ' wyprowadzenie PB1 jako wejście
    config pinB.2=input      ' wyprowadzenie PB2 jako wejście
    config pinB.3=input      ' wyprowadzenie PB3 jako wejście
    config pinB.4=output      ' wyprowadzenie PB4 jako wyjście
    config pinB.5=output     ' wyprowadzenie PB5 jako wyjście
    config pinB.6=output      ' wyprowadzenie PB6 jako wyjście
    config pinB.7=output      ' wyprowadzenie PB7 jako wyjście

    config pinD.0= input    ' wyprowadzenie PD0 jako wejście
    config pinD.1= output   ' wyprowadzenie PD1 jako wyjście
    config pinD.2= output   ' wyprowadzenie PD2 jako wyjście
    config pinD.3= output   ' wyprowadzenie PD3 jako wyjście
    config pinD.4= output   ' wyprowadzenie PD4 jako wyjście
    config pinD.5= output   ' wyprowadzenie PD5 jako wyjście
    config pinD.6= output   ' wyprowadzenie PD6 jako wyjście


    ' USTAWIENIE STANU NISKIEGO NA NIEUŻYWANYCH PINACH

    Reset PortD.3          '
    Reset PortD.4          '
    Reset PortD.5          '
    Reset PortD.6          '

    Reset PortB.4          '
    Reset PortB.5          '
    Reset PortB.6          '
    Reset PortB.7          '


    ' USTALENIE SZYBKOŚCI TRANSMISJI

    If         pinb.0=1 then baud = 921600 ' jeśli wyprowadzenie PB0 = 1 wtedy prędkość
                                                  ' transmisji 921600 bodów
       ElseIf pinb.1=1 then baud = 460800 ' jeśli wyprowadzenie PB1 = 1 wtedy prędkość
                                                   ' transmisji 460800 bodów
       ElseIf pinb.2=1 then baud = 230400 ' jeśli wyprowadzenie PB2 = 1 wtedy prędkość
                                                   ' transmisji 230400 bodów
       ElseIf pinb.3=1 then baud = 115200 ' jeśli wyprowadzenie PB3 = 1 wtedy prędkość
                                                   ' transmisji 115200 bodów
    End If


    Reset portD.2           ' ustawienie na porcie D2 stanu niskiego, // ustawia jednocześnie
                                 ' Maxa w tryb odbioru. (str.76)
                      
    Dim A As Byte          ' Definicja zmiennej A
                      
                      
    Do                      ' początek pętli
                      
       A = Waitkey         ' Funkcja wstrzymuje działanie programu do czasu pojawienia się
                                  ' w buforze transmisji szeregowej odebranego znaku.
       Set portD.2         ' ustawienie na porcie D2 stanu wysokiego (tryb nadawania)
       Print A            '
       Reset portD.2      ' ustawienie na porcie D2 stanu niskiego (powrót do trybu odbioru)
    Loop                 ' koniec pętli      
    End                  
  • Poziom 14  
    Cześć,
    nie o to mi chodziło z tymi podciągami,
    Nie używane piny procesora możesz zostawić wolne (pod warunkiem że ustawisz je jako wyjścia) ale tak jak zrobiłeś też będzie dobrze.

    Napisz jak wygląda nadawanie układu do którego się podłączasz, jeśli na zasadzie bajt wysyła bajt odbiera to powinno to działać. Gorzej jeśli wysyła jakiś zestaw danych, wtedy to nie będzie działać bo po odebraniu pierwszego bajtu blokujesz odbiór reszty i nadajesz czego i tak nie odbierze. w takim przypadku musisz zbudować jakiś bufor który po odbiorze wszystkiego dopiero zacznie nadawać.
  • Poziom 2  
    Cześć
    Dzięki w takim razie zostanie to z tym rezystorami.

    Co do transmisji to próbowałem najpierw z HyperTermial, ale efektów nie było, później udało mi się znaleźć jeszcze jeden programik, "RS232 tester"
    Link: http://mirley.firlej.org/rs232tester
    (co prawda jest on dla RS 232 ale konwerter zbudowany jest na FT232 wiec sygnał zamieniany jest USB-RS232-RS485, wiec zwarłem wyjście TxD z wejściem RxD za układem FT232 ) i w tej konfiguracji program odsyłał dane. Za pomocą HypeTerminala nie udało mi się nawet w takiej konfiguracji odebrać żadnej danej, więc pewnie coś źle tam robiłem.

    Wychodzę z założenia że skoro program radzi sobie z sygnałem usb-rs i wysyła dane po jednym bajcie to po podłączeniu do echa powinien działać i odsyłać dane, niestety odpowiedzi nie ma żadnej.

    Sprawdziłem ścieżki i połączenia u wszystko jest w porządku, jedynie wartość napięcia zasilania jest trochę niska 4,7V ale wydaje mi się że to wystarczy do poprawnego działania układów.

    Nie mam pomysłów co zrobić dalej więc prosił bym o jakieś sugestie.