Клавиатура и NedoPC-90

8-битные микроконтроллеры AVR (AT90, ATtiny, ATmega) от Atmel (в настоящий момент принадлежит Microchip)

Moderator: Shaos

Mac Buster
Retired
Posts: 1474
Joined: 03 Aug 2003 22:37
Location: Moscow

Post by Mac Buster »

SfS wrote:Кстати - может статью в следующий номер NedoPC тиснуть о написании программного UARTа и драйвера клавиатуры ? Никто не против ?
Все только за! :D
Extreme Entertainment
SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

Post by SfS »

Shaos wrote: Теперь у нас все есть, чтобы воплотить проект NedoPC-PROTO2 в жизнь! Статью конечно пиши - опубликуем.
Еще не все. Драйвер сырой. И ОС тоже надо поставить переработанную.
Попробую так сказать по пунктам.

1. В протоколе обмена клавиатуры есть еще как я понял бит четности, но я его пока не обрабатываю пока, хотя и учитываю.

2. Модуль поддержки клавиатуры плонирую разбить на два модуля - "модуль программной эмуляции UART" (полного UART - с поддержкой разных длин символов, четности, разного кол-ва старт-стопов) и собственно "модуль 40кнопочной клавиатуры". Таким образом убъются два зайца - заяц 1й - можно будет с помощю макросов указать - программный или аппаратный UART используется, и - заяц 2й - программный UART можно будет использовать не только для поддержки клавиатуры, но и для других нужд, коли возникнет нужда.

3. Сейчас веду работы по доработке ОС до версии 1.0. Что делается и планируется.
а) Создание интерактивного конфиг-скрипта (наподобие как для линуксового ядра). То есть набираем "make config", на что выдается серия вопросов с подсказками, на которые пользователь вводит ответы (свои или по умолчаию). В результате формируются для каждого модуля файлы конфигурации. Главное достоинство - абсолютно единообразный формат входных файлов для конфиг-скрипта. Уже почти завершено (процентов на 70-80).
б) Изменение структуры каталогов. Теперь каждый проект будет хранится в отдельном подкаталоге ../upl/<имя проекта>. Там же сохраняются все текущие настройки для данного проекта. И там же при компиляции сохраняются временные объектные файлы. Плюсы такого подхода очевидны. Таким образом для многих проектов будет достаточно всего лишь одной копии системы. Ну и простое удобство - глянул в каталог upl и сразу видно - какие проекты есть. Тоже почти готово.
в) Реализация многозадачности. Планирую отказаться от простого фонового цикла, а все пользовательские задачи свести в список и выделять по некоему кванту времени на задачу. Если задача пользователя всего одна - то формировать простой фоновый цикл. Если же несколько - то переключать их по таймеру. Цель - исключить длительные ожидания при выполнении долгих процессов. При этом приоритеты драйверов будут всегда выше приоритетов фоновых задач.

Для пользователя это все выглядит примерно так:

// Определения задач
ttask task0(){/* код задачи 0 */}
ttask task1(){/* код задачи 1 */}
ttask task2(){/* код задачи 2 */}

// Начало списка
USER_TASK_LIST_BEGIN()
USER_TASK_LIST_ADD(task0, stk_size) /*Добавляем задачу 0 в список*/
USER_TASK_LIST_ADD(task1, stk_size) /*Добавляем задачу 1 в список*/
USER_TASK_LIST_ADD(task2, stk_size) /*Добавляем задачу 2 в список*/
// конец списка
USER_TASK_LIST_END()

Правда не следует злоупотреблять этим. Для каждой задачи (если их больше 1й) надо 35байт под регистры (32РОН + 2б SP + SREG). И еще под стек (задается пользователем).
Степень готовности - пока непонятна. Вроде работает - но требует длительной отладки.

Такие вот пироги. В общем если есть какие пожелания - пишите. Проще сейчас, пока модулей мало и структура ОС еще не полностью определена, пожелания учесть, чем потом чтото неучтенное мной в ОС через задний прозход вводить.
SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

Post by SfS »

Mac Buster wrote:
SfS wrote:Кстати - может статью в следующий номер NedoPC тиснуть о написании программного UARTа и драйвера клавиатуры ? Никто не против ?
Все только за! :D
Насчет статьи идея такая. Не циклиться на клавиатуре. Там собственно ничего интересного нет - просто таблица перекодировки и все. Вся соль была - скорость подобрать и коди клавишь выписать.
Тема примерно такая "Последовательный интерфейс связи между устройствами. Аппаратно-программная поддержка."
И три части сделать.

1. Подробное описание последовательного протокола. Так сказать "чтобы дворнику понятно было".
2. Обзор возможностей AVR в этом плане. Описание аппаратного UART и работы с ним (с примером драйвера для ОС).
3. Эмуляция UART с помощью таймера и прерывания (типа подзаголовка "что делать если UARTов не хватает?"). Подробное описание как реализован программный UART, почему написан именно такой код, а не иной (там есть ньюансы в плане скорости).

Так же - предложения и замечания приветствуются. Пока идея вылеживается :)
SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

Post by SfS »

Shaosу: ты как запустишь у себя клавиатуру с моим модулем - напиши что получилось. Может чтото подправить надо.
Кстати - я в свою клавиатуру воткнул разъем (от наушников, 3х-ногий). Очень удобно.
Ну и для красоты впендюрил над верхним рядом кнопок по бокам два светодиода (красный и зеленый), чтобы было видно подключена клавиатура или нет :) Фотку выложу на днях.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

SfS wrote:
Mac Buster wrote:
SfS wrote:Кстати - может статью в следующий номер NedoPC тиснуть о написании программного UARTа и драйвера клавиатуры ? Никто не против ?
Все только за! :D
Насчет статьи идея такая. Не циклиться на клавиатуре. Там собственно ничего интересного нет - просто таблица перекодировки и все. Вся соль была - скорость подобрать и коди клавишь выписать.
Тема примерно такая "Последовательный интерфейс связи между устройствами. Аппаратно-программная поддержка."
И три части сделать.

1. Подробное описание последовательного протокола. Так сказать "чтобы дворнику понятно было".
2. Обзор возможностей AVR в этом плане. Описание аппаратного UART и работы с ним (с примером драйвера для ОС).
3. Эмуляция UART с помощью таймера и прерывания (типа подзаголовка "что делать если UARTов не хватает?"). Подробное описание как реализован программный UART, почему написан именно такой код, а не иной (там есть ньюансы в плане скорости).

Так же - предложения и замечания приветствуются. Пока идея вылеживается :)
Принимается. Только еще опиши поподробнее пример с общением между PC и AVR по последовательному порту (со стороны PC к примеру будем иметь HyperTerminal).
Я тут за главного - если что шлите мыло на me собака shaos точка net
Mac Buster
Retired
Posts: 1474
Joined: 03 Aug 2003 22:37
Location: Moscow

Post by Mac Buster »

Shaos wrote:Только еще опиши поподробнее пример с общением между PC и AVR по последовательному порту (со стороны PC к примеру будем иметь HyperTerminal).
Ни кто не знает достойной замены Hyper Terminal-у ? Что-то он мне страшно не нравится...
Extreme Entertainment
SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

Post by SfS »

Mac Buster wrote:
Shaos wrote:Только еще опиши поподробнее пример с общением между PC и AVR по последовательному порту (со стороны PC к примеру будем иметь HyperTerminal).
Ни кто не знает достойной замены Hyper Terminal-у ? Что-то он мне страшно не нравится...
Лично я пользуюсь линуксовой самописной програмулиной. Окно терминала делится на две части. В верхнюю идет весь ввод с клавиатуры и по Enterу выводится в ком-порт. В нижнюю отабражается весь ввод с компорта. Примитивно и просто. Но для устройств, где на компорту только Rx и Tx - вполне подходит. Впрочем дописать ее нетрудно. Могу выложить, если надо.
Caro
Fanat
Posts: 88
Joined: 21 Nov 2002 11:09
Location: E-burg/Russia

Post by Caro »

Mac Buster wrote:Ни кто не знает достойной замены Hyper Terminal-у ? Что-то он мне страшно не нравится...
Лично я пользуюсь терминалкой Tera Term Pro.
Скачать вместе с исходниками можно отсюда:
http://www.vector.co.jp/authors/VA002416/teraterm.html
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

SfS wrote:Вот тут лежит версия NedoPC-90.AVROS с поддержкой клавиатурки.

http://www.nedopc.org/nedopc/upload/Ned ... st.tar.bz2

Она полностью сконфигурирована для тестовой программки по AT90S8535. Программка читает символ с клавиатуры и
(с учетом CapsLook и Fn) выводит его в поледовательный порт.
Клавиатура подключается к ноге INT0 процессора.

Коды всех служебных клавиш можно посмотреть в файле ../hl/keypad40.h

Схема сопряжения и коды всех клавиш лежат в ../hl/doc.hl/keypad40.txt

Также добавлен модуль поддержки таймера-1.
Клавиатура пока работает только через программный UART, который настроен только на прием (в общем не UART, а UAR :) ).

Как появится макет с двумя UARTами добавлю поддержку клавиатуры через аппаратный UART.

В общем "на посмотреть" все работает - но кое что еще буду править. Всетаки за несколько часов все не отладить :)
А оно у меня не собирается :(
In file included from hl/timer0.c:6,
from hl/__tmpsrc__.c:2:
/usr/include/avr/signal.h:7:2: warning: #warning "please include sig-avr.h instead"
In file included from hl/__tmpsrc__.c:14:
hl/keypad40.c: In function `keypad40_puart_init':
hl/keypad40.c:42: invalid lvalue in assignment
hl/keypad40.c: In function `keypad40_puart_int_handler':
hl/keypad40.c:56: `OCR1A' undeclared (first use in this function)
hl/keypad40.c:56: (Each undeclared identifier is reported only once
hl/keypad40.c:56: for each function it appears in.)
hl/keypad40.c:57: `TCNT1' undeclared (first use in this function)
hl/keypad40.c: In function `keypad40_puart_timer_handler':
hl/keypad40.c:74: `OCR1A' undeclared (first use in this function)
hl/keypad40.c:75: `TCNT1' undeclared (first use in this function)
hl/keypad40.c: In function `keypad40_getch':
hl/keypad40.c:221: warning: implicit declaration of function `pgm_read_byte'
make: *** [create_hl] Ошибка 1
Я тут за главного - если что шлите мыло на me собака shaos точка net
SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

Post by SfS »

Shaos wrote: А оно у меня не собирается :(
In file included from hl/timer0.c:6,
from hl/__tmpsrc__.c:2:
/usr/include/avr/signal.h:7:2: warning: #warning "please include sig-avr.h instead"
In file included from hl/__tmpsrc__.c:14:
hl/keypad40.c: In function `keypad40_puart_init':
hl/keypad40.c:42: invalid lvalue in assignment
hl/keypad40.c: In function `keypad40_puart_int_handler':
hl/keypad40.c:56: `OCR1A' undeclared (first use in this function)
hl/keypad40.c:56: (Each undeclared identifier is reported only once
hl/keypad40.c:56: for each function it appears in.)
hl/keypad40.c:57: `TCNT1' undeclared (first use in this function)
hl/keypad40.c: In function `keypad40_puart_timer_handler':
hl/keypad40.c:74: `OCR1A' undeclared (first use in this function)
hl/keypad40.c:75: `TCNT1' undeclared (first use in this function)
hl/keypad40.c: In function `keypad40_getch':
hl/keypad40.c:221: warning: implicit declaration of function `pgm_read_byte'
make: *** [create_hl] Ошибка 1
Очевидно по какойто причине не подключается файл io8535.h. Или ты под что его собрать пытаешься ?

Попробуй в Makefile дописать

AVR-INC= -I/usr/include/avr \
--include avr/io.h \
--include system/compincs.h \ # удалить !!!!
--include system/sysdef.h \
--include string.h \
--include stdio.h \
--include stdlib.h \
--include ina90.h # добавить !!!

Или напрямую

AVR-INC= -I/usr/include/avr \
--include avr/io.h \
--include system/compincs.h \
--include system/sysdef.h \
--include string.h \
--include stdio.h \
--include stdlib.h \
--include io8535.h \
--include pgmspace.h

Это навскидку. попробуешь - скажи что получилось. И под что собираешь конкретно ?
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

SfS wrote:Очевидно по какойто причине не подключается файл io8535.h. Или ты под что его собрать пытаешься ?

Попробуй в Makefile дописать

AVR-INC= -I/usr/include/avr \
--include avr/io.h \
--include system/compincs.h \ # удалить !!!!
--include system/sysdef.h \
--include string.h \
--include stdio.h \
--include stdlib.h \
--include ina90.h # добавить !!!

Или напрямую

AVR-INC= -I/usr/include/avr \
--include avr/io.h \
--include system/compincs.h \
--include system/sysdef.h \
--include string.h \
--include stdio.h \
--include stdlib.h \
--include io8535.h \
--include pgmspace.h

Это навскидку. попробуешь - скажи что получилось. И под что собираешь конкретно ?
Все тоже. Я просто собираю то что в архиве. В makefile поправил только -I к инклудникам AVR-a.
Я тут за главного - если что шлите мыло на me собака shaos точка net
SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

Post by SfS »

Shaos wrote:/usr/include/avr/signal.h:7:2: warning: #warning "please include sig-avr.h instead"
In file included from hl/__tmpsrc__.c:14:
hl/keypad40.c: In function `keypad40_puart_init':
hl/keypad40.c:42: invalid lvalue in assignment
hl/keypad40.c: In function `keypad40_puart_int_handler':
hl/keypad40.c:56: `OCR1A' undeclared (first use in this function)
hl/keypad40.c:56: (Each undeclared identifier is reported only once
hl/keypad40.c:56: for each function it appears in.)
hl/keypad40.c:57: `TCNT1' undeclared (first use in this function)
hl/keypad40.c: In function `keypad40_puart_timer_handler':
hl/keypad40.c:74: `OCR1A' undeclared (first use in this function)
hl/keypad40.c:75: `TCNT1' undeclared (first use in this function)
hl/keypad40.c: In function `keypad40_getch':
hl/keypad40.c:221: warning: implicit declaration of function `pgm_read_byte'
хм..хм...
Слушай - напиши свою версию avr-glibc.
Далее - проверь в инклюднике /usr/include/avr/avr/io8535.h наличие определенй:

* Timer/Counter 1 */
#define TCNT1 _SFR_IO16(0x2C)
#define TCNT1L _SFR_IO8(0x2C)
#define TCNT1H _SFR_IO8(0x2D)

/* Timer/Counter1 Output Compare Register A */
#define OCR1A _SFR_IO16(0x2A)
#define OCR1AL _SFR_IO8(0x2A)
#define OCR1AH _SFR_IO8(0x2B)

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

Если все это есть - попробуй в файл ../system/sysdef.h
перед самым первым инклюдом добавить строчки
#include <avr/io8535.h>
#include <avr/pgmspace.h>

Это некорректно, но поможет установить где собака зарыта. И собрать программу.
SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

Post by SfS »

Shaos wrote:...
И еще - закинь мне сюда свой мэйкфайл. Точнее его начало - все где ты изменения вносил.

Кстати - ты именно под 90s8535 собираешь или под мегу8535 ? Могут быть какието отличия.

Я писал тест только под 90s8535 нимало не заботясь о совместимости с другими процами на данном этапе.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

SfS wrote:
Shaos wrote:/usr/include/avr/signal.h:7:2: warning: #warning "please include sig-avr.h instead"
In file included from hl/__tmpsrc__.c:14:
hl/keypad40.c: In function `keypad40_puart_init':
hl/keypad40.c:42: invalid lvalue in assignment
hl/keypad40.c: In function `keypad40_puart_int_handler':
hl/keypad40.c:56: `OCR1A' undeclared (first use in this function)
hl/keypad40.c:56: (Each undeclared identifier is reported only once
hl/keypad40.c:56: for each function it appears in.)
hl/keypad40.c:57: `TCNT1' undeclared (first use in this function)
hl/keypad40.c: In function `keypad40_puart_timer_handler':
hl/keypad40.c:74: `OCR1A' undeclared (first use in this function)
hl/keypad40.c:75: `TCNT1' undeclared (first use in this function)
hl/keypad40.c: In function `keypad40_getch':
hl/keypad40.c:221: warning: implicit declaration of function `pgm_read_byte'
хм..хм...
Слушай - напиши свою версию avr-glibc.
Далее - проверь в инклюднике /usr/include/avr/avr/io8535.h наличие определенй:

* Timer/Counter 1 */
#define TCNT1 _SFR_IO16(0x2C)
#define TCNT1L _SFR_IO8(0x2C)
#define TCNT1H _SFR_IO8(0x2D)

/* Timer/Counter1 Output Compare Register A */
#define OCR1A _SFR_IO16(0x2A)
#define OCR1AL _SFR_IO8(0x2A)
#define OCR1AH _SFR_IO8(0x2B)

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

Если все это есть - попробуй в файл ../system/sysdef.h
перед самым первым инклюдом добавить строчки
#include <avr/io8535.h>
#include <avr/pgmspace.h>

Это некорректно, но поможет установить где собака зарыта. И собрать программу.
Старая версия AVROS ведь у меня нормально собиралась - я с тех пор ничего не менял:

binutils-2.13.2.1
gcc-3.2.3
avr-libc-20020203

да - у меня есть TCNT1L и TCNT1H и нет TCNT1, и точно также есть OCR1AL и OCR1AH и нет OCR1A - вроде в старом коде в этом смысле все Ок было...
Я тут за главного - если что шлите мыло на me собака shaos точка net
SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

Post by SfS »

Shaos wrote: Старая версия AVROS ведь у меня нормально собиралась - я с тех пор ничего не менял:

binutils-2.13.2.1
gcc-3.2.3
avr-libc-20020203
попробуй строчку инклюдников.

AVR-INC= -I/usr/include/avr --include avr/io.h --include avr/ina90.h --include system/sysdef.h --include string.h --include stdio.h --include stdlib.h

вместо той, что у тебя.

Это единственное что я менял в мэкфайле.

Блин - жалко на работе нету сейчас рабочего avr-gcc. я бы сейчс проверил все.