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.

2 comentários:

William disse...

Caramba, achei que só eu era louco por essas coisas assim :-D

Ótimo post, verdadeiro espírito de viciado em tecnologia

Depois que eu tiver um tempo vou brincar com o Arduino.

Eu estava fuçando com meus componentes não programáveis, CIs CMOS(4017, 4011) e o 555. Vou arrumar percloreto de ferro e voltar a fazer minhas plaquinhas :)

Aguardando próximo post com as fotos heim

Jean J. Michel disse...

William, pode deixar que eu postarei ;)

Comprei um Arduino no eBay semana passada, estou só esperando o bichin chegar para começar a aloprar com ele e postar os resultados aqui :-D

Como chegou ao blog?

Abraço