Прошу помогите, немогу понять в чем дело, почему код не работает так как надо.
Код для MK1 в режиме Master:
CODE:
;=======================================================================
;Autor: Ilnur 2011
;Project: Mega8 работа с SPI в режиме Master
;Name: SPImega8Master
;=======================================================================
.device ATmega8
.include "m8def.inc"
.list
.def temp=r16
.def data=r17
.org $0
rjmp init
INIT: ;стек
ldi temp,high(RAMEND)
out SPH,temp
ldi temp,low(RAMEND)
out SPL,temp
;порты
ldi temp,$00
out DDRD,temp
ldi temp,0b11111111
out PortD,temp
ldi temp,(1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0);
out SPCR,temp
;(1<<SPE) - разрешение работы SPI
;(1<<MSTR) - режим ведущего
;(1<<CPOL) - во время ожидания на SCK присутствует ВЫСОКИЙ уровень
;(1<<CPHA) - данные считываются по спадающему фронту SCK
;(1<<SPR1)|(1<<SPR0) - частота SCK равна СК/128
;режим работы №3 :)
ldi temp,(0<<SPI2X)
out SPSR,temp
;(0<<SPI2X) - двойная скорость отключена
;SPCR (0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0);
ldi temp,(1<<PB2)+(1<<PB3)+(1<<PB5)
out DDRB,temp ;MOSI, SS и SCK на выход
ldi temp,(0<<PB4) ;MISO на вход
out PortB,temp ;т.к. в режиме ведущего
;===
Main:
rcall Output
rjmp Main
Output:
ldi data,PortD
out SPDR,data ;запись данных в регистр данных
Wait_Transmit:
sbis SPSR,SPIF ;ждем окончания передачи байта
rjmp Wait_Transmit
ret
;Autor: Ilnur 2011
;Project: Mega8 работа с SPI в режиме Master
;Name: SPImega8Master
;=======================================================================
.device ATmega8
.include "m8def.inc"
.list
.def temp=r16
.def data=r17
.org $0
rjmp init
INIT: ;стек
ldi temp,high(RAMEND)
out SPH,temp
ldi temp,low(RAMEND)
out SPL,temp
;порты
ldi temp,$00
out DDRD,temp
ldi temp,0b11111111
out PortD,temp
ldi temp,(1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0);
out SPCR,temp
;(1<<SPE) - разрешение работы SPI
;(1<<MSTR) - режим ведущего
;(1<<CPOL) - во время ожидания на SCK присутствует ВЫСОКИЙ уровень
;(1<<CPHA) - данные считываются по спадающему фронту SCK
;(1<<SPR1)|(1<<SPR0) - частота SCK равна СК/128
;режим работы №3 :)
ldi temp,(0<<SPI2X)
out SPSR,temp
;(0<<SPI2X) - двойная скорость отключена
;SPCR (0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0);
ldi temp,(1<<PB2)+(1<<PB3)+(1<<PB5)
out DDRB,temp ;MOSI, SS и SCK на выход
ldi temp,(0<<PB4) ;MISO на вход
out PortB,temp ;т.к. в режиме ведущего
;===
Main:
rcall Output
rjmp Main
Output:
ldi data,PortD
out SPDR,data ;запись данных в регистр данных
Wait_Transmit:
sbis SPSR,SPIF ;ждем окончания передачи байта
rjmp Wait_Transmit
ret
Код для MK2 в режиме Slave:
CODE:
;=======================================================================
;Autor: Ilnur 2011
;Project: Mega8 работа с SPI в режиме Slave
;Name: SPImega8Slave
;=======================================================================
.device ATmega8
.include "m8def.inc"
.list
.def temp=r16
.def data=r17
.org $0
rjmp init
INIT: ;стек
ldi temp,high(RAMEND)
out SPH,temp
ldi temp,low(RAMEND)
out SPL,temp
;порты
ldi temp,$ff
out DDRD,temp
ldi temp,0b00000000
out PortD,temp
ldi temp,(1<<SPE)|(0<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0);
out SPCR,temp
;(1<<SPE) - разрешение работы SPI
;(0<<MSTR) - режим ведомого
;(1<<CPOL) - во время ожидания на SCK присутствует ВЫСОКИЙ уровень
;(1<<CPHA) - данные считываются по спадающему фронту SCK
;(1<<SPR1)|(1<<SPR0) - частота SCK равна СК/128
;режим работы №3 :)
ldi temp,(0<<SPI2X)
out SPSR,temp
;(0<<SPI2X) - двойная скорость отключена
;SPCR (0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0);
ldi temp,(0<<PB2)+(0<<PB3)+(0<<PB5)
out DDRB,temp ;MOSI, SS и SCK на вход
ldi temp,(1<<PB4) ;MISO на выход
out PortB,temp ;т.к. в режиме ведомого
;===
Main:
rcall Receive
out PortD,data
rjmp Main
Receive:
sbis SPSR,SPIF
rjmp Receive
in data,SPDR
ret
;Autor: Ilnur 2011
;Project: Mega8 работа с SPI в режиме Slave
;Name: SPImega8Slave
;=======================================================================
.device ATmega8
.include "m8def.inc"
.list
.def temp=r16
.def data=r17
.org $0
rjmp init
INIT: ;стек
ldi temp,high(RAMEND)
out SPH,temp
ldi temp,low(RAMEND)
out SPL,temp
;порты
ldi temp,$ff
out DDRD,temp
ldi temp,0b00000000
out PortD,temp
ldi temp,(1<<SPE)|(0<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0);
out SPCR,temp
;(1<<SPE) - разрешение работы SPI
;(0<<MSTR) - режим ведомого
;(1<<CPOL) - во время ожидания на SCK присутствует ВЫСОКИЙ уровень
;(1<<CPHA) - данные считываются по спадающему фронту SCK
;(1<<SPR1)|(1<<SPR0) - частота SCK равна СК/128
;режим работы №3 :)
ldi temp,(0<<SPI2X)
out SPSR,temp
;(0<<SPI2X) - двойная скорость отключена
;SPCR (0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0);
ldi temp,(0<<PB2)+(0<<PB3)+(0<<PB5)
out DDRB,temp ;MOSI, SS и SCK на вход
ldi temp,(1<<PB4) ;MISO на выход
out PortB,temp ;т.к. в режиме ведомого
;===
Main:
rcall Receive
out PortD,data
rjmp Main
Receive:
sbis SPSR,SPIF
rjmp Receive
in data,SPDR
ret
схема на которой все испытывал:
а вот что во время работы твориться (несмотря на то, какую кнопку нажимаешь):
подскажите что не так, может в схеме проблема? или в проге?
(Добавление)
AVR Studio ошибок не находит, все нормально
Правда в Proteus`е пишется что проц загружается на 88%-100%, и иногда жалуется на то, что слишком сильно проц загружен...
В чем дело может быть???