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

AVR ATmega32 + USART. Odczytanie danych z PC nie działa.

isengrim 20 Lip 2007 17:36 1641 5
  • #1 4099018
    isengrim
    Poziom 11  
    Posty: 15
    Witam,
    Mam mały problem. Napisałem już kilka kombinacji programu który odczytywać ma dane pochodzące z PC (terminala). Przeszukałem forum i książkę i teoretycznie wszystko powinno być ok. Niestety nie jest. To co dostaje wysyłam na diody i otrzymuję:
    - w przypadku cyfr (większości) dane postaci 11000011
    - innych przycisków (np F1-F5) 11000000
    W przypadku wysyłania liter nic się nie dzieje.

    Prawdę mówiąc nie mam już pomysłu co z tym zrobić. Kod jest następujący:

    .INCLUDE "m32def.inc"

    .EQU cz_takt = 16000000
    .EQU pr_szer = 9600

    .org 0x000
    rjmp Start

    .org 0x01B
    rjmp Odczytaj

    .org 0x01D
    rjmp Wyslij

    Start:
    ldi R16,high(RAMEND)
    out SPH,R16
    ldi R16,low(RAMEND)
    out SPL,R16
    ldi R16,255
    out DDRC,R16
    ldi R17,high(cz_takt/(16*pr_szer)-1)
    ldi R16,low(cz_takt/(16*pr_szer)-1)
    out UBRRH,R17
    out UBRRL,R16
    ldi R16, 0b10000110 //bity parz wylaczone
    //ldi R16,(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
    out UCSRC,R16
    ldi R16,(1<<RXEN)|(1<<TXEN)|(0<<UDRIE)|(1<<RXCIE)
    out UCSRB,R16
    sei

    Petla:
    rjmp Petla

    Wyslij:
    ldi R16,0x45
    out UDR,R16
    reti

    Odczytaj:
    push R17
    in R17,UDR
    out PORTC,R17
    pop R17
    reti


    Byłbym bardzo wdzięczny za pomoc.
  • #2 4099074
    kamyczek
    Poziom 38  
    Posty: 3994
    Pomógł: 394
    Ocena: 573
    A jesteś pewny że twoja mega korzysta z oscylatora 16 MHz. Bo zapewne działa na węwnętrznym oscylatorku RC poza tym trzeba sprawqdzić wartości bitów jtagen w przypadku włączenia jtaga port jest wyłączony !!!
  • #3 4099129
    isengrim
    Poziom 11  
    Posty: 15
    Tak - 16Mhz
    Teraz ciekawa rzecz... Bit jtagen miałem wyłączony ale sprawdziłem z książką ustawienia pozostałych bitów. Okazuje się, że zapomniałem o wyzerowaniu takich bitów jak:
    SUT0, CKSEL3-1
    W tym momencie przesyłanie cyfr (o co mi głównie chodziło) działa poprawnie. Niestety z literami dzieje się coś dziwnego - zmieniają się tylko bity 7 i 8. tzn. otrzymuję zawsze jedną z 4 kombinacji.
    Z ciekawości chętnie bym się dowiedział co jeszcze jest nie tak, aczkolwiek i tak bardzo dziękuję za zwrócenie uwagi na bity, ponieważ przy działającym przesyłaniu cyfr mogę dalsze prace rozpocząć. :)

    Jeszcze jedno - jak naciskam na kompie 2 razy jakąś cyfrę pod rząd to zwraca mi jakiś inny kod. Po ponownym naciśnięciu kod jest ok (i tak w kółko).



    Hmmm... odnośnie zwracanego kodu - jak już pisałem to co dostaje z USART'a wyświetlam na diodach i jednocześnie na wyświetlaczu 7-segmentowym (odejmuję od otrzymanego kodu 48 tak, żeby wyświetlane były cyfry). Na segmentach liczby 2 i 6 wyświetlane są ok, natomiast na diodach dla 2 i 6 wyświetlane jest to samo, czego nie rozumiem niestety.
  • #4 4099149
    Booby
    Poziom 14  
    Posty: 159
    Pomógł: 14
    Ocena: 4
    1) Adres wektora przerwań dla RXCIE to 0x1A a nie 0x1B,
    powinno być: .org 0x01A
    2) Adres wektora przerwań dla UDRIE to 0x1C a nie 0x1D,
    powinno być: .org 0x01C
    3) Tak naprawdę to przerwań UDRIE nie włączasz,
    powinno być: ldi R16,(1<<RXEN)|(1<<TXEN)|(1<<UDRIE)|(1<<RXCIE)
  • #5 4099169
    isengrim
    Poziom 11  
    Posty: 15
    Co do powyższego - wektory przerwań zmieniłem wg. wskazań ale działanie programu się nie zmieniło ;)
    bit UDRIE wyłączyłem bo on zdaje się tylko przy wysyłaniu jest potrzebny.
  • #6 4099401
    kamyczek
    Poziom 38  
    Posty: 3994
    Pomógł: 394
    Ocena: 573
    Jeśli możesz postaraj sie wysłać do terminala kolejno wartości hex 0x54,0x45,0x53,0x54 i sprawdź co wyświetla terminal jeśli to bedzie słowo TEST oznacza że mega wysyła poprawnie kody ascII możesz te same kody wysłać do megi i zobaczyć efekt na porcie a problem może być w formacie transmisji. Musisz sprawdzac podczas transmisji kilku bajtów gotowość bufora udre do zapisu.
REKLAMA