реклама на сайте
подробности

 
 
> USART
MaUrJIu
сообщение Jul 25 2011, 08:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 2-04-11
Пользователь №: 64 078



Нужно организовать передачу данных от микросхемы к мк 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, 08:34
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MaUrJIu
сообщение Jul 28 2011, 16:43
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 2-04-11
Пользователь №: 64 078



Посмотрел, но там ничего не было. Только сейчас кажется понял почему. Эта микросхема (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)

Сообщение отредактировал MaUrJIu - Jul 28 2011, 16:50
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MaUrJIu   USART   Jul 25 2011, 08:31
- - Палыч   Цитата(MaUrJIu @ Jul 25 2011, 12:31) Инте...   Jul 25 2011, 08:39
- - MaUrJIu   Да, кончено, нога ХСК подсоединена к источнику син...   Jul 25 2011, 08:50
|- - Палыч   Цитата(MaUrJIu @ Jul 25 2011, 12:50) Но п...   Jul 25 2011, 09:24
- - MaUrJIu   Действительно перепутал значения. В дш на микросхе...   Jul 25 2011, 09:42
|- - Палыч   Цитата(MaUrJIu @ Jul 25 2011, 13:42) Код ...   Jul 25 2011, 10:09
|- - ILYAUL   Цитата(Палыч @ Jul 25 2011, 14:09) Устано...   Jul 25 2011, 10:22
|- - Палыч   Цитата(ILYAUL @ Jul 25 2011, 14:22) А в 8...   Jul 25 2011, 11:57
|- - ILYAUL   Цитата(Палыч @ Jul 25 2011, 15:57) Ещё мо...   Jul 25 2011, 12:42
|- - Палыч   Цитата(ILYAUL @ Jul 25 2011, 16:42) Там B...   Jul 25 2011, 13:05
- - MaUrJIu   ЦитатаОгласите Fosc и Baud Rate Fosc = 1 МГц Baud ...   Jul 25 2011, 15:21
|- - ILYAUL   Цитата(MaUrJIu @ Jul 25 2011, 19:21) Fosc...   Jul 25 2011, 15:39
|- - MaUrJIu   Цитата(ILYAUL @ Jul 25 2011, 19:39) Отлич...   Jul 26 2011, 08:14
- - ILYAUL   У Вас осцил есть , что бы сигналы посмотреть?   Jul 26 2011, 08:19
- - MaUrJIu   Нет к сожалению. Могу посмотреть, но это все нужно...   Jul 26 2011, 08:26
|- - ILYAUL   Цитата(MaUrJIu @ Jul 26 2011, 12:26) Нет ...   Jul 26 2011, 08:43
- - MaUrJIu   ЦитатаПричём здесь они , они на PD1 PD2 , а инит д...   Jul 26 2011, 10:05
- - ILYAUL   Смотрите сигналы- расскажите   Jul 26 2011, 10:13


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 14:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01387 секунд с 7
ELECTRONIX ©2004-2016