desktop

Curso de programación de PIC en PICBasic Pro

gracias amigo @volthor por las observaciones, lo de las palabras inadecuades me gustaria saber a cuales te refieres para corregirlo ya que me interesa mejorar todo lo relacionado a la programacion, he a vanzado de a paso por mi cuenta y con mucha ayuda de los amigos de foro, a lo mejor no he prestado mucha atencion a lo que me indicas...saludosss

PD: Aprovenchando un poco, me encuentro esta semana en Mexico DF por el centro comercial perisur, si alguien pudiera ayudarme a encontrar alguna tienda de electronica si hay alguna sercana ya que me gustaria aprovehar el viaje...Muchas Gracias
 
Hola Volthor, adjunto el archivo de lo que quiero hacer, saludos y gracias (y)

hola Kiyero:
listo realizado el archivo lo ejecute en mi simulador fisico de pic y funciona perfecto, si tiene alguna duda por favor digamela.
corra el archivo en pic basic pro y montelo en su simulador fisico.
en la parte del pulsador se repite para evitar que si se mantiene oprimido el boton no pase al siguiente.

de paso sirve como parte del tema en el foro

Código:
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado1: 
         if boton1 = 0 then
          pause 200
          goto sensado1
         endif

Código:
'****************************************************************
'*  Name File: secuenciador.BAS                                     
'*  Author  : Kiyero                                            *
'*  Notice  : Copyright (c) 2012                                *
'*          : All Rights Reserved                               *
'*  Date    : 14/03/2012                                        *
'*  Version : 1.0  con pic 16f628A                              *
'*  Notes   : proyecto secuenciador en pic basic pro                                             
'*          :                                                   *
'****************************************************************

Define LOADER_USED 1
define osc4
define WDT_on
cmcon=7   
   TRISB = %00000000   
   TRISA = %111111
   
symbol boton1 = porta.0
inicio:
porta = %000000
portb = %00000000

menu:
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado1: 
         if boton1 = 0 then
          pause 200
          goto sensado1
         endif
     goto efecto1
endif
goto menu
efecto1:
portb=%10000000
pause 1000
portb=%01000000
pause 1000
portb=%00100000
pause 1000
portb=%00010000
pause 1000
portb=%00001000
pause 1000
portb=%00000100
pause 1000
portb=%00000010
pause 1000
portb=%00000001
pause 1000
portb=%00000010
pause 1000 
portb=%00000100
pause 1000
portb=%00001000
pause 1000
portb=%00010000
pause 1000
portb=%00100000
pause 1000
portb=%01000000
pause 1000
portb=%10000000
pause 1000 
portb=%00000000

boton2: 
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado2: 
         if boton1 = 0 then
          pause 200
          goto sensado2
         endif
     goto efecto2
endif
goto boton2 
efecto2:
portb=%10000001
pause 2000
portb=%01000010
pause 2000
portb=%00100100
pause 2000
portb=%00011000
pause 2000
portb=%00100100
pause 2000
portb=%01000010
pause 2000
portb=%10000001

boton3:  
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado3: 
         if boton1 = 0 then
          pause 200
          goto sensado3
         endif
     goto efecto3
endif
goto boton3
efecto3:
portb=%11111111
pause 3000
portb=%00000000
pause 3000
boton4:  
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado4: 
         if boton1 = 0 then
          pause 200
          goto sensado4
         endif
     goto efecto4
endif
goto boton4
efecto4:
portb=%10101010
pause 3000
portb=%01010101
pause 3000
boton5:  
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado5: 
         if boton1 = 0 then
          pause 200
          goto sensado5
         endif
     goto efecto5
endif
goto boton5
efecto5:
portb=%00011000
pause 3000
portb=%01000010
pause 3000
portb=%10000001
pause 3000
portb=%00100100
pause 3000
boton6:  
if boton1 = 0 Then ' presiona boton1
   pause 200
sensado6: 
         if boton1 = 0 then
          pause 200
          goto sensado6
         endif
     goto efecto6
endif
goto boton6
efecto6:
portb=%10000000
pause 1000
portb=%00100000
pause 1000
portb=%00001000
pause 1000
portb=%00000010
pause 1000
portb=%00000001
pause 1000
portb=%00000100
pause 1000
portb=%00010000
pause 1000
portb=%01000000
pause 1000
goto menu
end
(y)
 
Última edición por un moderador:
Hola amigo, si es un motor a escobillas, con un pequeño arreglo al dimmer que esta en este mismo tema, podras controlarlo sin problema alguno.
No recuerdo si fue "completamente" sensurado :rolleyes: un aporte mio sobre como modificar el dimmer; Pero basicamente lo que tenes que hacer, como comente en su momento, es agregar una autoinduccion para proteger el triac y que este funcione bien.
Busca informacion de como se calcula la autoinduccion segun carga ;)... Si implementas SanGoogle, sumale el tag "prof.martintorres" y de seguro te va a llevar al video y el circuito que arme controlando un motor de 1/4 HP...
Salu2(y)

PD: Reimy, no te olvides de volver con un regalo para este amigo :D
 
hola amigos, les cuento que me ha entrado la curiosidad por saber como cargo un valor, por ejemplo 255 a una variable, utilizando un teclado matricial de 3x4. he estado revisando un poco el thread asi superficialmente, y no encontre... ¿alguien me da una idea de como hacerlo? la lectura del teclado ya la tengo y se como cargar el numero de tecla presionado en una variable, osea 1 digito pero no se como hacer lo anterior, osea 3 digitos o mas... saludosss ;)
 
Hola Volthor, probé el que me enviaste, pero al compilarlo me dá un error, (igual genera el archivo hex), lo simulo en proteus y se queda en el primer efecto, aún cuando vuelvo a presionar el pulsador, adjunto el .pbp y el .dsn, para que por favor lo observes (no sé si tal vez mi simulador está mal configurado), gracias, seguimos en contacto(y)

saludos muy Buenos dias:
hola te comento que lo ejecute en mi simulador proteus y funciona perfecto, revisa la configuracion de tu simulador.
chao cualquier cosa comentelo
 
Hola alguien me propria ayudar, necesito saber como general un 3 pwm por software los cual en momentos van a funcionar al mismo tiempo, es para hacer una controladora rgb, ya se que de esto se hablo en varios temas pero como yo programo en PBP (pic basic pro) me gustaria poder hacerlo en ese lenguaje para después poder modificar y hacer los efectos que yo quiera
 
Hola alguien me propria ayudar, necesito saber como general un 3 pwm por software los cual en momentos van a funcionar al mismo tiempo, es para hacer una controladora rgb, ya se que de esto se hablo en varios temas pero como yo programo en PBP (pic basic pro) me gustaria poder hacerlo en ese lenguaje para después poder modificar y hacer los efectos que yo quiera
Me parece, bien no lo recuerdo, en este msimo tema hay uno o odos ejemplos... tendrias que pegarle una mirada... despues cuando llegue a casa, de ultimas, veo si lo encuentro yo o directamente subo el que encontre "yo" acá en el foro
 
...... despues cuando llegue a casa, de ultimas, veo si lo encuentro yo o directamente subo el que encontre "yo" acá en el foro
no encontre el que vi aca en el foro, pero te paso unpar de ejemplos que tenia dando vuelta:

Código:
DEFINE OSC 4
TRISB = %00000000     
TRISC = 0               
mode            var     byte
counterVar      var     word   
colorGoal       var     byte[3] 
currentColor    var     byte[3] 
colorCheck      var     byte 
x               var     byte    

maxCount        con     1
clear
high portc.0
pause 2000
low portc.0

main:
if countervar > maxcount then 
    countervar = 0              
    colorcheck = 0             
    for x = 0 to 3
        if currentcolor[x] = colorgoal[x] then 
            colorcheck = colorcheck + 1      
        endif                               
    next
    if colorcheck = 3 then 
        mode = mode + 1       
    else                   
        for x = 0 to 3   
            if currentcolor[x] < colorgoal[x] then
                currentcolor[x] = currentcolor[x] + 1
            else
                currentcolor[x] = currentcolor[x] - 1
            endif    
        next
    endif
else
    counterVar = countervar + 1
endif

select case mode//3 
    case 0          
        colorgoal[0] = 25
        colorgoal[1] = 200
        colorgoal[2] = 0
    case 1
        colorgoal[0] = 0
        colorgoal[1] = 250
        colorgoal[2] = 77
    case 2
        colorgoal[0] = 250
        colorgoal[1] = 0
        colorgoal[2] = 100
end select

pwm portc.0, currentcolor[0], 1     
pwm portc.1, currentcolor[1], 1
pwm portc.2, currentcolor[2], 1

goto main

Voy a seguir revolviendo en la PC de escritorio :) tengo un bolonqui :rolleyes: ya por lo menos se que en la notebook no esta :unsure:
 
Saludos amigos, por softwaret no hay manera de generar 3 PWM simultaneos, la unica manera es por hardware, hay dispositivos como el TLC5940 DRIVER PWM, tiene 16 canales PWM idependientes y se controla de forma serial.

Caracteristicas:
El TLC5940 es un controlador de PWM de 16 unidades con 12 bit de control del ciclo de trabajo (0 - 4095), 6 bits de control de límite de corriente (0 - 63), y una interfaz serial de conexión en cadena. Es muy útil para ampliar el número de salidas PWM disponibles.

Y por lo que vi no es costoso, seria bueno si se animan a realizar un codigo para este intetegrado me pongo a la orden para prestar mi apoyo en el codigo saludos
 
Hola gracias por la ayuda, pero estuve hablando con mi profe de micros en la faculta y salio esto un pwm echo con ciclos FOR el cual se puede hacer que acute sobre varia salidas a las ves este es el ejemplo:

Código:
CMCON=7
TRISB=0
ledr var portb.1  
ledg var portb.2
ledb var portb.3
portb=0
B VAR BYTE :I VAR BYTE  
B=0 


RGB:
 IF B=255 THEN             
  PAUSE 40      
  WHILE B<>0      
  pause 40
   B=B-1          
   FOR I=1 TO B   
    LEDR=1
    ledg=1
    ledb=1
    pauseus 150
   NEXT I
   
   FOR I=1 TO (255-B)
    LEDR=0
    ledg=0
    ledb=0
    pauseus 150 
   NEXT I
  WEND
   B=0   
 ELSE
 pause 40
   B=B+1
   FOR I=1 TO B
    LEDR=1
    ledg=1
    ledb=1
    pauseus 150
   NEXT I
   
   FOR I=1 TO (255-B)
    LEDR=0
    ledg=0
    ledb=0
    pauseus 150
   NEXT I
 ENDIF 
goto rgb

nota: esta echo para el 16f628a y hay que usar un oscilador externos de 20Mhz y cuando termine toda la controladora voy a subir con las simulaciones y algún video
 
Última edición:
bueno, no se si alguien habria leido mi pregunta anterior pero aqui les dejo la solucion que consegui. el montaje tiene un lcd 16x2 y un teclado matricial 4x3 con el que se igresa un valor a una variable. saludosss
Código:
@ DEVICE MCLR_On, INTRC_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
DEFINE OSC 4 
cmcon=7 ;cambiar a modo digital todo el puerto A
TRISA = 0 ;todo el puerto A es configurado como salidas


A VAR PORTB.0 ;nombres para los pines de las filas
B VAR PORTB.1
C VAR PORTB.2
D VAR PORTB.3


UNO VAR PORTB.4 ;nombres para los pines de las columnas
DOS VAR PORTB.5
TRES VAR PORTB.6
CUATRO VAR PORTB.7


BARRIDO:
LOW A ;hacer bajo la 1era fila
IF UNO = 0 THEN PORTA = 1 ;si la 1ra tecla es presionada sacar 1
IF DOS = 0 THEN PORTA = 2 ;si la 2da tecla es presionada sacar 2
IF TRES = 0 THEN PORTA = 3 ;si la 3ra tecla es presionada sacar 3
IF CUATRO = 0 THEN PORTA = 10 ;si la 4ta tecla es presionada sacar 10

HIGH A ;poner en alto la 1era fila
LOW B ;hacer bajo la 2da fila

IF UNO = 0 THEN PORTA = 4 ;si la 1ra tecla es presionada sacar 4
IF DOS = 0 THEN PORTA = 5 ; y así sucesivamente
IF TRES = 0 THEN PORTA = 6
IF CUATRO = 0 THEN PORTA = 11

HIGH B ;poner en alto la 2da fila
LOW C ;hacer bajo la 3ra fila

IF UNO = 0 THEN PORTA = 7
IF DOS = 0 THEN PORTA = 8
IF TRES = 0 THEN PORTA = 9
IF CUATRO = 0 THEN PORTA = 12

HIGH C ;poner en alto la 3ra fila
LOW D ;hacer bajo la 4ta fila

IF UNO = 0 THEN PORTA = 14
IF DOS = 0 THEN PORTA = 0
IF TRES = 0 THEN PORTA = 15
IF CUATRO = 0 THEN PORTA = 13

HIGH D ;poner en alto la 4ta fila
PAUSE 10 ;pausa de 10 milisegundos

GOTO BARRIDO ;continuar con el barrido de teclas
END
 

Adjuntos

  • var-one.rar
    32.1 KB · Visitas: 105
quien me puede ayudar....

resulta que necesito enviar un numero via serial para hacer un contador segun el dato entrante pero me veo con la situacion de que serin solo recibe un dato por ejemplo si envio 234 solo recibe el 2, me encontre con que la instruccion serin2 recibe mas datos pero no logro que me funcione ahora, es necesario escribir ese dato en memoria o a variable me almacena ese dato hasta que entre otro porfa ayuda....
 
Apreciados colegas estoy tratando de contar eventos y he utilizado el comando BUTTON de PICBasic 2.60 para detectar un evento en el pin RB7, de la siguiente forma:

LOOP:
BUTTON , PULSO , 1 , 255 , 20 , i , 0 , LOOP

pero cuando compilo me da el error (BAD EXPRESION)

Tambien con el comando LOOKUP me da BAD EXPRESION
ej
Lookup Digit,[$3F,$06$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron

EL programa es el siguiente:
Código:
cont Var Byte                   'Cont es una variable cuenta eventos
Cont1 Var Byte                  'Cont1 es una variable cuenta hasta 125
Cont2 Var Byte                  'Cont2 es una variable cuenta hasta 5
Digit Var Byte                    'Digit es una variable tipo Byte
Patron Var Byte                 'Patron es una variable tipo Byte
Digit1 Var Byte                  'Digit1 Variable tipo Byte
Digit2 Var Byte                  'Digit2 Variable tipo Byte
PULSO Var PORTB.7            'Pulso de entrada cuenta de productos
i var byte                          'Variable tipo Byte
LedRojo Var PORTA.2           'Led Rojo Freno 
Rele1 var PORTA.4               'Rele1 es Puerto de Salida freno
'
'
'Rutina Principal

CMCON = 7                        'RA0 - RA3 son E/S Digitales           
TRISA = 0                          'Puerto A como salida
TRISB = $80                       'Puerto B como Salida  excepto bit 7
i = 0
'Habilitar interrupcion del TMRO
 '
INTCON = %00100000              'Habilitar Interrupcion de TMRO                    
OPTION_REG = %00000111        'Inicializa el Prescaler                  
TMR0 = 217                            'Cargar el registro TMRO  
on interrupt GOTO PROCESO      'salta a rutina de proceso
INTCON = %10100000              'Habilitar interrupciones          
CONT1 = 0                             'CONT1 = 0
Cont2 = 0                               'Cont2 = 0
'
'Revisar el puertoB.7 si llego pulso y esta alto
Loop:
    BUTTON , PULSO , 1 , 255 , 20 , i , 0 , loop 'Se chequea por un pulso de entr
    CONT1 = cont1 + 1             'Incrementa cont1 de 1 a 125
    Cont2 = Cont2 + 1              'Incrementa Cont de 1 hasta 5
    if Cont1 = 125  then freno1   'Chequea cuenta por 125
    if Cont2 = 5 then freno2       'Chequea por cuenta de 5
    goto Loop                          'Continua esperando un evento externo
    disable                              ' Se deshabilitan las otra interrupciones
'    
Freno1:                                 'Rutina de freno1 cuenta de 5
    Cont1 = 0                           'Limpia el contador 1
    high LedRojo                        ' 
    Rele1                                  'Prende Led Rojo indica freno act.
    if Pulso = 0  Then Freno1        'Retardo 5 Mseg
    Goto loop                             'Regresa a Loop 
'
Freno2:                                    'Rutina de Freno 2
    Cont2 = 0                             'Limpia el contador 2
    high LedRojo                   '
    Rele1                                   'Prende Led Rojo indica freno act.
    if Pulso = 0 then Freno2           'Retardo 5 Mseg
    Goto loop
'        
'Rutina de servicio de la interrupcion
                        
'        
PROCESO:                            'EL PROCESO A REALIZAR
'
    TMR0 = 217                      '
    Digit = Cont Dig 1              '
    Lookup Digit,[$3F,$06$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
    Patron = Patron ^ $FF           'Invertir bits de la variable Patron
    PORTB = Patron                    'Mostrar 10 digitos
    Digit2 = 0                             'Desactivar el digito 2
    Digit1 = 1                             'Activar el dijito 1
    Pause 5                               'Retardo 5 mseg
'
    Digit = Cont dig 0              '
    Lookup Digit,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
    Patron = Patron ^ $FF           'Invertir bits de la variable Patron
    Digit2 = 0                             'Desactivar el Digito 1
    PORTB = Patron                     'Mostrar el digito
    Digit2 = 1                             'Activar Digito 2
    Pausa 1                               'Esperar un mseg
'
    Intcon.2 = 0                         'Re-Habilitar la interrupcion del TMRO
    Resume                                'Regresar al programa principal
    Enable                                 'Habilitar Interrupciones
'
    End
 
Última edición por un moderador:
Hola...deberías hacerle caso al compilador en cuanto a las faltas de sintaxis que cometes...por otro lado no dices que PIC usas, ni pusiste los fusibles de programación ni definiste la velocidad del oscilador del mismo.
Así corregido te compilara sin error pero dudo que si no haces lo que te dije anteriormente funcione como corresponde.

Código:
cont Var Byte 'Cont es una variable cuenta eventos
Cont1 Var Byte 'Cont1 es una variable cuenta hasta 125
Cont2 Var Byte 'Cont2 es una variable cuenta hasta 5
Digit Var Byte 'Digit es una variable tipo Byte
Patron Var Byte 'Patron es una variable tipo Byte
Digit1 Var Byte 'Digit1 Variable tipo Byte
Digit2 Var Byte 'Digit2 Variable tipo Byte
PULSO Var PORTB.7 'Pulso de entrada cuenta de productos
i var byte 'Variable tipo Byte
LedRojo Var PORTA.2 'Led Rojo Freno
Rele1 var PORTA.4 'Rele1 es Puerto de Salida freno
'
'
'Rutina Principal

CMCON = 7 'RA0 - RA3 son E/S Digitales
TRISA = 0 'Puerto A como salida
TRISB = $80 'Puerto B como Salida excepto bit 7
i = 0
'Habilitar interrupcion del TMRO
'
INTCON = %00100000 'Habilitar Interrupcion de TMRO
OPTION_REG = %00000111 'Inicializa el Prescaler
TMR0 = 217 'Cargar el registro TMRO
on interrupt GOTO PROCESO 'salta a rutina de proceso
INTCON = %10100000 'Habilitar interrupciones
CONT1 = 0 'CONT1 = 0
Cont2 = 0 'Cont2 = 0
'
'Revisar el puertoB.7 si llego pulso y esta alto
Loop:
BUTTON  PULSO , 1 , 255 , 20 , i , 0 , loop 'Se chequea por un pulso de entr
CONT1 = cont1 + 1 'Incrementa cont1 de 1 a 125
Cont2 = Cont2 + 1 'Incrementa Cont de 1 hasta 5
if Cont1 = 125 then freno1 'Chequea cuenta por 125
if Cont2 = 5 then freno2 'Chequea por cuenta de 5
goto Loop 'Continua esperando un evento externo
disable ' Se deshabilitan las otra interrupciones
'
Freno1: 'Rutina de freno1 cuenta de 5
Cont1 = 0 'Limpia el contador 1
high LedRojo '
Rele1 = 1'Prende Led Rojo indica freno act.
if Pulso = 0 Then Freno1 'Retardo 5 Mseg
Goto loop 'Regresa a Loop
'
Freno2: 'Rutina de Freno 2
Cont2 = 0 'Limpia el contador 2
high LedRojo '
Rele1 = 1 'Prende Led Rojo indica freno act.
if Pulso = 0 then Freno2 'Retardo 5 Mseg
Goto loop
'
'Rutina de servicio de la interrupcion

'
PROCESO: 'EL PROCESO A REALIZAR
'
TMR0 = 217 '
Digit = Cont Dig 1 '
Lookup Digit,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
Patron = Patron ^ $FF 'Invertir bits de la variable Patron
PORTB = Patron 'Mostrar 10 digitos
Digit2 = 0 'Desactivar el digito 2
Digit1 = 1 'Activar el dijito 1
Pause 5 'Retardo 5 mseg
'
Digit = Cont dig 0 '
Lookup Digit,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
Patron = Patron ^ $FF 'Invertir bits de la variable Patron
Digit2 = 0 'Desactivar el Digito 1
PORTB = Patron 'Mostrar el digito
Digit2 = 1 'Activar Digito 2
Pause 1 'Esperar un mseg
'
Intcon.2 = 0 'Re-Habilitar la interrupcion del TMRO
Resume 'Regresar al programa principal
Enable 'Habilitar Interrupciones
'
End

Saludos.

Ric.
 
Apreciados colegas estoy tratando de contar eventos y he utilizado el comando BUTTON de PICBasic 2.60 para detectar un evento en el pin RB7, de la siguiente forma:

LOOP:
BUTTON , PULSO , 1 , 255 , 20 , i , 0 , LOOP

pero cuando compilo me da el error (BAD EXPRESION)

Tambien con el comando LOOKUP me da BAD EXPRESION
ej
Lookup Digit,[$3F,$06$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
Saludos.
Al parecer estas usando un PIC16F628A
En PICBasic Pro 2.60 LOOP no puede ser usado como etiqueta, ya que es una instrucción.
En esta parte: Lookup Digit,[$3F,$06$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
Te hace falta separar $06$5B con una coma. --> $06,$5B
En Freno1: y Freno2: No determinas que hacer con Rele1

Como te menciona el amigo ricbevi, ya corrigio algunas partes de tu programa.
Pero cambia la etiqueta LOOP: como por ejemplo MainLoop:

Si compilas sin establecer los fuses, tendrás esta configuración por default...
Oscilador a cristal, Watch Dog Timer activado, Brown-Out Reset activado, Master Clear activado.
Y si no estableces la velocidad del reloj, PBP por default determinará 4MHz.

Esta sería una configuración de fuses para el PIC16F628A/48A en PBP 2.60
Código:
@ DEVICE PIC16F628A    ; Microcontrolador utilizado
; Palabra de configuración
@ DEVICE INTRC_OSC_NOCLKOUT,PROTECT_OFF,CPD_OFF,WDT_OFF,MCLR_ON,PWRT_ON,BOD_OFF,LVP_OFF
Y para establecer la frecuencia del reloj usas...
DEFINE OSC 10 ; Definir que se trabajará con 10MHz.
Para usar un cristal de croma de T.V. NTSC = (3.579545MHz)
DEFINE OSC 3

Suerte.
 
Última edición:
Un apregunta, el tema anterior me desperto la curiosidad para saber como podria modificarlo para poder reconocer un patron de señal dado...Por ejemplo miren esta señal:
señal_camioneta.JPG
Mi camioneta tiene un sistema de codigos por pulsos para dar a conocer al usuario donde hay un problema determinado; El tema esta en que se me paso por la cabeza hacer bucles FOR-NEXT con retardos pequeños e implementar la interrupcion por hardware para reconocer los estados altos... el tema o mejor dicho consulta seria...como podria hacer para reconocer el tiempo de los estados altos cuando este dentro de la interrupcion?
Agradezco cualquier orientacion ... Saludos
 
Hola amigo torres devuelta yo por acá, viendo tu consulta, se me ocurre ahora que pudieras medir cuanto dura el estado en alto con dos interrupciones continuas las dos como mencionas por hardware y con ayuda del TMR0, al momento de haber un cambio de bajo a alto se activa la interrupción por flanco de subida e inmediatamente activa la el TMR0 como contador y nuevamente la interrupción de hardware pero esta vez por flanco de bajada y al momento de cambiar de alto a bajo paras el TMR0 y verificas su valor y allí ya tendrías el tiempo que duro en alto el pulso, bueno es lo que se me ocurre ahora pero por allí esta la idea, cualquier cosa me avisas...saludoss
 
Hola amigo torres devuelta yo por acá, viendo tu consulta, se me ocurre ahora que pudieras medir cuanto dura el estado en alto con dos interrupciones continuas las dos como mencionas por hardware y con ayuda del TMR0, al momento de haber un cambio de bajo a alto se activa la interrupción por flanco de subida e inmediatamente activa la el TMR0 como contador y nuevamente la interrupción de hardware pero esta vez por flanco de bajada y al momento de cambiar de alto a bajo paras el TMR0 y verificas su valor y allí ya tendrías el tiempo que duro en alto el pulso, bueno es lo que se me ocurre ahora pero por allí esta la idea, cualquier cosa me avisas...saludoss
Me ayudas con los bytes de configuracion para hacer esto? Como seteo la interrupcion por hardware para que detecte flanco de subida y flanco de bajada en PBP... Si no te mal interpreto el mensaje, cuando sale de la instruccion dentro del programa que es de la interrupcion por hardware, tendria que desactivar el tmr0 ¿verdad? Estoy pensando que alterminar la interrupcion, este volveria a la linea de donde salto y no me dejaria guardar un valor en una varible (este valor seria el tiempo)... Me parece que no te entendi :unsure:
Mirá, quizas sea lo mismo, pero realizado de otra manera... Mi idea era que cuando detecte la interrupcion por hardware, salte a la rutina / sub programa de la interrupcion y que ahi dentro tenga un bucle con pequeños retardos y una funcion para incrementar una variable... Al volver a estado bajo el puerto de la interrupcion, vuelve al punto desde donde partio y sigue con el resto... luego, cuando nuevamente salte la interrupcion, como la primer variable ya no es cero, guardaria este dato en una segunda variable y asi mismo, cuando salte por 3era vez... Luego, tengo que pensar en como armar la tabla para comparar y sacar mensajes por el display... Muy lejos estoy de la idea inicial ¿no?
 
No vas tan mal, pero algo importante que debes tomar siempre en cuenta son los retardos por ciclos de maquina que consume el pic para cada instrucción, el asunto es necesitas mucha precisión para medir el estado del pulso en alto, y para eso si utilizas un bucle necesitarías restar el ciclo de maquina que no es mas que el tiempo que requirió el pic, mientras atiente la interrupción ya consumes tiempo y si aparte debes de saltar una sub-rutina le sumas mas tiempo y aun ni piensas en medir el pulso en alto y si lo hicieras de esa manera el programa seria mas tedioso ya que tendrías que sacar cuentas de cuanto tiempo has consumido antes de empezar a medir el pulso para luego restarlo, estamos hablando de micro-segundos pero que sumados valen bastante. Ahora lo que yo te comento es algo mas sencillo, tan sencillo que casi todo el código no es mas que configuraciones entre interrupciones y TMR0, de momento te dejo un ejemplo que subi hace ya un tiempo, no mide nada, y la única ejecucion que tiene aparte de las configuraciones del pic es un toggle, y ya con eso puedes detectar de forma instantánea cada una de los pines configurados como interrupción por hardware y con eso cambiar el estado de un led. Te dejo la simulación y el código ya mañana me pongo a practicar con uno mas completo para lo que tu requieres y así aprendo a medir flancos de subida.

Aquí el código comentado:

Código:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''CONFIGURACION DE FUSES
@ DEVICE PIC12F675   
@ DEVICE INTRC_OSC_NOCLKOUT
@ DEVICE WDT_OFF       
@ DEVICE PWRT_OFF
@ DEVICE MCLR_OFF
@ DEVICE BOD_OFF
@ DEVICE PROTECT_OFF
@ DEVICE CPD_OFF 

'''''''''''''''''''''''''''''''''''''''''''''''''''''''DEFINICIÓN DE OSCILADOR Y CALIBRACIÓN DE OSCILADOR 
DEFINE OSCCAL_1K 1
DEFINE OSC 4  

INTCON = %10001000 'INTERRUPCIONES ACTIVADAS
OPTION_REG = %00000000
WPU = %00110110 'TODOS LOS PINES CON PULL-UP MENOS GPIO.0 y GPIO.3
IOC = %00111110 'TODOS LOS PINES COMO INTERRUPCION MENOS GPIO.0 
ANSEL = %00000000 'ADC DESABILITADO 
CMCON = %00000111 'COMPARADOR DESABILITADO 
         
SYMBOL LED = GPIO.0 

TRISIO =%00111110 'TODOS COMO ENTRADA MENOS GPIO.0    
GPIO  = %00000000 
    

ON INTERRUPT GOTO SWCHIT 
INTCON = %10001000 

INICIO:

GOTO INICIO

Disable
SWCHIT:
TOGGLE LED 
PAUSE 400
INTCON = %10001000 'EN ESTE PUNTO SI FUERA UN SOLO PIN DE HARIA UN TOGGLE PERO
Resume                     'SOLO DEL BIT DE INTERRUPCION POR CAMBIO DE ESTADO
Enable                      'DE PASARIA DE INTERRUNCION POR FLANCO DE BAJADA A 
                               'INTERRUNCION POR FLANCO DE SUBIDA

Los archivos estan aqui

Ver el archivo adjunto 71533



Si te fijas no existe un código después del inicio solo tiene un goto inicio, luego viene la parte de interrupción la cual solo se activa si cambia uno de los pines...Luego me pongo con mas...saludosss:apreton:
 
Última edición:
Atrás
Arriba