Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » Не работает SPI на ассемблер ATmega8

Страниц (3): [1] 2 3 »
 

1. ilnur888 - 11 Апреля, 2011 - 13:41:33 - перейти к сообщению
Всем добрый день!
Прошу помогите, немогу понять в чем дело, почему код не работает так как надо.
Код для 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


Код для 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


схема на которой все испытывал:


а вот что во время работы твориться (несмотря на то, какую кнопку нажимаешь):


подскажите что не так, может в схеме проблема? или в проге?
(Добавление)
AVR Studio ошибок не находит, все нормально
Правда в Proteus`е пишется что проц загружается на 88%-100%, и иногда жалуется на то, что слишком сильно проц загружен...
В чем дело может быть???
2. nestandart - 11 Апреля, 2011 - 14:15:37 - перейти к сообщению
Зачем городить конструкцию из 2 МК ?
Как это должно работать ?
(Добавление)
Кнопки должны быть притянуты к +5v через резисторы.
У вас получается : когда кнопка включена - она притянута к земле ,
а когда выключена - нога МК "болтается в воздухе" и МК принимает "случайные значения".

Я бы подключил кнопки не кземле а к +5v а ноги МК притянул к земле через резисторы.
(Добавление)
На светодиодах должны стоять ограничительные резисторы.
У вас к одному порту подключено 8 светодиодов "на прямую" ,
можно запросто спалить МК

Может быть я ошибаюсь , но я бы не рискнул включать такую конструкцию.
3. ilnur888 - 11 Апреля, 2011 - 14:37:09 - перейти к сообщению
Сделал конструкцию из 2 МК чтобы проверить, работает SPI иль нет.
Это работает так, выводы PortD МК1 соединены с кнопками, в зависимости от того, какая кнопка нажата в данный момент должны гореть светодиоды от МК2, т.е. по SPI передается байт считанный из портов PortD МК2.
Хм, насчет кнопок, счас попробую
(Добавление)

непомогло
Мне кажется дело не в этом, так я и раньше пробовал...
4. nestandart - 11 Апреля, 2011 - 14:41:11 - перейти к сообщению
Выложите измененную схему.
5. ilnur888 - 11 Апреля, 2011 - 14:41:36 - перейти к сообщению
nestandart, Улыбка)) это же виртуальное устройство, чего вы так боитесь? Вы никогда не работали в Proteus? Улыбка
6. nestandart - 11 Апреля, 2011 - 14:46:27 - перейти к сообщению
Вы меня не совсем поняли.

В вашей последней схеме , подтяните ноги МК к земле , через резисторы.

Один "конец" резистора между кнопкой и ногой МК , второй к земле.
Так каждую кнопку.
(Добавление)
В Proteus не работал .
Я бы не рискнул собирать реальное устройство по этой схеме.
7. ilnur888 - 11 Апреля, 2011 - 14:48:53 - перейти к сообщению
Nestandart, скажите пожалуйста, а код правильный?

Я не собираюсь собирать это устройство.
8. nestandart - 11 Апреля, 2011 - 14:51:18 - перейти к сообщению
На счет кода ничего конкретного не скажу.
Я не пину на асемблере.
9. ilnur888 - 11 Апреля, 2011 - 14:52:44 - перейти к сообщению
А работали ли вы с SPI?
(Добавление)
Мне нужна помощь в коде, скорее всего ошибка там, еще ошибка может быть в соединении SPI и настройкой выводов этого самого SPI как вход/выход...
10. nestandart - 11 Апреля, 2011 - 14:59:04 - перейти к сообщению
Переделайте схему , если не поможет знасит проблема в программе.
(Добавление)
Должно быть вот так.

Каждая кнопка.


(Добавление)
Номинал резистора может быть другим .
Можете попробовать 100К.
11. ilnur888 - 11 Апреля, 2011 - 15:22:37 - перейти к сообщению
Хех, заработало!!!
Ошибка-то в проге была!!!
Все, исправил, дело было вход/выход неправильно, соединение SPI правильно, теперь при нажатии на кнопку включ соотв светодиод, т.е. передача байтов работает!!!!
Ща, перепроверю отпишу...
Резисторы на всякий пожарный поставил уж... (хотя в компе ниче и не сгорит) Улыбка))
(Добавление)
Вообщем работает, только вот когда кнопку отожмешь, то лог. 1 все равно остается на выводе (с чего бы так), пробовал и в проге обнулять - пока незнаю че и делать.
Вот, работает так-то, передаетт! Улыбка
12. nestandart - 11 Апреля, 2011 - 15:45:08 - перейти к сообщению
Резисторы включены не правильно.
Там их вообще не должно быть.
Я же рисовал на схеме выше как должно быть.
Резисторы должны быть между кнопкой и МК а не между кнопкой и +5v.
А на последней схеме при отжатой кнопке может быть любой лог ,

при том он может меняться сам по себе.
(Добавление)
Если нога МК подключена к +5 - лог 1.
Если к GND - лог 0.
Нога МК не подключеная ни куда будет собирать внешние наводки и выдавать
случайные логи.
Нажатая кнопка должна подключать ногу МК к +5
а отжатая к GND.
(Добавление)
Как вариант можете включить внутренние резисторы "подтяжки".
13. ilnur888 - 11 Апреля, 2011 - 17:49:37 - перейти к сообщению
Это не помогает!!!
Я не знаю, программно не получается, это точно не связано с тем что ножки с/без резистора

Что-то надо делать...
14. nestandart - 11 Апреля, 2011 - 18:03:48 - перейти к сообщению
Цитата:
Я не знаю, программно не получается, это точно не связано с тем что ножки с/без резистора

Вы считываете данные с ноги МК
и у вас при любом раскладе лог1 ?

На новую схему можно взглянуть ?
(Добавление)
Что именно не получается ?
Светодиоды не реагируют на кнопки ?
15. ilnur888 - 11 Апреля, 2011 - 18:08:10 - перейти к сообщению
Улыбка
Схема такая же, просто дело в том, что если я кнопку нажимаю (появл. лог.1 - правильно) и потом отжимаю, то лог. 1 остается на выводе МК, а оставаться не должен по сути (откуда?), я и в прогевсе порты обнуляю...

Мне нужно чтобы кто-нить проверил код на наличие ошибок, чувствую что-то там нето...