torres.electronico
Well-known-Alfil
No estoy usando otras librerias, pero ni bien me libere de mis bolonquis, retorno a la electronica.
Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
No estoy usando otras librerias, pero ni bien me libere de mis bolonquis, retorno a la electronica.
contador var word
tiempo var word
infra var contador.byte0
estado Var byte
m1 var estado.bit0
m2 var estado.bit1
errorp var estado.bit2
tiempos var estado.bit3
enc0 var estado.bit4
enc1 var estado.bit5
encm var estado.bit6
enca var estado.bit7
luz var ccpr1l
parada var byte
retraso var byte
temp1 var byte
temp2 var byte
temp3 var byte
temp4 var byte
temp5 var byte
indica var byte
luztemp var byte
reten var byte
pulso var byte
boton var byte
casilla var byte
codigos var byte [12]
codigo var byte [7]
'
' alias de pin's
'
port_piloto var gpio.5 ' bit conectado al led, indicaciones
port_pulsar var gpio.4 ' bit usado para el pulsador independiente
port_ir var gpio.3 ' bit usado para el re eptor infrarrojo
port_encoderA var gpio.1 ' encoder pin desplazamiento A
port_encoderB var gpio.0 ' encoder pin desplazamiento B
'
' registro configuracion inicial
'
status=%00000000
option_reg=%00000110 ' configuracion de interruciones primarias
intcon=%00000000 ' configuracion de estatado de interrucciones primarias
pie1=%00000000 ' configuracion de interruciobes perineales
pir1=%00000000 ' estado de las interrucciones perineales
pcon=%00000001 ' configuracion del encendido
eecon1=%00000000 ' configuracion de etado de la eepron
osctune=%00000000 ' configuracion calibrado fino del oscilador
osccon=%01110000 ' configuracion del oscilador
t1con=%00100001 ' conpiguracion temporizador 1, TMR1
t2con=%00000000 ' configuracion temporizador 2, TMR2
cmcon1=%00000000 ' configuracion del comparador por TMR1
ccp1con=%00111100 ' configuracion del registro de control ccp1
cmcon0=%00000111 ' configuracion del comparador operacional
vrcon=%00000000 ' configuracion del voltage de referencia del comparadoronfiguracion del comparador operacional
adcon0=%00000000 ' configuracion de las entradas analogicas
ansel=%00000000 ' ajuste de las entradas analogicas
'
'eedat=0 ' bariable que lertura o guardado de la eepron
'eeadr=0 ' direccion donde se almacena en la eepron maximo 255
'
' definicion de puertos inicial
'
trisio=%010011 ' define los bit del puerto entrada o salida
gpio=%010011 ' define los bit del puerto
wpu=%010011 ' define los pull up del puerto
ioc=%000000 ' define como marca de interruccion los bit del puerto
'
pr2=40 ' maximo del contador timer2
'
'ON INTERRUPT GOTO interrucciones
'
tiempo=0
casilla=0
estado=0
retraso=0
'
' carga los valores de control de la eepron y vefifica q sean correctos
'
read 10, luz
gosub cargarcodigoIR
ccp1con=%00111100 ' activamos PWM
t2con=%00000100 '
'if codigos[0]=0 or codigos[0]=255 then gosub almacena_infra
'
' bucle programa
'
programa:
if port_ir=0 then gosub infrarrojos ' lectura infrarrojos
if pir1.0=1 then
gosub temporizadores ' retrasos y contador tiempo
gosub pulsador ' pulsador
endif
if port_encoderA=0 then ' lectura encoder rotativo
if port_encoderb=0 then gosub encoderrota
endif
if boton>0 then gosub tecla ' acciones
goto programa
frecuenciaout VAR word
ccpr1h CON frecuenciaout.byte1
ccpr1l CON frecuenciaout.byte0
pr2 CON frecuenciaout>>1
'configuracion de fuses
@ DEVICE MCLR_OFF, XT_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
define osc 4
CMCON = 7
TrisA = %11111111 'todo el port A como entrada
TrisB = %00000000 'todo el port B como salida
PORTA = %11111111 'todo el port A en 1
PORTB = %00000000 'todo el port B en 0
touch var porta.0
knob var porta.1
play var porta.2
stp var porta.3
servo var portb.0
vpot var byte
memo var word(20)
clear
inicio:
if stp = 0 then inicio
gosub leepot
pulsout servo,vpot
if touch = 0 then graba1
if play = 0 then reprod
goto inicio
graba1:
gosub rebote
gosub leepot
memo(1)=vpot
pulsout servo,memo(1)
if stp = 0 then graba2
goto graba1
graba2:
gosub rebote
gosub leepot
memo(2)=vpot
pulsout servo,memo(2)
if stp = 0 then graba3
goto graba2
graba3:
gosub rebote
gosub leepot
memo(3)=vpot
pulsout servo,memo(3)
if stp = 0 then inicio
goto graba3
reprod:
if stp = 0 then inicio
gosub rebote
pulsout servo,memo(1)
gosub pausa
pulsout servo,memo(2)
gosub pausa
pulsout servo,memo(3)
gosub pausa
goto reprod
pausa:
pause 1000
return
leepot:
pot knob,127,vpot
vpot = vpot /3+100
return
rebote:
if touch = 0 then rebote
if play = 0 then rebote
if stp = 0 then rebote
return
end
status=%00000000
option_reg=%00000000 ' tmr0 ajustado para los largos de pulso de los sevos
intcon=%10010000 '
programa:
if portb.7=0 then
'esto se añadiria en algun momento del programa
'para dar la orden de iniciado de losservos
'
portb=portb & %01110000 ' se ponen los pines de los servos a uno
tmr0=10 ' ajustamos como tiempo del pulso minimo el servo
intcon.5=1 ' se actiba la interruccion tmr0
'
' lo puse como un pulsador por poner, si usas esto no mezcles pause
' ni instrucciones especiales de picbasic
endif
goto programa
'
'
' control de interrucciones
'
'
DISABLE
interrucciones:
if intcon.2=1 then ' de esta manera para no alterar otras interrucciones
for temp1=0 to 255 ' ajustar para el largo el pulso del servo (maximo)
if servo1=temp1 then low portb.4
if servo2=temp1 then low portb.5
if servo3=temp1 then low portb.6
' añadir un pauseus si el tiempo desborda de 8bit no se mueve gran cosa
next temp1
intcon=intcon | %00100010 ' boramos bandera tmr0 y la interruccion
endif
.
piensa que al usar el comando pot (tambien lo usaba al rincipio asta darme cuenta que no...mas si el integrado tiene entradas a/d) el comando pot es un comando elaborado. constaria de un contador donde descarga un condensador y se pone a cargarlo mientras cuenta cuanto tiempo tarda en dar un bit 1.
vamos que no estas usando el puerto a/d del 16f628a (recuerda que este pic su puerto a del 0 al 4 son solo entradas no entregan corriente para dar un pulso al servo como salida)
...
Busca en la hoja de datos sobre los registros que debes usar para la interrupción por recepción.Estoy en la implementación de un programa que me permite cambiar desde la PC, números decimales de 4 dígitos y aparezcan en 4 displays de 7 segmentos.
Estoy usando el modulo USART de PIC18F2550.
El problema es que hay una nueva entrada decimal que tengo que agregar para controlar el parpadeo de de los 4 dígitos en el los display, con 1 parpadean y con 0 regresan a su estado normal.
O sea, se detiene parpadeo y cuando están parpadeando los display, a su vez cambien si yo envío de nuevo otros dígitos por la PC.
Al parecer, creo que tengo que hacer interrupciones con USART.
Si me podrían ayudar con alguna información o algún ejemplo, les estaría agradecido.
DEFINE OSC 20
DEFINE LOADER_USED 1
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h ' add TXSTA value, high speed
DEFINE HSER_SPBRG 32 ' add SPBRG value
DEFINE HSER_BAUD 9600
DEFINE HSER_CLROERR 1
RCSTA = %10010000 ;CONFIGURACION DE LA USART,
TXSTA = %00100000
INTCON = %11000000 'CONFIGURACION DE LA INTERRUPCION USART
PIE1 = %00100000
SYMBOL RECEP = PIR1.5 'FLAG DE RECEPCION USART
on interrupt goto INICIO
HIGH PORTC.2 'enable
HIGH PORTC.4 'strobe
DAT VAR PORTC.0 'data
CLK VAR PORTC.1 'clook
DS1 VAR BYTE
A VAR BYTE
UNO VAR BYTE
RECEP = 0
DISABLE
INICIO:
HSERIN [DEC1 DS1]
HSERIN [DEC1 uno]
IF UNO = 1 THEN INTERMITENTE
IF UNO = 0 THEN MUESTRA
CONVERTIR:
eeprom 0,[0]
LOOKUP DS1,[191,134,219,207,230,237,252,135,255,231,0],A
write 0,a
read 0,a
SHIFTout DAT,CLK,1,[A]
GOTO INICIO
INTERMITENTE:
read 0,a
SHIFTout DAT,CLK,1,[A]
pause 200
low 300
pause 200
high 300
pause 200
GOTO INTERMITENTE
MUESTRA:
read 0,a
SHIFTout DAT,CLK,1,[A]
GOTO CONVERTIR
RESUME
ENABLE
En realidad es muy sencillo y no se usa mucho código por lo mismo.
La interrupción por recepción del módulo EUSART es similar a las demás interrupciones.
Pero en éste caso el bit o bandera RCIF se pone en cero cuando se lee el buffer RCREG.
Te adjunto un ejemplo para que entiendas el proceso.
PD:
Así como no usaste resistencias para el display, también te recomiendo que en la simulación no uses el MAX232 y conectes el COMPIM directamente al PIC.
HIGH PORTC.2 'enable
HIGH PORTC.4 'strobe
DAT VAR PORTC.0 'data
CLK VAR PORTC.1 'clook
DS1 VAR BYTE
A VAR BYTE
RCSTA = %10010000 'Enable serial port and continuous receive,
TXSTA = %00100000 ' Enable transmit and asynchronous mode
INTCON = %11000000 'CONFIGURACION DE LA INTERRUPCION USART
PIE1 = %00100000
on interrupt goto INTER
A = 63
SHIFTout DAT,CLK,1,[A]
INTERMITENTE:
read 0,a
pause 200
low 300
pause 200
high 300
pause 200
GOTO INTERMITENTE
DISABLE
INTER:
PIR1.5 = 1
HSERIN [DEC1 DS1]
eeprom 0,[0]
LOOKUP DS1,[63,6,91,79,102,109,124,7,127,103,0],A
write 0,a
read 0,a
SHIFTout DAT,CLK,1,[A]
ENABLE
RESUME
END
[/COLOR]La hoja de datos dijo:1 = The EUSART receive buffer, RCREG, is full (cleared when RCREG is read)
0 = The EUSART receive buffer is empty
'regulador 3 pwm para led rgb con 12f683
'
'
' define osc (8)
'
' defnicion de variables y bit alias
'
' variables variadas
estado Var byte ' bit de marcas de memoria
tiempos var estado.bit0
secuencias var estado.bit1
pulsado var estado.bit2
m2 var estado.bit3
tiempo var word
temp1 var byte
temp2 var byte
temp3 var byte
' bariables para PWM rgb
PWMrgb var byte
PWMled1 var byte
PWMled2 var byte
PWMled3 var byte
' variables de infrarrojo
contador var word ' aprovechos su alias como punto para retrasos y infrarrojos
infra var contador.byte0 ' esto permite reducir muchos la bariable 16bit
pulso var byte
boton var byte
casilla var byte
codigos var byte [14]
codigo var byte [7]
'
' alias de pin's
'
port_piloto var gpio.1 ' bit usado para el pulsador independiente
port_ir var gpio.3 ' bit usado para el re eptor infrarrojo
port_led3 var gpio.4 ' control pwm led3
port_led2 var gpio.5 ' control pwm led2
port_led1 var gpio.0 ' control pwm led1
'
' registro configuracion inicial
'
status=%00000000
option_reg=%00000000 ' configuracion de interruciones primarias
intcon=%00000000 ' configuracion de estatado de interrucciones primarias
pie1=%00000000 ' configuracion de interruciobes perineales
pir1=%00000000 ' estado de las interrucciones perineales
pcon=%00000001 ' configuracion del encendido
eecon1=%00000000 ' configuracion de etado de la eepron
osctune=%00001100 ' configuracion calibrado fino del oscilador
osccon=%01110000 ' configuracion del oscilador
t1con=%00100000 ' conpiguracion temporizador 1, TMR1
t2con=%00000000 ' configuracion temporizador 2, TMR2
cmcon1=%00000000 ' configuracion del comparador por TMR1
ccp1con=%00000000 ' configuracion del registro de control ccp1
cmcon0=%00000111 ' configuracion del comparador operacional
vrcon=%00000000 ' configuracion del voltage de referencia del comparadoronfiguracion del comparador operacional
adcon0=%00000000 ' configuracion de las entradas analogicas
ansel=%00000000 ' ajuste de las entradas analogicas
'
' definicion de puertos inicial
'
trisio=%001000 ' define los bit del puerto entrada o salida
gpio=%000010 ' define los bit del puerto
wpu=%000000 ' define los pull up del puerto
ioc=%000000 ' define como marca de interruccion los bit del puerto
'
' bariables iniciales
'
for temp1=0 to 9
temp2=temp1+8
read temp2,codigos[temp1]
next temp1
PWMled1=0
PWMled2=0
PWMled3=0
pwmrgb=108
boton=0
tmr0=247
intcon=%10100000 ' iniciamos interruciones, solo tmr0, perineales apagadas
ON INTERRUPT GOTO interrucciones ' define salto interruciones
goto programa
'
'
' control de interrucciones
'
' solo controlando tmr0
DISABLE
interrucciones:
tmr0=247
intcon.2=0
PWMrgb=PWMrgb-1
if pwmrgb=0 then
PWMrgb=107
gpio=%000010 ' borra los 3 pines pwm de los led
endif
if PWMrgb=PWMled1 then port_led1=1 'activa pin's
if PWMrgb=PWMled2 then port_led2=1
if PWMrgb=PWMled3 then port_led3=1
pir1.7=0
resume
enable
'
' programa
'
programa:
if port_ir=0 then gosub infrarrojos ' lectura infrarrojos
if boton>0 then gosub tecla ' acciones
goto programa
'
' lectura infrarrojos
'
infrarrojos:
contador=0
while port_ir=0 ' leemos el largo del pulso alto de inicio codigo
contador=contador+1
wend
if contador<180 then salto_ruido ' si es menor seguro sea ruido IR
contador=0
while port_ir=1 ' leemos el largo del pulso bajo de inicio codigo
contador=contador+1
if contador>90 then salto_ruido ' si es mayor seguro no sera correcto
wend
pulso=0
repeat
port_piloto=0
infra=0
while port_ir=0 ' cuenta el largo el pulso alto
infra=infra+1
if infra>34 then salto_barrido ' si desborda salimos a comprovarlo
wend
infra=0
while port_ir=1 ' cuenta el largo el pulso bajo
infra=infra+1
if infra>48 then salto_barrido ' si desborda salimos a comprovarlo
wend
casilla=pulso>>3 ' divido entre 4 para encasillar en byte's
codigo[casilla]=codigo[casilla]<<1 ' desplazo byte para ingresar nuevo bit
if infra>18 then codigo[casilla]=codigo[casilla]+1 ' si es un 1 lo suma
pulso=pulso+1 ' cuenta el largo de bit serial
until pulso=48 ' limite maximo serial 48bit
salto_barrido:
if codigo[0]=codigos[0] then ' comprovamos byte de acceso bajo
if codigo[1]=codigos[1] then ' comprovamos el byte de acceso alto
boton=codigo[casilla] ' almaceno el ultimo byte en boton
endif ' se puede mejorar la veracidad de los 2
endif ' ultimos byte's. NEC, RC5, Panasonic48bit
salto_ruido:
port_piloto=1
return
'
' accion de la tecla pulsada del pando infrarrojo
'
tecla:
select case boton ' comprovamos la accion de la tecla pulsada
case codigos[9]' subir global
if pwmled1<100 then ' para si un valor llega al maximo
if pwmled2<100 then
if pwmled3<100 then
if pwmled1>0 then pwmled1=pwmled1+1 ' para mantener a 0
if pwmled2>0 then pwmled2=pwmled2+1
if pwmled3>0 then pwmled3=pwmled3+1
endif
endif
endif
case codigos[8]' bajar global
if pwmled1>0 then pwmled1=pwmled1-1 ' hasta llegar a 0
if pwmled2>0 then pwmled2=pwmled2-1
if pwmled3>0 then pwmled3=pwmled3-1
case codigos[7]' subir pwm1
if pwmled3<100 then pwmled3=pwmled3+1
case codigos[6]' bajar pwm1
if pwmled3>0 then pwmled3=pwmled3-1
case codigos[5]' subir pwm2
if pwmled2<100 then pwmled2=pwmled2+1
case codigos[4] ' bajar pwm2
if pwmled2>0 then pwmled2=pwmled2-1
case codigos[3] ' subir pwm3
if pwmled1<100 then pwmled1=pwmled1+1
case codigos[2] ' bajar pwm3
if pwmled1>0 then pwmled1=pwmled1-1
end select
boton=0
return
'
'
' datos de la eepron
'
data @8
data $02,$FD ' 16bit de acceso ir NEC RC5
datA $DF,$5F,$CF,$9F,$7F,$0F ' las 6 telas de subir y bajar
data $4F,$87 ' las dos teclas de subir bajar global