Да брось , STM32F0 по любому AVR сливает. :biggrin:
Вид для печати
Гы .. не верно акценты расставил - исправил. :))))))
Ты, я так понял , пытаешься себя убедить, зацепившись за непонятное тебе, что AVR хоть в чем то превзошла F0 ? :))))))
Ошибаешься . Еще раз повторю NVIC это не AVR'cкий контроллер прерываний ...
Не совсем однозначно. Регистры и диоды оптом будут стоить около 40 руб (оптом: регистр 74HC595D по 3 руб., двойной диод BAT54A по 0.6 руб), их легче купить и не нужно прошивать через разъем IDC-10M. ПЛИС стоить будет около 120 руб + разъем для прошивки. С регистрами можно поставить мелконогий дешевый арм F030 только для UART и загрузки данных в регистры сдвига. С этими регистрами последовательная загрузка может быть с произвольной скоростью, а затем одним импульсом мгновенно записывается параллельно. Это упростит программу и работать будет даже, если Z80 на 7 МГц, так как адреса с Z80 на регистры выдаются заранее до сигналов чтения из порта клавиатуры. Дешевое и недежное решение
---------- Post added at 11:36 ---------- Previous post was at 11:31 ----------
Если бы ДМА могло передавать быстро данные из одного из двух буферов по 256 байт наружу МК, было бы хорошо. Мы тогда подготовливали бы в одном из буферов свежие данные после прихода пакета, а из второго была бы передача через ДМА.
Вопрос по выбору микроконтроллера. Семейство M0 быстрое 48 МГц (F030, F051), но в бесплатной версии компилятора IAR у него ограничение по объему кода 16 Кб. Для других семейств - 32 Кб. Также уроки и книги есть только (или больше) для семейства М3. Но оно более медленное 24 МГц (F100). Подойдет ли нам F100 ?
Может , про что я здесь и пою.
100ка -103е старые .
32k хватит за глаза , на изучение , да и на сам проект.
А далее можете на гнутые перейти, если боитесь кряков.
Нужны уроки - http://kazus.ru/forums/forumdisplay.php?f=34
Создавайте ветку - всегда я и другие будут рады помочь, мешающих отошьем ...
Лучше 051 заложить, т.к. они современнее и импользовать STM32F0DISCOVERY для макетирования ?
А 16 хватит ?Цитата:
32k хватит за глаза , на изучение , да и на сам проект.
А для STM32F0DISCOVERY есть ?Цитата:
А далее можете на гнутые перейти, если боитесь кряков.
Нужны уроки - http://kazus.ru/forums/forumdisplay.php?f=34
Цитата:
Создавайте ветку - всегда я и другие будут рады помочь, мешающих отошьем ...
Ну как вариант , причем уже описывал ранее.
Со стороны USART - DMA укладывает данные в память (как вариант массив) .
Со стороны адресов (сканбит) так же DMA по таймеру (или стробу)
захватывает порт и укладывает в память.
Анализируем принятое с UART сравниваем с сканбитом -если соответствует выводим в порт данных .
Здесь, насколько понимаю, быстрее всего будет происходить обновление сканбита . Нажатие кнопки самое медленное .:biggrin:
dosikus, нифига не понял
1. Спектрум все время щелкает адресами в том числе и старшими (A15-A8)
2. В какой то момент он решил прочитать состояние кнопок, к примеру, есть ли нажатые кнопки на синклер джобстинках A8=0 A11=0 остальные Axx=1 и появляется строб чтения из порта 0xFE (что в этот момент будет делать ARM ?)
3. Надо выставить данные, подождать пока строб пропадет
4. Пришли новые данные о нажатых клавишах (что делает ARM ?)
У меня есть сия дискаверина и как раз сейчас ковыряю . :biggrin:
---------- Post added at 19:27 ---------- Previous post was at 19:19 ----------
Я так же . :biggrin:
Ибо писал, что не знаю работу спеки .
Если есть сигнал по которому и только по которому нужно выводить на данные клавиатуры , задействуем его .
А вообще я что то не понял - ты мне что проверку решил устроить ????? :biggrin:
Не засирай мне мозг.
Как же тогда механическая клавиатура работает ?:biggrin:
Сканбит на адресах выделит нажатые кнопки , а 555КП11 запишут когда надо .
И если спекки щелкает адресами , то на KL0-KLx так же будет что то в зависимости от нажатых клавиш -
но без /IN_K&K на шину не попадет.
Так же и на STM32, здесь можно дополнительно фильтровать именно сканбит на адресной шине .
Данные о клавишах будут поступать намного медленней чем обновляться цикл сканбита .
Вот кстати - если не ошибаюсь сканирование клавиатуры происходит в прерывании ? С какой частотой ?
клавиатура спектрума это 8 строк по 5 кнопок, одновременно можно выбрать хоть все 8 строк, если есть желание побыстрому проверить нажатие кнопки на клавиатуре, что бы это дело корректно отработать, надо в зависимости от старших адресных разрядов, брать значение столбцов для кнопок и по AND их объединять, время реакции, буквально 2,5 такта на частота 3.5мгц проца, либо 2 такта и выставить wait, но это плохой вариант
на avr сделали так, из матрицы 40кнопок (8 рядов 5колонок) делают табличку на 256 байт, где уже все предрасчитанно и фактически обработчик прерывания выглядит так
rdval:
in r31, (portd)
ld r16, z
out (portb), r16
ret
---------- Post added at 18:45 ---------- Previous post was at 18:38 ----------
хочу понять, причем тут dma и event, мож есть какой то хитросделанный фокус покус
---------- Post added at 18:47 ---------- Previous post was at 18:45 ----------
как программе приспичит, так и будет сканировать, это в бейсике по умолчанию висит на прерываниях и там юзается сканбит, в софтах, юзают по несколько выбранных строк одновременно, и вообще не пойму, нафик сканбит, ARM не собирается клаву сканить, он собирается притворятся механической клавиатурой, то есть реагировать на 8 входных сигналов в произвольной комбинации, должен выдать 5 бит, которые бы выдала механическая клавиатура, должен сделать это быстро
Вот бы ее к Фениксу подпаять вместо АТМЕГИ. И имитировать периодическое нажатие одной кнопки. По алгоритму работы поможем. Для начала - прочитать старший байт адреса при прерывании.
Это только в ПЗУ и правильных программах, а в остальных - кто кодгда хочет, даже может быть постоянный опрос.Цитата:
Вот кстати - если не ошибаюсь сканирование клавиатуры происходит в прерывании ? С какой частотой ?
Можно от девборды подпаять пока три провода. Один - сигнал чтения из порта клавиатуры (выв. 12 /INT0), второй - один из 8 битов адреса A8-A15 (A12 Z80), третий один из 5 битов данных на клавиатуру (сразу не сообразишь, куда). Остальное дело программирования - будем нажимать кнопку 0.
ZEK, Поправьте по схеме, если ошибусь.
Нет ли более простого клона, где есть разъем под механическую клавиатуру ?
А что такое event ты знаешь ? :biggrin:
Я спрашиваю потому, что не знаю с чего тебе придется начинать объяснять .:biggrin:
И не факт что сие и задействовать понадобится, я приводил event'ы как механизм мощнее прерываний , не мешающий ядру.
Так уважаемые, оба .
Механическая клава - тупо , на основании скан бита на адресах , выводит
данные на KL0-KLx .
С чего вы панику наводите ? С этим вариантом все получится.
Хотим большего, давайте попросим у caro исходники, чем гадать ...
dosikus, не парься, посчитали уже на 48мгц, если на асме написать обработчик, все успеет, даже может в турбе
zst, В помощь .
The Definitive Guide to the
ARM Cortex-M0
Joseph Yiu
http://caxapa.ru/thumbs/424855/The_D...M_Cortex-M.pdf
Это хорошо. Надо купить девборды и индикаторы для макетирования. Я так понял, что шлейф можно паять и он не расплавится. Шаг контактов у него какой ? Символы размером 8х8 точек можно будет разглядеть ? И общий размер какой ?
Программа прерывания будет примерно такой:
void ISR_IN_FE (void)
{
PORT_KEY_DATA = KEY_BUFFER [PORT_KEY_ADDR];
}
Как ARM данные по 8 и 5 битов обрабатывают ?
Какую среду разработки качать: IAR или KEIL ?
Там коннектор , если не ошибаюсь 10 pin .
Прерываться от чего бум?
Есть вариант на EXTI - повесить на каждый вход от адресов спекки .
В прерывании будем иметь сканбит в полученном байте,
преобразуем вес разряда в порядковый номер бита - получаем индекс массива .
В итоге что то типа этого (внимание !!! Это только надумки!!)
Массив KEY_BUFFER [], будет забивать DMA от USART, автоматом , почти ...Код:void EXTI4_15_IRQHandler (void)
{
....
cut
....
index= Conv( PORT_KEY_ADDR);
PORT_KEY_DATA = KEY_BUFFER [index];
}
1) нормально , так же как и другие . :)))
2) Качайте Keil http://rutracker.org/forum/viewtopic.php?t=2305709
Ставите сам MDK и паки , в паках можно выбрать только STM .
В IAR обнаружил пакость, что не даст использовать STM по полной ...
В прерывании надо читать сразу 8 бит адреса. Этот байт будет индексом в массиве.
Лучше вырубить все остальные дма и прерывания. Оставить только на клавиатуру. Наличие нового байта лучше ожидать в цикле. Если пришел байт - прочитать его и начать анализировать. Предлагаю для дополнительной синхронизации сделать проверку: если в принятом байте 3 старших бита 000 - значит начало пакета, счетчик байтов установить на 0 (если не ожидаем контрольного байта). У следующих байтов 3 старших бита 111. По номеру байта в пакете складывать их в соответствующие переменные (не массив), например, A8_KEY_LINE - A15_KEY_LINE. Тут скорость особая не нужна. Если в последнем байте контрольная совпала - вызываем подпрограмму декодирования - распаковки. Она из 8 байтов должна сделать 256 байтов на все варианты 8 битов адреса. Вот тут скорость нужна, чтобы быстро вычислить 256 байтов.
Лучше прерывания по сигналу IN_FE (IN_K&K). В этот момент Z80 читает состояние клавиатуры. И байт адреса нужно обрабатывать целиком. Для максимальной скорости лучше эту единственную команду в подпрограмме прерывания написать на ассемблере. Возможно лучше использовать не массив, а адреса в ОЗУ.
Кроме обработки клавиатуры контроллеру ничего делать не нужно.
Тут дело не только в скорости .
Со стороны keypad'а ничего не упаковывать . Keypad полученные данные с клавиатуры , джойстика и т.д -
передает по UART пакетом , где например первые ( и не обязательно) 5 (или сколько там строк у клавы) уже вычисленные состояния нажатых клавиш. Последующие байты состояние мыши/джойстика.
Со стороны модуля в спекки - DMA укладывает принятый пакет от UART побайтно в массив KEY_BUFFER [] ...
---------- Post added at 21:00 ---------- Previous post was at 20:55 ----------
Еще проще, но тогда не универсально - сей сигнал есть у всех спекки ?
Чувствуется , что Вас кто то направляет. Асм то накуа ?????????Цитата:
Сообщение от zst
А вот это вообще не понимаю . Массив и так будет в RAM...Цитата:
Сообщение от zst
Для получения кода клавиатуры надо передавать 8 байтов (40 бит состояния). По одному биту на кнопку. Это и есть без упаковки. 256 байтов расчитывать и передавать долго. У нас скорость примерно 19200. Рассчитывать будем, когда примем весь пакет без ошибок.
Кто его знает, как компилятор начнет рассчитывать адрес байта по индексу. Еще раз повторяю - это очень важно сделать максимально быстро. Или делать схему придется на регистрах. Иначе будет глюкодром.Цитата:
А вот это вообще не понимаю . Массив и так будет в RAM...
Если байты UART-а складывать по ДМА, потом его обрабатывать - это усложнит обработку. Из 8 байтов состояния клавиатуры мы должны для каждого нового пакета рассчитывать 256 вариантов данных клавиатуры.
Я Вас не понимаю , то Вы экономите а здесь начинаете транжирить .
Я предлагаю передавать уже вычисленную строку состояние механической ZX клавы , а не порядковый номер кнопки. В keypad контроллер зачем жалеете? И в модуле спекки уже вычислять ничего не будем - будем тупо раскидывать принятые данные по портам ...
Мда , а как же у меня все это работает , вот я дурак то . :biggrin:
Уважаемый, прекратите свои AVR надумки, очень Вас прошу ...
dosikus,
оно если без таблични должно быть так
Код:byte addr; // тут старший байт шины адреса
byte[8] rows; // тут значение нажатых кнопок для каждой строки
byte scan = 0x01;
byte res = 0xFF;
int cnt = 0;
while (cnt++<8)
{
if (addr & scan) == 0)
res &= rows[cnt];
scan <<=1;
}
и еще, посмотрел в даташит, посчитал, у ARM будет 18 тактов на то что бы выставить данные, из них 12 вход в прерывание, остается 6 тактов
Считаем, 1 так Z80 на 3,5 мгц это 285нс
1 такт ARM на 48МГц это 21нс
данные процу надо через полтора такта после того как он опустил iorq и rd
=285нс * 1,5 = 430нс, делаем запас на логику 50нс к примеру остается 380нс
380нс/ 21нс = 18 тактов - 12 тактов на вход в прерывание, остается 6 тактов, вот какой тут в гланды Си
Извните, пока не получается объяснить принцип работы клавиатуры и как должна для этого работать компьютерная часть устройства. Попробую еще раз.
40 кнопок разбиты на группы по 5 штук. Каждой пятерке соответствует один бит адреса Z80 от A8 до A15. При чтении состояния 5 кнопок Z80 выставляет соответствующий бит адреса в 0, остальные в 1. На шину данный (биты D4-D0) при этом подается состояние этих 5 кнопок.
Поэтому на стороне кейпада мы готовим 8 байтов состояния клавиатуры по 5 значимых битов. 0 в соответствующем бите - значит кнопка нажата. 1 - не нажата. Эти 8 байтов с 40 значимыми битами мы и передаем на компьютерную часть. Но дело осложняется тем, что большинство программ устанавливает на адресах A8-A15 не по одному биту, а как вздумается в любой комбинации. Поэтому мы должны, для работы этих программ сделать все 256 вариантов. При этом если два бита адреса в 0, то в результат получается из двух байтов из 8, например, A8_KEY_LINE & A12_KEY_LINE.
у экрана от нокии 1280 не коннектор, а сразу на плату он припаивается.
да и стоит он примерно 50р
можно и от сименсов экранов найти. А60/С60 например.
по оптовой цене экран 1202/1280 даже меньше 40р
Ничем оно не усложняется совершенно и не надо городить 256 комбинаций.
Если могут быть активными несколько адресов -то
придется делать так :
выбирать данные из массива по этим нескольким адресам-индексам ,объединять их по OR и выводить полученное .
---------- Post added at 21:38 ---------- Previous post was at 21:36 ----------
Лучше тогда SPI TFT 1.8' с китайских площадок .
dosikus, вот такие по 80р у нас - http://gsmserver.com/shop/spares/lcd...c_a_b_g_31.php
только они походу с паралельным интерфейсом
AHTuXPuCT, да параллельные .
Там что то типа ILI9320 , но куда такого монстра ?
Ему уже FSMC понадобиться , а это 100pin 103ий как минимум ...