Haz una pregunta
  Foros de Electrónica » Diseño digital » Interfaces y Programación
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

18/03/2012 #1


Problema Bootloader y ASM
Buenas, soy nuevo en ASSEMBLER, necesito su ayuda, he estado todo el día (sin exagerar), tratando de hacer correr el sgte codigo en mi PIC 16F873A, que enciende y apaga un LED:

Código:
;**********************************************************
; Processor: PIC16F873 at 20 MHz
; Function: Flash a LED connected to RA0
; Hardware: Testboard K3a
; Filename: 873flash.asm
; Author: Lars Petersen, oz1bxm@pobox.com
; Credit: Tony Nixon's LED flasher
;**********************************************************

        LIST P=16F873A, R=DEC    ; Use the PIC16F873 and decimal system

        #include "P16F873A.INC"  ; Include header file

        __config  _CP_OFF & _HS_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_ON

        CBLOCK 0x20             ; Declare variable addresses
          Loop1,Loop2
        ENDC
;
; -----------
; INITIALIZE
; -----------
;
        ORG    0x000          ; Program starts at 0x000
;
        CLRF   PORTA           ; Initialize port A
        CLRF   PORTB           ; Initialize port B
        CLRF   PORTC           ; Initialize port C
;
        BSF    STATUS,RP0      ; RAM bank 1
;
        CLRF   TRISA           ; All pins port A output
        CLRF   TRISB           ; All pins port B output
        CLRF   TRISC           ; All pins port C output
;
; ------------------------
; FUNCTION OF PORT A PINS
; ------------------------
;
        MOVLW    6
        MOVWF    ADCON1        ; All pins digital I/O
;
        BCF      STATUS,RP0    ; RAM bank 0
;
; ----------
; MAIN LOOP
; ----------
;
Main    BSF     PORTA,0        ; Turn on LED connected to RA0
        CALL    delay
        BCF     PORTA,0        ; Turn off LED connected to RA0
        CALL    delay
        GOTO    Main
;
; ---------------
; DELAY 250 MSEC
; ---------------
;
delay   MOVLW   250
        MOVWF   Loop1
Outer   MOVLW   250
        MOVWF   Loop2
Inner   NOP
        NOP
        DECFSZ  Loop2,F
        GOTO    Inner          ; Inner loop = 5 usec.
        DECFSZ  Loop1,F
        GOTO    Outer
        RETURN

        END 

;**********************************************************
Cuento corto, cuando programo el codigo con un programador externo, el codigo funciona bien, pero si le cargo el bootloader al PIC, y luego programo vía bootloader , el programa no anda, ni siquiera se prende el LED. El bootloader esta bueno, ya que he hecho andar muchos otros programas en C. ¿cual podría ser el problema? Gracias por su ayuda.
19/03/2012 #2


fijate esto: ORG 0x000 ; Program starts at 0x000

si cargaste el bootloader el programa deberia iniciar al final del bootloader.
Si el bootloader esta cargado en la posicion 0X000 (seguramente) el programa tuyo va a ir devuelta al bootloader y se hace un circulo entre el ORG 0x000 y el bootloader.

Fijate los otros programas que cargaste y anduvieron en que posicion de memoria arrancan y ponele esa.
Si queres pasa el codigo del bootloader y vemos que posicion es.
Cualquier cosa avisa!
Muchas suerte, saludos!
19/03/2012 #3


Hola, estoy usando el bootloader de microchip. En el lenguaje C se usa esta sentencia:

Código:
#ORG 0x0F00,0x0FFF {}
¿Cual sería el equivalente en assembler?

23/03/2012 #4


http://www.microchipc.com/PIC16bootl...loader_FAQ.php

Directiva ORG
Esta directiva dice al ensamblador a partir de que posición de memoria de programa se situarán las siguientes instrucciones. Rutinas de comienzo, subrutinas de interrupción y otros programas deben comenzar en locaciones de memoria fijados por la estructura del microcontrolador. Recordemos que el 16F84 sólo tiene 1024 posiciones de memoria flash para código.
La directiva ORG hace al compilador colocar el código que le sigue en una nueva dirección de memoria (la salida del compilador no solo coloca los códigos de operación sino también las direcciones de cada instrucción del programa). Usualmente se la utiliza para: reset, programas de servicios de interrupción, programa principal, subrutinas.
Ejemplos:
1) Inicia el programa en la posición cero:
ORG 0x00

En resumen, proba con cambiar en tu codigo el
ORG 0x000 ; Program starts at 0x000
por esto->
ORG 0xF00 ; Program starts at 0xF00

Tambien fijate si en el mplab podes setear la posicion en la que queres que se te escriba tu codigo y si te pasas de esta que te avise.

Despues comentame como te fue
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Interfaces y Programación

Lenguajes de programación, gestión y manejo de puertos

Cerrar
Foros de Electrónica » Diseño digital » Interfaces y Programación

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.