domingo, 22 de dezembro de 2013

Conserto de um TK-85

Há alguns dias eu vi no Mercado Livre 2 TKs-85 anunciados pelo vendedor como "Para Aproveitar Peças".  A julgar pelas fotos, os equipamentos estavam bonitos, apesar de faltarem alguns componentes na placa. Resolvi então encarar o desafio de tentar consertá-los e fiz a compra.


Quando os equipamentos chegaram eu fiquei bem animado, pois estavam num estado de conservação melhor do que eu imaginava. Tanto o gabinete quanto as placas.

Hoje eu consegui consertar um deles. Deu bastante trabalho, mas valeu a pena!

O primeiro passo foi uma inspeção visual.A placa estava em bom estado. Eu precisei somente retirar o excesso de solda proximo aos conectores do teclado e fazer um 'jumper' de fio para reparar uma ilha que tinha se soltado.




O segundo passo foi checar as tensões de alimentação. Eu liguei uma fonte de 9Volts no TK e medi a tensão saída do 7805, que estava normal, por volta dos 5.04Volts.
O próximo passo foi checar se esta tensão chegava em todos os CIs. Novamente tudo OK.

Como as memórias estão faltando, consultei o diagrama para ver se se tratava da versão de 16 ou de 48K. Era o de 16K. Medi então as tensões que alimentam as memórias. O V+ estava em 8.5Volts e o V- estava em -4,84Volts.


Resolvi instalar então o Z80 e 8 memórias 4116 que tinha guardados em algum canto por aqui. Com cuidado chequei com o diagrama e em outras fotos a correta orientação dos CIs, uma vez que tanto o soquete do Z80 quanto os soquetes de metade das DRAMS estavam montados (de fábrica, creio eu) de cabeça pra baixo.


Uma característica deste TK-85, pelo jeito também de fábrica é que em vez da ROM  original (de 8K) foram utilizadas duas EPROMs 2732 (de 4K), num arranjo onde a linha A11 é utilizada para selecionar alternadamente uma das memórias, e a linha A12 faz o papel de Chip Select para ambas.


Voltando ao reparo, com os CI's intalados, é hora de ligar o micro, que deu sinal de vida, porém não estava normal. A imagem apresentava listras horizontais e estava totalmente distorcida.



Eu medi as tensões nos soquetes de todos os CIs e descobri que a memória mais à direita (IC37) não estava recebendo os + V (8,5Volts). Também pudera, pois este soquete estava com a aparência muito estranha.


 Trocado o soquete e reinstalada a memória, liguei novamente o micro e para minha surpresa o cursor K apareceu lá,  perfeitinho!




A segunda etapa do reparo foi o reparo do teclado, que já houvera sofrido uma reforma, pois o acetato estava cortado e os encaixes que ficam normalmente na placa haviam sido soldados a 'flat cables', mas não gostei do aspecto das soldas. Quando retirei as fitas, algumas das soldas se soltaram, o que era um bom sinal, pois essa peça não deve ter sofrido sobreaquecimento quando o serviço foi feito.




 

Eu refiz então os 2 flats, e usei uns conectores SIP 90 graus em vez dos conectores IDC que estavam instalados originalmente.



A membrana das linhas de dados (a de 5 pinos) exigiu mais cuidados, pois estava rachada bem próximo da base. Isso exigiu que o conector fosse limado para poder encaixar sem fazer muita força. O conector que encaixa na membrana também deu um pouco de trabalho, pois um dos pinos estava bem frouxo. Tive que desencaixar o pino para desempena-lo, o que causou a quebra do terminal, porém consegui soldar o flat assim mesmo.











Cabo refeito, hora de ligar o micro e testar. Mas cadê o cursor? Sumiu!. Estava fácil demais, deveria ter desconfiado....

Com o osciloscópio eu chequei que os pulsos de sincronismo nos pinos 2 e 3 de IC20 (LS86)estavam presentes. Mas o sinal de video, que vem do pino 7 do LS165 estava sempre em nível alto. Chequei então os sinais de LOAD e CLOCK que chegam aos pinos 1 e 2 de IC9 (LS165). Os sinais estavam presentes, porém não havia nada no pino 7 do LS165. Pensei que IC9 estava queimado e o substituí por um HC165, aproveitando para colocar um soquete. Mas quando liguei a tela ainda estava branca.


Suspeitei que a amplitude do sinal de clock estava meio baixa (2,6V de pico) e por isso retirei e medi o capacitor C2, que traz o sinal de clock dos circuitos do oscilador ao LS165, mas este estava OK.

Reinstalei o capacitor C2 também o CI orginal (LS165). Assim que o micro inicializou ele mostrou o cursor K. Ainda não entendi qual foi o defeito, se foi um mau contato, ou algo assim, mas o micro está funcionando corretamente agora.





Com o micro funcionando, testei o teclado e para minha felicidade, todas as teclas estão funcionando!!



Mais um TK 85 pra coleção!

sábado, 21 de dezembro de 2013

Pickit 2 Clone em caixa de Tic Tac

Continuando com os projetos em caixa de Tic Tac, segue abaixo minha versão de montagem do Pickit 2 Clone para caixa de Tic Tac.

Layout da placa
A figura abaixo é a vista de cima da placa. O formato e as dimensões foram desenhados especialmente para caber nas caixas de balas de menta Tic Tac (da pequena, pois agora tem uma maior).

Durante a montagem, e durante os testes/troubleshooting a imagem acima, bem como a imagem da face inferior da placa foram utilizadas. 

Layout impresso, para ajudar na montagem e "troubleshoot"

Exceto pelo PIC e pelos conectores, todo os outros componentes foram reaproveitado de sucata.  

O indutor foi feito a partir de um núcleo retirado de reator de lâmpada fluorescente compacta. Para saber quantas voltas enrolar, eu levei em conta a indutância e o número de espiras do enrolamento original. Sabendo-se que a indutância num toróide e proporcional ao quadrado do número de espiras, basta usar um pouco de matemática para calcular o número de espiras a ser enrolado no indutor. A foto abaixo traz um "close" da bobina.

"close" da bobina utilizada.
Como não consegui encontrar na minha sucata um cristal SMD de 20MHz, eu utilizei um cristal de 12MHz. Por isso, após gravar o "firmware" foi necessário alterar a configuração dos fuse bits para dividir a frequência do PLL por 3 em vez de dividir por 5.

bit 2-0 PLLDIV2:PLLDIV0: PLL Prescaler Selection bits

111 = Divide by 12 (48 MHz oscillator input)
110 = Divide by 10 (40 MHz oscillator input)
101 = Divide by  6 (24 MHz oscillator input)
100 = Divide by  5 (20 MHz oscillator input)
011 = Divide by  4 (16 MHz oscillator input)
010 = Divide by  3 (12 MHz oscillator input)
001 = Divide by  2 (8 MHz oscillator input)
000 = No prescale  (4 MHz oscillator input drives PLL directly)

Na prática, isso siginifica mudar os bits do registro CONFIG1-L. O Data Sheet do PIC18F2550 mostra como deve ser essa configuração para vários tipos de cristal. A figura abaixo mostra como fazer esta mudança
Configuração dos Fuse Bits para cristal de 12.0MHz
Outro componente que não consegui encontrar foi o resistor de 2K7 do divisor de tensão que fornece ao PIC a amostra do sinal de VPP. Em seu lugar eu utilizei um resistor de 2K2, e troquei o outro resistor do divisor, originalmente de 4K7, por um outro, de 3,82K. A razão de divisão ficou idêntica à original até a quinta casa decimal. Mas um resistor de 3K9 também serviria (diferença na terceira casa decimal).

O conector USB é um pouco complicado de soldar, pois os terminais ficam praticamente escondidos debaixo de seu invólucro. Mas usando um ferro de ponta fina e um pouco de fluxo de solda foi possível realizar a soldagem.
Detalhe da soldagem do conector USB
Depois que a placa foi completamente montada, foram soldados alguns fios nos pinos  /RESET, VCC, GND, PGD e PGC, estes últimos dois em ilhas colocadas no 'layout' com esta finalidade.

Fios conectados aos sinais de programação do PIC18F2550
 
Para programar a placa, foi utilizado um outro Clone de PickKit2. Depois de programar o "Firmware" é necessário alterar a configuração dos "fusebits", conforme descrito anteriormente

Programando a placa usando outro clone de PicKit

Depois de programado, o circuito foi o circuito foi conectado ao PC via cabo US e o circuito foi detectado normalmente. 
Em seguida foram executados os testes usando o menu Tools->Troubleshoot da aplicação "PicKit2 Programmer". No passo 2, ao se testar o VPP, o circuito reportava ao PC uma tensão de VPP de 12Volts, porém no pino VPP não tinha tensão. A polarização de base de Q10 foi checada e estava OK. O transístor foi substituído.

Após a troca de Q10, a comutação da tensão de VPP passou a funcionar corretamente, porém a tensão reportada (e medida) era muito baixa, por volta dos 8 Volts. Para checar se o problema era carga, foi inserido um resistor de 1K entre os pinos VPP e o GND. A tensão então caiu para 7.5Volts,  aproximadamente. Realmente era um problema de carga.
A única carga que o circuito possui é o resistor R9, mas ele é comutado pelo transistor Q8, que deveria fica em corte quando a tensão VPP está ativa. A polarização de base de  Q8 e ela estava OK. O transistor foi então substituído e o circuito passou a operar normalmente!

Tudo pronto. Agora é só colocar na caixa.


Como a placa foi projetada para a caixinha de Tic Tac, a montagem foi super simples. Bastou fazer um rasgo no fundo da caixa para que a placa deslizasse até o fundo. O rasgo foi feito com cuidado, de forma a ficar bem justo. Foram utilizados um estilete afiado para o rasgo inicial e limas finas para o acabamento.

O rasgo para o conector ficou bem justo. 

Com a placa na sua posição correta, foi feita a marcação para o furo para a passagem do pescoço do "push-button".

Agora só falta colocar a tampa

A tampa traseira foi colocada e o encaixe do conector USB foi checado. Ficou perfeito.

Encaixe perfeito.

Um teste final foi executado, usando a interface para programar uma placa experimental

Teste "ao vivo"

Dever cumprido! Dá gosto de ver um projeto terminado, ainda que tenha demorado tanto tempo. 

Agora é só levar no bolso.


terça-feira, 17 de dezembro de 2013

Hackaday Fubarino Contest

Este post está em inglês porque é minha entrada para o concurso da placa Fubarino no Hackaday.


Intro

My entry for the Fubarino Contest is a modified version of the Video Display Adapter developed by Daryl Rictor for his 6502 SBCs. 
The hack consists of adding an extra configuration jumper and a few lines of assembly to allow the selection of a Boot Logo with the Hack-A-Day URL, as needed for the contest.


Hardware

The modification on the original hardware consists of a 10k resistor connected at pin 26 of the AVR. The other side of the resistor goes to a pin header and then to the GND. This pin of the microcontroller (PC3) is normally configured as an ouput, but it is briefly set as an input during the startup. If the jumper J5 is present, a reading on the pin C3 will return "0". Otherwise it will return "1" (High). That's exactly the same technic used by the author of the project to detect (and thus select) the NTSC/PAL option.

The modded circuit can be seen on the picture below.




The circuit was assembled on standard board very similar to a veroboard. The Picture below shows the jumpers and the headers of the board.



Software

The original code underwent two modifications. One was the the boot logo itself. Instead of the original, I have reused the ASCII art from the retro.hackaday.com and added some stuff related to the contest.

/--------------------------------------\
|                                      |
|        __ __         __              |
|       / // /__ _____/ /__  ___ _     |
|      / _  / _ `/ __/  '_/ / _ `/     |
|     /_//_/\_,_/\__/_/\_\  \_,_/      |
|            ___                       |
|           / _ \___ ___ __            |
|          / // / _ `/ // /            |
|         /____/\_,_/\_, /             |
|                   /___/              |
|                                      |
|      Fubarino Contest entry by:      |
|                                      |
|          Daniel Jose Viana           |
|                                      |
|                  _                   |
|               ](o o)[                |
|                \|||/                 |
|                /   \                 |
|               ]     [                |
|                                      |
|         http://hackaday.com          |
|                                      |
\--------------------------------------/

For converting the raw ASCII logo into a file that could be read by the AVR assembler, I've created a Python script. The code of the script is presented below. It doesn't check if the raw log has more than 40 characters x 25 lines  but I think I can handle it by myself, so i kept the script simplest as possible.

# Script to convert ASCII characters
# into includable hexadecimal bytes 

# input and output files
fi = open('banner_raw.txt', 'r')
fo = open('h_banner.inc','w')

# write ASCII image preceeded with remarks  
for line in fi:
    fo.write('; ');
    fo.write (line)

# write entry point info
fo.write ('\n.CSEG')
fo.write ('\n.ORG 0x600')
fo.write ('\n')


# convert each line into hexadecimal values. conversion from
# http://code.activestate.com/recipes/496969-convert-string-to-hex/
fi.seek(0)
for line in fi:
    position=0
    for ch in line:
        #convert character to hexa
        hv = hex(ord(ch)).replace('0x', '')
        if len(hv) == 1:
            hv = '0'+hv
        hv=' $'+hv

        #place character into output file
        if position==0:
            fo.write('\n.db');
        if position < 40:
            fo.write (hv)
            if position !=39:
                fo.write (',')
        position=position+1
        
fo.write('\n')

fi.close()
fo.close()

The other modification on the original code was on the routine that shows the logo at the start-up. It was preceded by an almost copy-and-paste of the code that checks the NTSC/PAL. It changes the state of the PC3 line (port C, bit 3) and activates its pull-up. Then, After a little delay (a bunch of NOPs, indeed) the pin is read. If the jumper J5 is connected the 10k resistor will bring the line down. and the screen buffer will be initialized with the contest Logo. Otherwise the Clear Screen (FormFeed) routine is called and the program continues.

;******************************************************************************
; Initialize the Display SRAM
;******************************************************************************

; Check pin for easter egg. If low on startup, shows banner
 SBI portc, vd7 ; add pullup to pin C3 (vd7)
 ldi J, 0x17  ; set pin C3 as input
 out ddrc, J  ;
 nop   ; delay (wait for ext pull down
 nop   ;        resistor...)
 nop   ; ""
 nop   ; ""
 nop   ; ""
 nop   ; ""
 nop   ; ""
 nop   ; ""
 nop   ; ""
 nop   ; ""
 nop   ; ""
 nop   ; ""
 sbis pinc, vd7 ; is Pin c3 low?
 rjm SHOWBANNER ; Yes, Show Boot Banner
 rcall formfeed ; No, Simply clear the screen
 ldi Cursclk, 0xf8 ; init cursor blink timer 
 rjmp Restore_c3  ; continue 

showbanner:
; fill display SRAM with the Startup Banner 
 ldi ZL, 0x00
 ldi ZH, 0x0C ; set to start of Banner in Prog Mem
 ldi YL, 0x60
 ldi YH, 0x00 ; set to start of SRAM
 ldi XL, 0xE8
 ldi XH, 0x03 ; set X to 1000
 ldi J, 0x20  ;
frloop:
 lpm J, Z+  ; get boot image
 st  Y+, J  ; save to SRAM
 sbiw XL, 1  ; dec X
 brne frloop  ; do until X=0

 ldi Cursclk, 0x00 ; init cursor blink timer. 
    ; wait 256 blink times before initial CLS

RESTORE_C3:
 ldi J, 0x1F  ; set Pin C3 to output
 out ddrc, J  ;
 SBI portc, ackdpin ; raise Pin C3 to hi level

Notice the variable "Cursclk", which is responsible for the delay time of the banner. The main code waits for "Cursclk" counts reach 255 (0xFF) before entering in the normal operation state of the interface. This variable increments at each video frame and it is initialized 0 when the Boot Logo is selected, thus providing a delay of 256 video frames (close to 4 seconds ). On the other hand, when the Boot Logo is not selected, this variable is initialized with 248 (0xf8), wich corresponds 8 frames or something close to 130ms.

Video

The video below demonstrates the operation of the hack. Initially the board boots without the logo option. Then the logo jumper is inserted and the board is restarted, showing the logo.


Conclusion

Thanks for Daryl Rictor for sharing the code of his amazing interface. Without it this hack would not be possible.

And I hope you have enjoyed my hack!

Links:

Source Code Package:  VIDEO_DISPLAY.ZIP
Daryl Rictor's Video Terminal Page:
Hackaday Fubarino Contest:

/--------------------------------------\
|                                      |
|        __ __         __              |
|       / // /__ _____/ /__  ___ _     |
|      / _  / _ `/ __/  '_/ / _ `/     |
|     /_//_/\_,_/\__/_/\_\  \_,_/      |
|            ___                       |
|           / _ \___ ___ __            |
|          / // / _ `/ // /            |
|         /____/\_,_/\_, /             |
|                   /___/              |
|                                      |
|      Fubarino Contest entry by:      |
|                                      |
|          Daniel Jose Viana           |
|                                      |
|                  _                   |
|               ](o o)[                |
|                \|||/                 |
|                /   \                 |
|               ]     [                |
|                                      |
|         http://hackaday.com          |
|                                      |
\--------------------------------------/