Autor Tema: Errores y alertas en programa simulación con PIC16F877.  (Leído 6379 veces)

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

Desconectado Tidoneo

  • PIC10
  • *
  • Mensajes: 6
Errores y alertas en programa simulación con PIC16F877.
« en: 12 de Julio de 2023, 18:46:29 »
Buenas tardes, colegas, recién entro en el mundo de la programación de PIC's, quería solicitar consejos o apoyo para saber dónde me estoy equivocando. Estoy usando un PIC16F877 y Microcode studio, les comparto dos imágenes, una del código en cuestión y la otra es los errores de compilación, pienso que puede ser sintaxis respecto a cómo diga en la hoja de datos del pic pero no he tenido resultados, muchas gracias y saludos.


Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:Errores y alertas en programa simulación con PIC16F877.
« Respuesta #1 en: 12 de Julio de 2023, 19:11:54 »
Podrías compartir el código completo?

No logro ver los errores que muestra el compilador.
Recuerda que Microcode es el IDE para PicBasic y eso es solo un fragmento usando ensamblador.

elreypic.

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Errores y alertas en programa simulación con PIC16F877.
« Respuesta #2 en: 12 de Julio de 2023, 19:18:51 »
Ademas de lo que dice elreypic2 :

- Subí el código, no la imagen.
- Si igual subís la imagen, que no sea con tan poca resolución porque no se ve nada (la primera)
- El código, además de incompleto, es para un micro de la familia 8051.

Desconectado Tidoneo

  • PIC10
  • *
  • Mensajes: 6
Re:Errores y alertas en programa simulación con PIC16F877.
« Respuesta #3 en: 12 de Julio de 2023, 19:46:25 »
Gracias por las respuestas, aún no he terminado de documentar el proyecto. La parte que me genera error es dónde mando a llamar una parte de Código en lenguaje ensamblador, ASM-ENDASM y adjunto en mejor calidad los errores de compilación. agradezco su asesoria

Código: [Seleccionar]

    @ DEVICE PIC16F877 , protect_on

'  ***************      Puerto A   ***************

    'TRISA.0 = 1      ' VELOCIDAD REF
    'TRISA.1 = 1      ' LARGO REF
    TRISA.2 = 0       ' INICIO
    'TRISA.3 = 1      ' ANALOGO
    TRISA.4 = 0       ' ARRANQUE
    TRISA.5 = 0       ' DISCO

'  ***************      Puerto B   ***************

    TRISB.0 = 1       ' DENTRO
    TRISB.1 = 1       ' Manual / Automatico
    TRISB.2 = 1       ' ARRNQUE MAN
    TRISB.3 = 1       ' PARO
    TRISB.4 = 1       ' ARRANQUE AUTO
    TRISB.5 = 1       ' PE
    TRISB.6 = 0       ' DISCOS
    TRISB.7 = 0       ' PRINCIPAL

'  ***************      Puerto C   ***************

    TRISC.0 = 1       '
    TRISC.1 = 0       '
    TRISC.2 = 0       '
    TRISC.3 = 1       '
    TRISC.4 = 1       '
    TRISC.5 = 1       '     
    TRISC.6 = 1       '
    TRISC.7 = 1       '

'  ***************      Puerto D   ***************

    TRISD.0 = 0       '
    TRISD.1 = 0       '
    TRISD.2 = 0       '
    TRISD.3 = 0       '
    TRISD.4 = 1       '
    TRISD.5 = 1       '   
    TRISD.6 = 1       '
    TRISD.7 = 1       '

'  ***************      Puerto E   ***************

    TRISE.0 = 0       ' LED FASE
    TRISE.1 = 1       '   
    TRISE.2 = 0       ' OK INICIO

'  *****************************************************   

'                Definicion de Variables


    S_EnvoOk        VAR PORTA.2
    S_ArrBA         VAR PORTA.4
    S_NeuDisc       VAR PORTA.5

    E_ESR           VAR PORTB.5
    S_Run_Inv_Disc  VAR PORTB.6
    S_Run_Inv_Main  VAR PORTB.7
    E_FPapel        VAR PORTC.3
    E_FMordaza      VAR PORTC.4
    S_LedFMordaza  VAR PORTD.0
    S_LedAde       VAR PORTD.1
    S_LedAtras     VAR PORTD.2
    S_LedFPapel    VAR PORTD.3
    S_LedFase       VAR PORTE.0
    S_LedPicOk      VAR PORTE.2


 
    E_PB_Inicio       VAR   Bit
    E_Inv_Main_Ok     VAR   Bit
    E_Sel_Man_Auto    VAR   Bit
    E_PB_Jog          VAR   Bit
    E_Inv_Disc_Ok     VAR   Bit
    E_Enable_Inicio   VAR   Bit
    E_SelCtrlReg      VAR   Bit
    E_PB_Arranque     VAR   Bit
    E_PB_Paro         VAR   Bit
    E_PPM             VAR   Byte
    E_Largo           VAR   Byte
    E_FC_Inicio       VAR   Bit
    E_FC_MaxVel       VAR   Bit
    E_FC_IncVel       VAR   Bit
    E_FC_DecVel       VAR   Bit
    E_FC_MinVel       VAR   Bit
    Set_Largo         VAR   Word
    Run               VAR   Bit
    Acc               VAR   Bit
    DAcc              VAR   Bit
    TimeAcc           VAR   Byte
    S_Ref_PPM         VAR   Word
    S_Ref_Largo       VAR   Word
    AccPPM            VAR   Word
    DAccPPM           VAR   Word
    BitDAccPPM        VAR   DAccPPM.15
    Gain              VAR   Byte
    GainP             VAR   Word
    Bandera1          VAR   Bit
    BJog              VAR   Bit
    BanES             VAR   Byte    'Paro de Emergencia
    VerError          VAR   Byte
    Base              VAR   Word
    B                 VAR   Word
    Err1              VAR   Word
    Err2              VAR   Word
    Error             VAR   Word
    GP                VAR   Word
    Pol               VAR   Bit
    FacGP             VAR   Word
    BanJog            VAR   Bit   
    BanInicio         VAR   Bit
    BanInicio_Mor     VAR   Bit
    BanInicio_Pap     VAR   Bit
    BanRampa          VAR   Bit
    BanIni            VAR   Bit
    BanIntLk          VAR   Bit
    BanSReg           VAR   Bit
    Entry_PPM         VAR   Byte
    BanParo           VAR   Bit
    RunBA             VAR   Bit
    BanArrBA          VAR   Byte
    AuxFMordaza       VAR   Bit
    BanAlim           VAR   Bit
   

'*********  TEST  ***************

'    update     VAR  Bit

'********************************


 ADCON1 = 4              ' Define Entradas Analogas PortA 0, 1, 3
 T2CON = %00000100       ' Timer 2 Encendido y Prescala = 1
 CCP1CON = %00001100     ' Define El Puerto C.1 como modo PWM
 CCP2CON = %00001100     ' Define El Puerto C.2 como modo PWM

 OPTION_REG = $d1        '

 CLEAR
 Low S_ArrBA 
 Low S_NeuDisc
 Entry_PPM = 0
 BanIntLk = 0
 Low S_NeuDisc
 Low S_ArrBA 
 BanIni = 0
 BanInicio = 0
 BanInicio_Mor = 0
 BanInicio_Pap = 0
 BanRampa = 0
 BJog = 0
 BanIni = 0
 BanSReg = 0
 RunBA = 0
 BanArrBA = 0
 AuxFMordaza = 0
 BanAlim = 0
 E_PPM = 0
 E_PB_Arranque = 0
 E_PB_Paro = 0
 S_Ref_PPM = 1
 S_Ref_Largo = 0
 BanES = 0
 Low S_Run_Inv_Main
 Low S_Run_Inv_Disc
 Run = 0
' update = 1       
 Gain = 0
 VerError = 0
 Bandera1 = 1
 Error = 0
 Base = 1
 GP = 0
 GainP = 1
 CCPR2L= 0             'VELOCIDAD
 CCPR1L = 0            'LARGO
 E_FC_MinVel = 0
 E_PB_Inicio = 0
 BanParo = 0
 BanJog = 0
 Low S_EnvoOk
 Low S_LedAde
 Low S_LedAtras
 Low S_LedFase

'   Lcdout $fe, 1
'   Lcdout dec3 S_Ref_PPM, " ", dec4 Error, " ", dec4 GP, " ",dec1 Pol
'   Lcdout $fe, $C0
'   Lcdout dec3 E_Largo, " ", dec5 Set_Largo, " ", dec5 GainP
               

Goto Inicio

' *********** Rutina de Contador *********

Cuenta:
PAUSEUS 5
Return

' *********** Rutina de convercion Analogo a Digital de In PotrA.0 *********

LeePPM:
        ADCON0 = $41           
        Gosub AnaDig

        Entry_PPM = ADRESH

        If Entry_PPM < 5 then
        Entry_PPM = 5
        ENDIF


'        E_PPM = ADRESH

'        If E_PPM < 5 then
'        E_PPM = 5
'        ENDIF


        Return

' *********** Rutina de convercion Analogo a Digital de In PotrA.1 *********

LeeLargo:

        ADCON0 = $49       
        Gosub AnaDig
        E_Largo = ADRESH
       
        If E_Largo < 94 then
        E_Largo = 94
        ENDIF

        If E_Largo > 233 then
        E_Largo = 233
        ENDIF
       Return

' *********** Rutina para leer encender la convercion A/D ************

AnaDig:
        Pauseus 50              ' CONFIG CANAL
        ADCON0.2 = 1            ' CONVERSION
        Pauseus 50              '
        Return

' *********** Rutina para leer Entradas ************


LeeInputs:

   E_SelCTrlReg = PortB.0
   E_Sel_Man_Auto = PortB.1
   E_PB_Jog = PortB.2
   E_PB_Paro = PortB.3
   E_PB_Arranque = PortB.4
   E_FC_Inicio = PortC.0
   E_FC_MaxVel = PortC.5
   E_FC_IncVel = PortC.6
   E_FC_DecVel = PortC.7
   E_FC_MinVel = PortD.4
   E_PB_Inicio = PortD.5
   E_Inv_Disc_Ok = PortD.6
   E_Inv_Main_Ok = PortD.7
   E_Enable_Inicio = PortE.1

Return


'****************** Interrupt T0 *******************************

       disable '
Time:
     TimeAcc = TimeAcc + 1
      INTCON.2 = 0
     Resume
      enable


' ***************  Rutina de Arranque **********

ArrInv:
    Pause 200
    High S_Run_Inv_Main
    High S_Run_Inv_Disc
    High S_EnvoOk
Return

' ***************  Rutina de Paro**********

ParoInv:
    Low S_Run_Inv_Main
    Low S_Run_Inv_Disc
    Low S_EnvoOk
Return

' ***************  Programa Inicial  **************

Inicio:
   
    Gosub LeeInputs


    If E_ESR = 0 Or E_Inv_Main_Ok = 0 Or E_Inv_Disc_Ok = 0 Then

       CLEAR
       Low S_ArrBA 
       Low S_NeuDisc
       Entry_PPM = 0
       BanIntLk = 0
       BanIni = 0 
       BanInicio = 0
       BanInicio_Mor = 0
       BanInicio_Pap = 0
       BanRampa = 0
       BanJog = 0
       BJog = 0
       BanSreg = 0
       RunBA = 0
       BanArrBA = 0
       AuxFMordaza = 0
       BanAlim = 0
       E_PPM = 0
       E_PB_Arranque = 0
       E_PB_Paro = 0
       S_Ref_PPM = 1
       S_Ref_Largo = 0
       BanES = 0
       Low S_Run_Inv_Main
       Low S_Run_Inv_Disc
       Run = 0
'       update = 1       
       Gain = 0
       VerError = 0
       Bandera1 = 1
       Error = 0
       Base = 1
       GP = 0
       GainP = 1
       CCPR2L= 0
       CCPR1L = 0
       E_FC_MaxVel = 1
       E_FC_MinVel = 0
       E_PB_Inicio = 0
       BanParo = 0
       Low S_LedAde
       Low S_LedAtras
       Low S_LedFase
       Low S_EnvoOk
       Goto Ref
   Else
'       High S_EnvoOk
   EndIf
     

'     If E_Sel_Man_Auto = 0 Then Man
'     If E_Sel_Man_Auto = 1 Then Auto

'Man:

    If BanJog = 1 && BJog = 1 Then
       Gosub ParoInv
       Low S_NeuDisc
       BanJog = 0
       BJog = 0
    EndIf


    If E_PB_Jog = 1 && BanJog = 0 && Run = 0 then
       GP = 0
       E_PPM  = 43
       If BJog = 0 then
          S_Ref_PPM = 1
          High S_NeuDisc
          Gosub ArrInv
       EndIf
       BJog = 1
       Goto Rampa1

    EndIf

    If E_PB_Jog = 0 && BJog = 1 then
     
       E_PPM  = 0
       GP = 0
       S_Ref_PPM = 1
       BanJog = 1
       Goto Rampa1
 
   EndIf
       

'Auto:
     
     
     If E_Sel_Man_Auto = 0 && E_PB_Arranque = 1 && BJog = 0 && Run = 0 && E_PB_Paro = 1 && E_ESR = 1 Then

        BanParo = 1
        Run = 1
        Pause 5
        High S_NeuDisc
        Gosub ArrInv
     EndIf
 
     If E_PB_Paro = 0 Or E_ESR = 0 Then
        BanInicio = 0
        BanIni = 0
        BanInicio_Mor = 0
        BanInicio_Pap = 0
        BanRampa = 0
        Run = 0
        Low S_ArrBA
        RunBA = 0
        BanArrBA = 0
        AuxFMordaza = 0
        BanAlim = 0
     EndIf
     
   
     iF Run = 0 && S_Ref_PPM > 5 then Rampa
     
     If Run = 0 && BanParo = 1 Then
        Low S_LedAde
        Low S_LedAtras
        Low S_LedFase
        BanSReg = 0
        Gosub ParoInv
        Pause 200
        Low S_NeuDisc
        BanParo = 0
     EndIf

     If Run = 0 Then Inicio

 If E_SelCTrlReg = 0 Then
    Error = 0
    Low S_LedAde
    Low S_LedAtras
    Low S_LedFase
    Bandera1 = 0
    VerError = 0
    Goto Rampa
 EndIf

 IF E_PB_Inicio = 1 Then
    BanSReg = 1
    RunBA = 1
 EndIf
 
 If BanSReg = 1 then SinIniReg
'**************************************************

   If  Run = 1 && BanInicio = 0 Then
       S_Ref_PPM  = 43
       S_Ref_Largo = 43
       BanInicio = 1
       BanIni = 1
       Goto Ref
   EndIf
 
   If E_FC_Inicio = 0 && S_Run_Inv_Main = 1 && BanInicio_Mor = 0 && Run = 1 Then
      S_Ref_PPM = 1
      BanInicio_Mor = 1
      Goto Ref
   EndIf


   If E_FPapel = 0 && S_Run_Inv_Disc = 1 && BanInicio_Pap = 0 && Run = 1 && BanInicio_Mor = 1 Then
      S_Ref_Largo = 0
      BanInicio_Pap = 1
      Goto Ref
   EndIf   
   
   If BanInicio_Mor = 1 && BanInicio_Pap = 1 then
      BanIni = 0
      RunBA = 1
   EndIf
   
   If BanIni = 1 then Ref


SinIniReg:

 
   If E_FMordaza = 0 && BanArrBA < 10 && AuxFMordaza = 0 && RunBA = 1 && BanAlim = 0 Then
      BanArrBA = BanArrBA + 1
      AuxFMordaza = 1
   EndIf
   
   If E_FMordaza = 1 && AuxFMordaza = 1 Then
      AuxFMordaza = 0
   EndIf

   If RunBA = 1 && Run = 1 && BanArrBA >= 10 then
      High S_ArrBA
      BanAlim = 1
   EndIf
   
   
   If S_Ref_PPM < 5 && BanRampa = 0 Then

       BanRampa = 1
       S_Ref_PPM = 5
       S_Ref_Largo = 5
       Goto Rampa
   
    EndIf
   
   

'********************************

Base = 20

   If E_FMordaza = 0 And Bandera1 = 1 then
        Bandera1 = 0
        VerError = 1
        Error = 0
        Pol = 1
   ENDIF 
     
   If E_FPapel = 0 And Bandera1 = 1 then
        Bandera1 = 0
        VerError = 2
        Error = 0
        Pol = 0
   ENDIF       

 If  VerError > 0 then
       
            B = 0
         Err1 = 0
         Err2 = 0
       
ASM

Suma      CALL _Cuenta
          INC _ON
          CJNE _ON,#70,Sigue
          INC _Err1
          CLR _ON
          CJNE _Err1,#100,Sigue
          INC _Err2
          CLR _Err1
          CJAE _Err2,#1,ErrFin
Sigue     CJNE _VerError,#1,CHPap
          JNB PORTC.3,ErrFin 
CHPap     CJNE _VerError,#2,CHErr
          JNB PORTC.4,ErrFin
ChErr     GOTO Suma
       
ErrFin

 ENDASM

Error = (Err2 * 100) + Err1


        If Error >= 3 & Pol = 1 Then
           High S_LedAde
        Else
           Low S_LedAde
        EndIf

       If Error >= 3 & Pol = 0 Then
           High S_LedAtras
       Else
           Low S_LedAtras
       EndIf

       If Error < 3 Then
          High S_LedFase
       Else
          Low S_LedFase
       EndIf


' ********* Definicion de Polaridad **********
       VerError = 0

EndIf

If E_FMordaza = 1 And E_FPapel = 1 And VerError = 0 Then
   Bandera1 = 1
ENDIF


Rampa:

BanSReg = 1
   Gosub LeePPM

'*******************************
 If E_FC_MaxVel = 1 && E_FC_IncVel = 1 && E_FC_DecVel = 1 && E_FC_MinVel = 1 Then
    E_PPM = Entry_PPM / 2
 EndIf

 If E_FC_MaxVel = 0 && E_FC_IncVel = 1 && E_FC_DecVel = 1 && E_FC_MinVel = 1 Then
    E_PPM = (Entry_PPM * 11) /10
 EndIf

 If E_FC_MaxVel = 0 && E_FC_IncVel = 0 && E_FC_DecVel = 1 && E_FC_MinVel = 1 Then
    E_PPM = Entry_PPM
 EndIf

 If E_FC_MaxVel = 0 && E_FC_IncVel = 0 && E_FC_DecVel = 0 && E_FC_MinVel = 1 Then
    E_PPM = (Entry_PPM * 10) / 11
 EndIf

 If E_FC_MaxVel = 0 && E_FC_IncVel = 0 && E_FC_DecVel = 0 && E_FC_MinVel = 0 Then
    E_PPM = (Entry_PPM * 3) /2
 EndIf

 If E_PPM > 255 Then
    E_PPM = 255
 EndIf
' ******************************

 If Run = 0 Then
    E_PPM = 5
 EndIf


Rampa1:
   
  Gosub LeeLargo 


AccPPM = S_Ref_PPM + 1
DAccPPM = S_Ref_PPM - 1

If BitDAccPPM = 1 then
   DAccPPM = 0
EndIF


If E_PPM > AccPPM Then
Acc = 1
DAcc = 0
 INTCON = $a0
 On Interrupt Goto Time
EndIf

If E_PPM < DAccPPM Then
Acc = 0
DAcc = 1
 INTCON = $a0
 On Interrupt Goto Time
EndIf

If Acc = 0 && DAcc = 0 Then
      INTCON.2 = 0
      INTCON = $80
      TimeAcc = 0
EndIf

'********  Rampa de Aceleracion  ***************

If Acc = 1 && TimeAcc >= 7 Then

     If S_Ref_PPM >= E_PPM then
        S_Ref_PPM = E_PPM
        Acc = 0
     EndIf

     If S_Ref_PPM = E_PPM then FinAcc

    S_Ref_PPM = S_Ref_PPM + 1

FinAcc:
 TimeAcc = 0
EndIf

'********  Rampa de Desaceleracion  ***************

If DAcc = 1 && TimeAcc >= 7 Then
 
   If S_Ref_PPM = 0 then
      DAcc = 0
   endif
 
  If S_Ref_PPM <= E_PPM AND Run = 1 then
      S_Ref_PPM = E_PPM
      DAcc = 0
   endif
 
 S_Ref_PPM = S_Ref_PPM - 1

FinDAcc:
 TimeAcc =0
Endif

'*************************************************


Set_Largo = E_Largo * S_Ref_PPM

GainP = Set_Largo / 233

If Error >= 18 && Pol = 1 Then
   S_Ref_Largo = GainP + 3
EndIf

If Error >= 12 && Error < 18 && Pol = 1 Then
   S_Ref_Largo = GainP + 2
EndIf

If Error >= 3 && Error < 12 && Pol = 1 Then
   S_Ref_Largo = GainP + 1
EndIf

If Error >= 18 && Pol = 0 Then
   S_Ref_Largo = GainP - 3
EndIf

If Error >= 12 && Error < 18 && Pol = 0 Then
   S_Ref_Largo = GainP - 2
EndIf

If Error >= 3 && Error < 12 && Pol = 0 Then
   S_Ref_Largo = GainP - 1
EndIf

If Error < 3 Then
   S_Ref_Largo = GainP
EndIf

' **************  Referencia a Inversores *********************

Ref:

PR2 = 255                   '  PR2 nos da la frecuencia del PWM 4 kHz

CCPR2L= S_Ref_PPM      ' Salida de Referencia Paquetes por Minuto

CCPR1L = S_Ref_Largo         ' Salida de Referencia de Largo de Paquete

Fin:
                                 
Goto Inicio


'********************** Fin de Programa ************************

« Última modificación: 12 de Julio de 2023, 19:48:57 por Tidoneo »

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Errores y alertas en programa simulación con PIC16F877.
« Respuesta #4 en: 12 de Julio de 2023, 21:05:13 »
Dentro del ASM..ENDASM
- Las variables que usás no están definidas en ningún lado.
- Reitero:  Los mnemónicos NO son de ningún PIC , son de la familia 8051.

Desconectado Tidoneo

  • PIC10
  • *
  • Mensajes: 6
Re:Errores y alertas en programa simulación con PIC16F877.
« Respuesta #5 en: 13 de Julio de 2023, 02:48:25 »
Gracias, hice un cambio en el código con el lenguaje normal a base de lo que tenía en ensamblador, ¿cómo ven la adaptación? Me compilo correctamente, solo que aún no he probado y no sé cómo se comportara

Código: [Seleccionar]
Suma:      CALL Cuenta
           B=B+1
           IF B <> 70 THEN
           CALL Sigue
           ELSE
           Err1=Err1+1
           B=0
           ENDIF
           IF Err1 <> 100 THEN
           CALL Sigue
           ELSE
           Err2=Err2+1
           Err1=0
           ENDIF
           IF Err2 <> 1 THEN
           CALL ErrFin
           ENDIF
Sigue:     IF VerError <> 1 then
          call CHPap
          else
          IF PORTB.3=0 THEN ErrFin
          ENDIF 
CHPap:     IF VerError <> 2 then
          CALL CHErr
          ENDIF
          IF PORTB.3=0 THEN ErrFin
ChErr:     GOTO Suma
       
ErrFin:     

Desconectado Tidoneo

  • PIC10
  • *
  • Mensajes: 6
Re:Errores y alertas en programa simulación con PIC16F877.
« Respuesta #6 en: 13 de Julio de 2023, 10:56:38 »
Se me paso que lo que tenia en lenguaje ASM, de acuerdo a lo de las variables, se que como tal no las tengo declaradas, pero en el manual de usuario de PicBasic Pro compiler, viene una no se si decir regla o llamado para cuándo se use el ASM. De igual forma las declare aparte y aún así me seguía manteniendo los errores

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Errores y alertas en programa simulación con PIC16F877.
« Respuesta #7 en: 13 de Julio de 2023, 11:35:59 »
Gracias, hice un cambio en el código con el lenguaje normal a base de lo que tenía en ensamblador, ¿cómo ven la adaptación? Me compilo correctamente, solo que aún no he probado y no sé cómo se comportara

Código: [Seleccionar]
Suma:      CALL Cuenta
           B=B+1
           IF B <> 70 THEN
           CALL Sigue
           ELSE
           Err1=Err1+1
           B=0
           ENDIF
           IF Err1 <> 100 THEN
           CALL Sigue
           ELSE
           Err2=Err2+1
           Err1=0
           ENDIF
           IF Err2 <> 1 THEN
           CALL ErrFin
           ENDIF
Sigue:     IF VerError <> 1 then
          call CHPap
          else
          IF PORTB.3=0 THEN ErrFin
          ENDIF 
CHPap:     IF VerError <> 2 then
          CALL CHErr
          ENDIF
          IF PORTB.3=0 THEN ErrFin
ChErr:     GOTO Suma
       
ErrFin:     

Estás usando CALL  como si fuera GOTO , nada bueno puede salir de ahi.

Desconectado Tidoneo

  • PIC10
  • *
  • Mensajes: 6
Re:Errores y alertas en programa simulación con PIC16F877.
« Respuesta #8 en: 13 de Julio de 2023, 14:24:52 »
Gracias Eduardo2, tenía una cuestión; ¿el mnemónico CJAE que funcionalidad tiene?, ya que no logro encontrar información al respecto.
« Última modificación: 13 de Julio de 2023, 14:26:55 por Tidoneo »

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Errores y alertas en programa simulación con PIC16F877.
« Respuesta #9 en: 13 de Julio de 2023, 15:23:23 »
Gracias Eduardo2, tenía una cuestión; ¿el mnemónico CJAE que funcionalidad tiene?, ya que no logro encontrar información al respecto.

googleando:

http://www.sc.ehu.es/sbweb/webcentro/automatica/web_8051/Contenido/set_8051/Instrucciones/51cjne.htm


CJAE, no ha sido una instrucción del 8051.

La encontré en un microcontrolador denominado SX.



Fuente:

https://www.jameco.com/Jameco/Products/ProdDS/2111513.pdf

La pregunta es, ¿Dé dónde tu sacaste ese código?
« Última modificación: 13 de Julio de 2023, 15:33:04 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Errores y alertas en programa simulación con PIC16F877.
« Respuesta #10 en: 13 de Julio de 2023, 16:29:39 »
... ¿el mnemónico CJAE que funcionalidad tiene?, ya que no logro encontrar información al respecto.

Ya te lo respondieron.

Me dá la sensación que pensás que en assembler es como en los lenguajes de alto nivel donde la sintaxis es estándar.
Además de las instrucciones propias de cada micro, según el fabricante una instrucción funcionalmente equivalente se puede escribir de manera diferente.  Trasladar directamente el código de un
micro desconocido a un PIC16F877A es una tarea destinada al fracaso.

Por otro lado, en
Código: [Seleccionar]
Suma:      CALL Cuenta
           B=B+1
           IF B <> 70 THEN
           CALL Sigue
           ELSE
           Err1=Err1+1
           B=0
           ENDIF
           IF Err1 <> 100 THEN
           CALL Sigue
           ELSE
           Err2=Err2+1
           Err1=0
           ENDIF
           IF Err2 <> 1 THEN
           CALL ErrFin
           ENDIF
Sigue:     IF VerError <> 1 then
          call CHPap
          else
          IF PORTB.3=0 THEN ErrFin
          ENDIF
CHPap:     IF VerError <> 2 then
          CALL CHErr
          ENDIF
          IF PORTB.3=0 THEN ErrFin
ChErr:     GOTO Suma
       
ErrFin:     

Usás CALL en lugar de GOSUB . En equivalentes , la diferencia es a GOSUB le chequea el destino PBP y a CALL el MPASM
Ahi era preferible usar GOSUB,  aunque obviamente con su correspondiente RETURN.

Desconectado Tidoneo

  • PIC10
  • *
  • Mensajes: 6
Re:Errores y alertas en programa simulación con PIC16F877.
« Respuesta #11 en: 13 de Julio de 2023, 18:46:30 »
Eduardo2 , la verdad creía que, si era más simple, nunca me había tocado trabajar con algo de ensamblador, muy pocas veces llegué a trabajar con micros, también pensé en el uso del GOSUB ya estudiando más a fondo los manuales que descargue, afortunadamente con ese y algunos otros cambios que ejecute logro funcionar, gracias a su apoyo. Tengo menos de 1 meses aprendiendo sobre el lenguaje y apenas me ando familiarizando.

DominusDRR, me rompí la cabeza buscando lo que esa instrucción ejecutaba, tenías conocimiento de ella previamente?, nunca había leído sobre esos.
Contestando a tu otra pregunta ese código fue extraído de una máquina o pasado, desconozco la historia, pero la funcionalidad que tenía era de corrección automática de 500cpm, la idea era convertirlo y hacerlo funcional en otro dispositivo más versátil.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Errores y alertas en programa simulación con PIC16F877.
« Respuesta #12 en: 13 de Julio de 2023, 18:53:12 »
DominusDRR, me rompí la cabeza buscando lo que esa instrucción ejecutaba, tenías conocimiento de ella previamente?, nunca había leído sobre esos.

El primer microcontrolador que aprendí en mi vida fue el Intel 8051, pero eso es muchos años de eso, no recuerdo casi nada, ni las instrucciones, simplemente googlee,y cuando lo hagas, es mejor hacerlo en inglés, en castellano hay muy poca información técnica.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32