nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 19 Oct 2018 15:35



Reply to topic  [ 105 posts ]  Go to page Previous  1 ... 3, 4, 5, 6, 7  Next
Клавиатура и NedoPC-90 
Author Message
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17014
Location: Colorado
Reply with quote
Post 
SfS wrote:
В каком байте какие фузы - не помню, но это легко выяснить сопоставив значения байтов со значениями по умолчанию которые есть в документации. Там всего несколько байт.


В доке нигде точно не написано в каких битах каких байтов сидят CKSEL и CKOPT. Ну предположим CKSEL я могу угадать - это младшие 4 бита Fuse Low Byte, т.к. там значение по умолчанию 0001 стоит, но вот где находится CKOPT я угадать не смогу - т.к. это один бит по умолчанию 1 который надо запрограммировать в 0 :)

_________________
:eugeek: https://twitter.com/Shaos1973


15 Apr 2006 19:34
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17014
Location: Colorado
Reply with quote
Post 
Shaos wrote:
SfS wrote:
В каком байте какие фузы - не помню, но это легко выяснить сопоставив значения байтов со значениями по умолчанию которые есть в документации. Там всего несколько байт.


В доке нигде точно не написано в каких битах каких байтов сидят CKSEL и CKOPT. Ну предположим CKSEL я могу угадать - это младшие 4 бита Fuse Low Byte, т.к. там значение по умолчанию 0001 стоит, но вот где находится CKOPT я угадать не смогу - т.к. это один бит по умолчанию 1 который надо запрограммировать в 0 :)


Обнаружил описание поиском в разделе "Memory Programming" :)
CKSEL как я ипредполагал - четыре младших бита во Fuse Low Byte
CKOPT - бит 4 во Fuse High Byte

Получается что для перепрограммирование чипа на использование внешнего кварца надо выполнить команду:

uisp -dprog=dapa --wr_fuse_l=0xee --wr_fuse_h=0xc9

_________________
:eugeek: https://twitter.com/Shaos1973


15 Apr 2006 19:41
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17014
Location: Colorado
Reply with quote
Post 
Уррраааа! Заработала! :lol:

Досовская терминальная программа CONEX (запущенная на досовском ноуте, который подключён к NedoPC-90 через RS-232) печатает символ и его код, посланные с авра, правда похоже перевод строки идет без возврата каретки и они печатаются лесенкой:

Code:
b 62
    @ 40
        " 22


Вставил в код программы \r\n вместо \n и оно поправилось - стало печатать в столбик :)

Сопутствующий вопрос - щас мы имеем тока вывод на терминал, а как сделать обоюдный обмен с терминалом, т.е. и возможность ввода тоже?

_________________
:eugeek: https://twitter.com/Shaos1973


15 Apr 2006 19:56
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17014
Location: Colorado
Reply with quote
Post 
Shaos wrote:
Досовская терминальная программа CONEX (запущенная на досовском ноуте, который подключён к NedoPC-90 через RS-232) печатает символ и его код, посланные с авра...


А minicom в линуксе я так и не могу настроить :(

Вроде все модемное обнулил - однако оно OFFLINE пишет всё время - на команду инициализации модема в правый нижний угол вешается красный квадратик и ничего не происходит, а на попытку набрать номер оно ругается что не может и пытается снова...

_________________
:eugeek: https://twitter.com/Shaos1973


15 Apr 2006 20:42
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17014
Location: Colorado
Reply with quote
Post 
Вобщем переписал вывод на двухстрочный дисплей:

Code:
//----------------------------------------------------------------------
// 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);
  }
//----------------------------------------------------------------------


Вот фотка одновременного теста клавиатурки и дисплейчика:

Image

Теперь можно приступать к кодингу виртуальной машины RW0! Одно удручает - уже сейчас программа занимает 6296 байт, а ведь на борту их всего 8К :(

_________________
:eugeek: https://twitter.com/Shaos1973


15 Apr 2006 22:09
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17014
Location: Colorado
Reply with quote
Post 
Заметил одну особенность - с включенным в компиляцию но не подсоединенным UART клавиатурка иногда подвисала. После того как отключил - подвисать перестала и размер кода уменьшился до 5404 байта.

_________________
:eugeek: https://twitter.com/Shaos1973


15 Apr 2006 22:48
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17014
Location: Colorado
Reply with quote
Post 
Поддержка клавиатуры поддержана просто блестяще :)
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" для реализации еще одной дополнительной раскладки (на картинке помечено зелёным):

Image

Причём повторное нажатие Fn+BackSp вернет обратно обычный Fn-режим (на картинке помечено красным) - при этом светодиоды Fn1 и Fn2 будут соответственно зажигаться и гаснуть в соответствии с выбранным режимом.

Кроме того выбор режима CapsLock теперь может быть прочитано программой пользователя - что позволит программно зажечь соответствющий светодиод CapsLock. Если SfS посчитает что выдавать код этого действия наружу не всегда уместно - могу предложить обернуть это дело в #ifdef - чтобы по умолчанию код не возвращался на уровень юзера, а в моём приложении - будет возвращаться.

На уровне hl думаю надо оставить только две стандартные раскладки (с моим небольшим изменением). Всё-таки на уровне системы - это реализация поддержки конкретной клавиатурки без всяких дополнительных раскладок - дополнительный слой будет этажом выше - в программе на пользовательском уровне.

_________________
:eugeek: https://twitter.com/Shaos1973


16 Apr 2006 19:33
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17014
Location: Colorado
Reply with quote
Post 
Shaos wrote:
На уровне hl думаю надо оставить только две стандартные раскладки (с моим небольшим изменением). Всё-таки на уровне системы - это реализация поддержки конкретной клавиатурки без всяких дополнительных раскладок - дополнительный слой будет этажом выше - в программе на пользовательском уровне.


Будет примерно вот так:

Code:
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;
}


В знакогенераторе дисплея нету двух важных символов '\' и '~', для отображения которых пришлось ввести два символа устанавливаемых программно с кодами 4 и 5 соответственно - эти коды подменяют коды '\' и '~' в момент отправки их на печать.

_________________
:eugeek: https://twitter.com/Shaos1973


16 Apr 2006 21:36
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17014
Location: Colorado
Reply with quote
Post 
Shaos wrote:
при этом светодиоды Fn1 и Fn2 будут соответственно зажигаться и гаснуть в соответствии с выбранным режимом


по идее при таком способе переключения раскладок мне ненужно будет иметь два светодиода - одного с пометкой Fn2 будет вполне достаточно

_________________
:eugeek: https://twitter.com/Shaos1973


17 Apr 2006 19:16
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17014
Location: Colorado
Reply with quote
Post 
Обдумываю подключение внешних ОЗУ и ПЗУ по шине NI-15 - пока предполагаю в таком модуле памяти иметь три адресуемых регистра внешней адресации R0, R1, R2 и один буфер обмена данными. Выходит что таким образом можно адресовать до 16 Мб. Также можно организовать возможность блочного чтения-записи, когда адрес будет инкрементироваться автоматически (хотя бы в пределах сегментов по 64 Кб). В этом адресном пространстве можно будет иметь байткод RW0 и переменные исполняемой виртуальной программы.

_________________
:eugeek: https://twitter.com/Shaos1973


18 Apr 2006 06:53
Profile WWW
God
User avatar

Joined: 03 Feb 2003 14:53
Posts: 1095
Reply with quote
Post 
Shaos wrote:
Обдумываю подключение внешних ОЗУ и ПЗУ по шине NI-15 - пока предполагаю в таком модуле памяти иметь три адресуемых регистра внешней адресации R0, R1, R2 и один буфер обмена данными. Выходит что таким образом можно адресовать до 16 Мб. Также можно организовать возможность блочного чтения-записи, когда адрес будет инкрементироваться автоматически (хотя бы в пределах сегментов по 64 Кб). В этом адресном пространстве можно будет иметь байткод RW0 и переменные исполняемой виртуальной программы.

Дык возьми пзухи с шино И2Ц.

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


18 Apr 2006 07:01
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17014
Location: Colorado
Reply with quote
Post 
cr0acker wrote:
Shaos wrote:
Обдумываю подключение внешних ОЗУ и ПЗУ по шине NI-15 - пока предполагаю в таком модуле памяти иметь три адресуемых регистра внешней адресации R0, R1, R2 и один буфер обмена данными. Выходит что таким образом можно адресовать до 16 Мб. Также можно организовать возможность блочного чтения-записи, когда адрес будет инкрементироваться автоматически (хотя бы в пределах сегментов по 64 Кб). В этом адресном пространстве можно будет иметь байткод RW0 и переменные исполняемой виртуальной программы.

Дык возьми пзухи с шино И2Ц.


Ага и сидеть ждать пока там побитно все будет заливать? ;)

_________________
:eugeek: https://twitter.com/Shaos1973


18 Apr 2006 10:56
Profile WWW
God
User avatar

Joined: 03 Feb 2003 14:53
Posts: 1095
Reply with quote
Post 
Shaos wrote:
cr0acker wrote:
Shaos wrote:
Обдумываю подключение внешних ОЗУ и ПЗУ по шине NI-15 - пока предполагаю в таком модуле памяти иметь три адресуемых регистра внешней адресации R0, R1, R2 и один буфер обмена данными. Выходит что таким образом можно адресовать до 16 Мб. Также можно организовать возможность блочного чтения-записи, когда адрес будет инкрементироваться автоматически (хотя бы в пределах сегментов по 64 Кб). В этом адресном пространстве можно будет иметь байткод RW0 и переменные исполняемой виртуальной программы.

Дык возьми пзухи с шино И2Ц.


Ага и сидеть ждать пока там побитно все будет заливать? ;)

Зачем у вас же ось. Некиц буфер в байт(или 2). По таймеру обращение с ПП заливания. Скорость передачи в и2ц может менятся. 500Кгц я думаю тебе хватит. БЫстрее код всё равно не заинтерпритируешь. Учти что скорость вывода на экран тоже ограничена, скоротость работы КБ1013ВГ6 совместимого контроллера.

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


18 Apr 2006 12:59
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17014
Location: Colorado
Reply with quote
Post 
cr0acker wrote:
Зачем у вас же ось. Некиц буфер в байт(или 2). По таймеру обращение с ПП заливания. Скорость передачи в и2ц может менятся. 500Кгц я думаю тебе хватит. БЫстрее код всё равно не заинтерпритируешь. Учти что скорость вывода на экран тоже ограничена, скоротость работы КБ1013ВГ6 совместимого контроллера.


Я буду интерпретировать быстрее (во всяком случае постараюсь), поэтому мне надо быстрый доступ к внешней памяти.

_________________
:eugeek: https://twitter.com/Shaos1973


18 Apr 2006 15:34
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17014
Location: Colorado
Reply with quote
Post 
Shaos wrote:
Обдумываю подключение внешних ОЗУ и ПЗУ по шине NI-15 - пока предполагаю в таком модуле памяти иметь три адресуемых регистра внешней адресации R0, R1, R2 и один буфер обмена данными. Выходит что таким образом можно адресовать до 16 Мб. Также можно организовать возможность блочного чтения-записи, когда адрес будет инкрементироваться автоматически (хотя бы в пределах сегментов по 64 Кб). В этом адресном пространстве можно будет иметь байткод RW0 и переменные исполняемой виртуальной программы.


Подробнее о плате памяти NedoMemory-1 читаем тут

_________________
:eugeek: https://twitter.com/Shaos1973


19 Apr 2006 20:31
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 105 posts ]  Go to page Previous  1 ... 3, 4, 5, 6, 7  Next

Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.