desktop

Curso de programación de PIC en PICBasic Pro

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.
 
Buenas amigos tenia tiempo que no pasaba por el foro, hace unos días me puse a recordar un poco de picbasic ya que me la paso mas metido con programación Arduino. El caso es que estoy haciendo un monitor cardíaco para medir las pulsaciones, estaba pensando usar el comando COUNT pero no conseguía los datos correctos en el manejo de dicha sentencia, así que me dispuse a hacer un sistema como flanco.

Voy a empezar por pasos en la programacion:

Código:
DEFINE OSC 4                      ;DEFINCION OSCILADOR
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB       ;DEFINICION DE LOS PINES DEL PIC AL LCD
DEFINE LCD_EBIT 2
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3

TRISB = 0     ;PUERTO B COMO SALIDA
PORTB = 0    ;INICIA EL PUERTO B EN CERO

DATOS VAR PORTB.0    ;PIN CON EL NOMBRE DATO, POR DONDE SE LEERÁN LOS PULSOS
PULSOS VAR BYTE       ;VARIABLE DONDE SE GUARDARAN LOS PULSOS OBTENIDOS

LCDOUT $FE,1          ;LIMPIAR LCD
PAUSE 500              ;RETARDO


INICIO:                                                ;LOOP CON NOMBRE INICIO
LCDOUT $FE,2,"PULSOS = ",DEC2 PULSOS   ;MOSTRAR RESULTADO EN LA LCD
IF DATOS = 1 THEN                                ;SI DATOS ENTRA EN ESTADO 1 ENTONCES
LCDOUT $FE,1,"PULSOS = ",DEC2 PULSOS   ;MOSTRAR RESULTADO EN LA LCD 
PULSOS = PULSOS + 1                            ;SUMA "1" A LA VARIABLE PULSOS
ESPACIO:                                             ;LOOP CON NOMBRE ESPACIO
IF DATOS = 1 THEN ESPACIO     ;SI EL PIN DATOS PERMANECE EN UNO, NO HACE NADA
ENDIF                                    ;FINALIZAR SI
GOTO INICIO                           ;IR A INICIO

END                       ;FIN DEL PROGRAMA


Bueno como puede ver la lógica del programa se basa en, que al cambiar a estado 1 el pin dato se suma la variable pulsos y esta no seguirá sumando hasta no volver a 0 y luego iniciar otra vez, así conseguí leer la entrada de pulsos en tiempo real sin importar la velocidad con que llegan los pulsos al pin DATOS.

El problema es que quiero que, a medida que se cuente los pulsos por el pin DATOS, se pueda mostrar en la LCD un conteo de 60 segundos al mismo tiempo, que sea independiente uno del otro, he intentado que el programa me trate de realizar ambas funciones al mismo tiempo y no puedo, tiene retardos o se cuelga, ¿hay que usar interrupciones? he intentado con el manual pbp que aparece unos ejemplos y no me da tampoco.

Les voy a dejar el diagrama que detecta los pulsos y el diagrama de proteus con el archivo HEX, ojala me puedan ayudar y me haya hecho explicar bien.
 

Adjuntos

  • MONITOR CARDIACO.rar
    7.9 KB · Visitas: 68
  • Monitor Cardiaco.jpg
    Monitor Cardiaco.jpg
    33.2 KB · Visitas: 47
Última edición por un moderador:
Hola a todos.
De nuevo ando por estos lados molestándolos a ver sí me pueden ayudar.
He estado haciendo pruebas de matrices de leds y tengo un pequeño problema con un código para una de 8x24 no se por que no logro que los registros 74hc164 colocados en cascada funcionen como debe ser pues en lugar de ir añadiendo las letras que siguen atrasan la información un bit por cada registro y en cada 8 columnas se ve lo mismo aquí les subo los archivos para que vean lo que quiero decir, y a ver sí me pueden ayudar a corregir los errores que tenga en el código, además en el puerto a3 me sale un dato invertido y tuve que poner un inversor que quiero quitar pero no se como invertir este dato en el código les agradezco de antemano su colaboración, muchas gracias por su paciecia
 

Adjuntos

  • prueba matriz 8x24 16f88.rar
    25.7 KB · Visitas: 76
Última edición:
Hola a todos.
De nuevo ando por estos lados molestándolos a ver sí me pueden ayudar.
He estado haciendo pruebas de matrices de leds y tengo un pequeño problema con un código para una de 8x24 no se por que no logro que los registros 74hc164 colocados en cascada funcionen como debe ser pues en lugar de ir añadiendo las letras que siguen atrasan la información un bit por cada registro y en cada 8 columnas se ve lo mismo aquí les subo los archivos para que vean lo que quiero decir, y a ver sí me pueden ayudar a corregir los errores que tenga en el código, además en el puerto a3 me sale un dato invertido y tuve que poner un inversor que quiero quitar pero no se como invertir este dato en el código les agradezco de antemano su colaboración, muchas gracias por su paciecia

Hola compañero rápidamente noto que estas programando el pic a 4Mhz y lo estas simulando a 20Mhz no revise de momento otra cosa prueba ajustando eso primero y me avisas saludos
 
Hola compañero rápidamente noto que estas programando el pic a 4Mhz y lo estas simulando a 20Mhz no revise de momento otra cosa prueba ajustando eso primero y me avisas saludos

Hola Reyvilla. Gracias por mirar mi proyecto.
Si tienes razón esto lo hice a propósito para ver pasar más rápido el mensaje pues no se como alterar la velocidad en el programa y al simularlo o en el protoboard a 4 MHz corre lentisimo y como dije antes no se por que no funcionan bien los registros y en protoboard sucede exactamente lo mismo agradezco muchísimo sí me puedes ayudar:apreton:
 
Última edición:
Hola Reyvilla. Gracias por mirar mi proyecto.
Si tienes razón esto lo hice a propósito para ver pasar más rápido el mensaje pues no se como alterar la velocidad en el programa y al simularlo o en el protoboard a 4 MHz corre lentisimo y como dije antes no se por que no funcionan bien los registros y en protoboard sucede exactamente lo mismo agradezco muchísimo sí me puedes ayudar:apreton:

Hola de nuevo, revisando el codigo me doy cuenta que esta echo para una matrix e 8x8 por lo cual si tomas en cuenta que para una matriz de 24 puntos horizontales lo cuales vas a ir activando los led verticales según sea necesario para ir armando la imagen. Que sucede tu lo que haces en el código es un recorrido de 8 horizontales siempre por lo cual lo que sucede es que se va repitiendo en cada registro el mismo dato del registro anterior por lo cual se muestra la misma imagen en cada una de las matrices de 8x8. Ahora lo que se debe hacer es expandir esos 8 pulsos de reloj a 24. Tienes que tomar en cuenta lo siguiente:

Para tu primera duda lo de la compuerta inversora, lo que me encanta de los circuitos lógicos es eso mismo que hay que ser muy lógico en su funcionamiento para saber diseñar un circuito en tu caso lo conectaste en el clock. Lo cual si solo funciona con esa compuerta lo que te dice esa inversora es que inviertas la lógica del reloj en el código y listo.


Ahora lo de los tiempos y el bit de desplazamiento, te voy hacer una breve explicación general de como funciona toda la matriz.

Tenemos 24 columnas y 8 filas.
Las columnas están fijadas a los registros por ser mayoría y las filas a un puerto de pic.

Con estos datos puedes concluir lo siguiente viéndolo de modo programación lógica para que se sea mas fácil de entender.

En un esta matriz tienes un total de 24 tiempos o estados. Donde en cada estado podemos a su vez tener una combinación de 8 bits. Osea esto te dice que es casi inimaginable las
combinaciones que puedes tener allí entre filas y columnas.

Ahora bien sabiendo esto como es tiene que ser la arquitectura o algoritmo del código para que podamos usar cualquier combinación.

Primero determinar los tiempos, los voy llamar tiempo de led fila "TLF" y tiempo de led columna "TLC" mas el tiempo de desplazamiento o clock "Tclock" de los registros.
Adicional a eso como los datos que estamos enviando a los registros duran muy poco
no tendríamos tiempo de ver nada en la matriz ya que pasaría muy rápido. entonces para eso vamos a utilizar un repetidor que voy a llamar tiempo de repetición "TR". Ahora jugando con estos tiempos podemos aprender y lograr desplazar una imagen y poder verla como queramos.

Entonces tenemos:
tiempo de led fila "TLF"
tiempo de led columna "TLC"
tiempo de desplazamiento o clock "Tclock"
tiempo de repetición "TR"

Ahora tiempo de ejecución:
Tiempo1:
Y activar la columna 1.
Y en este punto aplicas TLC

Tiempo2:
Enviar la combinación de los 8 bits por el puerto del pic.
Y en este punto aplicas "TLF"

Tiempo12: Aquí se determina cuantas veces se va a mostrar el mismo dato para poder verlo.
Y en este punto aplicas "TR"

Tiempo3: Para desplazar dato.
Y en este punto aplicas "Tclock"

Y vas desplazando los bit del dato y repitiendo el mismo proceso. Ahora pareciera que TLC Y TLF son dos tiempos de retardos distintos, en realidad es uno solo tiempo ya que para encender el del deben combinarse ambas activaciones tanto horizontal como vertical.

En resumen:
Cargas el dato en los registros con Tclock y activas los 8 bit en los pines del pic
esperas con TLC y TLF.

Repites n veces esto hasta sincronizarlo que puedas verlo bien.
Luego cargas el siguiente dato y empiezas de nuevo.

Datos:
Invierte la logica del clock
Trabaja a 20Mhz
Y regula los tiempos
Avísame cualquier cosa yo igual voy a estar chequeando que otra cosa puede haber en el código saludoss
 
Me estoy iniciando en Programación P.B.P.
Necesito ayuda con la instrucción SELECT CASE, información más detallada que en los libros y ejemplos fáciles de entender.



Estoy Practicando con el libro de microcontroladores 16f628a y el pic16f877a.
También no puedo convertir la salida del puerto A, hago el ejemplo del libro y no funcionan algunas luces del puerto A, se mantiene encendido.
Todo en lenguaje PICBasic Pro.
 
Última edición por un moderador:
Atrás
Arriba