domingo, 17 de abril de 2011

HCS08 - Motorola Freescale - Comunicacion Serial

HCS08, SERIAL, HIPERTERMINAL
Es lo que Necesitas


En este tutorial creare comunicacion por puerto serial con la computadora

primero necesitaremos que tu pc tenga instalada hiperterminal, si es windows XP

ya la trae por default, si tienes alguna version mas reciente (Vista, 7) puedes descargarte

el programa que yo uso como hiperterminal:



Hiperterminal

Para otros SO, como linux, aun no he logrado hacer funcionar Code Warrior, asi que no tengo experiencia

sobre el tema de micros freescale en ellos.

INTRODUCCION
La Hiperterminal es un software que permite la comunicacion por medio de puertos, en este caso, el puerto serial de tu pc.

Lo que tu introduzcas por teclado se enviara por serial, y lo que tu veas en la hiperterminal es lo que recibes por el puerto serial.

Si no posees una pc con puerto serial, puedes comprar un adaptador USB-RS232 como le he hecho yo para usar mi notebook.

Necesitas:
* Conector DB-9; con cables y un poco de soldadura crearas extensiones de los pines 2, 3 y 5 -> Rx, Tx y Gnd respectivamente



* Un CI MAX232N o MAX233
* Capacitores de 1 Micro Faradio, la cantidad depende del CI MAX que elijas, checa sus datasheet para saber como conectarlos

Las conecciones son obvias, checando las datasheets de los MAX puedes averiguar como conectar los cables del puerto serial DB9 y de tu micro Motorola, para el MCS9SC08 que uso son las patas 20 y 19 Rx y Tx respectivamente.

Imagenes de conexion general para el puerto serie:
En esta Imagen se aprecia mi HCS08_OpenSourceBDM, el micro HCS08, el MAX233,
asi como mi adaptor USB-RS232

Todo mas de cerca.



Primer programa:

ENVIA LO QUE RECIBE.

Basicamente haremos que el la terminal se escriba lo que tecleamos, es decir:
Entramos nosotros a una secion de hiperterminal y escribimos algo por teclado, esto se envia al micro, y el micro regresa exactamente lo mismo:

mainLoop:
LDA    #$0
STA    SCIBDH
LDA    #$1F
STA    SCIBDL
LDA    #$0
STA    SCIC1
LDA    #$0C
STA    SCIC2
CICLO:            
LDA    SCIS1
AND    #$20     ;RDRF
BEQ    CICLO
CICLO1:            
LDA    SCIS1
AND    #$80     ;TDRE
BEQ    CICLO1

LDA    SCID
STA    SCID
BRA    CICLO

feed_watchdog
BRA    mainLoop


He aqui otro codigo que hace lo mismo:
;*******************************************************************
;* This stationery serves as the framework for a user application. *
;* For a more comprehensive program that demonstrates the more     *
;* advanced functionality of this processor, please see the        *
;* demonstration applications, located in the examples             *
;* subdirectory of the "Freescale CodeWarrior for HC08" program    *
;* directory.                                                      *
;*******************************************************************

; Include derivative-specific definitions
            INCLUDE 'derivative.inc'
;
; export symbols
;
            XDEF _Startup
            ABSENTRY _Startup

;
; variable/data section
;
            ORG    RAMStart         ; Insert your data definition here
ExampleVar: DS.B   1

;
; code section
;
            ORG    ROMStart

_Startup:
            LDHX   #RAMEnd+1        ; initialize the stack pointer
            TXS
            CLI                     ; enable interrupts

mainLoop:
            LDA    #$0
            STA    SCIBDH
            LDA    #$1F
            STA    SCIBDL
            LDA    #$0
            STA    SCIC1
            LDA    #$0C
            STA    SCIC2
CICLO:            
            LDA    SCIS1
            AND    #$20     ;RDRF
            BEQ    CICLO
CICLO1:            
            LDA    SCIS1
            AND    #$80     ;TDRE
            BEQ    CICLO1
            
            LDA    SCID
            STA    SCID
            BRA    CICLO

            feed_watchdog
            BRA    mainLoop

;**************************************************************
;* spurious - Spurious Interrupt Service Routine.             *
;*             (unwanted interrupt)                           *
;**************************************************************
spurious:                           ; placed here so that security value
            NOP                     ; does not change all the time.
            RTI

;**************************************************************
;*                 Interrupt Vectors                          *
;**************************************************************
            ORG   $FFFA

            DC.W  spurious          ;
            DC.W  spurious          ; SWI
            DC.W  _Startup          ; Reset




ESCRIBE "HOLA" 4 EVER

Screenshot de la Hyperterminal


Esquematico


Este programa escribira en la Hiperterminal "Hola" en un bucle infinito

;inicia el main
;***********************************
BSR prog_ports            ;programamos puertos
main:

BSR retardo
BSR mandaholaS

feed_watchdog
BRA main



;Subrutinas
mandaholaS:
LDHX  #$80      ;apunto a la mem $80

lleno:
feed_watchdog
LDA   SCIS1       ;cargo el Status register
AND   #$80   
BEQ   lleno       ;Si ya se envio el dato anterior TDRE=0, mando otro

LDA   ,X          ;cargo el contenido de la memoria apuntada actual
STA   SCID        ;la coloco para enviar
INCX              ;incremento el puntero
CPHX  #$86        ;si estoy apuntando a la 86 (palabra finalizada)
BNE   lleno       ;si no, mando el siguiente caracter

RTS                                  


retardo:
;******************************************************
LDHX  #$FFF
RET1        
feed_watchdog
AIX   #$01
CPHX  #$0500
BNE   RET1

RTS
;******************************************************                        

prog_ports:
;******************************************************---

;declaramos la comunicacion serial
;*************************************           
LDA    #$0
STA    SCIBDH
LDA    #$1F
STA    SCIBDL
LDA    #$0
STA    SCIC1
LDA    #$0C
STA    SCIC2
;*************************************           

;programamos el timer a 1 segundo
;*************************************
MOV   #$B,RTCMOD         ;se recetea el contador al llegar a 
MOV   #%1101,RTCSC        ;0.1 segundo
;*************************************            

;Escribimos hola en memorias consecutivas
;**************
MOV   #$48,$80      ;H
MOV   #$4F,$81      ;O
MOV   #$4C,$82      ;L
MOV   #$41,$83      ;A
MOV   #$A,$84       ;New Line
MOV   #$D,$85       ;carriage return
;***************

RTS
;******************************************************---






POR SI TIENES DUDAS DE COMO
CONECTAR:


Esquematico










Por cosas del destino parece ser que hay veces que no funciona la conexión serial
y puede deberse a la conexión del MAX233, recomiendo mejor usar el siguiente circuito:




Debido a la hoja de datos del MAX233








Bibliografía:


FIN POR AHORA

5 comentarios:

  1. OMBE COMPA TIENE ALGUN CODIGO EN C SOBRE ESTE MISMO EJEMPLO Y CON EL MISMO MC9S08E..

    ResponderEliminar
  2. ERES LA MAMADA WE, CHIDA PAGINA. NI LOS INGES TIENEN UNA ASI. GRACIAS POR LOS APORTES

    ResponderEliminar