Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USART
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
MaUrJIu
Нужно организовать передачу данных от микросхемы к мк atmega8. Интерфейс передачи синхронный полудуплексный. Т.е. для того чтобы использовать USART я соединил ноги rx и tx. Мк ведомое устройство. Значит инициализирую usart:
Код
USART_Init:    ldi R16,(1<<RXEN)|(1<<TXEN)
            out UCSRB,R16
            ldi R16,(1<<URSEL)|(1<<UMSEL)|(3<<UPM0)|(3<<UCSZ0)
            out UCSRC,R16
            cbi PORTD,4
            ret

И принимаю данные:
Код
USART_Receive:    sbis UCSRA,RXC
            rjmp USART_Receive
            in RXbyte,UDR
            ret

Но это дело не работает. Не могу понять почему. Дайте пожалуйста мне идеи или подскажите, что я делаю не так.
P.S. Или подскажите какую-нибудь микросхемку с данным интерфейсом в протеусе
Палыч
Цитата(MaUrJIu @ Jul 25 2011, 12:31) *
Интерфейс передачи синхронный полудуплексный. Т.е. для того чтобы использовать USART я соединил ноги rx и tx.
Ну, раз - синхронный, то ещё - синхроимпульсы (нога ХСК).
MaUrJIu
Да, кончено, нога ХСК подсоединена к источнику синхроимпульсов. Но приема почему то не происходит.
Палыч
Цитата(MaUrJIu @ Jul 25 2011, 12:50) *
Но приема почему то не происходит.
Возможно, неправильно установлен UCPOL

P.S. Надеюсь, что PD4 установлена на ввод.
MaUrJIu
Действительно перепутал значения. В дш на микросхему написано, что считывать по нарастающему фронту. Установил бит UCPOL в 1.
Код
USART_Init:    ldi R16,(1<<RXEN)|(1<<TXEN)
            out UCSRB,R16
            ldi R16,(1<<URSEL)|(1<<UMSEL)|(3<<UPM0)|(3<<UCSZ0)|(1<<UCPOL)
            out UCSRC,R16
            cbi PORTD,4
            ret

Но все равно не работает пока.
Цитата
P.S. Надеюсь, что PD4 установлена на ввод.

Я сделал так: cbi PORTD,4. Это правильно?
Палыч
Цитата(MaUrJIu @ Jul 25 2011, 13:42) *
Код
            cbi PORTD,4

Установлен ли PD4 на ввод?

Управляет направлением в Вашем случае регистр DDRD

Цитата(MaUrJIu @ Jul 25 2011, 13:42) *
Но все равно не работает пока.
Огласите Fosc и Baud Rate
ILYAUL
Цитата(Палыч @ Jul 25 2011, 14:09) *
Установлен ли PD4 на ввод?

А в 8-ке по сбросу порты не устанвливаются как входы ? Не работал с ней

Цитата(MaUrJIu @ Jul 25 2011, 13:42) *
Действительно перепутал значения. В дш на микросхему написано, что считывать по нарастающему фронту. Установил бит UCPOL в 1.

Для приема - это спадающий фронт. Нет, sorry,не туда посмотрел
Палыч
Цитата(ILYAUL @ Jul 25 2011, 14:22) *
А в 8-ке по сбросу порты не устанвливаются как входы ? Не работал с ней
Да, по сбросу - на ввод. Но, поскольку, автор привёл только часть программы, не исключено, что где-то нечаенно перевел его на вывод...

Ещё может не работать, если Baud Rate - высокий, а тактовая (Fosc) - низкая для данного Baud Rate ...
ILYAUL
Цитата(Палыч @ Jul 25 2011, 15:57) *
Ещё может не работать, если Baud Rate - высокий, а тактовая (Fosc) - низкая для данного Baud Rate ...

Ну с этим я полностью согласен. beer.gif Там Baud Rate <Fosc/4 должон быть, как минимум.

Но по-моему этим
Цитата
Огласите Fosc и Baud Rate
Вы топикстартера поставили в тупик biggrin.gif Помягче может быть? Частота процессора , скорость обмена sm.gif

Цитата
В дш на микросхему написано, что считывать по нарастающему фронту

Не согласен.
Можно считывать и так и так , но необходимо знать , по какому фронту мастер считает , что выставленный им бит - true и под этот фронт настроить приёмник т.е UCPOL
Палыч
Цитата(ILYAUL @ Jul 25 2011, 16:42) *
Там Baud Rate < Fosc/4 должон быть, как минимум.

Да, согласно DS (Rev.M стр.133) : Fxck < Fosc/4
MaUrJIu
Цитата
Огласите Fosc и Baud Rate

Fosc = 1 МГц
Baud Rate (задает микросхема) = 10-16,7 кГц
Цитата
А в 8-ке по сбросу порты не устанвливаются как входы ?

По умолчанию все биты DDRD установлены в ноль, т.е. наверное настроены как вход.
Я изменил строку:
Код
cbi PORTD,4

на
Код
cbi DDRD,4

но пока не работает...
ILYAUL
Цитата(MaUrJIu @ Jul 25 2011, 19:21) *
Fosc = 1 МГц
Baud Rate (задает микросхема) = 10-16,7 кГц

По умолчанию все биты DDRD установлены в ноль, т.е. наверное настроены как вход.
Я изменил строку:
Код
cbi PORTD,4

на
Код
cbi DDRD,4

но пока не работает...

Отличненько , а теперь
добавьте
Код
SBI PORTD,4
и проверьте есть единица на шине RX
MaUrJIu
Цитата(ILYAUL @ Jul 25 2011, 19:39) *
Отличненько , а теперь
добавьте
Код
SBI PORTD,4
и проверьте есть единица на шине RX

Добавил. Единица есть. Но она есть и без этой строчки. У меня же rx и tx соединены.
ILYAUL
У Вас осцил есть , что бы сигналы посмотреть?
MaUrJIu
Нет к сожалению. Могу посмотреть, но это все нужно делать в универе. А что нужно посмотреть?
ILYAUL
Цитата(MaUrJIu @ Jul 26 2011, 12:26) *
Нет к сожалению. Могу посмотреть, но это все нужно делать в универе. А что нужно посмотреть?

Есть ли сигнал Start , Data на RX от мастера и что на XCK

Цитата
...У меня же rx и tx соединены...


Причём здесь они , они на PD1 PD2 , а инит делали для PD4 ( XCK)
MaUrJIu
Цитата
Причём здесь они , они на PD1 PD2 , а инит делали для PD4 ( XCK)

Видимо я Вас не понял. На XCK есть лог. 1. Если убрать SBI PORTD,4, то 0.
ILYAUL
Смотрите сигналы- расскажите
MaUrJIu
Посмотрел, но там ничего не было. Только сейчас кажется понял почему. Эта микросхема (adns-2610 или мышь) при подаче питания посылает два пакета данных и ждет команды от хоста. При этом на линиях clock (наверное только на ps/2, это я понял судя по напряжению на этой ноге - у ps/2=5v у usb=2,6v. Обратил внимание на это только дома, поэтому на осциле не посмотрел) и data лог. 1. Так вот кажется я что-то нашел, но вот что понять не могу.
Код всей программы:

Код
/*
* AVRAssembler2.asm
*    Title        Connect the mouse to the computer via com port     
*  Created    xxx
*  Author        xxx
*    email        xxx
*/

.include "m8def.inc"

;***** Pin definitions

.equ    Rx    =2;Receive pin is PC2
.equ    Tx    =3;Transmit pin is PC3

;***** Global register variables

.def    bitcnt    =R16;bit counter
.def    temp    =R17;temporary storage register

.def    Txbyte    =R18;Data to be transmitted
.def    RXbyte    =R19;Received data

.cseg
.org 0
    rjmp    reset

;***************************************************************************
;*
;* "USART_Init"
;*
;* This subroutine initializes the hardware UART
;*
;***************************************************************************
USART_Init:    ldi R16,(1<<RXEN)|(1<<TXEN)
            out UCSRB,R16
            ldi R16,(1<<URSEL)|(1<<UMSEL)|(1<<UPM1)|(3<<UCSZ0)|(1<<UCPOL)
            out UCSRC,R16
            cbi DDRD,4
;sbi PORTD,4
            ret

USART_Transmit:    sbis UCSRA,UDRE
            rjmp USART_Transmit
            out UDR,Txbyte
            ret

USART_Receive:    sbis UCSRA,RXC
            rjmp USART_Receive
            in RXbyte,UDR
            ret

;***************************************************************************
;*
;* "putchar"
;*
;* This subroutine transmits the byte stored in the "Txbyte" register
;* The number of stop bits used is set with the sb constant
;*
;* Number of words    :14 including return
;* Number of cycles    :Depens on bit rate
;* Low registers used    :None
;* High registers used    :2 (bitcnt,Txbyte)
;* Pointers used    :None
;*
;***************************************************************************
.equ        sb    =1;Number of stop bits (1, 2, ...)

putchar:    ldi    bitcnt,9+sb;1+8+sb (sb is # of stop bits)
        com    Txbyte;Inverte everything
        sec;Start bit

putchar0:    brcc    putchar1;If carry set
        cbi    PORTC,Tx;    send a '0'
        rjmp    putchar2;else    

putchar1:    sbi    PORTC,Tx;    send a '1'
        nop

putchar2:    rcall UART_delay;One bit delay
        rcall UART_delay

        lsr    Txbyte;Get next bit
        dec    bitcnt;If not all bit sent
        brne    putchar0;   send next
;else
        ret;   return


;***************************************************************************
;*
;* "getchar"
;*
;* This subroutine receives one byte and returns it in the "Rxbyte" register
;*
;* Number of words    :14 including return
;* Number of cycles    :Depens on when data arrives
;* Low registers used    :None
;* High registers used    :2 (bitcnt,Rxbyte)
;* Pointers used    :None
;*
;***************************************************************************

getchar:    ldi     bitcnt,9;8 data bit + 1 stop bit

getchar1:    sbic     PINC,Rx;Wait for start bit
        rjmp     getchar1

        rcall UART_delay;0.5 bit delay

getchar2:    rcall UART_delay;1 bit delay
        rcall UART_delay        

        clc;clear carry
        sbic     PINC,Rx;if RX pin high
        sec;

        dec     bitcnt;If bit is stop bit
        breq     getchar3;   return
;else
        ror     Rxbyte;   shift bit into Rxbyte
        rjmp     getchar2;   go get next

getchar3:    ret


;***************************************************************************
;*
;* "UART_delay"
;*
;* This delay subroutine generates the required delay between the bits when
;* transmitting and receiving bytes. The total execution time is set by the
;* constant "b":
;*
;*    3·b + 7 cycles (including rcall and ret)
;*
;* Number of words    :4 including return
;* Low registers used    :None
;* High registers used    :1 (temp)
;* Pointers used    :None
;*
;***************************************************************************
; Some b values:     (See also table in Appnote documentation)
;
; 1 MHz crystal:
;   9600 bps - b=14
;  19200 bps - b=5
;  28800 bps - b=2
;
; 2 MHz crystal:
;  19200 bps - b=14
;  28800 bps - b=8
;  57600 bps - b=2

; 4 MHz crystal:
;  19200 bps - b=31
;  28800 bps - b=19
;  57600 bps - b=8
; 115200 bps - b=2

.equ    b    =5;19200 bps @ 1 MHz crystal


UART_delay:    ldi    temp,b
UART_delay1:    dec    temp
        brne    UART_delay1

        ret

;***** Program Execution Starts Here

;***** Test program

reset:    sbi        PORTC,Tx;Init port pins
        sbi        DDRC,Tx

        push    Txbyte
        rcall    USART_Init;Init USART

        ldi        Txbyte,12;Clear terminal
        rcall    putchar

        ldi R16,(0<<RXEN)
        out UCSRB,R16

;ldi        Txbyte,0xFF
;rcall    USART_Transmit
        
        ldi R16,(1<<RXEN)
        out UCSRB,R16

forever:    rcall USART_Receive
        mov    Txbyte,Rxbyte
        rcall    putchar;Echo received char
        rjmp    forever

Так вот если вкл. в код (см. после метки reset):

Код
ldi R16,(0<<RXEN)
        out UCSRB,R16

;ldi        Txbyte,0xFF
;rcall    USART_Transmit
        
        ldi R16,(1<<RXEN)
        out UCSRB,R16

То программа начинает принимать данные от мыши, но отправка команд ей не работает. Почему это происходит я понять никак не могу. Может есть мысли по этому поводу? Могу предположить, что мк не опускает clock перед передачей, как это требует мышь... (Я еще не знаю всех тонкостей работы usart-a)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.