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

Brak odbioru danych z terminala przez mikrokontroler

13 Lip 2006 16:27 1031 3
  • Poziom 14  
    Próbuje uruchomić port szeregowy w ATtiny 2313. Napisałem programik w asm. Wysyłając jedną daną z terminala mikrokontroler ma ją odebrać i wysłać inna daną spowrotem. Jak to zrobić? Chce sprawdzić czy działa to w połączeniu z kompem, a pózniej chce zamiast MAX232 włożyć MAX3232 i spiąc to z telefonem komórkowym.
    Problem- Dane nie są wysyłane z kompa do mikroprocka. Poniżej znajduje sie czesc programu który napisałem.
    Z góry dzieki za sugestie. Pozdrawiam

    ldi r16,$DF ;ustawienie stosu
    out SPL,r16

    ldi R16,51
    out UBRR,R16 ;WPISANIE WARTOŚCI SET BAUD RATE 9600
    sbi UCR,RXEN ;odblokowanie nadajnika
    sbi UCR,TXEN ;odblokowanie odbiornika

    ldi r16,65
    rcall receive
    rcall transmition
    sei ;globalne zezwolenie
    wait:
    rjmp wait

    receive:
    sbis USR,RXC
    rjmp receive
    in R20,UDR
    ret
    transmition:
    sbis USR,UDRE
    rjmp transmition
    out UDR,R16
    ret

    Dodano po 57 [minuty]:

    sprzętowo jest wszystko OK. Przy zwarciu RXD i TXD po wyjęciu procka terminal odbiera to co nadał.
    Problem tkwi w sofcie. Co jest nie tak?
  • Poziom 27  
    Ja wprawdzi pisałem to na '51, na AVR jeszcze nie, ale moim zdaniem musisz zrobić to tak. Piszesz sobie 2 procedury, jedna ma odebrać znak, druga go nadać i obsługujesz je w przerwaniu (musisz odblokować przerwanie od odbiornika UART i nadajnika UART (ale to, które sygnalizuje koniec transmisji)).I teraz, gdy wywoła się przerwanie 'odebrałem znak' zczytujesz go z rejestru UARTa. A jeśli będzie przerwanie 'wysłałem znak' to wpisujesz nowy do rejestru danej UART. Tak to z grubsza powinno wyglądać. Więcej informacji w nocie katalogowej ;)
    Pozdrawiam.
  • Poziom 18  
    Chyba zapomniales zainicjowac pin txd jako wyjscie...
    pozdr.
  • Poziom 14  
    Terminal odbiera to co nadam z procka. Nie działa w drugą stronę- to co nadaję z terminala mikroprocek nie chce odbierać.

    Dodano po 3 [godziny] 41 [minuty]:

    Dzieki za zainteresowaniem postem. Juz rozwiązałem ten problem.
    Zasada działania jest nastepująca:
    Wysyłając jedną daną z terminala inicjalizujemy proces transmisji w mikrokontrolerze. Procek wysyła do komputera zawartość tablicy którą możemy odczytac w terminalu.

    .cseg 0000h
    rjmp INIT
    TAB1:
    .DB "A T + C M G R = 1";$30,$33,$32,$32,$23 ;TABLICA Z ZAWARTOSCIA HASŁA DOSTEPU ; (0,3,2,2,#)
    ; procedura inicjalizacyjna
    .equ UBRR=$09
    .equ UCR=$0A
    .equ UDR=$0C
    .equ USR=$0B
    .equ UDRE=5
    .equ TXEN=3
    .equ RXEN=4
    .equ RXCIE=7
    .equ RXC=7
    .equ UDRIE=5
    .equ SPL=$3D
    .equ DDRB=$17
    .equ PORTB=$18
    .equ PINB=$16
    .equ PIND=$10
    .equ DDRD=$11
    .equ PORTD=$12
    .equ RXD=0
    .equ GIMSK=$3B
    .equ MCUCR=$35
    .def ZL=r30
    .def ZH=r31

    INIT:
    ldi r16,$DF ;ustawienie stosu
    out SPL,r16

    ldi R16,51
    out UBRR,R16 ;WPISANIE WARTOŚCI SET BAUD RATE 9600
    sbi UCR,RXEN ;odblokowanie nadajnika
    sbi UCR,TXEN ;odblokowanie odbiornika
    sei
    sbi PORTD,RXD
    sbi DDRD,RXD
    dalej:
    ldi r20,0
    ldi r21,9
    rcall receive
    ldi ZH,HIGH(TAB1<<1) ;pobranie tablicy
    ldi ZL,LOW(TAB1<<1)
    rcall transmition
    sei ;globalne zezwolenie przerwań
    wait:
    rjmp wait
    receive:
    sbis USR,RXC
    rjmp receive
    in R15,UDR
    ret
    transmition:
    sbis USR,UDRE
    rjmp transmition
    lpm r17,Z
    out UDR,r17
    inc r20
    adiw ZH:ZL,2
    cpse r20,r21
    rjmp transmition

    rjmp dalej

    Temat uważam za zamknięty
    Pozdrawiam.