Без описания |
Поиск в теме | Версия для печати |
engee |
Отправлено: 01 Мая, 2011 - 22:59:27
|
Рядовой
Сообщений всего: 5
Дата рег-ции: Май 2011
|
Но, я так понял, автор потом нашел ошибку в коде и переправил у себя, я попытался найти в чем дело, но не получается( схема не работает
(Добавление)
Master
CODE:
.device atmega8a
.include "m8Adef.inc"
.nolist
.list
;============================
;Объявления:
.def temp=R16
.def data=R17
;============================
;RAM
.DSEG
;============================
;FLASH
.CSEG
;============================
;Таблица векторов прерываний
.org 0x000
rjmp SPI_MasterInit ; RESET
.org 0x001
RETI ; INT0
.org 0x002
RETI ; INT1
.org 0x003
RETI ; TIMER2 COMP
.org 0x004
RETI ; TIMER2 OVF
.org 0x005
RETI ; TIMER1 CAPT
.org 0x006
RETI ; TIMER1 COMPA
.org 0x007
RETI ; TIMER1 COMPB
.org 0x008
RETI ; TIMER1 OVF
.org 0x009
RETI ; TIMER0 OVF
.org 0x00a
RETI ; SPI, STC
.org 0x00b
RETI ; USART, RXC
.org 0x00c
RETI ; USART, UDRE
.org 0x00d
RETI ; USART, TXC
.org 0x00e
RETI ; ADC
.org 0x00f
RETI ; EE_RDY
.org 0x010
RETI ; ANA_COMP
.org 0x011
RETI ; TWI
.org 0x012
RETI ; SPM_RDY
;============================
;Инициализация
SPI_MasterInit:
ldi temp,high(RAMEND)
out SPH,temp
ldi temp,low(RAMEND)
out SPL,temp
;порты
ldi temp,0b00000000
out DDRD,temp
ldi temp,0b00000000
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
Slave
CODE:
.device atmega8a
.include "m8Adef.inc"
.nolist
.list
;============================
;Объявления:
.def temp=R16
.def data=R17
;============================
;RAM
.DSEG
;============================
;FLASH
.CSEG
;============================
;Таблица векторов прерываний
.org 0x000
rjmp SPI_SlaveInit ; RESET
.org 0x001
RETI ; INT0
.org 0x002
RETI ; INT1
.org 0x003
RETI ; TIMER2 COMP
.org 0x004
RETI ; TIMER2 OVF
.org 0x005
RETI ; TIMER1 CAPT
.org 0x006
RETI ; TIMER1 COMPA
.org 0x007
RETI ; TIMER1 COMPB
.org 0x008
RETI ; TIMER1 OVF
.org 0x009
RETI ; TIMER0 OVF
.org 0x00a
RETI ; SPI, STC
.org 0x00b
RETI ; USART, RXC
.org 0x00c
RETI ; USART, UDRE
.org 0x00d
RETI ; USART, TXC
.org 0x00e
RETI ; ADC
.org 0x00f
RETI ; EE_RDY
.org 0x010
RETI ; ANA_COMP
.org 0x011
RETI ; TWI
.org 0x012
RETI ; SPM_RDY
;============================
;Инициализация
SPI_SlaveInit:
ldi temp,high(RAMEND)
out SPH,temp
ldi temp,low(RAMEND)
out SPL,temp
;порты
ldi temp,0b11111111
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
вот что получается |
|
|
engee |
Отправлено: 09 Мая, 2011 - 02:56:32
|
Рядовой
Сообщений всего: 5
Дата рег-ции: Май 2011
|
АААААА!!! я схожу с ума, вроде почитал, разобрался в SPI, сделал примерно все по апноуту в даташите, даже протеус заработал! а вот на деле спаял и ничего не пашет, лампочка на слейве горит и горит, а должна бы гаснуть при нажатии кнопки на мастере. Оговорюсь что контроллеры соеденены портами MISO, MOSI, SCK, GND, VCC, RESET. Ну просто это те порты через которые я прошиваю контроллер программатором, на обоих макетках были одинаковые гнезда и я просто обжал шестижильный кабель и соединил эти гнезда. Мастер питается от телефонной зарядки 4,9В\700мА. и шестижильный кабель, будучи соединённым с GND и VCC - передает питание слейву, ну лампочка горит на нем по крайней мере. Контроллеры Atmega8A.
Мастер:
CODE:
.include "m8Adef.inc"
.org 0x000 rjmp Init ; Reset Handler
Init:
ldi r16,(1<<PB3)+(1<<PB5)+(1<<PB2)
out DDRB,r16 ;mosi, SS и sck выходы
ldi r16,(1<<PB2)
out PORTB,r16 ; 1 в SS делает контроллер мастером
ldi r16,0
out DDRD,r16 ;Порт D сконфигурирован как вход
ldi r16,255 ; начальные значения на D - выс лог уровни
out PORTD,r16
;Настройка SPI
ldi r16,(1<<SPR0)+(1<<SPE)+(1<<MSTR)
out SPCR,r16 ;Enable SPI, Master, set clock rate fck/16
SPI_MasterTransmit:
; Start transmission of data (r16)
in r16,PIND
out SPDR,r16
Wait_Transmit:
; Wait for transmission complete
sbis SPSR,SPIF
rjmp Wait_Transmit
rjmp SPI_MasterTransmit
Слейв:
CODE:
.include "m8Adef.inc"
.org 0x000 rjmp Init
Init:
;init ports
ldi r16,(1<<PB4)
out DDRB,r16 ;miso выход, SS и остальные - входы
ldi r16,(0<<PB2)
out PORTB,r16 ;SS установлен в 0, чтобы мк мог принимать данные от мастера
ldi r16,255
out DDRD,r16 ;порт D - выход
ldi r16,255 ; Зажигаем светодиод
out PORTD,r16
;настройка SPI
ldi r16,(1<<SPE)
out SPCR,r16 ;SPI включен
SPI_SlaveReceive:
; Wait for reception complete
sbis SPSR,SPIF
rjmp SPI_SlaveReceive
; Read received data and return
in r16,SPDR
out PORTD,r16
rjmp SPI_SlaveReceive
|
|
|
|
Поиск в теме | Версия для печати |
Страниц (3): « 1 [2] 3 » |
« Программирование микроконтроллеров » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|