Autor Tema: Mi primer Freescale (Escuelita)  (Leído 3607 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Mi primer Freescale (Escuelita)
« en: 18 de Junio de 2009, 13:43:13 »
Hola.
Estoy iniciando con los freescale, de hecho apenas hice mi programador, tengo mi libro todo..pero no me quiere funcionar estas lineas en le code warrior ni en el winide:

Código: [Seleccionar]
$ INCLUDE        'mc68hc908jk3.INC'

        FLASH       EQU                 $ECE0
        RESET       EQU                 $FFFE
        LED         EQU                 1
        SW          EQU                 2                   ;PORTD2
        COPD        EQU                 0
        ORG         FLASH
        INICIO      BSET                COPD,CONFIG1        ;INHABILITA COPD
                    BSET                LED,PORTB
                    BSET                LED,DDRB
                    BCLR                SW,PORTD
                    BCLR                SW,DDRD

         SALTO      BRSET               SW,PORTD,LED_ON     ;SW ABIERTO? IR LED_ON
                    BRCLR               SW,PORTD,LED_OFF    ;SW CERRADO? IR LED_OFF
                    BRA                 SALTO
         LED_ON     BSET                LED,PORTB           ;ENCENDER LED
                    BRA                 SALTO
         LED_OFF    BCLR                LED,PORTB           ;APAGA LED
                    BRA                 SALTO

                    ORG                 RESET
                    DW                  INICIO

Como ven es algo sencillo, mi primer led encendido cn un freescale..pero al darle ensamblar me sale un error en todas las lineas, como si hubiera hecho algo malo en el programa, seleccione el HC908jk3, assembler pero aún asi me sigue dando error..
Me podrían decir que hice de malo?....hasta quité el signo pesos del include..

Saludos

PD:

Luego de encontrar el error, edite el título del post, quiero postear acá lo que valla aprendiendo, por que quiero que los que vengan de PIC u otros micros no vean tan difícil aprender sobre Freescale...espero que los que tienen más experiencia en esta marca nos puedan dar una mano...cosa que agradecería enormemente.

Saludos
« Última modificación: 19 de Junio de 2009, 07:34:59 por marvicdigital »

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Que hago mal?
« Respuesta #1 en: 19 de Junio de 2009, 07:31:00 »
Bueno me auto corrijo, según puedo ver, errores en el tab fueron la causa de que no pudiera ensamblar el codigo, también vi lo que para mi es un error(espero me corrijan si me equivoco) y es en la linea en donde damos la dirección de inicio de la flash: FLASH   EQU   $ECE0  al inicio del ejemplo del libro escriben: FLASH   EQU  $EC00, esta fue la que puse, quedando así el primer programita que hago para un freescale  :-/

Código: ASM
  1. $INCLUDE        'MC68HC908JK3.inc'
  2.  
  3. FLASH   EQU     $EC00
  4. RESET   EQU     $FFFE
  5. LED     EQU     7
  6. SW      EQU     2
  7. COPD    EQU     0
  8.         ORG     FLASH
  9. INICIO:
  10.         BSET    COPD,CONFIG1
  11.         BCLR    LED,PTB
  12.         BSET    LED,DDRB
  13.         BCLR    SW,DDRD
  14.  
  15. SALTO:
  16.         BRSET   SW,PTD,LED_OFF
  17.         BRCLR   SW,PTD,LED_ON
  18.         BRA     SALTO
  19.  
  20. LED_ON:
  21.         BSET    LED,PTB
  22.         BRA     SALTO
  23.  
  24. LED_OFF:
  25.         BCLR    LED,PTB
  26.         BRA     SALTO
  27.  
  28.         ORG     RESET
  29.         DW      INICIO


Saludos

PD:

Explicaré lo que he comprendido del libro, claro que si tengo un error o me pueden ampliar un poco más de teoría, no vendría nada mal  :mrgreen:

sobre las lineas:

Código: ASM
  1. ORG     RESET
  2.         DW      INICIO

Es importante conocer el valor que tendrán los puertos cuando ocurre un reset; por eso el RESET que se usa en las anteriores lineas es forzar al microcontrolador, para que inicie en una dirección conocida y así todos los registros, los periféricos, los bits de control son también forzados a un estado conocido.
Según el libro sucede lo siguiente cuando se produce un reset:

Citar
. Todos los registros referentes a puertos se colocan en cero, en condición de entradas.
. El puntero de la pila (SP) es forzado a $00FF.
. El bit del CCR toma el valor "1" lógico, deshabilitando las interrupciones enmascarables.
. El latch de interrupciones externas es borrado.
. El latch de STOP es borrado
. El latch de WAIT es borrado.

Ahora cuando se produce un RESET:

. Cuando se aplica un "0" lógico en el pin de RESET del micro
. Cuando se energiza el micro
. Al detectarse una transición positiva sobre VDD   (esto está en el libro..que significa esta situación?)
. Cuando se desborda el Watch dog.
. Cuando se desea ejecutar una instrucción desde una dirección ilegal.

« Última modificación: 19 de Junio de 2009, 08:13:24 por marvicdigital »

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Mi primer Freescale (Escuelita)
« Respuesta #2 en: 19 de Junio de 2009, 11:00:25 »
Hola,
Citar
Explicaré lo que he comprendido del libro, claro que si tengo un error o me pueden ampliar un poco más de teoría, no vendría nada mal 

sobre las lineas:


Código
GeSHi (asm):ORG   RESET   DW   INICIO
Es importante conocer el valor que tendrán los puertos cuando ocurre un reset; por eso el RESET que se usa en las anteriores lineas es forzar al microcontrolador, para que inicie en una dirección conocida y así todos los registros, los periféricos, los bits de control son también forzados a un estado conocido.

Aca tenes un error conceptual, el motivo de las lineas anteriores no es para que se inicie en una direccion conocida, sino que se debe iniciar siempre en esa direccion. Si te fijas en el data-sheet una vez que el micro finaliza la secuencia de reset carga en el contador de programa el contenido de las direcciones FFFE-FFFF y hace un jmp incondicional a la misma. Si vos no pones codigo en esas direcciones tu programa se va a los caños.

Saludos !

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Mi primer Freescale (Escuelita)
« Respuesta #3 en: 21 de Junio de 2009, 08:29:58 »
Gracias por tu aclaración Richi777  :-/
Tengo un problema con el Carry, estoy haciendo una simple rotación de un solo bit o led hacia ambas direcciones dependiendo del estado de un SW en el PTD, este es el programa:

Código: ASM
  1. $INCLUDE        'MC68HC908JK3.inc'
  2.  
  3. FLASH   EQU     $EC00
  4. RESET   EQU     $FFFE
  5. LED     EQU     0
  6. SW      EQU     2
  7. COPD    EQU     0
  8.  
  9.         ORG     RAMSTART
  10. CANT_A  RMB     1
  11. CANT_B  RMB     1
  12. MULTI   RMB     1
  13.  
  14.         ORG     FLASH
  15. INICIO:
  16.         BSET    COPD,CONFIG1
  17.         CLR     PTB
  18.         MOV     #$FF,DDRB       ;PROGRAMAMOS PUERTO B COMO SALIDAS
  19.         CLR     DDRD
  20.         CLR     PTB
  21.         MOV     #$01,MULTI
  22.         CLC
  23.  
  24. SALTO   JSR     RET_1S          ;LLAMA A RETARDO DE 1 SEGUDNO
  25.         MOV     MULTI,PTB
  26.         BRSET   SW,PTD,ROT_IZQ
  27.         BRCLR   SW,PTD,ROT_DER
  28.         BRA     SALTO
  29.  
  30. ROT_IZQ:
  31.         ROL     MULTI
  32.         BRA     SALTO
  33.  
  34. ROT_DER:
  35.         ROR     MULTI
  36.         BRA     SALTO
  37.  
  38. RET_1S:
  39.         MOV     #200T,CANT_A
  40.         LDA     #200T
  41. REDO    NOP
  42.         NOP
  43.         DBNZA   REDO
  44.         LDA     #200T
  45.         DBNZ    CANT_A,REDO
  46.         RTS
  47.  
  48.         ORG     RESET
  49.         DW      INICIO

Según la teoría que llevo leyendo, la bandera de Carry se afecta si hay un desbordamiento o un préstamo en operaciones matemáticas, pero en rotación de registros se hace a través del carry, según entiendo si al hacer una rotación hacia la derecha(ROR) el bit 0 de multi pasaría al carry y el que estaba en carry pasa al bit 7, pero  si es así como lo entendí no me funciona, al hacer la práctica empieza la rotación hacia la izquierda, cuando el bit 0 pasa al bit 1, el bit 0 sigue en 0, hasta ahí todo normal, cuando se hace la siguiente rotación ya el bit 0 pasa a 1, como si el carry se hubiera puesto en alto por la rotación anterior, entonces me surgen las dudas, si es que hago algo mal en el programa, o simplemente entendí mal la teoría del carry.
Agradezco mucho la explicación que me puedan brindar.

Saludos

PD: si empiezo hacer la rotación hacia la derecha no pasa lo mismo, de hecho el Carry siempre estará en 0 ya que al llegar el 1 al bit 0 y este pasa al carry, ahí muere todo, no vuelve a rotar ese uno...ahora si me confundí..hay algo que me hace falta?
« Última modificación: 21 de Junio de 2009, 08:40:10 por marvicdigital »