quarta-feira, junho 30, 2010

Problemas com o blog

Estou editando o layout do blog por isso está tudo desconfigurado. Peço um pouco de paciência, em alguns dias eu resolverei o problema.

Fotos do meu último experimento

Aí estão as fotos da montagem do meu último experimento (nada científico) com o PIC 16F628A da Microchip.
 
Mas não se anime, pois não está funcionando :(
 
Vou dar uma debugada depois, com calma, pois no Proteus está funcionando. Devo ter feito alguma barberagem na hora de montar, sei lá.
 
O que acontece é que quando o botão é pressionado os dois LEDs vermelhos apagam e o verde não liga.
 
Eis as fotos:
 
See at http://www.flickr.com/photos/jeanjmichel
 
See at http://www.flickr.com/photos/jeanjmichel
 
See at http://www.flickr.com/photos/jeanjmichel
 
See at http://www.flickr.com/photos/jeanjmichel

quarta-feira, junho 09, 2010

Mais um experimento com PIC 16F628A e Assembly

Seguindo a minha saga pelo mundo dos microcontroladores, hoje fiz mais um exemplo em Assembly usando o PIC 16F628A da Microchip.
 
A brincadeira é permutar entre o acendimento de um ou outro LED via chave táctil.
 
O fluxo do programa é este:
 
Fluxo
 
Aqui estão as imagens da simulação do circuito feita no Proteus:
 
Circuito desligado
Circuito desligado.
 
Circuito ligado
Circuito ligado.
 
Chave pressionada
Chave pressionada.
 
E aqui está o código Assembly:
 
;******************************************************************************;
; Processor: PIC16F628 at 4 MHz using internal RC oscillator                   ;
; Function : When the circuit is energized two LEDs will turn on, the power    ;
;            indicator and LED_D1. Every time the button is pressed the LED_D1 ;
;            will turn off and the LED_D2 will turn on, the opposite occurs    ;
;            when the button is released, turning off the LED_D2 and turning   ;
;            on the LED_D1 again.                                              ;
; Hardware : Protoboard                                                        ;
; Filename : main.asm                                                          ;
; Author   : Jean J. Míchel <jeanjmichel-at-gmail.com>                         ;
; Website  : http://www.jeanjmichel.blogspot.com                               ;
; Credit   :                                                                   ;
;******************************************************************************;
; Wiring diagram                               +-/\/\/--|>|--o GND             ;
;                                  +---v---+   |  R2    LED_PWR                ;
;                                -<|º  1   |>--+                               ;
;                                -<|   6   |>----/\/\/--|>|--o GND             ;
;                                -<|   F   |>--+  R3    D1                     ;
;                                -<|   6   |>- |                               ;
;                                -<|   2   |>- +-/\/\/--|>|--o GND             ;
;                                -<|   8   |>-    R4    D2                     ;
;                                -<|   A   |>-                                 ;
;                                -<|       |>--+----o¯o----o VDD 5v            ;
;                                  +-------+   |    R1                         ;
;                                              +---/\/\/---o GND               ;
;******************************************************************************;
#include  <p16f628a.inc>
list p=16f628a
ERRORLEVEL 0, -302;, -224, -302, -305, -207
__config (_INTOSC_OSC_NOCLKOUT & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_OFF)
 
#define   select_bank0  bcf STATUS,RP0
#define   select_bank1  bsf STATUS,RP0
#define   LED_PWR  PORTA,1
#define   LED_D1   PORTA,0
#define   LED_D2   PORTA,7
#define   BUTTON   PORTB,4
 
                org       0x00
                goto      setup              ;Perform the initial settings     ;
                
main            btfsc     BUTTON             ;Monitors the action of the button;
                goto      turn_on_d2         ;Turns on LED_D2                  ;
                goto      turn_on_d1         ;Turns on LED_D1                  ;
                
turn_on_d1      bcf       LED_D2             ;Turns off LED_D2                 ;
                bsf       LED_D1             ;Turns on LED_D1                  ;
                goto      main
                
turn_on_d2      bcf       LED_D1             ;Turns off LED_D1                 ;
                bsf       LED_D2             ;Turns on LED_D2                  ;
                goto      main
                
setup           select_bank1
                movlw     B'00000000'        ;Defines all pins of the PORTA    ;
                movwf     TRISA              ;registrator as output            ;
                
                movlw     B'00010000'        ;Defines all pins of the PORTB    ;
                movwf     TRISB              ;registrator as output except the ;
                                             ;the pin 4 - push button          ;
                
                bsf       PCON, OSCF         ;Sets 16F628 to operate at 4MHz   ;
                
                select_bank0
                movlw     0x07
                movwf     CMCON              ;Turns off the comparator         ;
                
                clrf      PORTA              ;Clears all pins of the PORTA     ;
                                             ;registrator                      ;
                
                clrf      PORTB              ;Clears all pins of the PORTB     ;
                                             ;registrator                      ;
                
                bsf       LED_PWR            ;Turns on LED_PWR - power LED     ;
 
 
                goto      main               ;Loop forever ;)                  ;
 
end
 
Enjoy!

segunda-feira, junho 07, 2010

Pequeno jogo em JavaScript

Estava lendo o material do blog Elétron Livre sobre um dojo de programação com o Program-ME, onde o pessoal da Globalcode criou uma réplica do jogo Genius.
 
Parei para pensar como seria o algoritmo (sem antes ler o deles claro) e comecei a esboçar em JavaScript algo parecido.
 
Quando inicializa a tela são sorteados quatro números inteiros e positivos, esses números aparecem por 1,5 segundo nos quatro campos dispostos em forma de matriz 2x2 na tela e depois são apagados.
Ao jogador resta preencher os quatro campos novamente com os valores correspondente a cada um deles antes exibido. No final ao pressionar o único botão da tela, as respostas do usuário são confrontadas com os números sorteados e exibido o resultado indicando se o jogador acertou ou não a combinação de números.
 
Segue uma seqüência de imagens do jogo:
 

Números sorteados.
 

Hora de jogar :-)
 

Conferindo meu chute.
 

Jogar novamente?
 

Agora sim!
 

Jogar novamente?
 

Bye-bye
 
Claro que isso é uma bobeira, e para simular corretamente o jogo Genius eu deveria ter usado imagens nas cores que o jogo utilizava e não campos numéricos, mas como fiz isso somente para ver como seria... ta ai o resultado. :-) Foi uma hora de almoço gasta em nome da ciência :-)
 
Para aumentar a dificuldade bastas mudar o tempo em que permanecem exibidos os números sorteados.
 
Eis o fonte da página:
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Untitled</title>
    <script language="JavaScript" type="text/javascript">
      <!--
        var ramdom = new Array();
        var answers = new Array();
        var ports = new Array();
        
        function allocate() {
          ports[0] = document.getElementById("portA");
          ports[1] = document.getElementById("portB");
          ports[2] = document.getElementById("portC");
          ports[3] = document.getElementById("portD");
          
          for(i = 0; i < 4; i++) {
            ramdom[i] = Math.floor(Math.random()* 11);
            ports[i].value = ramdom[i]; 
          }
          
          setTimeout(clearForm, 1500);
          
          ports[0].focus();
        }
        
        function clearForm() {
          for(i = 0; i < 4; i++) {
            ports[i].value = ""; 
          }
        }
        
        function checkAnswers() {
          var result = true;
          var tryAgain;
          
          for(i = 0; i < 4; i++) {
            answers[i] = ports[i].value;
            
            if(answers[i] != ramdom[i]) {
              result = false;
            }
          }
          
          var message = "Ramdom numbers: " + ramdom + "\n" +
                        "Your answers: " + answers
          
          if(result) {
            alert("You win! :-) \n\n" + message);
          }
          else {
            alert("You lose! :-( \n\n" + message);
          }
          
          tryAgain = prompt("Do you would like play again?", "Type Y or N");
          
          if(tryAgain == "Y") {
            allocate();
          }
          else {
            document.getElementById("gameForm").style.display = "none";
            document.getElementById("message").style.display = "block";
          }
        }
      //-->
    </script>
  </head>
  <body>
    <div id="gameForm">
      <input type="text" id="portA" name="portA" size="2" />
      <input type="text" id="portB" name="portB" size="2" /> <br/>
      <input type="text" id="portC" name="portC" size="2" />
      <input type="text" id="portD" name="portD" size="2" /> <br/><br/>
      <input type="button" id="check" name="check" value="Check my answers!" onclick="checkAnswers()" />
    </div>
    <div id="message" style="display: none;">
      <p>Thanks for play my game! :-)</p>
    </div>
    <script>
      allocate();
    </script>
  </body>
</html>

sábado, junho 05, 2010

Eletrônica - micro controlador Microchip 16F628A + Assembly [fotos]

Tinha ficado devendo as fotos do meu experimento com o PIC 16F628A da Microchip, bem aqui estão elas:
 
Montagem na protoboard
 
Montagem na protoboard
 
Montagem na protoboard
 
Ficou bem legal, funcionou conforme o simulado, mas dei algumas mancadas na hora de construir o circuito, falta de prática :-D.

terça-feira, junho 01, 2010

Eletrônica - micro controlador Microchip 16F628A + Assembly

Quem, assim como eu, trabalha com TI está acostumado a ver sistemas transformando informações em informações =P, ou seja, dados vem daqui e vão para lá. Isso me deixa um pouco frustrado, pois não construo nada, não vejo nada acontecer, etc. (não me diga que ver um gráfico em um relatório é "ver" as coisas acontecerem em um sistema ;) ) então voltei para os meus primórdios sonhos infantis de construir alguma coisa (na verdade um robô) e para isso invoquei meus conhecimentos de quando tinha 15 anos e estudei na Escola Estadual Técnica Parobé (hoje Centro Tecnológico Estadual Parobé), onde cursei eletrônica.
 
Junte a vontade de fazer algo "se mexer" a ter um colega com skills do Professor Pardal a muitas conversas sobre automação na hora do almoço e um passeio pela Rua República do Líbano (onde estão as lojas de componentes eletrônicos aqui no Rio de Janeiro) e então terás nas mãos uma protoboard, um punhado de componentes e muita diversão ;)
 
Comecei leve: um micro controlador da Microchip (16F628A), dois LEDs, um botão e um programa escrito em Assembly. Assembly ao invés de C porque é o mais próximo que podemos chegar de ver os elétrons passando pela placa ;).
 
A brincadeira é muito simples, mas com ela tive contato com Assembly para micro controladores, o que não conhecia.
 
Vamos lá, o negócio é ter dois LEDs ligados no PIC, um ficará permanentemente aceso (indicando que o circuito está ligado) e o outro LED ficará desligado até que se pressione o botão, que o ligará.
 
Eis a simulação do circuito (as imagens podem ser vistas direto no Flickr: http://www.flickr.com/photos/jeanjmichel/sets/72157624156071640/):
 
Circuito desligado:
desligado
 
Circuito ligado:
ligado
 
Circuito em uso (botão pressionado):
ligado
 
Eis o código Assembly:
 
;******************************************************************************;
; Processor: PIC16F628 at 4 MHz using internal RC oscillator                   ;
; Function : Switch on two LEDs. The first LED (D1), conenected to RB0, turns  ;
;            on when the circuit is energized (power LED), while the second    ;
;            LED (D2), connected to RA1, just turns on when the push button    ;
;            (PB1) is pressed.                                                 ;
; Hardware : Protoboard                                                        ;
; Filename : main.asm                                                          ;
; Author   : Jean J. Míchel <jeanjmichel-at-gmail.com>                         ;
; Website  : http://www.jeanjmichel.blogspot.com                               ;
; Credit   : Eduardo Bekman                                                    ;
;******************************************************************************;
; Wiring diagram                                                               ;
;                                  +---v---+    R1    D1                       ;
;                                -<|º  1   |>--/\/\/--|>|--o GND               ;
;                                -<|   6   |>--+                               ;
;                                -<|   F   |>- +----o¯o----o VDD 5v            ;
;                                -<|   6   |>- |    PB1                        ;
;                     D2    R3   -<|   2   |>- |                               ;
;              GND o--|<|--/\/\/--<|   8   |>- +---/\/\/---o GND               ;
;                                -<|   A   |>-      R2                         ;
;                                -<|       |>-                                 ;
;                                  +-------+                                   ;
;                                                                              ;
;******************************************************************************;
#include  <p16f628a.inc>
list p=16f628a
ERRORLEVEL 0, -302;, -224, -302, -305, -207
__config (_INTOSC_OSC_NOCLKOUT & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_OFF)
 
#define   select_bank0  bcf STATUS,RP0
#define   select_bank1  bsf STATUS,RP0
#define   BUTTON  PORTA,0
#define   LED_D1  PORTA,1
#define   LED_D2  PORTB,0
 
                org       0x00
                goto      setup              ;Perform the initial settings     ;
 
main            btfsc     BUTTON             ;Monitors the action of the button;
                goto      turn_on_led        ;Turns on LED_D1                  ;
                goto      turn_off_led       ;Turns off LED_D1                 ;
 
turn_on_led     bsf       LED_D1             ;Turns on LED_D1                  ;
                goto      main
 
turn_off_led    bcf       LED_D1             ;Turns off LED_D1                 ;
                goto      main
 
setup           select_bank1
                movlw     B'00000001'        ;Defines all pins of the PORTA    ;
                movwf     TRISA              ;registrator as output except     ;
                                             ;pin 0 - push button              ;
 
                movlw     B'00000000'        ;Defines all pins of the PORTB    ;
                movwf     TRISB              ;registrator as output            ;
 
                bsf       PCON, OSCF         ;Sets 16F628 to operate at 4MHz   ;
 
                select_bank0
                movlw     0x07
                movwf     CMCON              ;Turns off the comparator         ;
 
                clrf      PORTA              ;Clears all pins of the PORTA     ;
                                             ;registrator                      ;
 
                clrf      PORTB              ;Clears all pins of the PORTB     ;
                                             ;registrator                      ;
 
                bsf       LED_D2             ;Turns on LED_D2 - power LED      ;
                goto      main               ;Loop forever ;)                  ;
 
end
 
Ainda não consegui monta-lo na protoboard para postar fotos e vídeos do projeto funcionando, mas assim que o fizer eu posto.