Обсуждаем контроллеры компании Atmel.
Ответить

Re: Вопрос по SPI на asm

Вс сен 04, 2016 10:05:25

Alkul
Спойлер, я инстинктивно :) старался минимизировать число одновременно работающих прерываний, и поскольку время позволяло ( у мастера ), передавал в отдельной ветке, посматривая на флаг SPIF "вручную", в промежутках между основной работой, а слейв терпеливо ждал - куда ему деваться, он же слейв.
, кажется, вы слишком усложнили для консультируемого процесс пониманя. Вроде ему надо вязаться с ЖКИ, достаточно передачи в одну сторону, это наполовину уменьшает объем непоняток. Судя по последнему посту, все-таки SPI он еще не понимает.
Попробую последний раз.
Итак, мастер и слейв соединены 4 линиями пин-в-пин MOSI,MISO,CLK,SS. Исходно на SS высокий.
1. Вешаем низкий на SS, для слейва это значит : "Охапкин, возьми трубку, щас разговаривать будем".
2. Закидываем в SPDR первый байт из передаваемого пакета. Больше программно ничего не происходит, кусок схемы мастера, заточенный под SPI, самостоятельно начинает передавать слейву байт - бит за битом, дергая клок.
3. Закончив передачу байта, мастер выставляет флаг SPIF. Если выставлено разрешение прерывания и написан соответствующий обработчик, в этом обработчике : если данные переданы не все, закидывается следующий байт, соответственно передвинув указатель; если пакет передан полностью, на SS кидаем высокий : "Отбой,Вася !". Если разрешение на прерывание по SPI нет, отслеживать флаг SPIF с соответствующими вышеописанными манипуляйциями нужно "вручную", в головной программе.
Вот так-то, в таком аксепте :) . А одновременно или попеременно аппаратный и программный режим - это никак.

Блин, оказывается, речь шла о 10-битном слове. А я зря клаву топтал, пальцы мозолил. Но набранного жалко, опубликую. Кстати - а что это за чудо, у которого 10-битный кадр ?

Re: Вопрос по SPI на asm

Вс сен 04, 2016 10:15:59

Jack_A писал(а):кажется, вы слишком усложнили для консультируемого процесс пониманя.

Я попробовал описать процесс подробно. Для новичка может быть неочевидным, что для получения требуемых данных, если их у слейва несколько, надо сделать не один, а два цикла обмена. Ведь в первом цикле слейв еще "не знает", какие данные хочет получить мастер и отправляет то содержимое SPDR (для аппаратной реализации), которое находилось там перед началом обмена и не факт, что там лежало то, что нужно мастеру в данный момент.
В общем случае, для получения N байт данных надо сделать N+1 цикл обмена.

Jack_A писал(а): Вроде ему надо вязаться с ЖКИ...
Блин, оказывается, речь шла о 10-битном слове.

uk8amk писал(а):Все это так, но автору темы требуется 10-битный кадр.

Изначально у автора на диаграмме указаны 8-ми битные посылки.
Упоминания про подключение к ЖКИ я в теме не нашел... Мне кажется, автор про 10 бит просто так спросил. Вопрос в стиле "А как поступить, если?.."
Но что мы за автора гадаем, пусть сам уточнит, что же ему именно нужно.
Автор, напишите, ЧТО вы хотите подключить к МК по SPI.

Re: Вопрос по SPI на asm

Вс сен 04, 2016 10:31:57

А это он в другом разделе :
viewtopic.php?f=62&t=134878&p=2850137#p2850137
Насчет "ничего общего" он слукавил...

Re: Вопрос по SPI на asm

Вс сен 04, 2016 21:00:48

Все верно, мне нужно подключить oled ЖКИ по SPI. А т.к. все примеры на Си, а на asm есть библиотека только для простого дисплея в 4бита. Вот решил, заточить такую и попутно понять как пользоваться интерфейсом... диаграмм как раз от дисплея где два бита управления и 8бит данные, вот 10бит вырисовалось. В шите к дисплеям на WS0010 контроллера нет описания работы в SPI, кроме диаграммы...

Если смотреть диаграмму на флешь память 25 серии то там слова настройки и пересылки по 8 бит (00000011,10101010), тут может тоже, но пока по диаграмме видно одно в 10бит.

SPI-diagram.PNG
(38.25 KiB) Скачиваний: 485


я специально опустит SS в коде... потом нарисую все полностью...

Из написанного понимаю, что когда байт будет SPDR, то МК повиснит на этой строке, чтоб передать все 8 бит, после окончания уже в SPDR будет 8 бит от слейва и произойдет прерывание SPI_STC в котором я могу забрать данные, как в шите МК и там же записать новое слово, так. И не будет никакой цикличности программы (бит - прерывание)...

А как шить МК, когда уже пины заняты, т.е. надо в схеме городить логику, диоды или все просто - пришел от программатора SS на "0" и все...

Re: Вопрос по SPI на asm

Вс сен 04, 2016 21:59:53

vit007 писал(а): понимаю, что когда байт будет SPDR, то МК повиснит на этой строке

Неправильно понимаете. Никто ни на ком не повиснет, МК как ни в чем не бывало продолжит работу. Работа может быть как полезной ( продолжение вычислений или слежение за кнопками и т.д. ), так и тупым delay'ем - это зависит от квалифик^ции программера. А передача идет cсама по себе схемным автоматом SPI, не зависящим от выполняемой проги. А когда весь байт передан, он выставит флаг SPIF; "Ребята, я закончил !" .
Представим себе ( из реального изделия ) : МК непрерывно измеряет ток двигателя на предмет отрубить его при перегрузке. И тут возникла необходимость планово записать данные в журнал на внешней карточке через SPI. Так что, бросать следить за двигуном, всецело отдавшись передаче ? Хренушки, движок без контроля не оставим, передадим данные в фоновом режиме вышеописанным способом, продолжая измерять ток и лишь отвлекаясь на краткий миг запуливания следующей буквы в SPDR . Делу - время, а потехе ...

Re: Вопрос по SPI на asm

Пн сен 05, 2016 08:57:57

vit007 писал(а):Если смотреть диаграмму на флешь память 25 серии то там слова настройки и пересылки по 8 бит (00000011,10101010), тут может тоже, но пока по диаграмме видно одно в 10бит.

Блин, до меня только сейчас дошло. Плохо, когда задающий вопрос путается в предмете.
Автор, а ничего, что приведенная вами диаграмма - это интерфейс i2c, а Вы всех мучаете насчет интерфейса SPI? Это, вообще-то совершенно разные интерфейсы передачи, с совершенно разной логикой.

Re: Вопрос по SPI на asm

Пн сен 05, 2016 10:20:35

Мне тоже так показалось, не стал вникать глубоко, думал - чел ведь знает, чего хочет .
Спойлер"Крокодил - он тоже птица, только летает низенько-низенько "

Re: Вопрос по SPI на asm

Пн сен 05, 2016 12:24:54

Странно, не была такого :shock:

http://www.winstar.com.tw/products/oled ... 1602c.html

я ж название контроллера написал.... шит, что ли посмотреть нельзя было...

Значит аппаратный SPI работает параллельно программе, может поэтому и надо ждать появления флаг, а то как понять когда собирать данный со слейва...

А при программном этого преимущества не получить...
Последний раз редактировалось vit007 Пн сен 05, 2016 12:29:08, всего редактировалось 1 раз.

Re: Вопрос по SPI на asm

Пн сен 05, 2016 12:27:14

vit007 писал(а):Все верно, мне нужно подключить oled ЖКИ по SPI...
Начал бы примерно с такого ногодрыгания
Спойлер
Код:
.include "m8def.inc"

.def   Temp0=R16
.def   Temp1=R17
.def   Temp2=R18
.def   Temp3=R19
.def   Temp4=R20
.def   Temp5=R21
.def   Temp6=R22

.equ   MOSI=3
.equ   CSB=2
.equ   SCK=5

.equ   RS=1
.equ   RW=0

.cseg

.org 0

;rjmp RESET ; Reset Handler
;reti ;rjmp EXT_INT0 ; IRQ0 Handler
;reti ;rjmp EXT_INT1 ; IRQ1 Handler
;reti ;rjmp TIM2_COMP ; Timer2 Compare Handler
;reti ;rjmp TIM2_OVF ; Timer2 Overflow Handler
;reti ;rjmp TIM1_CAPT ; Timer1 Capture Handler
;reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
;reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
;reti ;rjmp TIM1_OVF ; Timer1 Overflow Handler
;reti ;rjmp TIM0_OVF ; Timer0 Overflow Handler
;rjmp SPI_STC ; SPI Transfer Complete Handler
;reti ;rjmp USART_RXC ; USART RX Complete Handler
;reti ;rjmp USART_UDRE ; UDR Empty Handler
;reti ;rjmp USART_TXC ; USART TX Complete Handler
;reti ;rjmp ADC_CC ; ADC Conversion Complete Handler
;reti ;rjmp EE_RDY ; EEPROM Ready Handler
;reti ;rjmp ANA_COMP ; Analog Comparator Handler
;reti ;rjmp TWSI ; Two-wire Serial Interface Handler
;reti ;rjmp SPM_RDY ; Store Program Memory Ready Handler

RESET:
      ldi Temp0,high(RAMEND)
      out SPH,Temp0
      ldi Temp0,low(RAMEND)
      out SPL,Temp0

      ldi Temp0,0b00101100      ; 2-SS(CS), 3-MOSI(SDI), 4-MISO(SDO)вход, 5-SCK(SCL)   
      out DDRB,Temp0
   OUT   PORTB,Temp0
;********************************************
;выдача команды очистки дисплея
   CBI   PORTB,CSB
   LDI   R21,0<<RS|0<<RW   ; будет запись команды
   LDI   R22,0b00000001   ; собственно команда очистки дисплея
   RCALL   WRITE_SPI
   SBI   PORTB,CSB
cycle:         
      rjmp cycle      
;*************************
WRITE_SPI:
   CLR   R20
GO_WRITE:
   CBI   PORTB,MOSI
   SBRC   R21,1   ; соответствует биту RS
   SBI   PORTB,MOSI

   CBI   PORTB,SCK
   RCALL   PAUSE_RET
   SBI   PORTB,SCK

   LSL   R22
   ROL   R21
   INC   R20
   CPI   R20,10
   BRLO   GO_WRITE
PAUSE_RET:   
   RET

.EXIT

Re: Вопрос по SPI на asm

Пн сен 05, 2016 12:54:58

vit007 писал(а):Значит аппаратный SPI работает параллельно программе, может поэтому и надо ждать появления флаг, а то как понять когда собирать данный со слейва...

Аппаратные модули потому и аппаратные, что работают независимо... т.е. параллельно программе. SPI, UART, ... и т.д.

Как понять когда собирать данный со слейва ? Не обязательно ждать флаг. Можно просто переодически его проверять...

А можно и не проверять)) Если цикл задан жёстко, то зная время когда будет отправлен следующий байт и зная время передачи байта... можно высчитать когда в слейве появится следующий байт. Забираем из буфера байт, не дожидаясь всяких флагов))
vit007 писал(а):я ж название контроллера написал.... шит, что ли посмотреть нельзя было...

Я чтото не понял... Что Вы вообще хотите сделать? Связать два МК (типа ATmega8) по SPI... или подключить к ATmega8 индикатор?
Последний раз редактировалось roman.com Пн сен 05, 2016 13:34:27, всего редактировалось 2 раз(а).

Re: Вопрос по SPI на asm

Пн сен 05, 2016 13:29:37

vit007 писал(а):http://www.winstar.com.tw/products/oled-module/oled-character-display/weh001602c.html
я ж название контроллера написал.... шит, что ли посмотреть нельзя было...

Это мы должны были посмотреть? Что-то я не помню, чтобы за консультации нам кто-то платил. В этой ветке вы ничего про индикатор не говорили. Нам еще надо по всему форуму побегать, чтоб ваши мысли в кучу собрать?
Автор, если Вы НАСТОЛЬКО некомпетентны в предмете, то надо было вопрос иначе задавать.
Надо было спросить - "Как мне подключить такой-то индикатор и как писать софт для работы с ним?"

У этого контроллера, судя по описанию выводов интерфейса (RS, R/W, E, DB0~DB7), вообще нет никакого последовательного интерфейса. Ни SPI, ни I2C. Подключение, аналогичное индикаторам с контроллером HD4478, только у него контроллер другой - WS0010

Но, тем не менее, беглый поиск показал, что возможность подключиться по SPI есть, только надо чутка "допилить" индикатор. Какой протокол обмена, к каким выводам после "допила" подключаться - а хрен его знает. Но там человек ссылается на другой индикатор, хоть и на том же контроллере. Так что сработает ли вариант "допила" для индикатора автора - еще большой вопрос.

Автор, не парьте себе и другим мозги - подключайтесь общепринятым для таких индикаторов способом - через выводы RS, R/W, E, DB0~DB7.

Jack_A писал(а):думал - чел ведь знает, чего хочет .

Как выясняется, нет.

Re: Вопрос по SPI на asm

Пн сен 05, 2016 14:07:39

vit007 писал(а):я ж название контроллера написал.... шит, что ли посмотреть нельзя было...

Дык оно мне надо было ? Там 3 интерфейса: моторыловский, интеловский и SPI . На снимке я вижу разъем под обычный параллельный и-фейс. А какой в реале достался - хз

А при программном этого преимущества не получить...

Можно, но нужно мудрить с таймерами, да и в скорости проигрывает.

Re: Вопрос по SPI на asm

Пн сен 05, 2016 20:36:56

как я забыл, у программного есть преимущество.... это подключение к любым выводам МК.

http://avr.ru/ready/inter/display/weh001202

это правда, что предмет плохо знаю... в универи давали asm, но практика 0 (вывод числа на экран монитора) мне, как технику показалось, а зачем это.... экзамен сдал и забыл... и только обучалка на этом сайте, открыла желание, чего-то большего... простой дисплей, я уже пользую на 4х битах, но красивее будет Oled. Извиняюсь за флуд.

Re: Вопрос по SPI на asm

Пн сен 05, 2016 22:56:49

Да OLED он или LCD - для интерфейса оно монохренственно, ему задача - затолкать в контроллер дисплея нужную строку.
roman.com писал(а):А можно и не проверять)) Если цикл задан жёстко, то зная время когда будет отправлен следующий байт и зная время передачи байта... можно высчитать когда в слейве появится следующий байт. Забираем из буфера байт, не дожидаясь всяких флагов))

Вот такому не надо учить новичков. Это все равно что билет купил, но побегу по шпалам за электричкой. Есть специально предусмотренный флаг, так его и нужно отслеживать, за это никто дополнительных денег не потребует. И никакого выигрыша во времени не будет, флаг взводится в то мгновение, когда байт полностью принят, так что и дожидаться его не придется.

Re: Вопрос по SPI на asm

Пн сен 05, 2016 23:21:34

Вот нельзя было сразу написать в начале темы что мы хотим... )) Людей тут запутали...))

http://avr.ru/ready/inter/display/weh001202
Jack_A писал(а):Есть специально предусмотренный флаг, так его и нужно отслеживать, за это никто дополнительных денег не потребует.

Проверка флага - лишняя строчка в программе))

Re: Вопрос по SPI на asm

Вт сен 06, 2016 04:09:09

roman.com писал(а):Проверка флага - лишняя строчка в программе))

Ерунда. Такая дурная "экономия" не даст ничего, кроме головной боли. Поскольку работа с дисплеем оформляется в подпрограммах, то повторится эта команда раз или два. Смысл экономии? Если пара команд так критична, надо брать контроллер с бОльшим объемом программной памяти. Или переходить с Си на ассемблер и более тщательно программировать.

Re: Вопрос по SPI на asm

Вт сен 06, 2016 05:36:14

Если есть возможность проверки флага занятости/готовности BUSY=1/0, нужно этим пользоваться. Тем более, что программная нагрузка, по мне, невелика.
Последний раз редактировалось akl Вт сен 06, 2016 14:06:13, всего редактировалось 1 раз.

Re: Вопрос по SPI на asm

Вт сен 06, 2016 07:20:44

roman.com А проверка времени с момента отправки байта - она не требует команд ? Или "вали кулем, потом разберем" ?

Re: Вопрос по SPI на asm

Вт сен 06, 2016 12:37:57

вот мой огород...

shift_0.asm
(3.9 KiB) Скачиваний: 233

Re: Вопрос по SPI на asm

Вт сен 06, 2016 13:03:52

Ну развели целый форум.. на пустом месте))
Alkul писал(а):Поскольку работа с дисплеем оформляется в подпрограммах, то повторится эта команда раз или два.

Это обязательное условие?)) Вообщето каждый пишет алгоритм под себя (под свои задачи).
Alkul писал(а):Такая дурная "экономия" не даст ничего, кроме головной боли.

Зависит от алгоритма...

Обычно кроме общения с индикатором МК выполняет и другие задачи... А если у меня простой линейный алгоритм? Например есть куча датчиков, их надо вывести на экран...

-измерил датчик 1
-обработал данные
-закинул в SPI... SPI автоматом передает. А я измеряю следующие датчики...
-измерил датчик 2
-обработал данные
-прочитал SPI (если мне нужно подтверждение или ещё что...)
-закинул в SPI... SPI автоматом передает. А я измеряю следующие датчики...
-измерил датчик 3
-обработал данные
...
...

Ну и нафига мне каждый раз проверять флаг окончания передачи/приёма, если я и так знаю сколько времени занимает измерение, обработка и передача/приём.
Alkul писал(а):Поскольку работа с дисплеем оформляется в подпрограммах...

т.е. мне надо сначала измерить все датчики, обработать... сложить в буфер... вызвать подпрограмму... читать буфер... передавать на индикатор... Ну и нафига эта мне головная боль с подпрограммами при линейном алгоритме?

Это я просто привел как пример. Не всегда нужно ждать или проверять флаг передачи/приёма SPI.
Ответить