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

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

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

SfS wrote:В каком байте какие фузы - не помню, но это легко выяснить сопоставив значения байтов со значениями по умолчанию которые есть в документации. Там всего несколько байт.
В доке нигде точно не написано в каких битах каких байтов сидят CKSEL и CKOPT. Ну предположим CKSEL я могу угадать - это младшие 4 бита Fuse Low Byte, т.к. там значение по умолчанию 0001 стоит, но вот где находится CKOPT я угадать не смогу - т.к. это один бит по умолчанию 1 который надо запрограммировать в 0 :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

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
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Уррраааа! Заработала! :lol:

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

Code: Select all

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

Сопутствующий вопрос - щас мы имеем тока вывод на терминал, а как сделать обоюдный обмен с терминалом, т.е. и возможность ввода тоже?
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

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

Вроде все модемное обнулил - однако оно OFFLINE пишет всё время - на команду инициализации модема в правый нижний угол вешается красный квадратик и ничего не происходит, а на попытку набрать номер оно ругается что не может и пытается снова...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Вобщем переписал вывод на двухстрочный дисплей:

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);
  }
//----------------------------------------------------------------------
Вот фотка одновременного теста клавиатурки и дисплейчика:

Image

Теперь можно приступать к кодингу виртуальной машины RW0! Одно удручает - уже сейчас программа занимает 6296 байт, а ведь на борту их всего 8К :(
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Заметил одну особенность - с включенным в компиляцию но не подсоединенным UART клавиатурка иногда подвисала. После того как отключил - подвисать перестала и размер кода уменьшился до 5404 байта.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Поддержка клавиатуры поддержана просто блестяще :)
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 думаю надо оставить только две стандартные раскладки (с моим небольшим изменением). Всё-таки на уровне системы - это реализация поддержки конкретной клавиатурки без всяких дополнительных раскладок - дополнительный слой будет этажом выше - в программе на пользовательском уровне.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

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;
}
В знакогенераторе дисплея нету двух важных символов '\' и '~', для отображения которых пришлось ввести два символа устанавливаемых программно с кодами 4 и 5 соответственно - эти коды подменяют коды '\' и '~' в момент отправки их на печать.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Shaos wrote:при этом светодиоды Fn1 и Fn2 будут соответственно зажигаться и гаснуть в соответствии с выбранным режимом
по идее при таком способе переключения раскладок мне ненужно будет иметь два светодиода - одного с пометкой Fn2 будет вполне достаточно
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Обдумываю подключение внешних ОЗУ и ПЗУ по шине NI-15 - пока предполагаю в таком модуле памяти иметь три адресуемых регистра внешней адресации R0, R1, R2 и один буфер обмена данными. Выходит что таким образом можно адресовать до 16 Мб. Также можно организовать возможность блочного чтения-записи, когда адрес будет инкрементироваться автоматически (хотя бы в пределах сегментов по 64 Кб). В этом адресном пространстве можно будет иметь байткод RW0 и переменные исполняемой виртуальной программы.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
cr0acker
God
Posts: 1078
Joined: 03 Feb 2003 13:53

Post by cr0acker »

Shaos wrote:Обдумываю подключение внешних ОЗУ и ПЗУ по шине NI-15 - пока предполагаю в таком модуле памяти иметь три адресуемых регистра внешней адресации R0, R1, R2 и один буфер обмена данными. Выходит что таким образом можно адресовать до 16 Мб. Также можно организовать возможность блочного чтения-записи, когда адрес будет инкрементироваться автоматически (хотя бы в пределах сегментов по 64 Кб). В этом адресном пространстве можно будет иметь байткод RW0 и переменные исполняемой виртуальной программы.
Дык возьми пзухи с шино И2Ц.
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

cr0acker wrote:
Shaos wrote:Обдумываю подключение внешних ОЗУ и ПЗУ по шине NI-15 - пока предполагаю в таком модуле памяти иметь три адресуемых регистра внешней адресации R0, R1, R2 и один буфер обмена данными. Выходит что таким образом можно адресовать до 16 Мб. Также можно организовать возможность блочного чтения-записи, когда адрес будет инкрементироваться автоматически (хотя бы в пределах сегментов по 64 Кб). В этом адресном пространстве можно будет иметь байткод RW0 и переменные исполняемой виртуальной программы.
Дык возьми пзухи с шино И2Ц.
Ага и сидеть ждать пока там побитно все будет заливать? ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
cr0acker
God
Posts: 1078
Joined: 03 Feb 2003 13:53

Post by cr0acker »

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

Post by Shaos »

cr0acker wrote:Зачем у вас же ось. Некиц буфер в байт(или 2). По таймеру обращение с ПП заливания. Скорость передачи в и2ц может менятся. 500Кгц я думаю тебе хватит. БЫстрее код всё равно не заинтерпритируешь. Учти что скорость вывода на экран тоже ограничена, скоротость работы КБ1013ВГ6 совместимого контроллера.
Я буду интерпретировать быстрее (во всяком случае постараюсь), поэтому мне надо быстрый доступ к внешней памяти.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Shaos wrote:Обдумываю подключение внешних ОЗУ и ПЗУ по шине NI-15 - пока предполагаю в таком модуле памяти иметь три адресуемых регистра внешней адресации R0, R1, R2 и один буфер обмена данными. Выходит что таким образом можно адресовать до 16 Мб. Также можно организовать возможность блочного чтения-записи, когда адрес будет инкрементироваться автоматически (хотя бы в пределах сегментов по 64 Кб). В этом адресном пространстве можно будет иметь байткод RW0 и переменные исполняемой виртуальной программы.
Подробнее о плате памяти NedoMemory-1 читаем тут
Я тут за главного - если что шлите мыло на me собака shaos точка net