Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Удаленная работа
Помощь проекту


 
Опции темы
Непрочитано 05.03.2013, 14:52  
JekaKey
Частый гость
 
Регистрация: 12.10.2012
Сообщений: 33
Сказал спасибо: 8
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
JekaKey на пути к лучшему
По умолчанию Pic: слитный прием данных по SPI.

Всем привет!
Порылся на форуме, но не нашел похожей ветки.
Столкнулся с проблемой приема данных по SPI, когда они идут практически слитно друг за другом.
Используемый камень - PIC18F44K22.
Задача состоит в следующем:
Время от времени, возникает порционная передача 3х байт данных. Необходимо эти 3 байта принять, и поместить их в буфер, где они будут обработаны в свободное от передачи время. Таких посылок может быть несколько, но не более 5-7 порций по 3 байта (между посылками конечно есть время, по длительности чуть дольше чем передача одного байта).
Вот график передачи:

Для приема, я использовал прерывание от MSSP модуля о завершении приема данных, и как только оно возникает, считываю буфер SSP и записываю данные в буфер FIFO для обработки. Проблема в том, что процедура записи в FIFO не успевает произвести обработку, до приема следующего байта. Таким образом, 1 байт из посылки не доходит.
Для организации FIFO я использовал код написанный на дефайнах от сюда: http://mainloop.ru/c-language/simple-fifo.html.
Привожу дизассемблинг процедуры FIFO_PUSH:
Код:
52:                FIFO_PUSH(buffer, SSP1BUF);
0012  C012     MOVFF 0x12, 0x13
0014  F013     NOP
0016  0E0F     MOVLW 0xF
0018  1613     ANDWF 0x13, F, ACCESS
001A  5013     MOVF 0x13, W, ACCESS
001C  0F01     ADDLW 0x1
001E  6ED9     MOVWF FSR2L, ACCESS
0020  6ADA     CLRF FSR2H, ACCESS
0022  CFC9     MOVFF SSP1BUF, INDF2
0024  FFDF     NOP
0026  2A12     INCF 0x12, F, ACCESS
В попытках оптимизировать этот код, я пытался убрать функцию sizeof, рассчитывая что она кушает много кода, но никакого прироста не оказалось вообще.

Подскажите, как более грамотно организовать FIFO буфер для приема слитно идущих байт? Исходя их того, что время между передачей байт не увеличиваем. Есть еще возможность сгенерировать прерывание на любой ноге INT0 непосредственно перед началом передачи, но я пока не вижу применения этому.
Реклама:

Последний раз редактировалось JekaKey; 05.03.2013 в 14:54.
JekaKey вне форума  
Непрочитано 05.03.2013, 15:43  
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,311
Сказал спасибо: 1,794
Сказали Спасибо 1,257 раз(а) в 553 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: Pic: слитный прием данных по SPI.

sizeof() никакого кода не кушает - компилятор просто подставит туда число

С какой скоростью передача SPI идет?
ЗЫ Упс. Если верить картинке, ~100 us на 3 байта... ~30 uS байт. И чтобы за 30 uS программа не успела байт в буфер положить? Не верю. Не знаю как в ПИКах, в АВРках при 8 МГц тактовой это было бы 240 тактов.
__________________
[ жизнь приятна и красива, если выпить литр пива ]

Последний раз редактировалось nml; 05.03.2013 в 15:50.
nml вне форума  
Непрочитано 05.03.2013, 16:00  
jump
Почётный гражданин KAZUS.RU
 
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 7,975
Сказал спасибо: 0
Сказали Спасибо 4,760 раз(а) в 2,300 сообщении(ях)
jump на пути к лучшему
По умолчанию Re: Pic: слитный прием данных по SPI.

при 8 МГц тактовой это было бы 240 тактов - для пиков в 4 раза меньше (относительно команд)
jump вне форума  
Непрочитано 05.03.2013, 16:24  
JekaKey
Частый гость
 
Регистрация: 12.10.2012
Сообщений: 33
Сказал спасибо: 8
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
JekaKey на пути к лучшему
По умолчанию Re: Pic: слитный прием данных по SPI.

Сообщение от nml Посмотреть сообщение
С какой скоростью передача SPI идет?
ЗЫ Упс. Если верить картинке, ~100 us на 3 байта... ~30 uS байт. И чтобы за 30 uS программа не успела байт в буфер положить? Не верю. Не знаю как в ПИКах, в АВРках при 8 МГц тактовой это было бы 240 тактов.
Да, все верно, 30uS на байт. Тут расчет приведен для тактовой частоты процессора в 1МГц, максимальная скорость передачи 1/4я от тактовой скорости.
Как верно заметил jump, у Pic16/18 на каждую команду 4 такта процессора уходит, соответственно максимальная производительность в 4 раза меньше.
Да, забыл написать, что оба процессора на одинаковой частоте работают...
JekaKey вне форума  
Непрочитано 05.03.2013, 17:29  
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,046
Сказал спасибо: 60
Сказали Спасибо 3,947 раз(а) в 2,307 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Pic: слитный прием данных по SPI.

После первого прерывания отключить глобально прерывания, сбросить флаг и сидеть в обработчике прерывания до тех пор, пока не примется 3-байт, складывая их (мониторя флаг запроса прерывания) в буфер и программно сбрасывая флаг запроса, после 3-го байта включить прерывания и выйти. Экономится время на вход-выход в прерывание. 60 машинных циклов должно хватить
niXto вне форума  
Непрочитано 06.03.2013, 09:58  
JekaKey
Частый гость
 
Регистрация: 12.10.2012
Сообщений: 33
Сказал спасибо: 8
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
JekaKey на пути к лучшему
По умолчанию Re: Pic: слитный прием данных по SPI.

niXto, спасибо за совет, буду пробовать поступить так, о результатах сообщу.
JekaKey вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AT89C5131 прием и передача данных по USB rihkov AVR 14 15.11.2012 08:16
Организация SPI в PIC 32 forker Микроконтроллеры, АЦП, память и т.д 3 16.09.2010 18:47
Передача данных по SPI на 20 метров KGN Микроконтроллеры, АЦП, память и т.д 17 20.08.2010 21:33
Как программно организовать передачу и прием данных ft232 tusya83 Микроконтроллеры, АЦП, память и т.д 19 01.04.2010 18:33
Proteus прием данных с COM zerion Микроконтроллеры, АЦП, память и т.д 10 28.04.2008 07:15


Часовой пояс GMT +4, время: 10:22.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd. Перевод: zCarot