Curso de programación de PIC en PICBasic Pro

Hola a todos.
Escribo este primer mensaje como presentación en este magnifico foro.
Estoy haciendo un generador de RF mezcla DDS y VCO's. Utilizare el DDS un ad9850 hasta los 20MHz y los VCO hasta los 200MHz. La parte de los VCO la tengo terminada, y la parte del DDS estoy un poco estancado. Tengo funcionando el AD9850 y un codificador con el siguiente código:
Código:
DEFINE  LCD_DREG        PORTA        ' Puerto de Datos del PIC
DEFINE  LCD_DBIT        0            ' Empieza en PORTA.0 hasta PORTA.3
DEFINE  LCD_RSREG       PORTA
DEFINE  LCD_RSBIT       4             ' Posicion de la linea RS
DEFINE  LCD_EREG        PORTA
DEFINE  LCD_EBIT        5             ' Posicion de la linea E
DEFINE  LCD_BITS        4             ' 4-bit data bus 
DEFINE  LCD_LINES       2             ' LCD lineas
DEFINE  LCD_COMMANDUS   1000         ' Retardo Comandos 
DEFINE  LCD_DATAUS      50           ' Retardo Datos 

DEFINE  OSC 48                        ' Especifica reloj

'_________________________________________________
'   Configuracion  registros PIC   
'_________________________________________________

TRISA  = %00000000           ' Configura in/out  0=salida
TRISB  = %11111111           ' Configura in/out  1=entrada
TRISC  = %00110000           ' Configura in/out   
PORTA   = 0                     
PORTB   = 0
PORTC   = 0
LATA    = 0                  ' Registros Latch
LATB    = 0
LATC    = 0
ADCON0  = $00                ' Deshabilita ADC
ADCON1  = $0F                ' Pines ADC todos digitales
CMCON   = $07                ' Comparador deshabilitado
UCON    = %00000000          ' Deshabilita USB y habilita RC4 e RC5
UCFG.3  = 1                  ' Deshabilita USB Transceiver
INTCON2.7=0                  ' Habilita R de pull-up
'T2CON   = %00000100          ' Prescaler=1 TMR2=ON
PORTA   = 0
PORTB   = 0
PORTC   = 0    

INTCON.7 = 1                 ' Habilita interrupciones globales GIE=1
INTCON.6 = 1                 ' Habilita interrupciones perifericas PEIE=1   
PIE1.5 = 1                   ' Habilita interrupciones recepciones RCIE
' On Interrupt Goto RxService  ' Asignar interrupción

'___________________________________
'   Simbolos del programa
'___________________________________
symbol EA = portc.4             ' Encoder A
symbol EB = portc.5             ' Encoder B
symbol P6 = portb.6             ' Menu
symbol P7 = portb.7             ' 
symbol P0 = portb.0             ' 

'___________________________________
'   Variables del programa   
'___________________________________
  
ValorSinto    VAR   LONG     ' Palabra de sintonia
Frecuencia    var   LONG     ' Valor frecuencia
Control       var   BYTE     ' Registro control DDS
Dato_pin      var   PortC.0  ' Pin de Datos
Reloj_pin     var   PortC.2  ' Pin de Reloj
Carga_Pin     var   PortC.1  ' Pin de actualizacion del DDS
Enc           var   byte     ' Lectura encoder
Ent_Parte     var   word     ' Parte entera division    
Fra_Parte     var   word     ' Parte decimal division

'___________________________________
'   Titulo del LCD en PowerON
'___________________________________

    pause   200
    lcdout  $FE,1, $FE,2     'Limpia LCD y va primera linea
    LCDOUT  "CCT2013 V1.0" 

'___________________________________
'   Inicializa variables   
'___________________________________

    Control=0               ' Ajuste inicial variable modificable       
    Frecuencia=5000000      ' Ajusta frecuenza inicial
    Fre_Rango=2             ' Rango inicial
    Fre_Desplaza=0          ' Modifica simbolo mas significativo
    Carga_Pin= 1    
    pause 2000
    gosub Calcular
    gosub Enviar_DDS
    
'___________________________________
'   Principal
'___________________________________   

Retorno_Menu
    Pause 10
    if p6=0 then Retorno_Menu
    call LCD_Refresco
    
Principal
    if p6=0 then goto Menu
    if ea=0 then goto Enc_Giro
goto principal 

Enc_Giro 
    if EB=0 then Enc_Inc
    
Enc_Dec
    
    Frecuencia = Frecuencia-1 
    GOTO    Enc_Confirm

Enc_Inc    
    Frecuencia = Frecuencia+1  
    goto    Enc_Confirm
    
Enc_Confirm
    if frecuencia>20000000 then frecuencia=20000000 
    if Frecuencia<400000 then Frecuencia=400000    
    call LCD_Refresco
    gosub Calcular
    gosub Enviar_DDS         
       
Enc_Complete    
    if EA=1 and EB=1 then  Principal        
    goto    Enc_Complete   
goto Principal

'___________________________________
'   Gestion pulsadores
'___________________________________   

'___________________________________
'   Gestiona Menus
'___________________________________   
 menu

 goto Principal
'___________________________________
'   Subprograma de calibración
'___________________________________   





'___________________________________
'   Actualizacion LCD
'___________________________________   

LCD_Refresco
    
    lcdout $FE,1, $FE,2
    lcdout "F: "
    
    if frecuencia < 1000000 then
        Ent_Parte = Frecuencia/1000
        Fra_Parte = Frecuencia//1000         
        lcdout #Ent_Parte, "."
        if Fra_parte < 100 then lcdout "0"
        if Fra_Parte < 10 then lcdout "0"
        lcdout #Fra_Parte, "KHz"
    else
        Ent_Parte = Frecuencia/1000000
        Fra_Parte = Frecuencia//1000000         
        lcdout #Ent_Parte, "."
        if Fra_parte < 100 then lcdout "0"
        if Fra_Parte < 10 then lcdout "0"
        lcdout #Fra_Parte, "MHz"
    endif
return

'___________________________________
'   Actualiza frecuencia del DDS
'___________________________________ 

Calcular

    ValorSinto = Frecuencia ** 2251800         

return

'___________________________________
'   Transferir al DDS
'___________________________________   

Enviar_DDS
    SHIFTOUT Dato_Pin, Reloj_pin, 0,[ValorSinto.BYTE0, ValorSinto.BYTE1, ValorSinto.BYTE2, ValorSinto.BYTE3, Control]
    Carga_Pin = 1
    pauseus 10
    Carga_Pin = 0
    pause 1000
return

Utilizo un PIC de la serie 18 para utilizar variables Long
Pero me gustaría ponerle un teclado matricial 4x4 para poder introducir la frecuencia. Por ejemplo escribir "4566000MHz". Me gustaría hacer que tenga barrido, introduciendo la frecuencia de inicio, la frecuencia final y los incrementos de frecuencia.
Todas las ideas serán bienvenidas.
 
Última edición por un moderador:
hola a todos. aquí desparchado sin nada que hacer me dedique a realizar una matriz para adorno de mi banco de trabajo y haciendo pruebas hice 2 programitas uno para una figura fija y otro para una móvil pero: al compilar la fija funciona perfectamente y al compilar la móvil el compilador no hace nada y genera el asm pero no el hex y se queda bloqueado incluso para que funcione de nuevo debo reiniciar el pc como sí se tratara de un virus:cabezon:, sera que alguien me puede ayudar echándole un ojito a mi proyecto? a ver sí puedo hacer funcionar la figura móvil? aquí les subo los archivos para que los vean les agradezco de antemano su ayuda
 

Adjuntos

  • figura fija 16f873a.rar
    17 KB · Visitas: 72
Última edición:
Hola a todos.
Escribo este primer mensaje como presentación en este magnifico foro.
Estoy haciendo un generador de RF mezcla DDS y VCO's. Utilizare el DDS un ad9850 hasta los 20MHz y los VCO hasta los 200MHz. La parte de los VCO la tengo terminada, y la parte del DDS estoy un poco estancado. Tengo funcionando el AD9850 y un codificador con el siguiente código:
Código:
DEFINE  LCD_DREG        PORTA        ' Puerto de Datos del PIC
DEFINE  LCD_DBIT        0            ' Empieza en PORTA.0 hasta PORTA.3
DEFINE  LCD_RSREG       PORTA
DEFINE  LCD_RSBIT       4             ' Posicion de la linea RS
DEFINE  LCD_EREG        PORTA
DEFINE  LCD_EBIT        5             ' Posicion de la linea E
DEFINE  LCD_BITS        4             ' 4-bit data bus 
DEFINE  LCD_LINES       2             ' LCD lineas
DEFINE  LCD_COMMANDUS   1000         ' Retardo Comandos 
DEFINE  LCD_DATAUS      50           ' Retardo Datos 

DEFINE  OSC 48                        ' Especifica reloj

'_________________________________________________
'   Configuracion  registros PIC   
'_________________________________________________

TRISA  = %00000000           ' Configura in/out  0=salida
TRISB  = %11111111           ' Configura in/out  1=entrada
TRISC  = %00110000           ' Configura in/out   
PORTA   = 0                     
PORTB   = 0
PORTC   = 0
LATA    = 0                  ' Registros Latch
LATB    = 0
LATC    = 0
ADCON0  = $00                ' Deshabilita ADC
ADCON1  = $0F                ' Pines ADC todos digitales
CMCON   = $07                ' Comparador deshabilitado
UCON    = %00000000          ' Deshabilita USB y habilita RC4 e RC5
UCFG.3  = 1                  ' Deshabilita USB Transceiver
INTCON2.7=0                  ' Habilita R de pull-up
'T2CON   = %00000100          ' Prescaler=1 TMR2=ON
PORTA   = 0
PORTB   = 0
PORTC   = 0    

INTCON.7 = 1                 ' Habilita interrupciones globales GIE=1
INTCON.6 = 1                 ' Habilita interrupciones perifericas PEIE=1   
PIE1.5 = 1                   ' Habilita interrupciones recepciones RCIE
' On Interrupt Goto RxService  ' Asignar interrupción

'___________________________________
'   Simbolos del programa
'___________________________________
symbol EA = portc.4             ' Encoder A
symbol EB = portc.5             ' Encoder B
symbol P6 = portb.6             ' Menu
symbol P7 = portb.7             ' 
symbol P0 = portb.0             ' 

'___________________________________
'   Variables del programa   
'___________________________________
  
ValorSinto    VAR   LONG     ' Palabra de sintonia
Frecuencia    var   LONG     ' Valor frecuencia
Control       var   BYTE     ' Registro control DDS
Dato_pin      var   PortC.0  ' Pin de Datos
Reloj_pin     var   PortC.2  ' Pin de Reloj
Carga_Pin     var   PortC.1  ' Pin de actualizacion del DDS
Enc           var   byte     ' Lectura encoder
Ent_Parte     var   word     ' Parte entera division    
Fra_Parte     var   word     ' Parte decimal division

'___________________________________
'   Titulo del LCD en PowerON
'___________________________________

    pause   200
    lcdout  $FE,1, $FE,2     'Limpia LCD y va primera linea
    LCDOUT  "CCT2013 V1.0" 

'___________________________________
'   Inicializa variables   
'___________________________________

    Control=0               ' Ajuste inicial variable modificable       
    Frecuencia=5000000      ' Ajusta frecuenza inicial
    Fre_Rango=2             ' Rango inicial
    Fre_Desplaza=0          ' Modifica simbolo mas significativo
    Carga_Pin= 1    
    pause 2000
    gosub Calcular
    gosub Enviar_DDS
    
'___________________________________
'   Principal
'___________________________________   

Retorno_Menu
    Pause 10
    if p6=0 then Retorno_Menu
    call LCD_Refresco
    
Principal
    if p6=0 then goto Menu
    if ea=0 then goto Enc_Giro
goto principal 

Enc_Giro 
    if EB=0 then Enc_Inc
    
Enc_Dec
    
    Frecuencia = Frecuencia-1 
    GOTO    Enc_Confirm

Enc_Inc    
    Frecuencia = Frecuencia+1  
    goto    Enc_Confirm
    
Enc_Confirm
    if frecuencia>20000000 then frecuencia=20000000 
    if Frecuencia<400000 then Frecuencia=400000    
    call LCD_Refresco
    gosub Calcular
    gosub Enviar_DDS         
       
Enc_Complete    
    if EA=1 and EB=1 then  Principal        
    goto    Enc_Complete   
goto Principal

'___________________________________
'   Gestion pulsadores
'___________________________________   

'___________________________________
'   Gestiona Menus
'___________________________________   
 menu

 goto Principal
'___________________________________
'   Subprograma de calibración
'___________________________________   





'___________________________________
'   Actualizacion LCD
'___________________________________   

LCD_Refresco
    
    lcdout $FE,1, $FE,2
    lcdout "F: "
    
    if frecuencia < 1000000 then
        Ent_Parte = Frecuencia/1000
        Fra_Parte = Frecuencia//1000         
        lcdout #Ent_Parte, "."
        if Fra_parte < 100 then lcdout "0"
        if Fra_Parte < 10 then lcdout "0"
        lcdout #Fra_Parte, "KHz"
    else
        Ent_Parte = Frecuencia/1000000
        Fra_Parte = Frecuencia//1000000         
        lcdout #Ent_Parte, "."
        if Fra_parte < 100 then lcdout "0"
        if Fra_Parte < 10 then lcdout "0"
        lcdout #Fra_Parte, "MHz"
    endif
return

'___________________________________
'   Actualiza frecuencia del DDS
'___________________________________ 

Calcular

    ValorSinto = Frecuencia ** 2251800         

return

'___________________________________
'   Transferir al DDS
'___________________________________   

Enviar_DDS
    SHIFTOUT Dato_Pin, Reloj_pin, 0,[ValorSinto.BYTE0, ValorSinto.BYTE1, ValorSinto.BYTE2, ValorSinto.BYTE3, Control]
    Carga_Pin = 1
    pauseus 10
    Carga_Pin = 0
    pause 1000
return
Utilizo un PIC de la serie 18 para utilizar variables Long
Pero me gustaría ponerle un teclado matricial 4x4 para poder introducir la frecuencia. Por ejemplo escribir "4566000MHz". Me gustaría hacer que tenga barrido, introduciendo la frecuencia de inicio, la frecuencia final y los incrementos de frecuencia.
Todas las ideas serán bienvenidas.

Hola...Bienvenido al foro y yo estuve hace tiempo pensando en un proyecto similar pero por aquí se hace muy difícil conseguir en el mercado local los materiales necesarios e imposible importarlos...¿que compilador estas usando? por que ni el Proton ni el PBP (al menos las versiones que yo tengo) reconocen la variable definidas como LONG.
Lo del teclado deberías dejar el puerto B libre y allí colocarlo.
Saludos.

Ric.
 
hola a todos. aquí desparchado sin nada que hacer me dedique a realizar una matriz para adorno de mi banco de trabajo y haciendo pruebas hice 2 programitas uno para una figura fija y otro para una móvil pero: al compilar la fija funciona perfectamente y al compilar la móvil el compilador no hace nada y genera el asm pero no el hex y se queda bloqueado incluso para que funcione de nuevo debo reiniciar el pc como sí se tratara de un virus:cabezon:, sera que alguien me puede ayudar echándole un ojito a mi proyecto? a ver sí puedo hacer funcionar la figura móvil? aquí les subo los archivos para que los vean les agradezco de antemano su ayuda

Hola compañero no veo ningún problema lo único que hice fue apagar todos los fuses y colocar el master clear a 5v es como una carita feliz pero no se mueve lo que hace es como si estuviera hablando o algo así, prueba cambiando eso y me avisas
 
Hola...Bienvenido al foro y yo estuve hace tiempo pensando en un proyecto similar pero por aquí se hace muy difícil conseguir en el mercado local los materiales necesarios e imposible importarlos...¿que compilador estas usando? por que ni el Proton ni el PBP (al menos las versiones que yo tengo) reconocen la variable definidas como LONG.
Lo del teclado deberías dejar el puerto B libre y allí colocarlo.
Saludos.

Ric.
La version del PBP es la 2.60. A partir de esta version puedes declarar variables LONG de 32 bits, siempre que utilizes PIC de la serie 18. La version del Microcode Studio es la 4.0.0.0, y en opciones del compilador tienes que marcar la casilla "use PBPL".
Los materiales los consigo por ebay.
La parte de 20MHz a 200MHz la tengo hecha y funcionando con 4 osciladores (2 VCO de micro-circuits (POS200 y POS100 comprados por internet en una tienda de Australia), y 2 VCO hechos con transistores fet. La parte de 400KHz a 20MHz es la que voy hacer con un modulo DDS AD9850 comprado en ebay por 3€. Luego cuando pase de 20MHz quiero utilizar el DDS como fuente para el PLL y pilotar los otros VCO. Tengo tambien un nivelador de amplitud funcionando perfectamente que conecto a las salidas del DDS y VCO's. Me falta por hacer un amplificador de banda ancha, un atenuador y un medidor de la potencia de la señal.
El teclado lo tengo en el portB, pero no consigo que me funcione bien. Realmente lo que quiero es introducir cualquier numero entre 1 y 200000000, que me lo vaya mostrando en el LCD y cuando pulse por ejemplo "#" que me lo introduzca en la variable "frecuencia".
Piensa que cuando ulitize la funcion de "sweep" (barrido), tengo que introducir 3 frecuencias. A saber: Inicial, Final e Incremento. Tambien quiero poner 2 barridos con frecuencias centrales de 455KHz y 10,7MHz para ajustar los filtros de las FI.
Si estas interesado puedo enviarte mas informacion, aunque la tengo todavia como borrador, y los link donde he comprado las cosas.
Cristobal
 
La version del PBP es la 2.60. A partir de esta version puedes declarar variables LONG de 32 bits, siempre que utilizes PIC de la serie 18. La version del Microcode Studio es la 4.0.0.0, y en opciones del compilador tienes que marcar la casilla "use PBPL".
Los materiales los consigo por ebay.
La parte de 20MHz a 200MHz la tengo hecha y funcionando con 4 osciladores (2 VCO de micro-circuits (POS200 y POS100 comprados por internet en una tienda de Australia), y 2 VCO hechos con transistores fet. La parte de 400KHz a 20MHz es la que voy hacer con un modulo DDS AD9850 comprado en ebay por 3€. Luego cuando pase de 20MHz quiero utilizar el DDS como fuente para el PLL y pilotar los otros VCO. Tengo tambien un nivelador de amplitud funcionando perfectamente que conecto a las salidas del DDS y VCO's. Me falta por hacer un amplificador de banda ancha, un atenuador y un medidor de la potencia de la señal.
El teclado lo tengo en el portB, pero no consigo que me funcione bien. Realmente lo que quiero es introducir cualquier numero entre 1 y 200000000, que me lo vaya mostrando en el LCD y cuando pulse por ejemplo "#" que me lo introduzca en la variable "frecuencia".
Piensa que cuando ulitize la funcion de "sweep" (barrido), tengo que introducir 3 frecuencias. A saber: Inicial, Final e Incremento. Tambien quiero poner 2 barridos con frecuencias centrales de 455KHz y 10,7MHz para ajustar los filtros de las FI.
Si estas interesado puedo enviarte mas informacion, aunque la tengo todavia como borrador, y los link donde he comprado las cosas.
Cristobal

Ok me faltaba lo de la casilla "PBPL" ...te sugiero que pases por aquí (https://www.google.com/url?q=https:...ds-cse&usg=AFQjCNGSuhpCArWCM2eylDGieBx7LF3HeQ ) donde hay un atenuador de RF en distintas versiones que quizás te interese. Entiendo la forma y disponibilidad de materiales desde donde tú resides pero NO es lo mismo desde aquí. Por otra parte en este momento en particular ya no me seria de mucha utilidad mas allá del ejercicio de "hacerlo".
En este mismo hilo hay algunos ejemplos de PBP y el uso de teclado que podrías revisar...utiliza el buscador del foro que es una herramienta invaluable. Tal ves para el amplificador de banda ancha puedas usar algún MMIC tipo MAR X(MAR4,5,6,7,etc).
Saludos.

Ric.
 
Muy buenas compañeros en esta oportunidad vengo con una duda con respecto a interrupciones en PBP. El caso es que estoy tratando de detectar flancos de bajada y subida por un pin del pic esto lo hago a través de la interrupción externa y al momento de detectar el flanco ya sea de bajada o subida la idea es deshabilitar la interrupción externa y habilitar la interrupción por desbordamiento del TMR0 y luego esperar hasta que se desborde el TMR0 y en ese momento hacerlo inverso activar la interrupción externa de nuevo y desactivar la del TMR0.

Ya he avanzado bastante con respecto a esto pero aun no logro que funcione al 100%.
Comento como hago cada cosa.

El pic es el 12F675

Para la detección de los flancos lo hago intercambiando el bit 6 del registro option de la siguiente manera:

Código:
OPTION_REG.6 = OPTION_REG.6 ^%1

Eso hace que si la interrupción fue por flanco de bajada el bit 6 estaba en 0 y por lo tanto lo cambio a 1 para que detecte cuando vuelva a cambia.

INTEDG: Interrupt Edge Select bit
1 = Interrupt on rising edge of GP2/INT pin
0 = Interrupt on falling edge of GP2/INT pin

Hasta aqui todo funciona al 100%

Ahora los pulsos son constantes tardan aproximadamente 8.3ms eso tomándolo de la red de 60Hz. Y la idea de esta parte era hacer un detector de cruce por cero.

Luego sabiendo esto lo que quiero es a partir del punto de detección implementar el TMR0 para activar el triac. Y porque el TMR0 y no un simple pause. Bueno de tanto investigar y leer resulta que mientras que el TMR0 me permite continuar con el programa principal el pause no me lo permite y me genera conflictos.

Entonces para lograr esto genere una variable para incrementar o decrementar el TMR0.
Active el TMR0 luego de la interrupción externa y deshabilite la interrupción externa.
Espero hasta que se desborde el TMR0 y luego activo el triac por un instante y lo desactivo.
Y luego desactivo la interrupción por TMR0 y vuelvo activar la interrupción externa.

Ahora funciona? Si si funciona, lo probé en físico.
Me permite hacer el programa principal? No no me lo ejecuta correctamente.

El loop de interrupción es este:

Código:
DISABLE
CRUCE_POR_CERO:
TMR0 = A 'variable que contiene el valor para el desboramiento del TMR0 de 0 a 255
IF INTCON.2 = 1 AND INTCON.1 = 0 THEN 'bandera de interrupción del TMR0 y la bandera de 
INTCON.2 = 0                                  'de la interrupción externa
TRIAC = 1
'PAUSEUS 100
TRIAC = 0   
INTCON = %10010000    'deshabilito la interrupción por TMR0
ELSE                                  'en caso de que no se haya desbordado el TMR0
OPTION_REG.6 = OPTION_REG.6 ^%1 'intercambio el estado del bit de interrupción externa
INTCON = %10100000                'habilito la interrupción por TMR0 y deshabilito la externa. 
ENDIF 
RESUME
ENABLE


Aun no se como hacer lo de darle prioridades a las interrupciones me gustaría saber si es eso lo otro que se puede hacer y como lo haría.

Si tengo algún error en el código avísenme se los agradezco muchas gracias de antemano
 
Hola compañero no veo ningún problema lo único que hice fue apagar todos los fuses y colocar el master clear a 5v es como una carita feliz pero no se mueve lo que hace es como si estuviera hablando o algo así, prueba cambiando eso y me avisas

jajaja como te pareció la figura muchas gracias por tu ayuda:aplauso:
lo vuelvo a decir eres un monstruo para esta vaina gracias.
 
buenas, pidiendo una manita para poder hacer el cambio de variable en un select case, abajo pongo el ejemplo, esta con un boton que al precionarlo hace el cambio pero la variable tiempo no cambia su valor lo he declaro de 2 formas y no funciona espero puedan ayudarme, gracias.

Código:
SELECT CASE cambios
CASE CAMBIOS = 1 : TIEMPO = 200 : lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
CASE CAMBIOS = 2 : TIEMPO = 150 : lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
CASE CAMBIOS = 3 : TIEMPO = 100 : lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
CASE CAMBIOS = 4 : TIEMPO = 50 : lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
CASE CAMBIOS = 5 : TIEMPO = 20 : lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
END SELECT

Código:
SELECT CASE cambios
CASE CAMBIOS = 1
   TIEMPO = 200
   lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
CASE CAMBIOS = 2
   TIEMPO = 150
   lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
CASE CAMBIOS = 3
   TIEMPO = 100
   lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
CASE CAMBIOS = 4
   TIEMPO = 50
   lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
CASE CAMBIOS = 5
   TIEMPO = 20
   lcdout $FE,$C0,DEC CAMBIOS, DEC TIEMPO
END SELECT
 
Última edición por un moderador:
buenas, pidiendo una manita para poder hacer el cambio de variable en un select case, abajo pongo el ejemplo, esta con un boton que al precionarlo hace el cambio pero la variable tiempo no cambia su valor lo he declaro de 2 formas y no funciona espero puedan ayudarme, gracias.
Tienes que hacer la selección así...
Código:
SELECT CASE cambios
CASE 1
   TIEMPO = 200
   lcdout $FE,$C0,DEC CAMBIOS, DEC3 TIEMPO
CASE 2
   TIEMPO = 150
   lcdout $FE,$C0,DEC CAMBIOS, DEC3 TIEMPO
CASE 3
   TIEMPO = 100
   lcdout $FE,$C0,DEC CAMBIOS, DEC3 TIEMPO
CASE 4
   TIEMPO = 50
   lcdout $FE,$C0,DEC CAMBIOS, DEC3 TIEMPO
CASE 5
   TIEMPO = 20
   lcdout $FE,$C0,DEC CAMBIOS, DEC3 TIEMPO
END SELECT
Pero veo que se juntará en la pantalla la variable cambios con la variable tiempo.
Por lo tanto tendrás que hacer una separación con " " Por ejemplo...
LCDOut $FE, $C0, Dec cambios, " ", Dec3 tiempo

Suerte.
 
Última edición:
hola a todos.
por aquí desocupado me puse a revisar un programa que realizo alguno de ustedes no recuerdo quien, es para mensajes en matriz de leds con 16f84a, funciona perfectamente pero no se como alterar la velocidad de desplazamiento, aquí pongo el codigó:
Código:
'*******************************************************************************
'matriz desplazamiento de mensaje con pic 16f84a y registro de desplazamiento 47ls164*
'*******************************************************************************
@ DEVICE PIC16F84A   
@ DEVICE XT_OSC       
@ DEVICE WDT_Off      
@ DEVICE PWRT_OFF       
@ DEVICE PROTECT_Off 
DEFINE OSC 4  
 'declaracion de variables

LINEA            var byte[16]
CHAR             VAR BYTE[8]
CHAR_ACT         VAR BYTE ' puntero de caracter
CHAR_LENGTH_ACT  VAR BYTE ' puntero de la longitud del caracter
CHAR_LENGTH      var byte ' longitud de la longitud
Caracter         var byte
Counter1         var byte
Counter2         var byte
Counter3         var byte
Counter4         var byte  


'declaracion de alias

DATOS            var PORTA.0
CLOCK            var PORTA.1

'Inicializacion de los datos


TRISA = 0
TRISB = 0

linea[1]=$FF
linea[2]=$FF
linea[3]=$FF
linea[4]=$FF
linea[5]=$FF
linea[6]=$FF
linea[7]=$FF
linea[8]=$FF
char_act=0
counter3=0
counter4=0
counter2=1
char_length_act = 1
low clock
low datos

DATA @0,"# FOROS DE ELECTRONICA " 'aquí guardamos nuestro mensaje, es modificable al gusto
read char_act,caracter
gosub tabla_char

'inicio del programa
Inicio:

MENSAJE:
        linea[1]=char[char_length_act]
        IF CHAR_LENGTh_act = char_length  then
           char_act = char_act + 1  
Mens_Salto1:
           read char_act,caracter
           if caracter=$FF then 
              char_act=0
              goto mens_salto1
           endif   
           gosub tabla_char
           char_length_act=0
        endif   
Img:
        counter1=0
                
LineH:
         PORTB = $FF
         counter1 = counter1 + 1      'envia LA ACTIVACION del registro
         if counter1 = counter2 then  'serial paralelo
            gosub send_data0          'para activar la linea vertical
         else
             gosub send_data1
         endif
         if counter1 = 8 then goto LineV
         goto lineh

LineV:
      PORTB = LINEA[COUNTER2]    'determina la posicion activa horizontal
      pauseus 500                'y genera la activacion de los leds verticales
      if counter2 = 8 then
           counter2 = 1
      ELSE
            counter2 = counter2 + 1
      endif
 
      
Shift_Left:
           if counter3 = 250 then
                counter3 = 0
                COUNTER4 = COUNTER4 + 1
                if counter4 = 2 then ' 250 del counter3 *4 del 
                   linea[8]=linea[7]'counter4 es aprox 0.5seg
                   linea[7]=linea[6]'si hay mas lineas 
                   linea[6]=linea[5]'hay q agrandar los vectores
                   linea[5]=linea[4]'y cambiar por un for   
                   linea[4]=linea[3]  
                   linea[3]=linea[2]  
                   linea[2]=linea[1]
                   counter4 = 0
                   char_length_act = char_length_act+1
                   GOTO INICIO
                endif
            ELSE
                counter3 = counter3 + 1
            endif
            goto IMG
                      
SEND_DATA0:
           low datos
           pauseus 1
           low clock
           pauseus 1
           high clock
           RETURN

SEND_DATA1:
           HIGH DATOS
           pauseus 1
           low clock
           pauseus 1
           high clock
           RETURN

'tabla de seleccion de caracter
           
TABLA_CHAR:
    select case caracter
            case " "
                char_LENGTH=3
                char[3]=$FF
                char[2]=$FF
                char[1]=$FF
            
            case"1" 
                char_LENGTH=4
                char[4]=$FF
                char[3]=%11111110
                char[2]=%10000000
                char[1]=%11011110

            case "2"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11001110
                char[3]=%10110110
                char[2]=%10110110
                char[1]=%11011000

            case "3" 
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11001001
                char[3]=%10110110
                char[2]=%10110110
                char[1]=%11011101
    
            case "4"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11110111
                char[3]=%10000000
                char[2]=%11010111
                char[1]=%11100111
   
            case "5" 
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10110001
                char[3]=%10101110
                char[2]=%10101110
                char[1]=%10001110
    
            case "6" 
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11110001
                char[3]=%11101110
                char[2]=%10101110
                char[1]=%11000001
    
            case "7"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10001111
                char[3]=%10110011
                char[2]=%10111100
                char[1]=%10111111
    
            case "8"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11001001
                char[3]=%10110110
                char[2]=%10110110
                char[1]=%11001001
    
            case "9" 
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11000001
                char[3]=%10110110
                char[2]=%10110111
                char[1]=%11001111
                 
            case "0"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11000001
                char[3]=%10111110
                char[2]=%10111110
                char[1]=%11000001
            
            case "@"
                char_LENGTH=7
                char[7]=$FF
                char[6]=%11000001
                char[5]=%10111010
                char[4]=%10100010
                char[3]=%10101010
                char[2]=%10110110
                char[1]=%11000001    
            
            case ":"
                char_LENGTH=3
                char[3]=$FF
                char[2]=%11001001
                char[1]=%11001001
            
            case "["
                char_LENGTH=3
                char[3]=$FF
                char[2]=%10111110
                char[1]=%10000000
            
            case "]"
                char_LENGTH=3
                char[3]=$FF
                char[2]=%10000000
                char[1]=%10111110
            
            case ","
                char_LENGTH=3
                char[3]=$FF
                char[2]=%11111001
                char[1]=%11111110
                
            case "."
                char_LENGTH=2
                char[2]=$FF
                char[1]=%11111110
                
            case"-" 
                char_LENGTH=4
                char[4]=$FF
                char[3]=%11110111
                char[2]=%11110111
                char[1]=%11110111             
            
            case "A"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11000000
                char[3]=%10110111
                char[2]=%10110111
                char[1]=%11000000
                          
           case "B"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11001001
                char[3]=%10110110
                char[2]=%10110110
                char[1]=%10000000
           
           case "C"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11011101
                char[3]=%10111110
                char[2]=%10111110
                char[1]=%11000001 
            
            case "D"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11000001
                char[3]=%10111110
                char[2]=%10111110
                char[1]=%10000000
                
            case "E"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10111110
                char[3]=%10110110
                char[2]=%10110110
                char[1]=%10000000
                               
            case "F"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10111111
                char[3]=%10110111
                char[2]=%10110111
                char[1]=%10000000
                
            case "G"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11010001
                char[3]=%10110110
                char[2]=%10110110
                char[1]=%11000001
            
            case "H"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10000000
                char[3]=%11110111
                char[2]=%11110111
                char[1]=%10000000
            
            case "I"
                char_LENGTH=4
                char[4]=$FF
                char[3]=%10111110
                char[2]=%10000000
                char[1]=%10111110
                
            case "J"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10111111
                char[3]=%10000001
                char[2]=%10111110
                char[1]=%11111101
            
            case "K"
                char_LENGTH=4
                char[5]=$FF
                char[3]=%10111110
                char[3]=%11011101
                char[2]=%11101011
                char[1]=%10000000
            
            case "L"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11111100
                char[3]=%11111110
                char[2]=%11111110
                char[1]=%10000000
            
            case "M"
                char_LENGTH=6
                char[6]=$FF
                char[5]=%10000000
                char[4]=%11011111
                char[3]=%11101111
                char[2]=%11011111
                char[1]=%10000000
            
            case "M"
                char_LENGTH=6
                char[6]=$FF
                char[5]=%10000000
                char[4]=%11011111
                char[3]=%11101111
                char[2]=%11011111
                char[1]=%10000000
                
            case "N"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10000000
                char[3]=%11110011
                char[2]=%11001111
                char[1]=%10000000
            
            case "O"
                char_LENGTH=6
                char[6]=$FF
                char[5]=%11000001
                char[4]=%10111110
                char[3]=%10111110
                char[2]=%10111110
                char[1]=%11000001
            
            case "P"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11001111
                char[3]=%10110111
                char[2]=%10110111
                char[1]=%10000000
                
            case "Q"
                char_LENGTH=6
                char[6]=$FF
                char[5]=%11111110
                char[4]=%11000001
                char[3]=%10111001
                char[2]=%10111101
                char[1]=%11000011
                
            case "R"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11001000
                char[3]=%10110111
                char[2]=%10110111
                char[1]=%10000000
            
            case "S"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%11011001
                char[3]=%10110110
                char[2]=%10110110
                char[1]=%11001101
                
            case "T"
                char_LENGTH=6
                char[6]=$FF
                char[5]=%10011111
                char[4]=%10111111
                char[3]=%10000000
                char[2]=%10111111
                char[1]=%10011111
                
            case "U"
                char_LENGTH=6
                char[6]=$FF
                char[5]=%10000001
                char[4]=%11111110
                char[3]=%11111110
                char[2]=%11111110
                char[1]=%10000001
            
            case "V"
                char_LENGTH=6
                char[6]=$FF
                char[5]=%10000111
                char[4]=%11111001
                char[3]=%11111110
                char[2]=%11111001
                char[1]=%10000111
                
            case "X"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10001000
                char[3]=%11110111
                char[2]=%11110111
                char[1]=%10001000
                                            
            case "Y"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10001111
                char[3]=%11110000
                char[2]=%11110000
                char[1]=%10001111
                
            case "Z"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%10011110
                char[3]=%10100110
                char[2]=%10110010
                char[1]=%10111100
                              
            case else
                char_LENGTH=5
                CHAR[1]=$FF
                CHAR[2]=$FF
                CHAR[3]=$FF
                CHAR[4]=$FF
                CHAR[5]=$FF

    end select
    return
             
                 
END
agradezco su colaboración
 
Última edición:
Ayuda, señor moderador D@rkbytes, en mi ultimo mensaje adjunte un archivo en rar donde esta el código y la simulación.
En base al mismo temporizador hice uno nuevo, el problema es que el temporizador funciona mas o menos bien hasta los 3 min. Cuando seteo a 9 min el temporizador ya no temporiza los 9 minutos.
No logro entender por que no funciona, peor pasa cunado seteo a cualquier numero de 2 dígitos por ejemplo 60 minutos.
¿que podrá ser?
En un principio creí que era por el proteus, asi que lo monte en proto y pasa el mismo efecto.
Ayuda por favor.
 
Última edición por un moderador:
Ayuda, señor moderador D@rkbytes, en mi ultimo mensaje adjunte un archivo en rar donde esta el código y la simulación.
Sube tu nuevo programa porque así no es posible saber que pueda estar fallando.

Ten en cuenta esto por favor:

Reglas del Foro 23) Es de mala educación referir una consulta a un solo miembro de la Comunidad.
Además de que te pierdes la posibilidad de que otros miembros te respondan.
 
Con las disculpas del caso...
En el mensaje #2684 adjuntè un archivo en rar (por falla en mi navegador no lo puedo subir otra vez) en el que encontraran un temporizador en pbp y proteus.
En base al mismo temporizador hice uno nuevo, el problema es que el temporizador funciona más o menos bien hasta los 3 min. Cuando seteo a 9 min (09) el temporizador ya no temporiza los 9 minutos.
No logro entender por qué no funciona, peor pasa cunado seteo a cualquier numero de 2 dígitos por ejemplo 60 minutos.
¿que podrá ser?
En un principio creí que era por el proteus, así que lo monte en proto y pasa el mismo efecto.
Ayuda por favor.


 
Última edición:
el problema es que el temporizador funciona más o menos bien hasta los 3 min. Cuando seteo a 9 min (09) el temporizador ya no temporiza los 9 minutos.
No logro entender por qué no funciona, peor pasa cunado seteo a cualquier numero de 2 dígitos por ejemplo 60 minutos.
¿que podrá ser?
Puede ser por la dimensión de la variable, quizás la declaraste del tipo Byte (Máximo 255).
Si te funciona con tres minutos es por esto: 3 x 60 = 180 (< 255 Y cabe dentro de la variable)
Pero... 9 x 60 = 540 (No cabe dentro de la variable, necesitas una variable del tipo Word, max. 65535)
Con PicBasic Pro el tipo de variable más alta para la familia PIC16 es del tipo Word.
En la familia PIC18 si puedes usar variables del tipo Long.

Si este es el problema, prueba cambiando la variable al tipo Word.

Saludos.
 
Gracias Señor Moderador D@rkbytes, otra vez me sacó de apuros.Era eso, lo probé en el proteus (existe bastante diferencia entre el cronometro externo y el proteus) pero en el proto lo probé con 5 minutos y 60 minutos y la variación es de pocos segundos y a pesar que estoy usando oscilador interno del pic 16F628a.
:)
 
buenos días. necesito un poco de su ayuda, estoy desarrollando un proyecto, estoy comunicando 4 canales analógicos a través de el puerto serial del 16f870, quiero enviar los cuatros datos de los canales analógicos y asignarlos a 4 variables en otro pic 16f870, el problema que tengo es que envío correctamente los 4 datos pero no he logrado recibirlos correctamente en el otro pic para poder mostrarlos en una lcd.

transmisor
Código:
INCLUDE "modedefs.bas"

@ device xt_osc 
define OSC 4
define LCD_DREG  PORTC
DEFINE LCD_DBIT  4
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG  PORTC
DEFINE LCD_EBIT  3
DEFINE LCD_BIT   4
DEFINE LCD_LINE  4

DEFINE ADC_BITS  10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPELUS 50

TRISB = %11000000
TRISA.4 = 1
SUMA VAR PORTB.6
RESTA VAR PORTB.7
L1 VAR PORTB.0
L2 VAR PORTB.1
L3 VAR PORTB.2
L4 VAR PORTB.3
L5 VAR PORTB.5
SONIDO VAR PORTB.4
SELECTOR VAR PORTA.4
SEL VAR BYTE
SET1 VAR WORD
SET2 VAR WORD
SET3 VAR WORD
SET4 VAR WORD
DATO1 var WORD
DATO2 VAR WORD
DATO3 VAR WORD
DATO4 VAR WORD
SENAL1 var word
SENAL2 VAR WORD
SENAL3 VAR WORD
SENAL4 VAR WORD
ADCON1 = %00000000
ADCON0 = %01000001
PAUSE 100
SEL = 1 
SET1 = 20000
SET2 = 20000
SET3 = 20000
SET4 = 20000

inicio:

ADCIN 0,DATO1
dato1 = ( dato1 / 64 ) * 489
SENAL1 = div32 10

ADCIN 1,DATO2
dato2 = ( dato2 / 64 ) * 489
SENAL2 = div32 10

ADCIN 2,DATO3
dato3 = ( dato3 / 64 ) * 489
SENAL3 = div32 10


ADCIN 3,DATO4
dato4 = ( dato4 / 64 ) * 489
SENAL4 = div32 10

SEROUT PORTC.0,N9600,[#SENAL1,",",#SET1,",",#senal2,",",#set2,",",#senal3,",",#set3,",",#senal4,",",#set4,","]

GOSUB SERIAL

if suma or resta = 1 then gosub calibracion
IF SELECTOR = 1 THEN GOSUB SELEC
IF SENAL1 > SET1  THEN
HIGH L1 
HIGH SONIDO 
ELSE
LOW L1
LOW SONIDO
ENDIF

IF SENAL2 > SET2  THEN
HIGH L2 
HIGH SONIDO 
ELSE
LOW L2
LOW SONIDO
ENDIF

IF SENAL3 > SET3  THEN
HIGH L3 
HIGH SONIDO 
ELSE
LOW L3
LOW SONIDO
ENDIF

IF SENAL4 > SET4  THEN
HIGH L4 
HIGH SONIDO 
ELSE
LOW L4
LOW SONIDO
ENDIF

SELECT CASE SEL

CASE 1
Lcdout $FE, 1
LCDOUT $FE, $80, "SE.ACT  C.01  SE.MAX"
lcdout $FE, $C0, DEC SENAL1 dig 4,".", dec senal1 dig 3, dec senal1 dig 2, " V"  
LCDOUT $FE, $CE, DEC SET1 dig 4,".",dec set1 dig 3,dec set1 dig 2," V" 
PAUSE 100

CASE 2
Lcdout $FE, 1
LCDOUT $FE, $80, "SE.ACT  C.02  SE.MAX"
lcdout $FE, $C0, DEC SENAL2 DIG 4,".",DEC SENAL2 DIG 3,DEC SENAL2 DIG 2," V"  
LCDOUT $FE, $CE, DEC SET2 DIG 4,".",DEC SET2 DIG 3,DEC SET2 DIG 2," V"
PAUSE 100

CASE 3
Lcdout $FE, 1
LCDOUT $FE, $80, "SE.ACT  C.03  SE.MAX"
lcdout $FE, $C0, DEC SENAL3 DIG 4,".",DEC SENAL3 DIG 3,DEC SENAL4 DIG 2," V" 
LCDOUT $FE, $CE, DEC SET3 DIG 4,".", DEC SET3 DIG 3, DEC SET3 DIG 2," V"
PAUSE 100

CASE 4
Lcdout $FE, 1
LCDOUT $FE, $80, "SE.ACT  C.04  SE.MAX"
lcdout $FE, $C0, DEC SENAL4 DIG 4,".",DEC SENAL4 DIG 3,DEC SENAL4 DIG 2," V"  
LCDOUT $FE, $CE, DEC SET4 DIG 4,".",DEC SET4 DIG 3,DEC SET4 DIG 2," V" 
PAUSE 100

END SELECT

goto inicio

calibracion:

SELECT CASE SEL

CASE 1
IF SUMA = 1 THEN SET1 = SET1 + 1000
IF RESTA = 1 THEN SET1 = SET1 - 1000
PAUSE 200

CASE 2
IF SUMA = 1 THEN SET2 = SET2 + 1000
IF RESTA = 1 THEN SET2 = SET2 - 1000
PAUSE 200

CASE 3
IF SUMA = 1 THEN SET3 = SET3 + 1000
IF RESTA = 1 THEN SET3 = SET3 - 1000
PAUSE 200

CASE 4
IF SUMA = 1 THEN SET4 = SET4 + 1000
IF RESTA = 1 THEN SET4 = SET4 - 1000
PAUSE 200

END SELECT
return

SELEC:
IF SELECTOR = 1 THEN SEL = SEL + 1
PAUSE 200
IF SEL = 5 THEN SEL = 1
RETURN

SERIAL:
HIGH L5
PAUSE 12
LOW L5
RETURN

end
receptor
Código:
INCLUDE "modedefs.bas"
@ device xt_osc 
define OSC 4
define LCD_DREG  PORTB
DEFINE LCD_DBIT  4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG  PORTB
DEFINE LCD_EBIT  3
DEFINE LCD_BIT   4
DEFINE LCD_LINE  4

TRISB = %00000000
TRISC = %00000111
SUMA VAR PORTC.1
RESTA VAR PORTC.2
SELECTOR VAR PORTC.0
SEL VAR BYTE
L1 VAR PORTC.4
L2 VAR PORTC.5
L3 VAR PORTC.6
L4 VAR PORTC.7
L5 VAR PORTC.3
SONIDO VAR PORTB.0
SET1 VAR WORD
SET2 VAR WORD
SET3 VAR WORD
SET4 VAR WORD
SENAL1 var word
SENAL2 VAR WORD
SENAL3 VAR WORD
SENAL4 VAR WORD
A VAR BIT

SEL = 1
INICIO:

if suma or resta = 1 then gosub calibracion
IF SEL = 1 THEN GOSUB SELEC
IF SENAL1 > SET1  THEN
HIGH L1 
HIGH SONIDO 
ELSE
LOW L1
LOW SONIDO
ENDIF

IF SENAL2 > SET2  THEN
HIGH L2 
HIGH SONIDO 
ELSE
LOW L2
LOW SONIDO
ENDIF

IF SENAL3 > SET3  THEN
HIGH L3 
HIGH SONIDO 
ELSE
LOW L3
LOW SONIDO
ENDIF

IF SENAL4 > SET4  THEN
HIGH L4 
HIGH SONIDO 
ELSE
LOW L4
LOW SONIDO
ENDIF

SELECT CASE SEL

CASE 1
Lcdout $FE, 1
LCDOUT $FE, $80, "SE.ACT  C.01  SE.MAX"
lcdout $FE, $C0, DEC SENAL1 ," V"  
LCDOUT $FE, $CE, DEC SET1 ," V" 
PAUSE 100

CASE 2
Lcdout $FE, 1
LCDOUT $FE, $80, "SE.ACT  C.02  SE.MAX"
lcdout $FE, $C0, DEC SENAL2 DIG 4,".",DEC SENAL2 DIG 3,DEC SENAL2 DIG 2," V"  
LCDOUT $FE, $CE, DEC SET2 DIG 4,".",DEC SET2 DIG 3,DEC SET2 DIG 2," V"
PAUSE 100

CASE 3
Lcdout $FE, 1
LCDOUT $FE, $80, "SE.ACT  C.03  SE.MAX"
lcdout $FE, $C0, DEC SENAL3 DIG 4,".",DEC SENAL3 DIG 3,DEC SENAL4 DIG 2," V" 
LCDOUT $FE, $CE, DEC SET3 DIG 4,".", DEC SET3 DIG 3, DEC SET3 DIG 2," V"
PAUSE 100

CASE 4
Lcdout $FE, 1
LCDOUT $FE, $80, "SE.ACT  C.04  SE.MAX"
lcdout $FE, $C0, DEC SENAL4 DIG 4,".",DEC SENAL4 DIG 3,DEC SENAL4 DIG 2," V"  
LCDOUT $FE, $CE, DEC SET4 DIG 4,".",DEC SET4 DIG 3,DEC SET4 DIG 2," V" 
PAUSE 100

END SELECT

SERIN PORTB.1,N9600,SENAL1,SET1,senal2,set2,senal3,set3,senal4,set4
HIGH L5
PAUSE 50
LOW L5
pause 50

GOTO INICIO

calibracion:

SELECT CASE SEL

CASE 1
IF SUMA = 1 THEN SET1 = SET1 + 1000
IF RESTA = 1 THEN SET1 = SET1 - 1000
PAUSE 200

CASE 2
IF SUMA = 1 THEN SET2 = SET2 + 1000
IF RESTA = 1 THEN SET2 = SET2 - 1000
PAUSE 200

CASE 3
IF SUMA = 1 THEN SET3 = SET3 + 1000
IF RESTA = 1 THEN SET3 = SET3 - 1000
PAUSE 200

CASE 4
IF SUMA = 1 THEN SET4 = SET4 + 1000
IF RESTA = 1 THEN SET4 = SET4 - 1000
PAUSE 200

END SELECT
return

SELEC:
IF SELECTOR = 1 THEN SEL = SEL + 1
PAUSE 200
IF SEL = 5 THEN SEL = 1
RETURN

END
 

Adjuntos

  • principal.jpg
    principal.jpg
    142 KB · Visitas: 74
  • remoto.jpg
    remoto.jpg
    137.5 KB · Visitas: 63
Última edición por un moderador:
que tal vimato, primero dejame hacerte una pregunta, tienes el pic transmisor en una simulacion y el pic receptor en otra simulacion? porque si es asi no te va a funcionar, te recomiendo que prurebes conectando la salida tx del pic emisor al rx del pic receptor y de esa forma verificas si la recepcion y el codigo estan trabajando como tu quieres. Realiza esa prueba y comenta a ver en que te podemos colaborar. Suerte y Saludos!
 
Hola "vimato"...hay unas cuantas cosas que veo a la "pasada de vista" en tú código...deberías subir los archivos de simulación para facilitarle las cosas al que te quiera ayudar.
En el código en el TX emites las comas"," como separadores de la cadena que enviás pero en el RX no haces nada con ellas...deberías mandar algún carácter de sincronizacion para así saber donde comienza la cadena de datos en el emisor y en el receptor deberías usar el comando "Wait" para tal efecto...tienes un pic con UART interna(HSerin) y usas comunicación serie emulada(Serin) que no es lo optimo...etc. Consulta la ayuda del PBP.
No entre a analizar la lógica del programa en sí.
Saludos.

Ric.
 
Atrás
Arriba