Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

UART '51 -> AVR

09 Apr 2005 14:36 1377 6
  • Level 22  
    Witam,
    Przesiadam się powoli z 89C4051 na AVR-y i na dzień dobry problemy...
    Mam program, który chciałbym 'przerzucić' do AVR. Zależy mi na odbiorze i transmisji danych binarnych. W 4051 miałem coś takiego:
    Code:

    $regfile = "89c2051.dat"
    $crystal = 11059200
    $serialoutput = Send

    Dim Ind As Byte         'index odebranego bajtu przez port
    Dim Buf(8) As Byte     'bufor danej odebranej przez port
    Dim Send_ok As Bit

    Rx Alias Scon.0
    Tx Alias Scon.1

    On Serial Serial_int

    'KONFIGURACJA UART
    Tcon = 0
    Scon =  &B01010000
    Tmod = &B00100001
    Pcon =  &B10000000
    Th1 = 160                        '600 bps
    Set Tcon.6
    'KONIEC KONFIGURACJI UART

    Rx = 0 : Tx = 0
    Send_ok = 0
    Enable Serial
    Priority Set Serial
    Enable Interrupts

    Ind = 1
    Do
        If Ind = 9 Then
             'TU MIALEM ZADANE 8 BAJTOW DANYCH W BUFORZE buf
             Ind = 1
        End If
    Loop
    End

    Serial_int:
       If Tx = 1 Then
          Tx = 0 : Send_ok = 0
       End If
       If Rx = 1 Then           'odbior jednego bajtu
          Rx = 0
          If Sbuf = 170 Then  '1-szy odebrany 170 to bufor na poczatek
              Ind = 1
          End If
          Buf(ind) = Sbuf       'wpisanie odebranego bajtu do bufora
          Incr Ind
       End If
    Return

    !Send:
       Bitwait Send_ok , Reset
       Send_ok = 1
       MOV   SBUF , acc;
    ret

    I wszystko hulało jak trzeba. Miałem odebrane 8 bajtów, rozpoczynajace sie chcrakterystycznym 170 (ale to kwestia protokolu juz). Wysylanie odbywalo sie poprzez proste PRINTBIN X.
    Jak to przekonwertosac na AVR??
    Napisalem cos takiego, ale nie chce mi dzialac :(
    Code:

    $regfile = "m8515.dat"
    $crystal = 3686400

    On Urxc Odbierz

    Dim Bufor(8) As Byte     'bufor danych
    Dim Index As Byte         'indeks poczatku bufora

    'KONFIGURACJA USART
    Ubrr = 191                   'przy zegarze 3686400 = 1200 bps
    Ucsra = &B00100000
    Ucsrb = &B00010000    '1 w Transmiter enable
    Ucsrc = &B10000110    'transmisja asynchr. bez kontr. parzyst. 8 bitow
    'KONIEC KONFIGURACJI USART

    Enable Urxc
    Enable Interrupts

    Do
       If Index = 9 Then
          If Bufor(1) = 170 Then
             'TU POWINIENEM MIEC 8 bajtow z 1-szym bajtem 170
          End If
          Index = 1
       End If
    Loop
    End

    Odbierz:
       If Udr = 170 Then           'reakcja na poczatek danych
          Index = 1
       End If
       Bufor(index) = Udr         'odebrany znak do bufora
       Incr Index
    Return

    Co tu jest nie tak? Podejrzewam, że nie radzę sobie z konfiguracją USART, ale samego odbioru poprze odczyt UDR tez nie jestem pewien.
    Proszę o porady.
  • VIP Meritorious for electroda.pl
    Spróbuj odczytać UDR do jakiejś zmiennej i dopiero porównaj, może pomoże... ;)
    Code:
    Ucsrb = &B00010000    '1 w Transmiter enable

    tutaj włączasz tylko reciver wbrew komentarzowi a nie włączas przerwania od RXCIE, spróbuj :
    Code:
    Ucsrb = &B10010000    '(1<<RXCIEN)|(1<<RXEN)
    Reciver można w AVR obsługiwać nie tylko w przerwaniu.
    Light-I
  • Level 22  
    Dzięki za podpowiedź... Poszło.
    Co prawda zawiesiłem dwie ATMegi ale poszło na 8515.

    A jeszcze przy okazji... Da się odwiesić ATMegę z popitolonymi fusami?
  • Level 22  
    Ni hu..hu...
    Mam programator z EP 6/2000 oparty na 74HCT244. Kombinowałem z taśmami, wtyczkami, chciałem zrobić 2 w jednym (równoległy i ISP). Działał - nawet przez jakiś czas a ATMega. Programował i w układzie i bez układu. Potem coś uC poprzestawiało i programował się tylko na wew. 1 MHz, tak ze za każdym razem musiałem mu przestawiać fusy przed i po programowaniu. Teraz padł całkiem. Bascom go nie identyfikuje. Rozebrałem programator. Dałem kwarc w nogi podstawki, wszystko jak najbliżej. I dalej nic. 8515 i 2313 programują się bez żadnego ale, a ATMega ni ruszy... jest jakiś tip na "twardy" reset tego dziadostwa?? :)
  • VIP Meritorious for electroda.pl
    Możliwe, że uszkodzony, możliwe, że zablokowany... Podpinałeś coś do XTAL2 ? Jeżeli tak, to mógł "strzelić" inwerter do napędzania zegara przez kwarc. Nigdy nie ma tak, że się samo przestawia. Zewnętrzny zegar podłącza się tylko i wyłacznie pod XTAL1 (co zresztą jest uwzględnione w poście ze schematem, którego link podałem wyżej). Można jeszcze zmierzyć pobór prądu, jak jest za duży to sio z nim do kosza, a jak nie, to pozostaje równoległy. Kiedyś jeden z forumowiczów podesłał mi pocztą podpadnięte ATmega32/8535. W obu sygnatury się częściowo wykasowały, ale Flash, EEPROM i Fusebity dało się zaprogramować i czytać na moim programatorze równoległym. Cały trick polegał na tym, że sam pisałem program do tego programatora, więc mogłem sobie wadliwe sygnaturki korygować tak, aby reszta programu "widziała" układ normalnie.
    Pozdrawiam, Light-I
  • Level 22  
    Temat zamknięty. Sprawa odblokowywania procesorów to już zupełnie inna bajka :D
pcbway logo