Autor Tema: ¡warnings PBPro!  (Leído 2987 veces)

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

Desconectado Syd_Vegetable

  • PIC10
  • *
  • Mensajes: 4
¡warnings PBPro!
« en: 06 de Diciembre de 2005, 19:06:00 »
Hola.
Mi problema es el siguiente:
al compilar el programa en PBP me aparece la siguiente davertencia:

warn INTERF~1.ASM  932: [102] code crosses boundary @ 800h

Estoy usando el PIC 16F876A que tiene 8K de memoria, no uso branch solo goto y gosub y tengo enendido que no hay problema con el tamaño del salto si se usan estas dos instrucciones, el programa mide menos de 4K

¿Este warning causaría problemas?
y si es así ¿cómo lo soluciono?

el archivo list me pone este error no se que signifique

Error[173]  : source file path exceeds 62 characters (C:MIS DOCUMENTOSPICBASICPROSOFTWAREMPASMWINMPASMWIN370P16F876A.INC)

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
RE: ¡warnings PBPro!
« Respuesta #1 en: 07 de Diciembre de 2005, 00:39:00 »
Como dijo Jack... vamos por partes...

Error[173] : source file path exceeds 62 characters (C:MIS DOCUMENTOSPICBASICPROSOFTWAREMPASMWINMPASMWIN370P16F876A.INC) Significa que es muy laraga la direccion del path y lo que tienes que hacer es cambiar el directorio raiz.. por ejemplo c:PBP

warn INTERF~1.ASM 932: [102] code crosses boundary @ 800h Con respecto a esto me parece que estas usando mas memoria o mas llamadas de als que se pueden hacer... es decir, el PBP solo te permite compilar tranquilo hasta 1K, porque es el tamaño de 1 pagina de memoria de programa, despues de ello tienes que trabajar con el PCLATH y PCL para no perderte... el otro problema que puedes tener es que hallas hecho mas de 4 llamadas (GOSUB) anidadas, por defecto PBP guarda 4 de los 8 niveles de pila para su propio uso, y te deja solo 4 para el usuario, fijate si ese es tu problema...

Si ninguno de esos es tu problema, deja tu codigo para que lo podamos ver y decirte donde puede estar el problema...

Un abrazo Rebotado
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)

Desconectado Syd_Vegetable

  • PIC10
  • *
  • Mensajes: 4
RE: ¡warnings PBPro!
« Respuesta #2 en: 07 de Diciembre de 2005, 18:15:00 »
Gracias por t respuesta.

cambíe todos los gosub por goto y aún así me pone el warning.

lo más probable es que me pasé a otro banco, ya que el programa es muy grande.

supuestamente el PBP hace el trabajo con el PLATH para saltar a más de 2K.

este es el programa, es la interfaz únicamente con un LCD y un teclado.
Para un afinadior de guitarra.


"****************************************************************
"*  Name    : interfaz.BAS                                     *
"*  Author  : Raymundo Coronado Guerrero                        *
"*  Notice  : Copyright (c) 2005 ITSON                          *
"*          : All Rights Reserved                               *
"*  Date    : 23/11/05                                          *
"*  Version : 1.0                                               *
"*  Notes   :                                                   *
"*          :                                                   *
"****************************************************************

@ device HS_OSC
DEFINE OSC 12                   ;oscilador externo de 12 MHz.          
       
"*******************************************************************************
"DECLARACIÓN DE VARIABLES Y CONSTANTES                                         *
"*******************************************************************************
inicia   var bit
OK       VAR BIT
atras    var bit
auto     var bit
adelante var bit
escoge   var bit
enter    var bit
manual   var bit
personal var bit
afina    var byte
espa     var byte
fase     var byte
cuerda   var byte
divisor  var byte
id       var byte
index    var byte
letra    var byte
nsexta   var byte
nquinta  var byte
ncuarta  var byte
notamax  var byte
notamin  var byte
ntercera var byte
nsegunda var byte
nprimera var byte
pausa    var byte
tinning  var byte
nota     var byte
z        var byte
permin   var word
permax   var word
ncentral var word


"Notas con sus repectivos periodos multiplicados por 10^5.
C2       CON 1528
Cs2_Db2  CON 1443
D2       CON 1362
Ds2_Eb2  CON 1286
E2_Fb2   CON 1213
Es2_F2   CON 1145
Fs2_Gb2  CON 1081
G2       CON 1024
Gs2_Ab2  CON 963
A2       CON 909
As2_Bb2  CON 858
B2_Cb2   CON 809
C3_Bs2   CON 764
Cs3_Df3  CON 721
D3       CON 681
Ds3_Ef3  CON 642
E3_Ff3   CON 606
F3_Es3   CON 572
Fs3_Gf3  CON 540
G3       CON 510
Gs3_Af3  CON 481
A3       CON 454
As3_Bf3  CON 429
B3_Cf4   CON 405
C4_Bs3   CON 382
Cs4_Df4  CON 360
D4       CON 340
Ds4_Ef4  CON 321
E4_Ff4   CON 303
F4_Es4   CON 286
Fs4_Gf4  CON 270
G4       CON 255
"*******************************************************************************
"Alias para los 4 botones del teclado                                          *
"*******************************************************************************
"    ----------------------------
"   |  Esc   |  <   |  >  | Enter|
"    ----------------------------
A    VAR PORTC.4                 ;nombres para los pines de las filas
B    VAR PORTC.5
UNO  VAR PORTC.6                 ;nombres para los pines de las columnas
DOS  VAR PORTC.7
TRISC=$C0                        ;2 pines más significativos como entradas
                                 ;los demás como salidas
TRISA=$00                        ;puerto A como salida
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0           "datos del LCD = al MSnible del Puerto B.
define LCD_RSREG PORTB
DEFINE LCD_RSBIT 5          "selección del registro de contol/datos Puerto A.4.
define LCD_EREG PORTA      
DEFINE LCD_EBIT 4        
"*******************************************************************************
"RUTINA QUE ENCUENTRA LA TECLA PRESIONADA.                                     *
"*******************************************************************************

 teclado:
     porta.0=1
     IF escoge=0 THEN
     LCDOUT $FE,1
     LCDOUT $FE,$81,"PRESIONE      "
     LCDOUT $FE,$C2," <,> o ENTER  "                                                                          
     endif
     
     A=0                        ;hacer baja la 1era fila      
     IF UNO=0 THEN
 espera1:
     INICIA=1                   ;si la 1ra tecla es presionada sacar 1            
     if uno=0 then espera1      ;espera a se que suelte la tecla
     gosub display
     endif          

     IF dos=0 THEN
 espera2:
     ATRAS=1                    ;si la 1ra tecla es presionada sacar 1            
     if dos=0 then espera2      ;espera a que se suelte la tecla
     gosub display
     endif
     
     A=1                        ;poner en alto la 1era fila      
     B=0                        ;hacer bajo la 2da fila

     IF UNO=0 THEN
 espera3:
     ADELANTE=1                 ;si la 1ra tecla es presionada sacar 1            
     if uno=0 then espera3      ;espera a que se suelte la tecla
     gosub display
     endif

     IF dos=0 THEN
 espera4:
     ENTER=1                    ;si la 1ra tecla es presionada sacar 1            
     if dos=0 then espera4      ;espera a que se suelte la tecla
     gosub display
     endif  
     
     B=1                        ;poner en alto la 2da fila
     
     porta.0=0
     goto teclado                                                                  
"*******************************************************************************
"SUBRRUTINAS DE DESPLIEGUE Y BÚSQUEDA DE OPCIONES.                             *
"*******************************************************************************
 
 display:
     porta.1=1
     if inicia=1 then
      fase=fase-1 min 0      
      adelante=1
      atras=0
      enter=0
      inicia=0
      nota=0
      cuerda=0
      escoge=0
     LCDOUT $FE,1
     endif
     IF fase=0 THEN
     goto modo
     endif
     if fase=1 then
     goto tipo
     endif
     if (fase=1)&(personal=0) then
     goto elija_afinacion
     ENDIF
     if (fase=1)&(personal=1) then
     goto elija_cuerda
     ENDIF                                                                  
     IF FASE=2 then        
     goto elija_nota
     ENDIF                    
     if fase=3 then
     goto golpea
     endif
     if (OK=1)&(fase=1)&(personal=0)|(enter=1) then
      cuerda=cuerda+1
      afina=1      
     if cuerda=7 then
      cuerda=1
      afina=1
      escoge=0
     ENDIF
     goto elija_afinacion
     ENDIF
     if (OK=1)&(fase=1)&(personal=1) then
      nota=1
      cuerda=1
     goto elija_cuerda
     endif
     goto golpea
     porta.1=1    
     return
     
"*******************************************************************************      
"Subrrutina para escoger el modo de operación: automática o manual             *
"*******************************************************************************  
 modo:
     porta.2=1
     if escoge=0 then
     lcdout $FE,$80,1,"MODO:"
     escoge=1      
     endif    
     
     if adelante=1 then auto=1
     if atras=1 then auto=0
     
     adelante=0
     atras=0
                                                ;despliegue del LCD
     if auto=1 then
     lcdout $FE,$C3,"AUTOMATICO  >"             ; ________________
     ENDIF                                      ;|#####MODO:######|
                                                ;|AUTOMATICO_____>|
                                                ;|________________|
     if auto=0 then
     lcdout $FE,$C0,"<   MANUAL   "    
     ENDIF
           
     IF (enter=1)&(escoge=1) THEN
      fase=1
      adelante=1
      atras=0
      escoge=0
             
      endif
      porta.2=0
      gosub display

"*******************************************************************************      
"Subrrutina para escoger el tipo de afinación: preestablecida o personalizada  *
"*******************************************************************************
 tipo:
     if escoge=0 then      
     LCDOUT $FE,$80,1,"TIPO:           "
      escoge=1
     endif      
       
     if adelante=1 then personal=0
     if atras=1    then personal=1                                                
                                             ;LCD
     if personal=0 then                    
     LCDOUT $FE,$C0,3,"PREESTABLECIDO >"   ; ________________
     endif                                 ;|#####TIPO:######|
                                           ;|PREESTABLECIDO_>|  
                                           ;|________________|
                                 
       
     if personal=1 then                    ; ________________
     LCDOUT $FE,$C0,3,"< PERSONALIZADO"    ;|#####TIPO:######|
     endif                                 ;|<#PERSONALIZADO#|
                                           ;|________________|
     IF enter=1 THEN
      fase=2
      enter=0
      atras=0
      adelante=1
      escoge=0
     
     endif                                      

     gosub display
     
"*******************************************************************************      
"Subrrutina para elejir cuerda  en tipo personalizada                          *
"*******************************************************************************        
 elija_cuerda:
       
     if escoge=0 then
     LCDOUT $FE,1
      escoge=1
     lcdout $FE,$84,"CUERDA:"
     endif

     if adelante=1 then cuerda=cuerda+1 max 6      
     if atras=1 then    cuerda=cuerda-1 min 1      
      ADELANTE=0                                    
      ATRAS=0                                              

"Rutina que busca las letras de la cuerda seleccionada para luego desplegarla
bcuerda:      
     
     lookup index,["0    PRIMERA    >0<   SEGUNDA    >0<   TERCERA    >0<   CUARTA     >0<   QUINTA     >0<   SEXTA      0"],letra
         
     if (id=1)&(letra!="0"Giño then
     gosub despliega
     endif
     
     if (id=1)&(letra="0"Giño then
     goto salte
     endif

     if (id=0)&(letra="0"Giño then
     index=index+1
     
     if index=cuerda then
     id=1
     index=index+1    
     endif
     endif
     goto bcuerda    
               
       
salte:
      id=2
      index=0
      letra=0
      espa=0
     
     if enter=1 then
      fase=2
      enter=0
      adelante=1
      escoge=0      
     gosub cuerdas              
     LCDOUT $FE,1
     
     endif      
     gosub display
     
"*******************************************************************************      
"Subrrutina para elejir nota en tipo personalizada                             *      
"*******************************************************************************        
 
 elija_nota:
       
     lcdout $FE,$80,"  NOTA:         "
     if adelante=1 then nota=nota+1 max notamax        
     if atras=1    then nota=nota-1 min notamin
      adelante=0
      atras=0
       
     gosub notas
       
 busca:
     lookup index,["0C20Cs2_Db20D20Ds2_Eb20E2_Fb20Es2_F20Fs2_Gb20G20Gs2_Ab20A20As2_Bb20B2_Cb20C3_Bs20Cs3_Df30D30Ds3_Ef30E3_Ff30F3_Es30Fs3_Gf30G30Gs3_Af30A30As3_Bf30B3_Cf40C4_Bs30Cs4_Df40D40Ds4_Ef40E4_Ff40F4_Es40Fs4_Gf40G4"],letra
     
     if (id=1)&(letra!="0"Giño then
     gosub despliega
     endif
     
     if (id=1)&(letra="0"Giño then
     goto salte_2
     endif

     if (id=0)&(letra="0"Giño then
      index=index+1
     if index=nota then
      id=1
      index=index+1    
     endif
     endif    
     
     goto busca

salte_2:
      id=0
      letra=0
      espa=0
      index=0
      letra=0      
     if enter=1 then                  
      fase=3
      adelante=1      
      enter=0      
     LCDOUT $FE,1
     endif
     return
     
"*******************************************************************************      
"Subrrutina para elejir afinación en tipo preestablecida                       *
"*******************************************************************************  
 elija_afinacion:
     
      IF escoge=0 then
      LCDOUT $FE,$80," AFINACION:     "
      pause 2000
      LCDOUT $FE,2
      escoge=1
      endif          
     
      if adelante=1 then afina=afina+1 max 13
      if atras=0    then afina=afina-1 min 1
      adelante=0
      atras=0
     
     
      if afina=1 then      
      if cuerda=1 then nota=29
      if cuerda=2 then nota=24
      if cuerda=3 then nota=20
      if cuerda=4 then nota=15
      if cuerda=5 then nota=10
      if cuerda=6 then nota=5      
      ENDIF
     
      if afina=2 then
      if cuerda=1 then nota=29
      if cuerda=2 then nota=24
      if cuerda=3 then nota=21
      if cuerda=4 then nota=17
      if cuerda=5 then nota=12
      if cuerda=6 then nota=5      
      ENDIF      
           
      if afina=3 then
      if cuerda=1 then nota=27
      if cuerda=2 then nota=22
      if cuerda=3 then nota=18
      if cuerda=4 then nota=13
      if cuerda=5 then nota=8
      if cuerda=6 then nota=3
      ENDIF
     
      if afina=4 then
      if cuerda=1 then nota=27
      if cuerda=2 then nota=22
      if cuerda=3 then nota=19
      if cuerda=4 then nota=15
      if cuerda=5 then nota=10
      if cuerda=6 then nota=3
      ENDIF
     
      if afina=5 then
      if cuerda=1 then nota=29
      if cuerda=2 then nota=24
      if cuerda=3 then nota=20
      if cuerda=4 then nota=15
      if cuerda=5 then nota=10
      if cuerda=6 then nota=3
      ENDIF
     
      if afina=6 then
      if cuerda=1 then nota=27
      if cuerda=2 then nota=24
      if cuerda=3 then nota=20
      if cuerda=4 then nota=15
      if cuerda=5 then nota=10
      if cuerda=6 then nota=3
      ENDIF
     
      if afina=7 then
      if cuerda=1 then nota=27
      if cuerda=2 then nota=22
      if cuerda=3 then nota=20
      if cuerda=4 then nota=15
      if cuerda=5 then nota=10
      if cuerda=6 then nota=3
      ENDIF                  
           
      if afina=8 then
      if cuerda=1 then nota=25
      if cuerda=2 then nota=20
      if cuerda=3 then nota=16
      if cuerda=4 then nota=11
      if cuerda=5 then nota=6
      if cuerda=6 then nota=1
      ENDIF
     
      if afina=9 then
      if cuerda=1 then nota=29
      if cuerda=2 then nota=25
      if cuerda=3 then nota=20
      if cuerda=4 then nota=13
      if cuerda=5 then nota=8
      if cuerda=6 then nota=1
      ENDIF            
     
      if afina=10 then
      if cuerda=1 then nota=29
      if cuerda=2 then nota=26
      if cuerda=3 then nota=22
      if cuerda=4 then nota=17
      if cuerda=5 then nota=10
      if cuerda=6 then nota=5
      ENDIF
     
      if afina=11 then
      if cuerda=1 then nota=27
      if cuerda=2 then nota=24
      if cuerda=3 then nota=20
      if cuerda=4 then nota=15
      if cuerda=5 then nota=8
      if cuerda=6 then nota=3
      ENDIF
     
      if afina=12 then
      if cuerda=1 then nota=29
      if cuerda=2 then nota=24
      if cuerda=3 then nota=20
      if cuerda=4 then nota=15
      if cuerda=5 then nota=8
      if cuerda=6 then nota=3
      ENDIF        
     
      if afina=13 then
      if cuerda=1 then nota=18
      if cuerda=2 then nota=13
      if cuerda=3 then nota=21
      if cuerda=4 then nota=17
      if cuerda=5 then nota=11
      if cuerda=6 then nota=6
      ENDIF
         
      lcdout $FE,$C0,"cuer:",#cuerda

"Rutina para buscar los tipos de afinación y desplegarlos posteriormente    
 busca2:  
 
     lookup index,["0STANDARD E     >0< OPEN E       >0< STANDARD D   >0< OPEN D       >0< DROP D       >0<DOUBLE DROP D >0< D SUSPENDED  >0< STANDARD O   >0< OPEN C       >0< OPEN A       >0< OPEN G       >0< G6th         >0< STANDARD F   >0"],letra
     
     if (id=1)&(letra!="0"Giño then
        gosub despliega2
     endif
     
     if (id=1)&(letra="0"Giño then
        id=2
        index=0
        letra=0
        espa=0
        goto busca2
     endif
     
     if (id=0)&(letra="0"Giño then
     index=index+1
     
     if index=afina then
     id=1
     index=index+1    
     endif
     endif    
     goto busca2

busca2_1:
     
     lookup index,["0EADGBE0EBEG#BE0DGCFAD0DADF#BE0DADGBE0DADGBD0DADGAD0CFBbEbGC0CGCGCE0EAEAC#E0DGDGBD0DGDGBE0FBbEG#CF0"],letra
     if (id=3)&(letra!="0"Giño then
        gosub despliega2
     endif
     
     if (id=3)&(letra="0"Giño then
         goto salte_3
     endif
     
     if (id=2)&(letra="0"Giño then
     index=index+1
     
     if index=afina then
        id=3
        index=index+1    
     endif
     endif    
     goto busca2_1

salte_3:
        id=0
        letra=0
        espa=0
        index=0
        letra=0      
      if enter=1 then
        enter=0
        gosub cuerdas
        gosub notas
        fase=3
        adelante=0
        escoge=0      
      endif  
     
      gosub display      

"*******************************************************************************      
"Subrrutina que busca la nota pedida y la guarda                               *
"*******************************************************************************
 
 notas:
       
     lookup2 nota,[0,c2,Cs2_Db2,D2,Ds2_Eb2,E2_Fb2,Es2_F2,Fs2_Gb2,G2,Gs2_Ab2,A2,As2_Bb2,B2_Cb2,C3_Bs2,Cs3_Df3,D3,Ds3_Ef3,E3_Ff3,F3_Es3,Fs3_Gf3,G3,Gs3_Af3,A3,As3_Bf3,B3_Cf4,C4_Bs3,Cs4_Df4,D4,Ds4_Ef4,E4_Ff4,F4_Es4,Fs4_Gf4,G4],ncentral    
     return        

"*******************************************************************************      
"Rutinas de despliege en el LDC para notas, afinaciones y para cuerdas         *
"*******************************************************************************
     
 despliega:
 
   lcdout $FE,$C0+espa,letra
   espa=espa+1
   index=index+1
   return
   
 despliega2:
   
   if id=1 then
   lcdout $FE,$80+espa,letra
   endif
   
   if id=3 then
   lcdout $FE,$C8+espa,letra
   endif
   espa=espa+1
   index=index+1      
   return  

           
"*******************************************************************************      
"Subrrutina que asigna las características de la cuerda a afinar               *
"*******************************************************************************
 
 cuerdas:
      if cuerda=1 then
         permin=229
         permax=629
         notamax=18
         notamin=32
         nota=notamin
         pausa=0
         divisor=1
         z=2
       endif
       
       if cuerda=2 then                        
         permin=324
         permax=840
         notamax=13
         notamin=26
         nota=notamin
         pausa=10
         divisor=2
         z=1
        endif
       
       if cuerda=3 then
         permin=409
         permax=840
         notamax=13
         notamin=22
         nota=notamin
         pausa=50
         divisor=3
         Z=0
       endif
       
       if cuerda=4 then
         permin=515
         permax=1000
         notamax=10
         notamin=18
         nota=notamin
         PAUSA=800        
         divisor=3
         Z=0
       endif
       
       if cuerda=5 then
         permin=730
         permax=1681
         notamax=1
         notamin=13
         nota=notamin
         PAUSA=800
         divisor=3
         Z=0
       endif
       
       if cuerda=6 then
         permin=790
         permax=1681
         notamax=1
         notamin=12
         nota=notamin
         PAUSA=800
         divisor=3
         z=0    
       endif
       
       return                  
                         
"*******************************************************************************      
"Subrrutina que prepara al ususario para colocar el brazo y golpear la cuerda  *
"*******************************************************************************
 golpea:
       LCDOUT $FE,$1
       
       if (auto=1)&(escoge=0) then
       lcdout $FE,$80,"COLOQUE EL BRAZO"
       lcdout $FE,$C0,"EN LA CLAVIJA  >"
       high porta.1
       escoge=1
       ENDIF
       
       IF adelante=1 THEN    
       lcdout $FE,$80,"GOLPEE LA CUERDA"
       high porta.2
       adelante=0            
       endif
       gosub display
       
       END
     

Desconectado Syd_Vegetable

  • PIC10
  • *
  • Mensajes: 4
RE: ¡warnings PBPro!
« Respuesta #3 en: 07 de Diciembre de 2005, 18:16:00 »
Gracias por t respuesta.

cambíe todos los gosub por goto y aún así me pone el warning.

lo más probable es que me pasé a otro banco, ya que el programa es muy grande.

supuestamente el PBP hace el trabajo con el PLATH para saltar a más de 2K.

este es el programa, es la interfaz únicamente con un LCD y un teclado.
Para un afinadior de guitarra.


"****************************************************************
"*  Name    : interfaz.BAS                                     *
"*  Author  : Raymundo Coronado Guerrero                        *
"*  Notice  : Copyright (c) 2005 ITSON                          *
"*          : All Rights Reserved                               *
"*  Date    : 23/11/05                                          *
"*  Version : 1.0                                               *
"*  Notes   :                                                   *
"*          :                                                   *
"****************************************************************

@ device HS_OSC
DEFINE OSC 12                   ;oscilador externo de 12 MHz.          
       
"*******************************************************************************
"DECLARACIÓN DE VARIABLES Y CONSTANTES                                         *
"*******************************************************************************
inicia   var bit
OK       VAR BIT
atras    var bit
auto     var bit
adelante var bit
escoge   var bit
enter    var bit
manual   var bit
personal var bit
afina    var byte
espa     var byte
fase     var byte
cuerda   var byte
divisor  var byte
id       var byte
index    var byte
letra    var byte
nsexta   var byte
nquinta  var byte
ncuarta  var byte
notamax  var byte
notamin  var byte
ntercera var byte
nsegunda var byte
nprimera var byte
pausa    var byte
tinning  var byte
nota     var byte
z        var byte
permin   var word
permax   var word
ncentral var word


"Notas con sus repectivos periodos multiplicados por 10^5.
C2       CON 1528
Cs2_Db2  CON 1443
D2       CON 1362
Ds2_Eb2  CON 1286
E2_Fb2   CON 1213
Es2_F2   CON 1145
Fs2_Gb2  CON 1081
G2       CON 1024
Gs2_Ab2  CON 963
A2       CON 909
As2_Bb2  CON 858
B2_Cb2   CON 809
C3_Bs2   CON 764
Cs3_Df3  CON 721
D3       CON 681
Ds3_Ef3  CON 642
E3_Ff3   CON 606
F3_Es3   CON 572
Fs3_Gf3  CON 540
G3       CON 510
Gs3_Af3  CON 481
A3       CON 454
As3_Bf3  CON 429
B3_Cf4   CON 405
C4_Bs3   CON 382
Cs4_Df4  CON 360
D4       CON 340
Ds4_Ef4  CON 321
E4_Ff4   CON 303
F4_Es4   CON 286
Fs4_Gf4  CON 270
G4       CON 255
"*******************************************************************************
"Alias para los 4 botones del teclado                                          *
"*******************************************************************************
"    ----------------------------
"   |  Esc   |  <   |  >  | Enter|
"    ----------------------------
A    VAR PORTC.4                 ;nombres para los pines de las filas
B    VAR PORTC.5
UNO  VAR PORTC.6                 ;nombres para los pines de las columnas
DOS  VAR PORTC.7
TRISC=$C0                        ;2 pines más significativos como entradas
                                 ;los demás como salidas
TRISA=$00                        ;puerto A como salida
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0           "datos del LCD = al MSnible del Puerto B.
define LCD_RSREG PORTB
DEFINE LCD_RSBIT 5          "selección del registro de contol/datos Puerto A.4.
define LCD_EREG PORTA      
DEFINE LCD_EBIT 4        
"*******************************************************************************
"RUTINA QUE ENCUENTRA LA TECLA PRESIONADA.                                     *
"*******************************************************************************

 teclado:
     porta.0=1
     IF escoge=0 THEN
     LCDOUT $FE,1
     LCDOUT $FE,$81,"PRESIONE      "
     LCDOUT $FE,$C2," <,> o ENTER  "                                                                          
     endif
     
     A=0                        ;hacer baja la 1era fila      
     IF UNO=0 THEN
 espera1:
     INICIA=1                   ;si la 1ra tecla es presionada sacar 1            
     if uno=0 then espera1      ;espera a se que suelte la tecla
     gosub display
     endif          

     IF dos=0 THEN
 espera2:
     ATRAS=1                    ;si la 1ra tecla es presionada sacar 1            
     if dos=0 then espera2      ;espera a que se suelte la tecla
     gosub display
     endif
     
     A=1                        ;poner en alto la 1era fila      
     B=0                        ;hacer bajo la 2da fila

     IF UNO=0 THEN
 espera3:
     ADELANTE=1                 ;si la 1ra tecla es presionada sacar 1            
     if uno=0 then espera3      ;espera a que se suelte la tecla
     gosub display
     endif

     IF dos=0 THEN
 espera4:
     ENTER=1                    ;si la 1ra tecla es presionada sacar 1            
     if dos=0 then espera4      ;espera a que se suelte la tecla
     gosub display
     endif  
     
     B=1                        ;poner en alto la 2da fila
     
     porta.0=0
     goto teclado                                                                  
"*******************************************************************************
"SUBRRUTINAS DE DESPLIEGUE Y BÚSQUEDA DE OPCIONES.                             *
"*******************************************************************************
 
 display:
     porta.1=1
     if inicia=1 then
      fase=fase-1 min 0      
      adelante=1
      atras=0
      enter=0
      inicia=0
      nota=0
      cuerda=0
      escoge=0
     LCDOUT $FE,1
     endif
     IF fase=0 THEN
     goto modo
     endif
     if fase=1 then
     goto tipo
     endif
     if (fase=1)&(personal=0) then
     goto elija_afinacion
     ENDIF
     if (fase=1)&(personal=1) then
     goto elija_cuerda
     ENDIF                                                                  
     IF FASE=2 then        
     goto elija_nota
     ENDIF                    
     if fase=3 then
     goto golpea
     endif
     if (OK=1)&(fase=1)&(personal=0)|(enter=1) then
      cuerda=cuerda+1
      afina=1      
     if cuerda=7 then
      cuerda=1
      afina=1
      escoge=0
     ENDIF
     goto elija_afinacion
     ENDIF
     if (OK=1)&(fase=1)&(personal=1) then
      nota=1
      cuerda=1
     goto elija_cuerda
     endif
     goto golpea
     porta.1=1    
     return
     
"*******************************************************************************      
"Subrrutina para escoger el modo de operación: automática o manual             *
"*******************************************************************************  
 modo:
     porta.2=1
     if escoge=0 then
     lcdout $FE,$80,1,"MODO:"
     escoge=1      
     endif    
     
     if adelante=1 then auto=1
     if atras=1 then auto=0
     
     adelante=0
     atras=0
                                                ;despliegue del LCD
     if auto=1 then
     lcdout $FE,$C3,"AUTOMATICO  >"             ; ________________
     ENDIF                                      ;|#####MODO:######|
                                                ;|AUTOMATICO_____>|
                                                ;|________________|
     if auto=0 then
     lcdout $FE,$C0,"<   MANUAL   "    
     ENDIF
           
     IF (enter=1)&(escoge=1) THEN
      fase=1
      adelante=1
      atras=0
      escoge=0
             
      endif
      porta.2=0
      gosub display

"*******************************************************************************      
"Subrrutina para escoger el tipo de afinación: preestablecida o personalizada  *
"*******************************************************************************
 tipo:
     if escoge=0 then      
     LCDOUT $FE,$80,1,"TIPO:           "
      escoge=1
     endif      
       
     if adelante=1 then personal=0
     if atras=1    then personal=1                                                
                                             ;LCD
     if personal=0 then                    
     LCDOUT $FE,$C0,3,"PREESTABLECIDO >"   ; ________________
     endif                                 ;|#####TIPO:######|
                                           ;|PREESTABLECIDO_>|  
                                           ;|________________|
                                 
       
     if personal=1 then                    ; ________________
     LCDOUT $FE,$C0,3,"< PERSONALIZADO"    ;|#####TIPO:######|
     endif                                 ;|<#PERSONALIZADO#|
                                           ;|________________|
     IF enter=1 THEN
      fase=2
      enter=0
      atras=0
      adelante=1
      escoge=0
     
     endif                                      

     gosub display
     
"*******************************************************************************      
"Subrrutina para elejir cuerda  en tipo personalizada                          *
"*******************************************************************************        
 elija_cuerda:
       
     if escoge=0 then
     LCDOUT $FE,1
      escoge=1
     lcdout $FE,$84,"CUERDA:"
     endif

     if adelante=1 then cuerda=cuerda+1 max 6      
     if atras=1 then    cuerda=cuerda-1 min 1      
      ADELANTE=0                                    
      ATRAS=0                                              

"Rutina que busca las letras de la cuerda seleccionada para luego desplegarla
bcuerda:      
     
     lookup index,["0    PRIMERA    >0<   SEGUNDA    >0<   TERCERA    >0<   CUARTA     >0<   QUINTA     >0<   SEXTA      0"],letra
         
     if (id=1)&(letra!="0"Giño then
     gosub despliega
     endif
     
     if (id=1)&(letra="0"Giño then
     goto salte
     endif

     if (id=0)&(letra="0"Giño then
     index=index+1
     
     if index=cuerda then
     id=1
     index=index+1    
     endif
     endif
     goto bcuerda    
               
       
salte:
      id=2
      index=0
      letra=0
      espa=0
     
     if enter=1 then
      fase=2
      enter=0
      adelante=1
      escoge=0      
     gosub cuerdas              
     LCDOUT $FE,1
     
     endif      
     gosub display
     
"*******************************************************************************      
"Subrrutina para elejir nota en tipo personalizada                             *      
"*******************************************************************************        
 
 elija_nota:
       
     lcdout $FE,$80,"  NOTA:         "
     if adelante=1 then nota=nota+1 max notamax        
     if atras=1    then nota=nota-1 min notamin
      adelante=0
      atras=0
       
     gosub notas
       
 busca:
     lookup index,["0C20Cs2_Db20D20Ds2_Eb20E2_Fb20Es2_F20Fs2_Gb20G20Gs2_Ab20A20As2_Bb20B2_Cb20C3_Bs20Cs3_Df30D30Ds3_Ef30E3_Ff30F3_Es30Fs3_Gf30G30Gs3_Af30A30As3_Bf30B3_Cf40C4_Bs30Cs4_Df40D40Ds4_Ef40E4_Ff40F4_Es40Fs4_Gf40G4"],letra
     
     if (id=1)&(letra!="0"Giño then
     gosub despliega
     endif
     
     if (id=1)&(letra="0"Giño then
     goto salte_2
     endif

     if (id=0)&(letra="0"Giño then
      index=index+1
     if index=nota then
      id=1
      index=index+1    
     endif
     endif    
     
     goto busca

salte_2:
      id=0
      letra=0
      espa=0
      index=0
      letra=0      
     if enter=1 then                  
      fase=3
      adelante=1      
      enter=0      
     LCDOUT $FE,1
     endif
     return
     
"*******************************************************************************      
"Subrrutina para elejir afinación en tipo preestablecida                       *
"*******************************************************************************  
 elija_afinacion:
     
      IF escoge=0 then
      LCDOUT $FE,$80," AFINACION:     "
      pause 2000
      LCDOUT $FE,2
      escoge=1
      endif          
     
      if adelante=1 then afina=afina+1 max 13
      if atras=0    then afina=afina-1 min 1
      adelante=0
      atras=0
     
     
      if afina=1 then      
      if cuerda=1 then nota=29
      if cuerda=2 then nota=24
      if cuerda=3 then nota=20
      if cuerda=4 then nota=15
      if cuerda=5 then nota=10
      if cuerda=6 then nota=5      
      ENDIF
     
      if afina=2 then
      if cuerda=1 then nota=29
      if cuerda=2 then nota=24
      if cuerda=3 then nota=21
      if cuerda=4 then nota=17
      if cuerda=5 then nota=12
      if cuerda=6 then nota=5      
      ENDIF      
           
      if afina=3 then
      if cuerda=1 then nota=27
      if cuerda=2 then nota=22
      if cuerda=3 then nota=18
      if cuerda=4 then nota=13
      if cuerda=5 then nota=8
      if cuerda=6 then nota=3
      ENDIF
     
      if afina=4 then
      if cuerda=1 then nota=27
      if cuerda=2 then nota=22
      if cuerda=3 then nota=19
      if cuerda=4 then nota=15
      if cuerda=5 then nota=10
      if cuerda=6 then nota=3
      ENDIF
     
      if afina=5 then
      if cuerda=1 then nota=29
      if cuerda=2 then nota=24
      if cuerda=3 then nota=20
      if cuerda=4 then nota=15
      if cuerda=5 then nota=10
      if cuerda=6 then nota=3
      ENDIF
     
      if afina=6 then
      if cuerda=1 then nota=27
      if cuerda=2 then nota=24
      if cuerda=3 then nota=20
      if cuerda=4 then nota=15
      if cuerda=5 then nota=10
      if cuerda=6 then nota=3
      ENDIF
     
      if afina=7 then
      if cuerda=1 then nota=27
      if cuerda=2 then nota=22
      if cuerda=3 then nota=20
      if cuerda=4 then nota=15
      if cuerda=5 then nota=10
      if cuerda=6 then nota=3
      ENDIF                  
           
      if afina=8 then
      if cuerda=1 then nota=25
      if cuerda=2 then nota=20
      if cuerda=3 then nota=16
      if cuerda=4 then nota=11
      if cuerda=5 then nota=6
      if cuerda=6 then nota=1
      ENDIF
     
      if afina=9 then
      if cuerda=1 then nota=29
      if cuerda=2 then nota=25
      if cuerda=3 then nota=20
      if cuerda=4 then nota=13
      if cuerda=5 then nota=8
      if cuerda=6 then nota=1
      ENDIF            
     
      if afina=10 then
      if cuerda=1 then nota=29
      if cuerda=2 then nota=26
      if cuerda=3 then nota=22
      if cuerda=4 then nota=17
      if cuerda=5 then nota=10
      if cuerda=6 then nota=5
      ENDIF
     
      if afina=11 then
      if cuerda=1 then nota=27
      if cuerda=2 then nota=24
      if cuerda=3 then nota=20
      if cuerda=4 then nota=15
      if cuerda=5 then nota=8
      if cuerda=6 then nota=3
      ENDIF
     
      if afina=12 then
      if cuerda=1 then nota=29
      if cuerda=2 then nota=24
      if cuerda=3 then nota=20
      if cuerda=4 then nota=15
      if cuerda=5 then nota=8
      if cuerda=6 then nota=3
      ENDIF        
     
      if afina=13 then
      if cuerda=1 then nota=18
      if cuerda=2 then nota=13
      if cuerda=3 then nota=21
      if cuerda=4 then nota=17
      if cuerda=5 then nota=11
      if cuerda=6 then nota=6
      ENDIF
         
      lcdout $FE,$C0,"cuer:",#cuerda

"Rutina para buscar los tipos de afinación y desplegarlos posteriormente    
 busca2:  
 
     lookup index,["0STANDARD E     >0< OPEN E       >0< STANDARD D   >0< OPEN D       >0< DROP D       >0<DOUBLE DROP D >0< D SUSPENDED  >0< STANDARD O   >0< OPEN C       >0< OPEN A       >0< OPEN G       >0< G6th         >0< STANDARD F   >0"],letra
     
     if (id=1)&(letra!="0"Giño then
        gosub despliega2
     endif
     
     if (id=1)&(letra="0"Giño then
        id=2
        index=0
        letra=0
        espa=0
        goto busca2
     endif
     
     if (id=0)&(letra="0"Giño then
     index=index+1
     
     if index=afina then
     id=1
     index=index+1    
     endif
     endif    
     goto busca2

busca2_1:
     
     lookup index,["0EADGBE0EBEG#BE0DGCFAD0DADF#BE0DADGBE0DADGBD0DADGAD0CFBbEbGC0CGCGCE0EAEAC#E0DGDGBD0DGDGBE0FBbEG#CF0"],letra
     if (id=3)&(letra!="0"Giño then
        gosub despliega2
     endif
     
     if (id=3)&(letra="0"Giño then
         goto salte_3
     endif
     
     if (id=2)&(letra="0"Giño then
     index=index+1
     
     if index=afina then
        id=3
        index=index+1    
     endif
     endif    
     goto busca2_1

salte_3:
        id=0
        letra=0
        espa=0
        index=0
        letra=0      
      if enter=1 then
        enter=0
        gosub cuerdas
        gosub notas
        fase=3
        adelante=0
        escoge=0      
      endif  
     
      gosub display      

"*******************************************************************************      
"Subrrutina que busca la nota pedida y la guarda                               *
"*******************************************************************************
 
 notas:
       
     lookup2 nota,[0,c2,Cs2_Db2,D2,Ds2_Eb2,E2_Fb2,Es2_F2,Fs2_Gb2,G2,Gs2_Ab2,A2,As2_Bb2,B2_Cb2,C3_Bs2,Cs3_Df3,D3,Ds3_Ef3,E3_Ff3,F3_Es3,Fs3_Gf3,G3,Gs3_Af3,A3,As3_Bf3,B3_Cf4,C4_Bs3,Cs4_Df4,D4,Ds4_Ef4,E4_Ff4,F4_Es4,Fs4_Gf4,G4],ncentral    
     return        

"*******************************************************************************      
"Rutinas de despliege en el LDC para notas, afinaciones y para cuerdas         *
"*******************************************************************************
     
 despliega:
 
   lcdout $FE,$C0+espa,letra
   espa=espa+1
   index=index+1
   return
   
 despliega2:
   
   if id=1 then
   lcdout $FE,$80+espa,letra
   endif
   
   if id=3 then
   lcdout $FE,$C8+espa,letra
   endif
   espa=espa+1
   index=index+1      
   return  

           
"*******************************************************************************      
"Subrrutina que asigna las características de la cuerda a afinar               *
"*******************************************************************************
 
 cuerdas:
      if cuerda=1 then
         permin=229
         permax=629
         notamax=18
         notamin=32
         nota=notamin
         pausa=0
         divisor=1
         z=2
       endif
       
       if cuerda=2 then                        
         permin=324
         permax=840
         notamax=13
         notamin=26
         nota=notamin
         pausa=10
         divisor=2
         z=1
        endif
       
       if cuerda=3 then
         permin=409
         permax=840
         notamax=13
         notamin=22
         nota=notamin
         pausa=50
         divisor=3
         Z=0
       endif
       
       if cuerda=4 then
         permin=515
         permax=1000
         notamax=10
         notamin=18
         nota=notamin
         PAUSA=800        
         divisor=3
         Z=0
       endif
       
       if cuerda=5 then
         permin=730
         permax=1681
         notamax=1
         notamin=13
         nota=notamin
         PAUSA=800
         divisor=3
         Z=0
       endif
       
       if cuerda=6 then
         permin=790
         permax=1681
         notamax=1
         notamin=12
         nota=notamin
         PAUSA=800
         divisor=3
         z=0    
       endif
       
       return                  
                         
"*******************************************************************************      
"Subrrutina que prepara al ususario para colocar el brazo y golpear la cuerda  *
"*******************************************************************************
 golpea:
       LCDOUT $FE,$1
       
       if (auto=1)&(escoge=0) then
       lcdout $FE,$80,"COLOQUE EL BRAZO"
       lcdout $FE,$C0,"EN LA CLAVIJA  >"
       high porta.1
       escoge=1
       ENDIF
       
       IF adelante=1 THEN    
       lcdout $FE,$80,"GOLPEE LA CUERDA"
       high porta.2
       adelante=0            
       endif
       gosub display
       
       END
     

Desconectado RAULDH

  • PIC10
  • *
  • Mensajes: 1
RE: ¡warnings PBPro!
« Respuesta #4 en: 08 de Diciembre de 2005, 00:45:00 »
Hola, creo que el problema es que el pic basic no trae en la lista de pics el 16f876A y solo viene el 16f876, asi sin la A, a mi me da el mismo warning pero al grabar el pic con el archivo funciona perfectamente.

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
RE: ¡warnings PBPro!
« Respuesta #5 en: 08 de Diciembre de 2005, 07:20:00 »
Hola Syd, como me imaginaba tu problema es que el codigo generado es muy grande mas de 3Kbytes, y el PBP compila bien hasta 2Kbytes, despues de esto debes fijarte en que pagina estas... como?? usando el registro PCLATH antes de cada goto y gosub, ademas debes usar sentencias mas cortas para no usar mucho codigo.... por ejemplo, mira los cambios que hice en tu codigo:

" @ device HS_OSC " no es necesatio especificar esto, lo puedes hacer en el grabador
........
     branchl fase, [modo, tipo]      " <-------------------- Mira
.........      
    select case afina           " <--------------- Otro Cambio
    case 1
        lookup cuerda+1, [29,24,20,15,10,5], nota
    case 2
        lookup cuerda+1, [29,24,21,17,12,5], nota
    case 3
        lookup cuerda+1, [27,22,18,13,8,3], nota
    case 4
        lookup cuerda+1, [27,22,19,15,10,3], nota
    case 5      
        lookup cuerda+1, [29,24,20,15,12,3], nota
    case 6
        lookup cuerda+1, [27,24,20,15,10,3], nota
    case 7
        lookup cuerda+1, [27,22,20,15,10,3], nota
    case 8
        lookup cuerda+1, [25,20,16,11,6,1], nota        
    case 9    
        lookup cuerda+1, [29,25,20,13,8,1], nota
    case 10      
        lookup cuerda+1, [29,26,22,17,10,5], nota
    case 11      
        lookup cuerda+1, [27,24,20,15,8,3], nota
    case 12
        lookup cuerda+1, [29,24,20,15,8,3], nota
    case 13    
        lookup cuerda+1, [18,13,21,17,11,6], nota
    end select          
      lcdout $FE,$C0,"cuer:",#cuerda
.......
       END
     

Intenta ver la forma de reducir tu codigo generado y luego empieza a ver como manejar las paginas de la memoria de programa.... otra opcion es hacerlos en C, me parece que no tiene el problema de las paginas...

Espero haberte ayudado. Un abrazo Sonrisa Gigante
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)

Desconectado Syd_Vegetable

  • PIC10
  • *
  • Mensajes: 4
RE: ¡warnings PBPro!
« Respuesta #6 en: 08 de Diciembre de 2005, 17:07:00 »
¡orale!

Tus ideas parece buenas para reducir el código muchas gracias, respecto el warning,
creo que sólo es eso, una advertencia que indica que me pasé de los primeros 2K, pero el programa no debe tener problemas.

Muchas gracias.
Saludos desde México.

Desconectado jorgeansuini

  • PIC18
  • ****
  • Mensajes: 340
RE: ¡warnings PBPro!
« Respuesta #7 en: 08 de Diciembre de 2005, 18:05:00 »
Hola:

Bueno ,por un lado se me adelantantaron con la manera de simplificar el código.-

Tambien podrias haber usado la estructura select..case.-

Por otro lado,efectivamente el warning, es solo eso ,una advertencia de que el compilador ha necesitado hacer un salto de página ,pero el mismo lo ha resuelto.-

Como comento alguien anteriormente, es un lucimiento de la gente de pbp de como te resuelve los saltos de pagina ,pero todo debe trabajar igual.-

Saludos
Jorge