domingo, 17 de abril de 2011

HCS08 - Motorola Freescale - Convertidor Analogico Digital

HCS08 y su Convertidor Analogico Digital
Sensor de Temperatura

Ahora les presento el codigo del convertidor analogico - digital:

REQUERIMIENTOS:

* Coloca 8 leds en el puerto B, es decir uno por pata, estos se encenderan de acuerdo a lo que reciba el convertidor.

* Coloca un potenciometro de forma divisor de voltaje en la entrada PTA1 (pata 25) del micro HCS08



En esta imagen se aprecia un divisor de voltaje hecho con
dos resistencias
En esta imagen, por medio de un potenciometro creamos el
divisor de voltaje de arriba
El chiste de crear un divisor de voltaje con el potenciometro es que al girar la perilla el voltaje por Vout (de la imagen de arriba) varie, asi se consigue comtrolar el voltaje que entra a PTA1 para poder muestrearlo en los leds.

Como habras entendido, Vout va conectado a la para 25 del micro (PTA1).

Esquematico:


Codigo:
; Insert your code here

;Entrada Analogica por PTA1            

;cabecera del programa
;*********************               
cabecera:
;declaracion puerto B coomo salida
LDA #$FF          ;cargamos $11111111=$FF
STA $03           ;lo colocamos en PTBDD para hacer PTBD de salida

;Configuracion del ADC
LDA #$90          ;Cargamos $90=10010000
STA ADCCFG        ;Colocamos en ADCCFG=bajo poder, clock /1,largo tiempo muestreo, resolucion 8 bits, 

LDA #$00
STA ADCSC2        

LDA     #$21        ;$21=00100001, COCO y AIEN desactivados, Activada conversion continua, Canal 1 seleccionado
STA     ADCSC1

;Inicia el main
;**************************
main:
LDA     ADCSC1          ;Se carga el contenido de ADCSC1 para verificar COCO
CMP     #$A1            ;Comparamos con $A1=%10100001 si igual Z=1,(COCO activado, AIEN desactivado, Conversion continua activada, Canal 1), 
BNE     main            ;si COCO no esta activado (Z=0), regresa (Branch) a main, con COCO debe ser: 

LDA ADCRL               ;cargamos la conversion
STA $02                 ;la colocamos en el puerto B
feed_watchdog
BRA main
;*************
;Termina el main

HCS08, LM35 Y DISP 7 SEGMENTOS
SENSOR DE TEMPERATURA

Se aprecia todo el circuito en si, junto con la HCS08 open source BDM


Esquematico


Un sensor de temperatura muy sencillo, se trata de desplegar la temperatura en dos dsiplay de 7 segmentos por medio de 2 drivers 7448.

REQUERIMIENTOS:
* 2 display 7 segmentos catodo comun
* 2 driver 7448 BCD a display 7 segmentos
* micro HCS08
* HCS08 open source BDM (o con lo que programes al micro

Conexiones:
* Del micro: PTB0 a PTB3 van al driver 7448 que controla las unidades
PTB4 a PTB7 van al driver 7448 que controla las decenas
(no hace falta decir que cada driver va a un display de 7 segmentos)
* La salida del LM35 va al PTA1 (pata 25) del micro




Codigo:




En la seccion de variables colocan esto:
; variable/data section
;
ORG    RAMStart         ; Insert your data definition here
ExampleVar: DS.B   1
arreglado:  equ     $83
convertido: equ     $84
i:          equ     $85
tope:       equ     $86

Y esto va como codigo principal del programa:

; Insert your code here
;Entrada Analogica por PTA1            

;cabecera del programa
;*********************               
cabecera:
;declaracion puerto B coomo salida
LDA #$FF          ;cargamos $11111111=$FF
STA $03           ;lo colocamos en PTBDD para hacer PTBD de salida

;Configuracion del ADC
LDA #%10010000          ;Cargamos $90=10010000
STA ADCCFG        ;Colocamos en ADCCFG=bajo poder, clock /1,largo tiempo muestreo, resolucion 8 bits, 

LDA #$00
STA ADCSC2        

LDA     #$21        ;$21=00100001, COCO y AIEN desactivados, Activada conversion continua, Canal 1 seleccionado
STA     ADCSC1

;inicializamos variables
LDA #$00
STA arreglado
STA convertido
STA i
STA tope

;main                                
;********************* 

main:
BSR convierte                    
BSR arregla
LDA arreglado
STA $02
BSR retardo
feed_watchdog
BRA main
;*********************

;convierte
;*********************
convierte:
LDA     ADCSC1          ;Se carga el contenido de ADCSC1 para verificar COCO
CMP     #$A1            ;Comparamos con $A1=%10100001 si igual Z=1,(COCO activado, AIEN desactivado, Conversion continua activada, Canal 1), 
BNE     convierte       ;si COCO no esta activado (Z=0), regresa (Branch) a main, con COCO debe ser: 

LDA ADCRL               ;cargamos la conversion
STA convertido          ;la colocamos en el puerto B
feed_watchdog
RTS
;*********************



;arregla
;*********************
arregla:
LDA convertido
ADD #$A
STA tope 

LDA #$00
STA arreglado
STA i

for:
feed_watchdog
LDA i
CMP tope
BEQ salirfor
LDA arreglado
ADD #$01
DAA
STA arreglado
INC i
BRA for

salirfor:
RTS                      
;*********************



;comenzamos con el codigo del retardo
;*************************                   
retardo:
LDA #$A            ;cargamos FF en la mem 100 y 101
STA $100
STA $101
STA $102

retardomain:

feed_watchdog
LDA $100             ;verificamos que la 100 llegue a 0 para asi terminar el retardo
CMP #$00
BEQ regreso

DECA                ;si no es cero, decrementamos en uno a A, cargamos FF en $91 y comenzamos el bucle del subretardo
STA $100

LDA #$78             ;reinicio del anidado
STA $101

subretardo:
feed_watchdog 

LDA $101
CMP #$00
BEQ retardomain

DECA
STA $101

LDA #$78
STA $102            ;renicio del anidado


subretardo1:

LDA $102
CMP #$00
BEQ subretardo

DECA
STA $102

BRA subretardo1

regreso:
RTS            
;**********************************
;Termina el retardo            

4 comentarios:

  1. Has intentado usar el Codewarrior para programarlo en C?, es mas sencillo, por que el assembler ya no se usa por ser tan incompatible =)

    Saludos.

    Pdta: muy buena página.

    ResponderEliminar
    Respuestas
    1. Nop :P de hecho coloque estos post porque en mi facu te obligan a usar asm jeje. Para ayudarles un poco a estos pobres chavos y que no la pasen tan mal como yo, porque ni documentaci´`on existe yya!!

      Eliminar
  2. holaa
    este donde podria conseguir un bdm

    ResponderEliminar
  3. Hola, una pregunta, en tu programación como seria una forma para que en lugar de mandar 1 mandara 0

    ResponderEliminar