TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: 20030229 en 27 de Septiembre de 2023, 19:44:00

Título: Ayuda con decodificador
Publicado por: 20030229 en 27 de Septiembre de 2023, 19:44:00
Estoy realizando un decodificador en mplab con el microcontrolador PIC16F628A pero al momento de cargar el código en proteus me empieza a salir el mismo error una y otra vez "[PIC16 CORE] PC=0x07F3. Stack overflow executing CALL instruction. [U1]" ya cheque y al modificar algunas partes del código se ponen números al azar pero no decodifica del 0 al 9 como debería adjunto el código que elaboré:

PROCESSOR 16F628A ;Declarar pic que se ocupara
#include   <xc.inc> ;Declarar librerias
 
; CONFIG
  CONFIG  FOSC = INTOSCIO     ; Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
  CONFIG  WDTE = OFF            ; Watchdog Timer Enable bit (WDT disabled)
  CONFIG  PWRTE = OFF           ; Power-up Timer Enable bit (PWRT disabled)
  CONFIG  MCLRE = ON           ; RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
  CONFIG  BOREN = OFF           ; Brown-out Detect Enable bit (BOD disabled)
  CONFIG  LVP = OFF             ; Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
  CONFIG  CPD = OFF             ; Data EE Memory Code Protection bit (Data memory code protection off)
  CONFIG  CP = OFF
 
PSECT udata_bank0
  W_TEMP: DS 0
   ; 1 byte=8bites
PSECT CODIGO, class = CODE, delta=2

Inicio:
    CLRF PORTA
    MOVLW 07H; 00001111
    MOVWF CMCON ; Habilitar entradas y salidas (input's,Output's) digitales
   
    BSF   STATUS,05H; 00100000B
    BCF   STATUS,06H; mover al banco 1
   
    MOVLW 00001111B
    MOVWF TRISA   
   
    CLRF  TRISB
   
    BCF STATUS,05H
    CLRF PORTB
   
     
PRINCIPAL:
   MOVF PORTA,0
   ANDLW 0FH
   
   MOVWF W_TEMP
   MOVLW 0AH
   SUBWF W_TEMP,0
   
   BTFSS CARRY
   GOTO $+03H
   
   MOVLW 09H
   MOVWF W_TEMP
   MOVF W_TEMP,0
   
   CALL TABLA
   MOVWF PORTB
   GOTO PRINCIPAL
   
TABLA:
    ADDWF PCL,1
    RETLW 00111111B;0
    RETLW 00000110B;1
    RETLW 01011011B;2
    RETLW 01001111B;3
    RETLW 01100110B;4
    RETLW 01101101B;5
    RETLW 01111101B;6
    RETLW 00000111B;7
    RETLW 01111111B;8
    RETLW 01100111B;9
END

El esquemático del proyecto sería el siguiente, donde se decodifican los bits en el display gracias a un dip switch
  - Tienes que ingresar para ver archivos adjuntos -  
Título: Re:Ayuda con decodificador
Publicado por: DominusDRR en 27 de Septiembre de 2023, 21:57:53
Estoy realizando un decodificador en mplab con el microcontrolador PIC16F628A pero al momento de cargar el código en proteus me empieza a salir el mismo error una y otra vez "[PIC16 CORE] PC=0x07F3. Stack overflow executing CALL instruction. [U1]" ya cheque y al modificar algunas partes del código se ponen números al azar pero no decodifica del 0 al 9 como debería adjunto el código que elaboré:

PROCESSOR 16F628A ;Declarar pic que se ocupará
#include   <xc.inc> ;Declarar librerias
 
; CONFIG
  CONFIG  FOSC = INTOSCIO     ; Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
  CONFIG  WDTE = OFF            ; Watchdog Timer Enable bit (WDT disabled)
  CONFIG  PWRTE = OFF           ; Power-up Timer Enable bit (PWRT disabled)
  CONFIG  MCLRE = ON           ; RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
  CONFIG  BOREN = OFF           ; Brown-out Detect Enable bit (BOD disabled)
  CONFIG  LVP = OFF             ; Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
  CONFIG  CPD = OFF             ; Data EE Memory Code Protection bit (Data memory code protection off)
  CONFIG  CP = OFF
 
PSECT udata_bank0
  W_TEMP: DS 1 ; 1 byte=8bites
PSECT CODIGO, class = CODE, delta=2

Inicio:
    MOVLW 07H; 00000111
    MOVWF CMCON ; Habilitar entradas y salidas (input's,Output's) digitales
    BSF   STATUS,05H; 00100000B
    BCF   STATUS,06H; mover al banco 1
    CLRF  TRISA
    MOVLW 01110111B
    MOVWF TRISA   
    BSF   TRISB,02H;Colocar como entrada el bit A2  DEL PUERTO A
    CLRF  TRISB
    BCF   STATUS,05H; Regresar al banco 0
    CLRF PORTB
    CLRF PORTA
   
     
PRINCIPAL:
   MOVF PORTA,1 ;0 es banco w mientras 1 es f
   ANDLW 0FH
   
   MOVWF W_TEMP
   MOVLW 0AH
   SUBWF W_TEMP,0
   
   BTFSS CARRY
   GOTO $+03H
   
   MOVLW 09H
   MOVWF W_TEMP
   MOVF W_TEMP,0
   
   CALL TABLA
   MOVWF PORTB
   GOTO PRINCIPAL
   
TABLA:
    ADDWF PCL,1
    RETLW 00111111B;0
    RETLW 00000110B;1
    RETLW 01011011B;2
    RETLW 01001111B;3
    RETLW 01100110B;4
    RETLW 01101101B;5
    RETLW 01111101B;6
    RETLW 00000111B;7
    RETLW 01111111B;8
    RETLW 01100111B;9
END

Creo que también deberías compartir el esquemático de tu proyecto.
Título: Re:Ayuda con decodificador
Publicado por: 20030229 en 27 de Septiembre de 2023, 23:25:55


Sería ese, se supone es un decodificador de 4 bits desde A0 hasta A3 y tiene que mostrar los numeros en el display de 7 segmentos  - Tienes que ingresar para ver archivos adjuntos -  
Título: Re:Ayuda con decodificador
Publicado por: DominusDRR en 27 de Septiembre de 2023, 23:51:59
A parte que tu código está raro, hay cosas que no tienen sentido como esta:

Código: ASM
  1. BSF   TRISB,02H;Colocar como entrada el bit A2  DEL PUERTO A

AHí hay una confusión entre el puerto B, pero el comentario habla del A. No está claro.

No recuerdo mucho de ensamblador, pero lo que tienes que hacer es simplemente tomar el valor del puerto A, ingresarlo a la tabla y lo que te retorna, ponerlo en el puerto B, no entiendo todo lo demás:

Algo así aproximadamente:

Código: ASM
  1. PRINCIPAL:
  2.    
  3.    MOVF PORTA,W; Muevo el contenido de port A a W
  4.    ANDWF 0x0F;    Enmascaro los 4 bits bajos de port A
  5.      
  6.    CALL TABLA;      W va hacia tabla y retorna con un nuevo valor
  7.    MOVWF PORTB;  W con el nuevo valor, se lo transfiere a Port B
  8.    GOTO PRINCIPAL; repito el proceso


Ahora bien, esto funciona mientras con el dipswitch ingreses hasta un número igual a 9 (1001b), para otros números mayores, la tabla no tiene que devolverte y no recuerdo que pasa cuando haces eso.

Deberías crear las opciones para que el display represente A, B, C, D, E y F, o por código que no haga nada ante ese escenario.

También no se puede apreciar si ese display es de ánodo común o de cátodo común (que es lo correcto).

Eduardo2.0 es más experto en esto, tal vez el encuentre algo más, o una sugerencia más acertada.




Título: Re:Ayuda con decodificador
Publicado por: 20030229 en 28 de Septiembre de 2023, 00:09:03
Una disculpa había colocado mal las instrucciones del inicio pero aún así con las nuevas no funciona, algo que noté es que si cambio el valor de pcl de 1 a 0 se enciende todo el display de catodo comun pero no cambia su valor se queda todo encendido
Título: Re:Ayuda con decodificador
Publicado por: tsu_electronica en 28 de Septiembre de 2023, 01:50:54
hola si estas leyendo el puertoA completo y tienes el mclr solo recuerda que ese bit siempre estará en 1, entonces si todos los pines son 0 no vas a  leer 0 vas a leer 32 y no va a saltar a ningún lado en la table hay dos maneras de corregir una es poniendo mclr en modo bit como entrada para que lea como 0 el bit o restándole 32 en tu programa.
Título: Re:Ayuda con decodificador
Publicado por: 20030229 en 28 de Septiembre de 2023, 02:42:42
hola si estas leyendo el puertoA completo y tienes el mclr solo recuerda que ese bit siempre estará en 1, entonces si todos los pines son 0 no vas a  leer 0 vas a leer 32 y no va a saltar a ningún lado en la table hay dos maneras de corregir una es poniendo mclr en modo bit como entrada para que lea como 0 el bit o restándole 32 en tu programa.

Hola, le tendría que mover algo más a esta parte del código?
; CONFIG
  CONFIG  FOSC = INTOSCIO     ; Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
  CONFIG  WDTE = OFF            ; Watchdog Timer Enable bit (WDT disabled)
  CONFIG  PWRTE = OFF           ; Power-up Timer Enable bit (PWRT disabled)
  CONFIG  MCLRE = OFF           ; RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
  CONFIG  BOREN = OFF           ; Brown-out Detect Enable bit (BOD disabled)
  CONFIG  LVP = OFF             ; Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
  CONFIG  CPD = OFF             ; Data EE Memory Code Protection bit (Data memory code protection off)
  CONFIG  CP = OFF
 
PSECT udata_bank0
  W_TEMP: DS 1
   ; 1 byte=8bites
PSECT CODIGO, class = CODE, delta=2

Inicio:
    CLRF PORTA
    MOVLW 07H; 00001111
    MOVWF CMCON ; Habilitar entradas y salidas (input's,Output's) digitales
   
    BSF   STATUS,05H; 00100000B
    BCF   STATUS,06H; mover al banco 1
   
    MOVLW 00001111B
    MOVWF TRISA   
   
    CLRF  TRISB
   
    BCF STATUS,05H
    CLRF PORTB

Es que aún así no me decodifica los bits se queda apagado el display de cátodo común.
  - Tienes que ingresar para ver archivos adjuntos -  
Título: Re:Ayuda con decodificador
Publicado por: tsu_electronica en 28 de Septiembre de 2023, 03:00:58
lo acabo de hacer pero no es para pic as si no para mpasm te los adjunto y los checas en proteus yo ya los cheque y trabaja bien
Título: Re:Ayuda con decodificador
Publicado por: 20030229 en 28 de Septiembre de 2023, 03:15:57
lo acabo de hacer pero no es para pic as si no para mpasm te los adjunto y los checas en proteus yo ya los cheque y trabaja bien

Los acabo de checar y funcionan a la perfección muchas gracias, ahora toca analizarlo, es que soy nuevo en esto de los pics jaja
Título: Re:Ayuda con decodificador
Publicado por: tsu_electronica en 28 de Septiembre de 2023, 04:01:02
perfecto cualquier cosa aquí andamos
Título: Re:Ayuda con decodificador
Publicado por: 20030229 en 28 de Septiembre de 2023, 15:27:26
perfecto cualquier cosa aquí andamos

Hola, hay alguna forma de que se pueda pasar la programación a pic as? O faltaría agregarle más valores? Todavía no entiendo bien sobre mplab
Título: Re:Ayuda con decodificador
Publicado por: tsu_electronica en 28 de Septiembre de 2023, 16:30:11
como tal no hay manera ya que cambian muchas cosas, aunque las dos sean ensamblador pic-as si es diferente, lo que se puede hacer ya que la lógica es la misma que hasta el amigo domius ya te compartió de hecho, así como está la estructura a grandes rasgos es definir que micro vas a usar, definir su configuración que es la frecuencia del reloj y si quieres el mcrl o no después declarar las salidas y entradas y al final solo leer y mostrar el valor solo que aquí si tienes que hacerlo completo bueno más bien desde cero
Título: Re:Ayuda con decodificador
Publicado por: Eduardo2 en 28 de Septiembre de 2023, 21:24:57
Estoy realizando un decodificador en mplab con el microcontrolador PIC16F628A pero al momento de cargar el código en proteus me empieza a salir el mismo error una y otra vez "[PIC16 CORE] PC=0x07F3. Stack overflow executing CALL instruction. [U1]" ya cheque y al modificar algunas partes del código se ponen números al azar pero no decodifica del 0 al 9 como debería adjunto el código que elaboré:
.....

Hay dos problemas:

- El principal es que como la tabla está en direcciones altas de la flash se debe cargar el byte superior en PCLATH , pues cuando se hace ADDWF PCL,1  se salta a  PCLATH+PCL.  Y como PCLATH está en 0...
Con otros pics se usa la directiva PAGESEL label  para cargar PCLATH con el valor apropiado, pero algunos pics como el 16F628A no funciona! No hace nada y ni siquiera dá error :(
En su lugar debés escribir a pata lo que PAGESEL generaba:
Código: [Seleccionar]
    movlw HIGH TABLA    ; carga el byte superior en PCLATH
    movwf PCLATH        ;

- Otro es el inicio del programa. En pic-as se deben declarar los bloques de memoria con PSECT y por defecto, en el linkeo te agrupa los bloques en la parte alta de la memoria. En tu caso iba todo por encima de la dirección 0x07C0.

El problema es que cuando inicia el pic lo hace en la dirección 0x0000  y ahí no tenés código !!!
Como normalmente esa zona vacía son puros ceros, y justo es el  opcode de NOP , el programa arrancará de 0x0000 y ejecutará NOPs hasta llegar a la parte donde está el código y funcionará, salvo que antes se encuentre con una tabla o subprogramas --> desastre.

Normalmente en 0x0000 se escribe un pequeño bloque con un GOTO al comienzo del programa principal, pero este bloque debe declararse como absoluto  porque si no te lo patea al fondo.
Código: [Seleccionar]
PSECT resetVec, class = CODE, delta=2, abs
resetVec:
    GOTO Inicio


Como ejemplo modifiqué un poco tu programa según mis gustos personales :), aunque básicamente es lo mismo.
Código: [Seleccionar]
PROCESSOR 16F628A
#include   <xc.inc>
 
; CONFIG
    CONFIG  FOSC  = INTOSCIO    ; Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
    CONFIG  WDTE  = OFF         ; Watchdog Timer Enable bit (WDT disabled)
    CONFIG  PWRTE = OFF         ; Power-up Timer Enable bit (PWRT disabled)
    CONFIG  MCLRE = ON          ; RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
    CONFIG  BOREN = OFF         ; Brown-out Detect Enable bit (BOD disabled)
    CONFIG  LVP = OFF           ; Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
    CONFIG  CPD = OFF           ; Data EE Memory Code Protection bit (Data memory code protection off)
    CONFIG  CP  = OFF
 
PSECT udata_bank0

PSECT resetVec, class = CODE, delta=2, abs
resetVec:
    GOTO Inicio

PSECT CODIGO, class = CODE, delta=2
Inicio: 
    BANKSEL PORTA
    CLRF PORTA   
    CLRF PORTB       
    MOVLW 07H       ; 00001111
    MOVWF CMCON     ; Habilitar entradas y salidas (input's,Output's) digitales
   
    BANKSEL TRISA
    MOVLW 00001111B
    MOVWF TRISA     
    CLRF  TRISB
   
    BANKSEL PORTA
    movlw HIGH TABLA
    movwf PCLATH 
     
PRINCIPAL:
   MOVF PORTA,W
   ANDLW 0FH   
   CALL TABLA
   MOVWF PORTB
   GOTO PRINCIPAL
   
TABLA:
    ADDWF PCL,1
    RETLW 00111111B     ; 0
    RETLW 00000110B     ; 1
    RETLW 01011011B     ; 2
    RETLW 01001111B     ; 3
    RETLW 01100110B     ; 4
    RETLW 01101101B     ; 5
    RETLW 01111101B     ; 6
    RETLW 00000111B     ; 7
    RETLW 01111111B     ; 8
    RETLW 01100111B     ; 9
    RETLW 00000000B     ; A
    RETLW 00000000B     ; B
    RETLW 00000000B     ; C
    RETLW 00000000B     ; D
    RETLW 00000000B     ; E
    RETLW 00000000B     ; F

    END resetVec

Hay una nota de aplicación de Microchip (AN556 Implementing a Table Read) que comenta esto.

¿Parece engorroso?  Lo es...   La gente de Microchip en lugar de mejorar el MPASM hicieron algo diferente y peor.