Palm (Pilot)
Клуб пользователей, Санкт-Петеpбуpг
 ENLiGHT Project. Новости об информационных технологиях, науке, авиации и космонавтике

ENLiGHT Project

оглавление | новости от ib/news | другие проекты | www.palmgear.com | письмо | win koi lat

Подключение к Palm PC-AT клавиатуры
Автор: Olaf Kaluza
(пишите ему только на english/deutsch!)

Перевод оригинальной версии - Владимир Медейко
Перевод публикуется с любезного разрешения автора.


Очень многие спрашивают, как можно вводить длинные тексты в PalmPilot? Здесь рассказывается о такой возможности - подключении к PalmPilot самой обычной клавиатуры PC/AT, которая у всех есть либо дома, либо её можно купить весьма дешево. В конце-концов, в мире почти нет мест, где не было бы поблизости PC AT клавиатуры.

 palm.jpg (22991 bytes)


Copyright

Все права на схему и исходный текст принадлежат Olaf Kaluza. Разрешается их использование в личных целях, для собственного удовольствия. Нежелательно копирование данной страницы и перевод на другие языки без разрешения автора. Нежелательно копирование на CD-ROM или другое распространение информации с данной страницы. Если у кого-то возникнут неприятности или сломается Пилот - это полностью ваша собственная проблема.

Переводчик не налагает никаких дополнительных ограничений на распространение перевода. Очевидно, неточности перевода увеличивают вероятность возникновения проблем, так что никакой ответственности переводчик также не несёт.

 

Контакты с автором

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

 

Принцип функционирования

Функционирование относительно просто. Необходимо лишь преобразовать данные в формате клавиатуры IBM-AT (а не старой XT-клавиатуры) в формат клавиатуры Apple-Newton. Затем уже можно использовать один из множества драйверов клавиатуры Newton для Пилота. Автор использует драйвер Freekey.

palmtastatur.gif (4571 bytes)
Схема соединенй

Как видно, схема так же проста, как и функционирование. Вы должны видеть каждую мельчайшую точку картинки. В противном случае лучше бросьте это дело, пока наш маленький друг не убит.
Вы, наверное, заметили, что порт Palmpilot не совсем соответствует RS232. Он принимает 0V как 1, поэтому нужен преобразователь напряжения.
Для соединения можно использовать либо Cradle, либо смастерить разъем для порта самому. На схеме показано первое, я сам использовал только второе.

Питание

Вообще-то, как схеме, так и клавиатуре нужно 5 вольт. Однако, можно не следовать этому в точности. У автора схема работает на 4.2В литиевых аккумуляторах. Очевидно, четыре никель-кадмиевых аккумулятора дадут то же самое.
Не рекомендуется использовать старые клавиатуры, т.к. потребление тока в основном определяется клавиатурой. Старые клавиатуры потребляют в 10-100 раз больше, чем современные!

Исходный текст кода для микроконтроллера:

;Преобразователь для клавиатуры PC в клавиатуру Palmpilot/Newton-Key
;Работает на 24Mhz
;
;
;
;
; 9.04.99
;

         .org 0000H

	;Установка внутренних ассемблерных переменных

         #include "/home/olaf/anwendungen/elektronik/tasm/global.inc"
         #include "/home/olaf/anwendungen/elektronik/tasm/sysmacro.inc"


    	; baud_const = 256 - (crystal / (12 * 16 * baud))
baud_const	.EQU 243         ;9600 бод на 24 MHz


#define  idle    orl   PCON,#00000001b


STACK    .EQU 04fH    ;Начало системного стека-1

#define  KEYDAT	       P3.3	;Данные клавиатуры
				;Как вход для тактирования
				;используется Int0/P3.2

FLAGS     .equ 040h   		; Используем эти байты для флагов
Ctrl      .equ (FLAGS-20h)+0 	; control key flag
Shift     .equ (FLAGS-20h)+1 	; shift   key flag
Alt       .equ (FLAGS-20h)+2 	; alt   key flag
RCtrl	  .equ (FLAGS-20h)+3 	; alt   key flag
RShift	  .equ (FLAGS-20h)+4 	; alt   key flag
RAlt      .equ (FLAGS-20h)+5 	; alt   key flag
E0cod     .equ (FLAGS-20h)+6 	; alt   key flag

lastkey   .equ 041h		; Последняя нажатая клавиша
NBits	  .equ 042h		; Счётчик битов
keytemp	  .equ 043h		; Временный код нажатия
NBytes	  .equ 044h		; !=0 помещены байты в байтовый буфер
keybuff	  .equ 045h		; Буфер для оттранслированных кодов


         ajmp anfang           ;Старт программы после Reset'а

         .org 0003H            ;Внешнее прерывание 0, INT0
         ajmp kbd	       ;Снова пришла клавиатура

         .org 000BH            ;Счётчик переполнения/таймер 0
         nop

         .org 0013H            ;Внешнее прерывание 1, INT1
         NOP

         .org 001BH            ;Счётчик переполнения/таймер 1
         NOP

         .org 0023H            ;Прерывание, последовательный порт
         NOP

         .org 0026H            ;Основная программа

        ;Основная программа, сначала некоторая инициализация
anfang 	mov   SP,#STACK			;Увеличение указателя стека
                             		;И место для банка регистров

	;Установки по умолчанию используют RS232 как 9600 бод при 24-х мегагерцах
        orl     PCON,#10000000b  	;Удвоение бодовой скорости
        MOV     TMOD,#00100001b
        MOV     SCON,#01000000b  	; Установить последовательный
					; порт в режим 1 и запретить приём
        mov     a, #baud_const
        mov     TH1, a
        orl     TCON,#01010010b  	; стартовать 1 оба таймера
        setb    TI              	;нормально установлено в этой программе


	orl	TCON,#00000001b		; Int0 должен переключаться по фронту
	mov	IP,#00000001b		; Int0 устанавливается на высший уровень
	mov	IE,#10000001b		; Разрешить Int0
	
        clr Shift 			; Очистить флаги клавиатуры
	clr Ctrl
	clr Alt
        clr RShift 			
	clr RCtrl
	clr RAlt
	clr E0cod
	mov NBytes,#0
	mov NBits,#0

	;Здесь начинается рабочий код
mainl   mov a,NBytes 			; Нажата клавиша?
        jz mainl     			; Нет? Ждать.

        anl     IE,#01111110b           ; Запретить IRQs
	mov	NBytes,#0
	mov a,keybuff
        orl     IE,#10000001b           ; Разрешить Int0

	jz	mainl			; Запрещённые клавиши посылают ноль

	acall cout			; Послать нажатие на Palmpilot

	mov   a,#8ah			; Удалить нажатие клавиши
	acall cout		        ; Palmpilot сделает там автоповтор
	idle				;Экономить электроэнергию
        sjmp mainl	


	;Послать байты на RS232
cout    jnb     TI, cout
        clr     TI
        mov     SBUF, a
        ret



	;KBD-процедура для прерывания 0
kbd:	push psw     		;Сохранить используемые регистры
        push acc

        mov acc,NBits 		; NBits=число битов последующее от клавиатуры
        cjne a,#0,bit1_8 	; Если не бит 0 то биты от 1 до 8
bit0:   ajmp bump		; Bit0 игнорируется т.к. это стартовый бит

bit1_8: cjne a,#9,$+3 		; Проверить 9-й бит
        jnc bit9
        mov c,KEYDAT  		; Текущий прочитанный бит
        mov a,keytemp 		; Возможно, последние биты
        rr a          		; И место для новых битов
        mov ACC.7,c     		; Биты введены.
        mov keytemp,acc
        ajmp bump

bit9:   cjne a,#9,bit10
        ajmp bump 		;Для начала не используем проверку чётности

	;Стоповый бит, поэтому заканчиваем и можем преобразовывать
bit10:  mov acc,keytemp 	;Последний полностью пришедший скан-код
	jb   E0cod,noe0		;Уже в расширенном E0-режиме? (префикс E0)
	cjne a,#0e0h,noe01      ;Переходим к расширенному E0-коду?
	setb E0cod
	ajmp tidy
	
	;Обрабатываем E0-коды 
noe0:	mov  acc,lastkey
	cjne a,#0f0h,noe0no
	clr  E0cod 		;Клавиша с префиксом E0 отпущена
	mov  lastkey,#0
	mov  acc,keytemp
	cjne a,#75h,notCUr	;Это Cursor-UP
	mov  a,#126		
	ajmp Not0
notCUr: cjne a,#72h,noCDr	;Cursor-Down отпущена?
	mov  a,#125
	ajmp Not0
noCDr:  cjne a,#6bh,noCLr       ;Это Cursor-Left?
	mov  a,#123
	ajmp Not0
noCLr:  cjne a,#74h,noCRr	;Это Cursor-Right?
	mov  a,#124
	ajmp Not0
noCRr:  cjne a,#11h,noAltgr	;Это правая клавиша ALT?
	mov  a,#58
	ajmp Not0
noAltgr:cjne a,#14,noCtrrr      ;Левая Ctrl?
	mov  a,#59
	ajmp Not0
noCtrrr:
	ajmp tidy		;Неопознанный код, ничего не делать

noe0no: 			;Клавиша с префиксом E0 нажата
	mov  acc,keytemp
	cjne a,#0f0h,noe3	;Это F0?
	mov  lastkey,keytemp
	ajmp tidy		;В первый раз если это F0
noe3:	clr  E0cod		;Мы знаем, какая клавиша была нажата
	cjne a,#75h,noCU	;Это Cursor-Up?
	mov  a,#-2		
	ajmp Not0
noCU:	cjne a,#72h,noCD	;Это Cursor-Down?
	mov  a,#-3
	ajmp Not0
noCD:   cjne a,#6bh,noCL	;Это Cursor-Left?
	mov  a,#-5
	ajmp Not0
noCL:   cjne a,#74h,noCR	;Это Cursor-Right?
	mov  a,#-4
	ajmp Not0
noCR:   cjne a,#11h,noAltg	;Это правая клавиша ALT?
	mov  a,#-70		;Посылаем OptionsUP
	ajmp Not0
noAltg: cjne a,#14h,noCtrr	;Это правая клавиша Ctrl?
	mov  a,#-69
	ajmp Not0
noCtrr:
	ajmp tidy		;Нажата неизвестная клавиша


	;Обработка нажатий и отпусканий не-E0 клавиш
noe01:  cjne a,#12h,notls 	; Это левая клавиша Shift?
        mov acc,lastkey     	; Если последний код
        cjne a,#0f0h,makels 	; был $f0, клавиша Shift отпущена
        clr Shift           	; Поэтому стереть биты Shift'а
        mov lastkey,#12h    	; И скан-код последнего символа в буфере

        mov a,#56
	ajmp Not0

makels: setb Shift          	; Следующая клавиша заShift'ена
        mov lastkey,#12h    	; Скан-код последнего символа в буфере

        mov a,#-72
	sjmp Not0

        sjmp tidy

notls:  cjne a,#59h,notrs	; Это правая клавиша Shift?
	mov  acc,lastkey	; Это код Break?
	cjne a,#0f0h,makers
	clr  RShift
  	mov  lastkey,#59h
	mov  a,#60		;Клавиша отпущена
	sjmp Not0
makers: setb RShift
	mov  lastkey,#59h
	mov  a,#-68		;Правая клавиша Shif нажата
	sjmp Not0

notrs:  cjne a,#14h,notctrl 	;Может, это клавиша Ctrl?
        mov acc,lastkey
	cjne a,#0f0h,mkctr
	clr  Ctrl
	mov  lastkey,#14h
	mov  a,#59
	sjmp Not0
mkctr:	setb Ctrl
	mov  lastkey,#14h
	mov  a,#-69
	sjmp Not0


notctrl: cjne a,#11h,notalt	;Это клавиша Alt?
        mov acc,lastkey
        cjne a,#0f0h,mkalt
        clr  Alt
        mov  lastkey,#11h
        mov  a,#55
        sjmp Not0
mkalt:  setb Alt
        mov  lastkey,#11h
        mov  a,#-73
        sjmp Not0


notalt: cjne a,#0f0h,notbreak 	; Это код Break? (Клавиша отпущена)
        mov lastkey,a         	;Заметить
        sjmp tidy               ;но не сохранять в буфере

notbreak: mov acc,lastkey     	; Если последняя клавиша была 0xf0
        cjne a,#0f0h,not_f0   	;Игнорировать скан-код, это код Break
        mov lastkey,#0        	;Dummy-значение
        sjmp tidy

	;Все особые случаи рассмотрены, так что это обычная клавиша
not_f0: mov a,keytemp    	;Настоящая клавиша
        mov lastkey,a      	;и в код последней клавиши.
        push dph     		; Нам нужен dptr для доступа к таблице
        push dpl     	
        mov dptr,#keytab    	;Да, другая таблица
        movc a,@a+dptr      	;Трансляция кода
        pop dpl      		;dptr больше не нужен
        pop dph
Not0:   mov keybuff,a      	; Символ в буфере клавиатуры
        mov NBytes,#1       	; И заметить для дальнейшей работы
tidy:   mov NBits,#0       	; Всё готово для следующей клавиши
        mov keytemp,#0
        sjmp intdone
bump:   inc NBits           	;подготовка к следующему биту 
intdone:pop acc
        pop psw
        reti

        ;Таблица перевода клавиш IBM-AT в Code-Set2 c't6/88 s.152
	;в коды Newton  
        ;    0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
keytab  .db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,0b0h,0b2h,000h ;0x00
        .db 000h,-73 ,-72 ,000h,-69 ,08ch,092h,000h,000h,000h,086h,081h,080h,08dh,093h,000h ;0x10
        .db 000h,088h,087h,082h,08eh,095h,094h,000h,000h,0b1h,089h,083h,091h,08fh,097h,000h ;0x20
        .db 000h,0adh,08bh,084h,085h,090h,096h,000h,000h,000h,0aeh,0a6h,0a0h,09ah,09ch,000h ;0x30
        .db 000h,0abh,0a8h,0a2h,09fh,09dh,099h,000h,000h,0afh,0ach,0a5h,0a9h,0a3h,09bh,000h ;0x40
        .db 000h,000h,0a7h,000h,0a1h,098h,000h,000h,-71 ,000h,0a4h,09eh,000h,0aah,000h,000h ;0x50
        .db 000h,000h,000h,000h,000h,000h,0b3h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0x60
        .db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0x70
        .db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0x80
        .db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0x90
        .db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0xa0
        .db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0xb0
        .db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0xc0
        .db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0xd0
        .db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0xe0
        .db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0xf0
  

           .end



Итак, это был исходный текст. Больше ничего нет, из него все должно быть ясно. Он базируется частично на приложении от Philips'а, где было показано как привешивать клавиатуру к MCS51, поэтому фраза об авторском праве к этому не относится.


Исходный текст и бинарный код (4kb ZIP)


В результате мы должны получить клавиатуру с американской раскладкой. Для автора это нормально, т.к. у него все компьютеры с американскими клавиатурами. Если вас это не устраивает, подправляйте Freekey сами. Хорошо вам повеселиться.


Если кому-то удастся собрать это устройство, или как-то дополнить статью -   пожалуйста пишите.


Примечание от DOOMKa:

Я сделал клавиатуру, подобную той, о которой Вы рассказывали на странице. Мой материал можно посмотреть на http://wince.cdc.ru/russian/kbdproj.htm  . Одно замечание: для нормальной работы нужно использовать прошивку palmtasta2 (а не palmtasta как у Вас).

 


Подключение к Palm Ericsson chatboard

во-первых, вот:
http://www.iptel-now.de/HOWTO/CHATBOARD/chatboard.html 

(если телефона нет, то проще сделать так же, только не готовую логику от писишной клавы отдирать, а вставить свой простенький контроллер на pic)

во-вторых, вот:
http://www.subdimension.com/community/scitech/ga628/a1018_chatb.htm 

так что по логике как раз не проще. там надо декодировать at команды, плюс оный чатборд эмулирует нажатие телефонных клавиш, т.е. жмешь ты, к примеру, L а оно шлет три раза at+ckpd="5". декодировать это не сложнее, чем писишный интерфейс, но и не проще. в любом случае uC некий понадобится. 

И еще по поводу клавиатуры Ericsson и PS/2 - можно обратить внимание на проект ЙЦУКЕН (http://starostin.palmclub.ru) Там вся схемотехника, прошивки, фото.

кроме того, для случая пальма, с батареек придется кормить ещс и преобразователь уровней и контроллер этой самой клавы, который больше вредит, чем даст пользы :)

Дополнительно ссылка: http://wince.box.ru/russian/newtonkb.htm

Если вы хотите дополнить FAQ - пожалуйста пишите. Ваши вопросы и ответы по e-mail могут быть помещены в форум или опубликованы в FAQ.

design/collection/some content by Frog,
PALM FAQ (C) Frog 2000-2003,
"PALM FAQ, http://www.enlight.ru/pilot/".