contador de programa PIC12F1822 saltando durante la programación de debug y release

4

Estoy teniendo los problemas más terribles para poner las cosas en marcha con mi PIC12F1822.

Estoy usando MPLAB 8.86, un ICD3 y tengo el chip, en un paquete DIP configurado en una placa de pruebas en mi escritorio. Por lo que puedo ver, todas las conexiones son confiables y están bien. Las cosas funcionaron bien hasta ayer por la noche y no me he movido / tocado nada.

El esquema se ve así:

Antesdeescribircualquiercódigoquehagaunaentradaenfuncióndelosconmutadoresuobtengadatosdelaserie,soloquierogiraralgunosLEDparaquesepaquetodoestáfuncionando.

Aquíestámicódigo:

listp=12F1822;listdirectivetodefineprocessor#include<p12F1822.inc>;processorspecificvariabledefinitions__CONFIG_CONFIG1,_FOSC_INTOSC&_WDTE_OFF&_PWRTE_OFF&_MCLRE_ON&_CP_OFF&_CPD_OFF&_BOREN_OFF&_CLKOUTEN_OFF&_IESO_OFF&_FCMEN_OFF__CONFIG_CONFIG2,_WRT_OFF&_PLLEN_OFF&_STVREN_OFF&_BORV_19&_LVP_OFF#DEFINELED1PORTA,.2;StatusLEDconnectedtoPortAbit1D1EQU0x7D;tempregister,usedduringdelayD2EQU0x7E;tempregister,usedduringdelayD3EQU0x7FORG0x0000;processorresetvectorGOTOSTART;----------------------------------------------------------------------------;;DELAYROUTINE,FORCESTHEPICTOWASTETIMEFOR0.1SecondsAT16MHz;DELAYMOVLW0X35MOVWFD1MOVLW0XE0MOVWFD2MOVLW0X01MOVWFD3DELAY_0DECFSZD1,FGOTO$+2DECFSZD2,FGOTO$+2DECFSZD3,FGOTODELAY_0;4CYCLESGOTO$+1GOTO$+1;4CYCLES(INCLUDINGCALL)RETURN;------------------------------------------START;DEVICECONFIGSTUFFBANKSELTRISAMOVLWB'00000000';EVERYTHINGELSEISOUTPUTMOVWFTRISABANKSELOSCCONMOVLWB'01111010';PLLDISABLED,16MHZCLOCKSPEED,INTERNALCLOCKMOVWFOSCCONBANKSELANSELACLRFANSELA;ALLPINSASDIGITALBANKSELADCON1MOVLWB'00001111'MOVWFADCON1;ALSOTURNSOFFANALOGTHINGSBANKSELCM1CON0CLRFCM1CON0;ALLCOMPARATORSOFFBANKSELPORTACLRFPORTA;CLEAREVERYTHINGONPORTABEFOREWESTART,EXITWITHBANK0SELECTEDLOOP;BLINKTHATLEDLIKEYOURLIFEDEPENDEDONITBCFLED1CALLDELAYBSFLED1CALLDELAYGOTOLOOPEND

Nadademasiadoemocionante.

Cuandohagoestoyluegoloprogramoenmododeliberación,solotengounLEDatascado.

Cuandohagoestoenmododedepuraciónyluegotratodepasarporeldepurador/ICD3/MPLAB,nopuedohacerqueelcódigoseejecutedemaneraconfiable.

Específicamente,elcontadordelprogramapareceestarsaltandoportodoslados.

Amientender,cuandoreinicielaMCUconelbotónamarilloenMPLAB,elprogramadeberíairalapartesuperioryluegoesperaraqueseejecuteoavance,comoesto:

La ubicación de la PC se indica con la flecha verde, ¡la mía sigue apareciendo en lugares que no son el comienzo! Se muestra en todo tipo de lugares, por ejemplo.

Estohacequeladepuraciónseaundolor,y-indicaquealgoestárealmentemal.

Notengoideadequé.¿Alguienmássehaencontradoconalgocomoesto?

Tampocoestálimitadoaestefragmentodecódigo.En [Este Ejemplo] después de reiniciar, la PC salta a BANKSEL OSCCON (línea 138) y cuando parece que se está ejecutando atascarse dentro de AUXHELLOWORLD (es decir, el LED sigue parpadeando para siempre).

Cualquier idea que puedas tener sería muy apreciada Mejor D

    
pregunta mynameisdev

3 respuestas

3

Usé una plantilla de ensamblaje que se encuentra aquí de Bill Howl en este sitio web y envolvió su retraso rutina a su alrededor.

Presté especial atención al ejemplo de rutina de inicialización de puerto que se encuentra en la hoja de datos del microchip pág. 124 Ejemplo 12-1 Inicialización del puerto A. ¡El PORTA DE BANKSEL justo antes de que comience la rutina de demora y el cambio de puerto es crucial! No parece tener el problema que está experimentando con el contador del programa. Simulado durante 806 segundos ... Y sin problemas. A veces es útil limpiar el código del proyecto haciendo clic en proyecto, limpiar.

Prueba este código fuente

Su segundo fragmento de código está causando errores de desbordamiento de pila
CORE-E0001: Se produjo un error en la pila sobre el flujo de instrucciones en 0x000037
CORE-E0001: Se produjo un error en la pila sobre el flujo de instrucciones en 0x000037
CORE-E0001: Se produjo un error en la pila sobre el flujo de instrucciones en 0x000037
CORE-E0001: Se produjo un error de pila sobre el flujo de instrucciones en 0x000038

Esto se debe a que falta la declaración de devolución en el bloque AUXHELLOWORLD.
Cuando se inicia el código, causaría un bucle infinito sin fin de estas dos llamadas (inicializar y auxhelloworld) cada vez que se agrega a la pila y nunca vuelve a aparecer. Eventualmente, la pila se abrumará y perderá la pista de dónde se supone que debe regresar, lo que provocará un comportamiento extraño en el código y el contador del programa saltará.

    START
    INICIACIÓN DE LLAMADAS
    LLAME A AUXHELLOWORLD

Prueba la plantilla! Realmente deberías aprender el código c y descargar el microchip o el compilador Hitech c. Hará su vida mucho más fácil ... ¡No volverá a reunirse!
Además, también puede incorporar el ensamblado en código c, si realmente necesita el código especializado.

    
respondido por el Peter H
1

Pude compilar y simular este código sin problemas en MPLAB v8.84, sin salto de contador de programas, tanto en el modo de depuración como en el de versión. Puedo ver el puerto Un poco alternando con el simulador MPLAB.

¿Intentaste alternar LATA en lugar de PORTA?

¿Especificó MPASM para compilar código absoluto?

    
respondido por el Adam Lawrence
1

Este programa para el 12F1822 que también enciende un LED conectado a RA2 funciona bien en una PCB mía:

;flasher.asm
;simple program for PIC12F1822 to flash LED on RA2 (pin 5)

    list      p=12f1822 ;list directive to define processor
    #include "p12f1822.inc" ;processor specific variable definitions

    errorlevel -302


   __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _BOREN_OFF
   __CONFIG _CONFIG2, _LVP_OFF & _PLLEN_ON

;-----------------------------------------------------------------
;defines
;-----------------------------------------------------------------

    #define LED LATA2   ; (pin 5)


;-----------------------------------------------------------------
;variables
;-----------------------------------------------------------------
    cblock      0x70        ;same bank as LATA
    Counter1
    Counter2
    endc

;------------------------------------------------------------------
;initialisation
;------------------------------------------------------------------

    org 0

    banksel OSCCON
    movlw   b'01110000'     ;HFINTOSC (32 MHz with PLL enabled)
    movwf   OSCCON
    banksel OSCSTAT
    btfss   OSCSTAT,HFIOFR  ;HFINTOSC ready?
    goto    $-1
    btfss   OSCSTAT,PLLR    ;PLL ready?
    goto    $-1
    banksel TRISA           
    bcf     TRISA,LED       ;LED output
    banksel LATA

;-----------------------------------------------------------------------
;main program loop
;-----------------------------------------------------------------------

loop:
    bsf     LATA,LED    ;LED off
    call    dly
    bcf     LATA,LED    ;LED on
    call    dly
    goto    loop

dly:
    movlw   0xFF
    movwf   Counter1
dly1:
    movlw   0xFF
    movwf   Counter2
dly2:
    decfsz  Counter2,F
    goto    dly2
    decfsz  Counter1,F
    goto    dly1
    return  

    end
    
respondido por el Leon Heller

Lea otras preguntas en las etiquetas