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