В доке нигде точно не написано в каких битах каких байтов сидят CKSEL и CKOPT. Ну предположим CKSEL я могу угадать - это младшие 4 бита Fuse Low Byte, т.к. там значение по умолчанию 0001 стоит, но вот где находится CKOPT я угадать не смогу - т.к. это один бит по умолчанию 1 который надо запрограммировать в 0SfS wrote:В каком байте какие фузы - не помню, но это легко выяснить сопоставив значения байтов со значениями по умолчанию которые есть в документации. Там всего несколько байт.
Клавиатура и NedoPC-90
Moderator: Shaos
-
Shaos
- Admin
- Posts: 24404
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
-
Shaos
- Admin
- Posts: 24404
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Обнаружил описание поиском в разделе "Memory Programming"Shaos wrote:В доке нигде точно не написано в каких битах каких байтов сидят CKSEL и CKOPT. Ну предположим CKSEL я могу угадать - это младшие 4 бита Fuse Low Byte, т.к. там значение по умолчанию 0001 стоит, но вот где находится CKOPT я угадать не смогу - т.к. это один бит по умолчанию 1 который надо запрограммировать в 0SfS wrote:В каком байте какие фузы - не помню, но это легко выяснить сопоставив значения байтов со значениями по умолчанию которые есть в документации. Там всего несколько байт.
CKSEL как я ипредполагал - четыре младших бита во Fuse Low Byte
CKOPT - бит 4 во Fuse High Byte
Получается что для перепрограммирование чипа на использование внешнего кварца надо выполнить команду:
uisp -dprog=dapa --wr_fuse_l=0xee --wr_fuse_h=0xc9
-
Shaos
- Admin
- Posts: 24404
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Уррраааа! Заработала!
Досовская терминальная программа CONEX (запущенная на досовском ноуте, который подключён к NedoPC-90 через RS-232) печатает символ и его код, посланные с авра, правда похоже перевод строки идет без возврата каретки и они печатаются лесенкой:
Вставил в код программы \r\n вместо \n и оно поправилось - стало печатать в столбик 
Сопутствующий вопрос - щас мы имеем тока вывод на терминал, а как сделать обоюдный обмен с терминалом, т.е. и возможность ввода тоже?
Досовская терминальная программа CONEX (запущенная на досовском ноуте, который подключён к NedoPC-90 через RS-232) печатает символ и его код, посланные с авра, правда похоже перевод строки идет без возврата каретки и они печатаются лесенкой:
Code: Select all
b 62
@ 40
" 22
Сопутствующий вопрос - щас мы имеем тока вывод на терминал, а как сделать обоюдный обмен с терминалом, т.е. и возможность ввода тоже?
-
Shaos
- Admin
- Posts: 24404
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
А minicom в линуксе я так и не могу настроитьShaos wrote: Досовская терминальная программа CONEX (запущенная на досовском ноуте, который подключён к NedoPC-90 через RS-232) печатает символ и его код, посланные с авра...
Вроде все модемное обнулил - однако оно OFFLINE пишет всё время - на команду инициализации модема в правый нижний угол вешается красный квадратик и ничего не происходит, а на попытку набрать номер оно ругается что не может и пытается снова...
-
Shaos
- Admin
- Posts: 24404
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Вобщем переписал вывод на двухстрочный дисплей:
Вот фотка одновременного теста клавиатурки и дисплейчика:

Теперь можно приступать к кодингу виртуальной машины RW0! Одно удручает - уже сейчас программа занимает 6296 байт, а ведь на борту их всего 8К
Code: Select all
//----------------------------------------------------------------------
// Main program
//----------------------------------------------------------------------
int clflag = 0;
// StdOutput
int stdoutc(char ch)
{
int i;
#if 0
if(!uart0_wr(&ch))
{return(0);}
else
{return(-1);}
#else
if(ch=='\n')
{
wp1602_ni15_curat(0,1);
clflag = -clflag;
}
if(ch>=0x20)
{
if(clflag < 0)
{
for(i=0;i<-clflag;i++) wp1602_ni15_outc(' ');
wp1602_ni15_curat(0,1);
clflag = 0;
}
wp1602_ni15_outc(ch);
clflag++;
}
// wp1602_ni15_outsrom(PSTR("on WP1602A test."));
#endif
return -1;
}
void init(void)
{
wp1602_ni15_clear();
wp1602_ni15_curat(0,0);
wp1602_ni15_outsrom(PSTR("NedoPC-90.AVROS"));
wp1602_ni15_curat(0,1);
stdout = fdevopen(stdoutc, NULL, 0);
stderr = fdevopen(stdoutc, NULL, 0);
printf("Stdio Inited\n");
}
//----------------------------------------------------------------------
// Main progam
int main()
{AUTOINIT_ALL_MODULES();
init();
int ch,c2;
while(1)
{ch=keypad40_getch();
printf("%c 0x%2.2X\n",ch,ch);
}
return(0);
}
//----------------------------------------------------------------------

Теперь можно приступать к кодингу виртуальной машины RW0! Одно удручает - уже сейчас программа занимает 6296 байт, а ведь на борту их всего 8К
-
Shaos
- Admin
- Posts: 24404
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Поддержка клавиатуры поддержана просто блестяще 
SfS - ты настоящий герой недопцшного труда!
Есть предложение по доработке. Мне для реализации прототипа наладонника с языком программирования внутри потребовалось введение еще одной виртуальной раскладки клавиатуры, которая бы включалась в режиме Fn вместо обычной дополнительной раскладки, а также нужно на уровне приложения отдетектировать режим CapsLock. Чтобы сильно не коверкать код NedoPC-90.AVROS я предлагаю внести следующие изменения в код SfS:
в файле hl/keypad40.h надо вставить две строчки:
#define KEYPAD40_KEY_CAPS 0x07
и
#define KEYPAD40_KEY_FN2 0x0F
в файле hl/keypad40.c вместо строки:
0x17, KEYPAD40_KEY_BACKSPC, KEYPAD40_KEY_BACKSPC,
надо написать:
0x17, KEYPAD40_KEY_BACKSPC, KEYPAD40_KEY_FN2,
а также вместо строки:
0x19, ' ', ' ',
надо написать:
0x19, ' ', KEYPAD40_KEY_CAPS,
далее убираем вот это:
else if((ch==KEYPAD40_SPC_KDN) && KEYPAD40_F(KEYPAD40_Fn)){KEYPAD40_INVF(KEYPAD40_FCAPSLOOK);}
а в ветку получения кода символа в режиме Fn непосредственно перед return(ch); следует вставить вот это:
if(ch==KEYPAD40_KEY_CAPS) KEYPAD40_INVF(KEYPAD40_FCAPSLOOK);
После чего сочетание клавиш Fn+BackSp получит свой уникальный код, по которому моя предполагаемая надстройка над интерфейсом SfS-a включит режим "второго Fn" для реализации еще одной дополнительной раскладки (на картинке помечено зелёным):

Причём повторное нажатие Fn+BackSp вернет обратно обычный Fn-режим (на картинке помечено красным) - при этом светодиоды Fn1 и Fn2 будут соответственно зажигаться и гаснуть в соответствии с выбранным режимом.
Кроме того выбор режима CapsLock теперь может быть прочитано программой пользователя - что позволит программно зажечь соответствющий светодиод CapsLock. Если SfS посчитает что выдавать код этого действия наружу не всегда уместно - могу предложить обернуть это дело в #ifdef - чтобы по умолчанию код не возвращался на уровень юзера, а в моём приложении - будет возвращаться.
На уровне hl думаю надо оставить только две стандартные раскладки (с моим небольшим изменением). Всё-таки на уровне системы - это реализация поддержки конкретной клавиатурки без всяких дополнительных раскладок - дополнительный слой будет этажом выше - в программе на пользовательском уровне.
SfS - ты настоящий герой недопцшного труда!
Есть предложение по доработке. Мне для реализации прототипа наладонника с языком программирования внутри потребовалось введение еще одной виртуальной раскладки клавиатуры, которая бы включалась в режиме Fn вместо обычной дополнительной раскладки, а также нужно на уровне приложения отдетектировать режим CapsLock. Чтобы сильно не коверкать код NedoPC-90.AVROS я предлагаю внести следующие изменения в код SfS:
в файле hl/keypad40.h надо вставить две строчки:
#define KEYPAD40_KEY_CAPS 0x07
и
#define KEYPAD40_KEY_FN2 0x0F
в файле hl/keypad40.c вместо строки:
0x17, KEYPAD40_KEY_BACKSPC, KEYPAD40_KEY_BACKSPC,
надо написать:
0x17, KEYPAD40_KEY_BACKSPC, KEYPAD40_KEY_FN2,
а также вместо строки:
0x19, ' ', ' ',
надо написать:
0x19, ' ', KEYPAD40_KEY_CAPS,
далее убираем вот это:
else if((ch==KEYPAD40_SPC_KDN) && KEYPAD40_F(KEYPAD40_Fn)){KEYPAD40_INVF(KEYPAD40_FCAPSLOOK);}
а в ветку получения кода символа в режиме Fn непосредственно перед return(ch); следует вставить вот это:
if(ch==KEYPAD40_KEY_CAPS) KEYPAD40_INVF(KEYPAD40_FCAPSLOOK);
После чего сочетание клавиш Fn+BackSp получит свой уникальный код, по которому моя предполагаемая надстройка над интерфейсом SfS-a включит режим "второго Fn" для реализации еще одной дополнительной раскладки (на картинке помечено зелёным):

Причём повторное нажатие Fn+BackSp вернет обратно обычный Fn-режим (на картинке помечено красным) - при этом светодиоды Fn1 и Fn2 будут соответственно зажигаться и гаснуть в соответствии с выбранным режимом.
Кроме того выбор режима CapsLock теперь может быть прочитано программой пользователя - что позволит программно зажечь соответствющий светодиод CapsLock. Если SfS посчитает что выдавать код этого действия наружу не всегда уместно - могу предложить обернуть это дело в #ifdef - чтобы по умолчанию код не возвращался на уровень юзера, а в моём приложении - будет возвращаться.
На уровне hl думаю надо оставить только две стандартные раскладки (с моим небольшим изменением). Всё-таки на уровне системы - это реализация поддержки конкретной клавиатурки без всяких дополнительных раскладок - дополнительный слой будет этажом выше - в программе на пользовательском уровне.
-
Shaos
- Admin
- Posts: 24404
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Будет примерно вот так:Shaos wrote: На уровне hl думаю надо оставить только две стандартные раскладки (с моим небольшим изменением). Всё-таки на уровне системы - это реализация поддержки конкретной клавиатурки без всяких дополнительных раскладок - дополнительный слой будет этажом выше - в программе на пользовательском уровне.
Code: Select all
typedef unsigned char byte;
unsigned int count = 0;
void COUNTER()
{
count++;
}
int clflag = 0;
// StdOutput
int stdoutc(char ch)
{
int i;
#if 0
if(!uart0_wr(&ch))
{return(0);}
else
{return(-1);}
#else
if(ch=='\n')
{
wp1602_ni15_curat(0,1);
clflag = -clflag;
}
if(ch>=0x20)
{
if(clflag < 0)
{
for(i=0;i<-clflag;i++) wp1602_ni15_outc(' ');
wp1602_ni15_curat(0,1);
clflag = 0;
}
if(ch=='\\') ch=4;
if(ch=='~') ch=5;
wp1602_ni15_outc(ch);
clflag++;
}
#endif
return -1;
}
byte symbol_04[8] PROGMEM = {0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00}; // '\'
byte symbol_05[8] PROGMEM = {0x00,0x08,0x15,0x02,0x00,0x00,0x00,0x00}; // '~'
void init(void)
{
wp1602_ni15_setchar_rom(4,symbol_04);
wp1602_ni15_setchar_rom(5,symbol_05);
wp1602_ni15_clear();
wp1602_ni15_curat(0,0);
wp1602_ni15_outsrom(PSTR("NedoPC-90.AVROS"));
wp1602_ni15_curat(0,1);
stdout = fdevopen(stdoutc, NULL, 0);
stderr = fdevopen(stdoutc, NULL, 0);
printf("Hello, World!\n");
output(DDRB,input(DDRB)|0x0F);_NOP();_NOP();
output(PORTB,0xF7);
}
void led(byte i, byte s)
{
byte mask = 8>>i;
byte newb = (input(PORTB)&(~mask));
if(!s) newb|=mask;
output(PORTB,newb);
}
#define led_clr(x) led(x,0)
#define led_set(x) led(x,1)
byte sh_mode = 0;
char sh_getch(void)
{
char ch = 0;
while(1)
{
ch = keypad40_getch();
if(ch==0x0F) // Fn switch
{
if(sh_mode&1) // Fn 2
{ // set Fn 1
sh_mode = (sh_mode&0xFE);
led_set(0);
led_clr(1);
}
else // Fn 1
{ // set Fn 2
sh_mode = (sh_mode&0xFE)|1;
led_set(1);
led_clr(0);
}
}
else if(ch==0x07) // Caps
{
if(sh_mode&2) // Caps On
{ // set Caps Off
sh_mode = (sh_mode&0xFD);
led_clr(2);
}
else // Caps Off
{ // set Caps On
sh_mode = (sh_mode&0xFD)|2;
led_set(2);
}
}
else break;
}
if(sh_mode&1)
{ // + 130 progam bytes
if(ch=='/') ch='\\';
else if(ch==':') ch=';';
else if(ch=='(') ch='[';
else if(ch==')') ch=']';
else if(ch==',') ch='<';
else if(ch=='.') ch='>';
else if(ch=='1') ch='~';
else if(ch=='2') ch='`';
else if(ch=='3') ch='#';
else if(ch=='4') ch='|';
else if(ch=='5') ch='%';
else if(ch=='6') ch='^';
else if(ch=='7') ch='&';
else if(ch=='8') ch='_';
else if(ch=='9') ch='{';
else if(ch=='0') ch='}';
}
return ch;
}
-
Shaos
- Admin
- Posts: 24404
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
-
Shaos
- Admin
- Posts: 24404
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Обдумываю подключение внешних ОЗУ и ПЗУ по шине NI-15 - пока предполагаю в таком модуле памяти иметь три адресуемых регистра внешней адресации R0, R1, R2 и один буфер обмена данными. Выходит что таким образом можно адресовать до 16 Мб. Также можно организовать возможность блочного чтения-записи, когда адрес будет инкрементироваться автоматически (хотя бы в пределах сегментов по 64 Кб). В этом адресном пространстве можно будет иметь байткод RW0 и переменные исполняемой виртуальной программы.
-
cr0acker
- God
- Posts: 1078
- Joined: 03 Feb 2003 13:53
Дык возьми пзухи с шино И2Ц.Shaos wrote:Обдумываю подключение внешних ОЗУ и ПЗУ по шине NI-15 - пока предполагаю в таком модуле памяти иметь три адресуемых регистра внешней адресации R0, R1, R2 и один буфер обмена данными. Выходит что таким образом можно адресовать до 16 Мб. Также можно организовать возможность блочного чтения-записи, когда адрес будет инкрементироваться автоматически (хотя бы в пределах сегментов по 64 Кб). В этом адресном пространстве можно будет иметь байткод RW0 и переменные исполняемой виртуальной программы.

Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
-
Shaos
- Admin
- Posts: 24404
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Ага и сидеть ждать пока там побитно все будет заливать?cr0acker wrote:Дык возьми пзухи с шино И2Ц.Shaos wrote:Обдумываю подключение внешних ОЗУ и ПЗУ по шине NI-15 - пока предполагаю в таком модуле памяти иметь три адресуемых регистра внешней адресации R0, R1, R2 и один буфер обмена данными. Выходит что таким образом можно адресовать до 16 Мб. Также можно организовать возможность блочного чтения-записи, когда адрес будет инкрементироваться автоматически (хотя бы в пределах сегментов по 64 Кб). В этом адресном пространстве можно будет иметь байткод RW0 и переменные исполняемой виртуальной программы.
-
cr0acker
- God
- Posts: 1078
- Joined: 03 Feb 2003 13:53
Зачем у вас же ось. Некиц буфер в байт(или 2). По таймеру обращение с ПП заливания. Скорость передачи в и2ц может менятся. 500Кгц я думаю тебе хватит. БЫстрее код всё равно не заинтерпритируешь. Учти что скорость вывода на экран тоже ограничена, скоротость работы КБ1013ВГ6 совместимого контроллера.Shaos wrote:Ага и сидеть ждать пока там побитно все будет заливать?cr0acker wrote:Дык возьми пзухи с шино И2Ц.Shaos wrote:Обдумываю подключение внешних ОЗУ и ПЗУ по шине NI-15 - пока предполагаю в таком модуле памяти иметь три адресуемых регистра внешней адресации R0, R1, R2 и один буфер обмена данными. Выходит что таким образом можно адресовать до 16 Мб. Также можно организовать возможность блочного чтения-записи, когда адрес будет инкрементироваться автоматически (хотя бы в пределах сегментов по 64 Кб). В этом адресном пространстве можно будет иметь байткод RW0 и переменные исполняемой виртуальной программы.

Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
-
Shaos
- Admin
- Posts: 24404
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Я буду интерпретировать быстрее (во всяком случае постараюсь), поэтому мне надо быстрый доступ к внешней памяти.cr0acker wrote:Зачем у вас же ось. Некиц буфер в байт(или 2). По таймеру обращение с ПП заливания. Скорость передачи в и2ц может менятся. 500Кгц я думаю тебе хватит. БЫстрее код всё равно не заинтерпритируешь. Учти что скорость вывода на экран тоже ограничена, скоротость работы КБ1013ВГ6 совместимого контроллера.
-
Shaos
- Admin
- Posts: 24404
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Подробнее о плате памяти NedoMemory-1 читаем тутShaos wrote:Обдумываю подключение внешних ОЗУ и ПЗУ по шине NI-15 - пока предполагаю в таком модуле памяти иметь три адресуемых регистра внешней адресации R0, R1, R2 и один буфер обмена данными. Выходит что таким образом можно адресовать до 16 Мб. Также можно организовать возможность блочного чтения-записи, когда адрес будет инкрементироваться автоматически (хотя бы в пределах сегментов по 64 Кб). В этом адресном пространстве можно будет иметь байткод RW0 и переменные исполняемой виртуальной программы.
