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

Temas similares

05/08/2014 #1


Error en mi programa RFID: Syntax Error
Buenos Días/Tardes,

Ya que estuve en la búsqueda de el programa PBP 2.5L sin ningún éxito, espero que alguien pueda ayudarme con esté código, me da el siguiente error: [Error]RFID.pbp (12) : Syntax error
En la línea 12:
Código:
IOCB=%00000000 'Esta es la línea 12.
Aquí está todo el código:
Código:
INCLUDE "modedefs.bas"
 
@ DEVICE INTRC_OSC_NOCLKOUT
@ DEVICE MCLR_OFF
DEFINE OSC 4
 
ADCON0 = %00000000
OPTION_REG=%00000000
WPU=%00000011
CMCON0 =%00000111
ANSEL=%00000000
IOCB=%00000000
INTCON=%00000000
'OSCCON=%0111011
 
symbol RELE = GPIO.5
SYMBOL JUMPER = GPIO.4
SYMBOL PUSH = GPIO.3
SYMBOL RX_PIC = GPIO.2
SYMBOL LED_R = GPIO.0
SYMBOL LED_V = GPIO.1
 
INPUT RX_PIC
input push
 
INDIRIZZO var WORD  'Indirizzo memoria su cui scrivere presente sul buffer
ADDR var WORD       'Indirizzo memoria 24LC1024
I VAR byte          'Contatore di comodo
LAMP VAR BYTE
DATO_RX VAR BYTE[10]    'Dato ricevuto dalla seriale ID-12
DATO_I2C VAR BYTE[10]   'Dato letto dalla memoria
SN VAR BYTE 'S: Posizione occupata in mem. - N: Posizione non occupata in mem.
DATO_OK VAR BYTE    'Contatore per confronto dato letto in mem e da seriale
TROVATO VAR BIT     '0: Codice non trovato in mem - 1: Codice trovato in mem.
CONTATORE VAR BYTE  'Contatore di comodo per verifica pressione pulsante
FUNZIONE VAR BYTE   '0:NESSUNA - 1:MEMORIZZA - 2: CANCELLA ID - 3: RESET
RICERCA_TIPO VAR BYTE   '1: Ricercare dato presente in me - N: Ricercare posizione libera in mem.
TEMP VAR BYTE
OUT_FUNZ var byte
NUM_BYTE var BYTE   'MAX:5 --> NUM_BYTE*2 = Byte del codice del trasponder da memorizzare
CODICI VAR BYTE     'Numero di codici possibili in memoria
 
NUM_BYTE=2
CODICI= 255/NUM_BYTE
 
'************* I N I Z I O    P R O G R A M M A **************
 
GOSUB AVVIO 
 
MAIN:
    contatore=0
    if funzione=0 then  'Attivo funzione memorizzazione/cancellazione se il pulsante è premuto
        WHILE PUSH=0     
            PAUSE 500
            CONTATORE=CONTATORE+1
            select case contatore
                case is >=18    'Uscita
                    gosub out
                case is >=12    'Cancella
                    HIGH led_R
                    LOW led_V
                    FUNZIONE=2
                case is >=6     'Memorizza
                    HIGH led_v
                    HIGH led_r
                    FUNZIONE=1                
            end select     
        WEND
    else        'Se si è in memorizzazione/cancellazione controllo il pulsante per uscire dal menu
        WHILE PUSH=0
            PAUSE 500
            CONTATORE=CONTATORE+1
            if contatore>=6 then
                gosub out
            endif
        wend    
    endif
 
    serin2 RX_pic,84,1000,esci,[WAIT($02), STR DATO_RX\10]
    GOSUB COMPRIMI     
    SELECT CASE FUNZIONE
        CASE 0  'FUNZIONAMENTO CHIAVE
            RICERCA_TIPO="S"
            GOSUB RICERCA
            IF TROVATO=1 THEN       'Codice trovato
                IF JUMPER=0 THEN    'Bistabile
                    TOGGLE RELE 
                    TOGGLE led_v               
                ELSE                'Monostabile
                    HIGH rele 
                    high led_v               
                    PAUSE 1000
                    LOW RELE
                    low led_V
                ENDIF                 
            ELSE                    'Codice non trovato
                low led_v                
                high led_r
                PAUSE 1000                 
                low led_r
                if RELE=1 then          'Attiva il led verde se l'uscita era attiva prima di questo codice non valido                    
                    high led_v
                endif
            ENDIF                          
        CASE 1  'FUNZIONAMENTO MEMORIZZAZIONE
            RICERCA_TIPO="S"    'Verifico se il codice è già in memoria
            GOSUB RICERCA
            if trovato=0 then   'Non è già in memoria allora lo memorizzo
                RICERCA_TIPO="N"
                GOSUB RICERCA
                IF TROVATO=1 THEN
                    GOSUB SCRIVI
                ENDIF
            endif
        CASE 2  'FUNZIONAMENTO CANCELLAZIONE
            RICERCA_TIPO="S"
            GOSUB RICERCA
            IF TROVATO=1 THEN
                GOSUB CANCELLA
            ENDIF              
    END SELECT
    GOSUB AZZERA
ESCI: 
GOTO MAIN
 
'**************** O U T ****************
OUT:
    funzione=0
    GOSUB LAMPEGGIA_V
    WHILE PUSH=0    'SE IL PULSANTE è ANCORA PREMUTO PER SBAGLIO NON FACCIO NULLA
    WEND
    if RELE=1 then
        LOW LED_R
        high led_v
    endif
return
 
'**************** L A M P E G G I A ****************
LAMPEGGIA:
    low led_r
    low led_v
    for I=0 to 11
        toggle led_v
        toggle led_r
        PAUSE 200
    next i
return
 
'**************** L A M P E G G I A - V ****************
LAMPEGGIA_V:
    low led_v
    low led_r
    for I=0 to 11
        toggle led_v
        PAUSE 200
    next i
return
 
'**************** S C R I V I ****************
'Scrittura nella locazione INDIRIZZO del codice letto dalla seriale
SCRIVI:
    ADDR=indirizzo*NUM_BYTE
    for i=5-num_byte to 4
        WRITE addr,DATO_RX[i]
        PAUSE 10
        addr=addr+1
    next i
    low led_v                
    LOW LED_R
    PAUSE 1000
    high led_v
    HIGH LED_R
return
 
'**************** C A N C E L L A ****************
'Cancellazione di una specifica locazione
CANCELLA
    ADDR=indirizzo*NUM_BYTE
    for i=0 to num_byte-1        
        WRITE addr,$FF
        PAUSE 10
        addr=addr+1
    next i    
    low led_r
    PAUSE 1000
    high led_r
RETURN
 
'**************** R I C E R C A ****************
'Ricerca codice letto da seriale ID-12 con restituzione indirizzo
RICERCA:
    select case ricerca_tipo
        case "S"    'Ricerca tra le locazioni di memoria occupate
            FOR INDIRIZZO=0 TO CODICI-1
                ADDR=indirizzo*NUM_BYTE   
                for i=5-num_byte to 4
                    read addr,dato_i2c[i]
                    addr=addr+1
                next i
                GOSUB CONTROLLO
                IF DATO_ok=NUM_byte THEN
                    TROVATO=1                                       
                    GOTO ESCI_RICERCA
                ENDIF
            next indirizzo
        case "N"    'Ricerca posizione non occupata
            dato_ok=0
            FOR INDIRIZZO=0 TO CODICI-1
                ADDR=indirizzo*NUM_BYTE    
                for i=5-num_byte to 4
                    read addr,dato_i2c[i]
                    if dato_i2c[i]=$FF then
                        dato_ok=dato_ok+1    
                    endif
                    addr=addr+1
                next i
                IF DATO_OK=num_byte THEN
                    trovato=1
                    goto ESCI_RICERCA
                ENDIF
            next indirizzo
    end select    
ESCI_RICERCA:
RETURN
 
'**************** R E S E T _ M E M ****************
'Cancellazione totale memoria
RESET_MEM:
    HIGH led_r
    pause 2000    
    FOR INDIRIZZO=0 TO 255
        WRITE addr,$FF
        PAUSE 10
    NEXT INDIRIZZO    
    LOW led_r
    while push=0    'Se il pulsante è ancora premuto non faccio niente
    wend
RETURN
 
'**************** C O N T R O L L O ****************
'Confronto del dato letto in memoria e di quello letto da seriale ID-12
'se DATO_OK=10 allora i due dati sono uguali
CONTROLLO:
    DATO_OK=0
    for i=5-num_byte to 4
        IF DATO_I2C[i]=DATO_RX[i] THEN
            DATO_OK=DATO_OK+1
        ENDIF
    next i
RETURN
 
'**************** A Z Z E R A ****************
'Reset variabili
AZZERA:
    trovato=0
    FOR I=0 TO 9
        DATO_RX[I]=0
        DATO_I2C[I]=0
    NEXT I
RETURN
 
'**************** I N I Z I A L I Z Z A ****************
'Fase di inizializzazione all'avvio
INIZIALIZZA:    
    TROVATO=0
    CONTATORE=0
    FUNZIONE=0
    LOW RELE    
    GOSUB AZZERA     
RETURN
 
'**************** A V V I O ****************
'Controllo all'avvio, se il tasto è premuto per reset memoria oppure no
AVVIO:
    GOSUB LAMPEGGIA
    IF PUSH=0 THEN  'Se tasto premuto all'avvio forzo il reset memoria
        GOSUB RESET_MEM
    ENDIF
    GOSUB INIZIALIZZA
RETURN
 
'**************** C O M P R I M I ****************
'Converto il codice da ASCII (10 byte) a HEX (5 byte) per risparmiare spazio
'in memoria e quindi rendere più veloce la ricerca. In HEX impiega la metà del 
'tempo perchè vi è la metà dei byte da controllare
COMPRIMI:
    I=0
    WHILE I<9
        TEMP=DATO_RX[I]
        IF TEMP>57 THEN
            TEMP=TEMP - 55
        ELSE
            TEMP=TEMP - 48
        ENDIF                         
        TEMP=TEMP * 16
        DATO_RX[I]=TEMP
        TEMP=DATO_RX[I+1]
        IF TEMP>57 THEN
            TEMP=TEMP - 55
        ELSE
            TEMP=TEMP - 48
        ENDIF
        TEMP=TEMP + DATO_RX[I]    
        DATO_RX[I]=TEMP
        I=I+2
    WEND
    TEMP=DATO_RX[0]
    DATO_RX[0]=TEMP
    TEMP=DATO_RX[2]
    DATO_RX[1]=TEMP
    TEMP=DATO_RX[4]
    DATO_RX[2]=TEMP
    TEMP=DATO_RX[6]
    DATO_RX[3]=TEMP
    TEMP=DATO_RX[8]
    DATO_RX[4]=TEMP
RETURN
Si alguien puede ayudarme con esto por favor.
Gracias por su colaboración.
Saludos.
05/08/2014 #2


juliorojas dijo: Ver Mensaje
Buenos Días/Tardes,

Ya que estuve en la búsqueda de el programa PBP 2.5L sin ningún éxito, espero que alguien pueda ayudarme con esté código, me da el siguiente error: [Error]RFID.pbp (12) : Syntax error
En la línea 12:
Código:
IOCB=%00000000 'Esta es la línea 12.
Aquí está todo el código:
Código:
INCLUDE "modedefs.bas"
 
@ DEVICE INTRC_OSC_NOCLKOUT
@ DEVICE MCLR_OFF
DEFINE OSC 4
 
ADCON0 = %00000000
OPTION_REG=%00000000
WPU=%00000011
CMCON0 =%00000111
ANSEL=%00000000
IOCB=%00000000
INTCON=%00000000
'OSCCON=%0111011
 
symbol RELE = GPIO.5
SYMBOL JUMPER = GPIO.4
SYMBOL PUSH = GPIO.3
SYMBOL RX_PIC = GPIO.2
SYMBOL LED_R = GPIO.0
SYMBOL LED_V = GPIO.1
 
INPUT RX_PIC
input push
 
INDIRIZZO var WORD  'Indirizzo memoria su cui scrivere presente sul buffer
ADDR var WORD       'Indirizzo memoria 24LC1024
I VAR byte          'Contatore di comodo
LAMP VAR BYTE
DATO_RX VAR BYTE[10]    'Dato ricevuto dalla seriale ID-12
DATO_I2C VAR BYTE[10]   'Dato letto dalla memoria
SN VAR BYTE 'S: Posizione occupata in mem. - N: Posizione non occupata in mem.
DATO_OK VAR BYTE    'Contatore per confronto dato letto in mem e da seriale
TROVATO VAR BIT     '0: Codice non trovato in mem - 1: Codice trovato in mem.
CONTATORE VAR BYTE  'Contatore di comodo per verifica pressione pulsante
FUNZIONE VAR BYTE   '0:NESSUNA - 1:MEMORIZZA - 2: CANCELLA ID - 3: RESET
RICERCA_TIPO VAR BYTE   '1: Ricercare dato presente in me - N: Ricercare posizione libera in mem.
TEMP VAR BYTE
OUT_FUNZ var byte
NUM_BYTE var BYTE   'MAX:5 --> NUM_BYTE*2 = Byte del codice del trasponder da memorizzare
CODICI VAR BYTE     'Numero di codici possibili in memoria
 
NUM_BYTE=2
CODICI= 255/NUM_BYTE
 
'************* I N I Z I O    P R O G R A M M A **************
 
GOSUB AVVIO 
 
MAIN:
    contatore=0
    if funzione=0 then  'Attivo funzione memorizzazione/cancellazione se il pulsante è premuto
        WHILE PUSH=0     
            PAUSE 500
            CONTATORE=CONTATORE+1
            select case contatore
                case is >=18    'Uscita
                    gosub out
                case is >=12    'Cancella
                    HIGH led_R
                    LOW led_V
                    FUNZIONE=2
                case is >=6     'Memorizza
                    HIGH led_v
                    HIGH led_r
                    FUNZIONE=1                
            end select     
        WEND
    else        'Se si è in memorizzazione/cancellazione controllo il pulsante per uscire dal menu
        WHILE PUSH=0
            PAUSE 500
            CONTATORE=CONTATORE+1
            if contatore>=6 then
                gosub out
            endif
        wend    
    endif
 
    serin2 RX_pic,84,1000,esci,[WAIT($02), STR DATO_RX\10]
    GOSUB COMPRIMI     
    SELECT CASE FUNZIONE
        CASE 0  'FUNZIONAMENTO CHIAVE
            RICERCA_TIPO="S"
            GOSUB RICERCA
            IF TROVATO=1 THEN       'Codice trovato
                IF JUMPER=0 THEN    'Bistabile
                    TOGGLE RELE 
                    TOGGLE led_v               
                ELSE                'Monostabile
                    HIGH rele 
                    high led_v               
                    PAUSE 1000
                    LOW RELE
                    low led_V
                ENDIF                 
            ELSE                    'Codice non trovato
                low led_v                
                high led_r
                PAUSE 1000                 
                low led_r
                if RELE=1 then          'Attiva il led verde se l'uscita era attiva prima di questo codice non valido                    
                    high led_v
                endif
            ENDIF                          
        CASE 1  'FUNZIONAMENTO MEMORIZZAZIONE
            RICERCA_TIPO="S"    'Verifico se il codice è già in memoria
            GOSUB RICERCA
            if trovato=0 then   'Non è già in memoria allora lo memorizzo
                RICERCA_TIPO="N"
                GOSUB RICERCA
                IF TROVATO=1 THEN
                    GOSUB SCRIVI
                ENDIF
            endif
        CASE 2  'FUNZIONAMENTO CANCELLAZIONE
            RICERCA_TIPO="S"
            GOSUB RICERCA
            IF TROVATO=1 THEN
                GOSUB CANCELLA
            ENDIF              
    END SELECT
    GOSUB AZZERA
ESCI: 
GOTO MAIN
 
'**************** O U T ****************
OUT:
    funzione=0
    GOSUB LAMPEGGIA_V
    WHILE PUSH=0    'SE IL PULSANTE è ANCORA PREMUTO PER SBAGLIO NON FACCIO NULLA
    WEND
    if RELE=1 then
        LOW LED_R
        high led_v
    endif
return
 
'**************** L A M P E G G I A ****************
LAMPEGGIA:
    low led_r
    low led_v
    for I=0 to 11
        toggle led_v
        toggle led_r
        PAUSE 200
    next i
return
 
'**************** L A M P E G G I A - V ****************
LAMPEGGIA_V:
    low led_v
    low led_r
    for I=0 to 11
        toggle led_v
        PAUSE 200
    next i
return
 
'**************** S C R I V I ****************
'Scrittura nella locazione INDIRIZZO del codice letto dalla seriale
SCRIVI:
    ADDR=indirizzo*NUM_BYTE
    for i=5-num_byte to 4
        WRITE addr,DATO_RX[i]
        PAUSE 10
        addr=addr+1
    next i
    low led_v                
    LOW LED_R
    PAUSE 1000
    high led_v
    HIGH LED_R
return
 
'**************** C A N C E L L A ****************
'Cancellazione di una specifica locazione
CANCELLA
    ADDR=indirizzo*NUM_BYTE
    for i=0 to num_byte-1        
        WRITE addr,$FF
        PAUSE 10
        addr=addr+1
    next i    
    low led_r
    PAUSE 1000
    high led_r
RETURN
 
'**************** R I C E R C A ****************
'Ricerca codice letto da seriale ID-12 con restituzione indirizzo
RICERCA:
    select case ricerca_tipo
        case "S"    'Ricerca tra le locazioni di memoria occupate
            FOR INDIRIZZO=0 TO CODICI-1
                ADDR=indirizzo*NUM_BYTE   
                for i=5-num_byte to 4
                    read addr,dato_i2c[i]
                    addr=addr+1
                next i
                GOSUB CONTROLLO
                IF DATO_ok=NUM_byte THEN
                    TROVATO=1                                       
                    GOTO ESCI_RICERCA
                ENDIF
            next indirizzo
        case "N"    'Ricerca posizione non occupata
            dato_ok=0
            FOR INDIRIZZO=0 TO CODICI-1
                ADDR=indirizzo*NUM_BYTE    
                for i=5-num_byte to 4
                    read addr,dato_i2c[i]
                    if dato_i2c[i]=$FF then
                        dato_ok=dato_ok+1    
                    endif
                    addr=addr+1
                next i
                IF DATO_OK=num_byte THEN
                    trovato=1
                    goto ESCI_RICERCA
                ENDIF
            next indirizzo
    end select    
ESCI_RICERCA:
RETURN
 
'**************** R E S E T _ M E M ****************
'Cancellazione totale memoria
RESET_MEM:
    HIGH led_r
    pause 2000    
    FOR INDIRIZZO=0 TO 255
        WRITE addr,$FF
        PAUSE 10
    NEXT INDIRIZZO    
    LOW led_r
    while push=0    'Se il pulsante è ancora premuto non faccio niente
    wend
RETURN
 
'**************** C O N T R O L L O ****************
'Confronto del dato letto in memoria e di quello letto da seriale ID-12
'se DATO_OK=10 allora i due dati sono uguali
CONTROLLO:
    DATO_OK=0
    for i=5-num_byte to 4
        IF DATO_I2C[i]=DATO_RX[i] THEN
            DATO_OK=DATO_OK+1
        ENDIF
    next i
RETURN
 
'**************** A Z Z E R A ****************
'Reset variabili
AZZERA:
    trovato=0
    FOR I=0 TO 9
        DATO_RX[I]=0
        DATO_I2C[I]=0
    NEXT I
RETURN
 
'**************** I N I Z I A L I Z Z A ****************
'Fase di inizializzazione all'avvio
INIZIALIZZA:    
    TROVATO=0
    CONTATORE=0
    FUNZIONE=0
    LOW RELE    
    GOSUB AZZERA     
RETURN
 
'**************** A V V I O ****************
'Controllo all'avvio, se il tasto è premuto per reset memoria oppure no
AVVIO:
    GOSUB LAMPEGGIA
    IF PUSH=0 THEN  'Se tasto premuto all'avvio forzo il reset memoria
        GOSUB RESET_MEM
    ENDIF
    GOSUB INIZIALIZZA
RETURN
 
'**************** C O M P R I M I ****************
'Converto il codice da ASCII (10 byte) a HEX (5 byte) per risparmiare spazio
'in memoria e quindi rendere più veloce la ricerca. In HEX impiega la metà del 
'tempo perchè vi è la metà dei byte da controllare
COMPRIMI:
    I=0
    WHILE I<9
        TEMP=DATO_RX[I]
        IF TEMP>57 THEN
            TEMP=TEMP - 55
        ELSE
            TEMP=TEMP - 48
        ENDIF                         
        TEMP=TEMP * 16
        DATO_RX[I]=TEMP
        TEMP=DATO_RX[I+1]
        IF TEMP>57 THEN
            TEMP=TEMP - 55
        ELSE
            TEMP=TEMP - 48
        ENDIF
        TEMP=TEMP + DATO_RX[I]    
        DATO_RX[I]=TEMP
        I=I+2
    WEND
    TEMP=DATO_RX[0]
    DATO_RX[0]=TEMP
    TEMP=DATO_RX[2]
    DATO_RX[1]=TEMP
    TEMP=DATO_RX[4]
    DATO_RX[2]=TEMP
    TEMP=DATO_RX[6]
    DATO_RX[3]=TEMP
    TEMP=DATO_RX[8]
    DATO_RX[4]=TEMP
RETURN
Si alguien puede ayudarme con esto por favor.
Gracias por su colaboración.
Saludos.
Hola...Tal vez porque el Pic que estas usando no tenga dicho registro y como no lo dices y no indicas de donde sacaste el programa en Italiano es lo que te puedo aportar.
Saludos.

Ric.
05/08/2014 #3


link programa
gracias ric.

el programa lo baje de Internet pero no lo e podido compilar para sacar el .hex le envió el link de donde esta el programa y el autor.

este es el link.


gracias por tu ayuda

que dios lo bendiga.
Archivos Adjuntos
Tipo de Archivo: txt link.txt (71 Bytes, 6 visitas)
05/08/2014 #4


Acá tienes en el adjunto los archivos sin errores(PBP ver2.50A)...aparentemente es la versión que tú utilizas.
El pic es el 12F683.

Ric.
Archivos Adjuntos
Tipo de Archivo: zip pack.zip (7,4 KB (Kilobytes), 3 visitas)
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.