Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?
19/10/2016 #3061
Moderador

Avatar de D@rkbytes

nelson enrique llontop dijo: Ver Mensaje
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.
Busca en la hoja de datos sobre los registros que debes usar para la interrupción por recepción.
Para recibir los datos puedes usar la instrucción "HSerIn", porque te permite usar varias variables.
20/10/2016 #3062


Interrupcion usart rcie
¿Cómo está, D@rkbytes?
He revisado lo que me indicó sobre los registros de interrupción y pues no tengo muy claro el registro PIR1.5, que es el bit RCIF (Flag de recepción por USART)
No sé cómo acomodarlo en mi programa.

Estoy haciendo un pequeño programa con un solo display de 7 segmentos.
Este programa envía 2 dígitos por el puerto serial, el primer dígito es el del dato que se va a mostrar por el display y el segundo es el del parpadeo.
Si es 1 parpadea y si es 0 deja de parpadear.

Lo que no puedo lograr, es que cuando esté parpadeando cambie el dato si le envío uno nuevo por serial, ya que se queda en el bucle del parpadeo.

Quisiera que me ayude en la distribución de los comandos como el On interrupt, Disable, Resume y Enable, y por supuesto el flag de recepción que no lo tengo muy claro.

Le adjunto el programa para que lo revise y me pueda ayudar, y si tiene alguna información para leer y comprender todo lo referido, sería genial.
Código PHP:
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 
20/10/2016 #3063
Moderador

Avatar de D@rkbytes

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.
Archivos Adjuntos
Tipo de Archivo: rar 18F2550 Interrupción EUSART.rar (47,0 KB (Kilobytes), 15 visitas)
21/10/2016 #3064
Suspendido


Pues hoy me toca rectificarme en el tema de controlar un led rgb con tmr0 y la lectura ir. A 8mhz conseguí justo pero si se pueden trabajar bien ambas cosas con una portadora pwm de 1khz y una definición del duty de 100. Pongamos qUE ya tengo el motor funcionando ahora solo faltan los pequeños detalles y mariconadillas para hacer un modulo algo chachi..

Los cálculos. (No suelo andar con ecuaciones complejas qUE no se manejar)
Seria esto....

tmr0 interruccion control RGB

+ 2.000.000,00000000 un cuarto osc
/ 2,00000000 tmr0 2:1 prescaler
---------------------
+ 1.000.000,00000000
/ 9,00000000 tmr0=247
---------------------
+ 111.111,11111111 frecuencia tmr0 interrupciones
/ 107,00000000 escala pwm
---------------------
+ 1.038,42159917 frecuencia final pwm


procesos ic entre interruccion tmr0

+ 9,00000000 tmr0=247
* 2,00000000 prescaler 2:1
---------------------
+ 18,00000000
* 4,00000000 un cuarto osc
---------------------
+ 72,00000000 procesos por interruccion tmr0
- 36,00000000 procesos ocupa interrupción tmr0 pwm
----------
36,0000000 procesos restantes


Conté qUE son 36 procesos la interRUPción trm0 pero realmente andarán entre 20 y 30 nunca se dan todas las decisiones al mismo tiempo lo cual sobran mas de 36 procesos para correr el programa normal....

Después si puedo o me dejan procederé a pasar el programa. Preparado para ir mejorando las costillas qUE lo Haran mas chachi. CoMo memoria de colores el control del leD blanco de iluminación por pwm interno y bueno dejando el pin gpio.2 libre o con un leD por el momento..

Un saludo

Puse un largo de duty en 107 cuando no voy a subir duty a mas de 100 para el rojo quizás 94 de máximo. Eso sera un truquito para adaPtar las corrientes de los diStintos colores al transformador qUE suele ser de 12.5v y para qUE puedan rebajar bien los cuerpos inductores qUE estabilizaran la modulación de pulsos en una corriente muy estable y poco rizado por la modulacion.

Un saludo
21/10/2016 #3065


Mas que hacer una pregunta, sólo diré, gracias D@rkbytes, por la ayuda de PICBasic.
Pasarlo a Proton IDE no fue muy difícil, sólo tuve que hacer unos cambios, pero la interrupción serial corre muy bien.
22/10/2016 #3066


D@rkbytes dijo: Ver Mensaje
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.

Muchas gracias, mi estimado, su ejemplo ha sido importante para comprender la interrupción,
pero tengo otro detalle.
Sería muy amable de su parte si me ayuda, ya que usted es un experto.

Le cuento que hago la interrupción de recepción por usart, pero no retorna al bucle donde éste empezó.
No sé qué problema puede ser. A ver si me da una mano.

Le dejo el programa de prueba.
Código PHP:
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 
23/10/2016 #3067
Moderador

Avatar de D@rkbytes

No, muy mal.
Necesitas poner mas atención sobre las configuraciones de los registros usados en el ejemplo que subí.
De esa forma no va a funcionar tu programa.

El bit 5 (RCIF = EUSART Receive Interrupt Flag bit) del registro PIR1 es el que necesitas comprobar para verificar si existió interrupción por recepción.
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

Ese bit se pondrá en 1 cuando contenga datos, tú no debes establecer esa condición.

Hay mas problemas en tu programa y te recomiendo que le des una buena leída a la hoja de datos.
31/10/2016 #3068
Suspendido


Pues ya de vuelta. Voy exponer cómo quedó el programa en basic. Funciona perfectamente.

Código:
'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
Pongamos que es lo básico, con mi rutina de lectura de IR y solo controlar un led RGB, es lo básisico, pero lo que quiero decir con definirlo todo, es que el programa tenga-una una estructura de flujo de procesos viable, donde se puede ampliar sin problema su programa...

El que me tengo currado es lo mismo, solo que activando el pwm interno.
Los números del mando, las memorias de los colores, tecla de almacenado y otra tecla que hace la secuencias de un color a otro de la memoria, quizás una tecla para aunmentar la velocidad de las secuencias y otra que configurarépara los valores iniciales al encenderse..
(Es una rayada decidir la presencia de la comodidad para usar el chisme.)


Y bueno, lo expuse porque en parte esta idea se me ocurrió aquí peleándome con alguno..
Y que por-lo-menos tengo el trabajo con una definición del duty de 100 y a una frecuencia PWM a 1 Khz, una respuesta de un mando que es correcta su codificación serial y ocupando poco mas de 400 procesos

Un saludo.


Como no escribo correctamente, me editaron el mensaje.
Hace 4 Semanas #3069


D@rkbytes dijo: Ver Mensaje
No, muy mal.
Necesitas poner mas atención sobre las configuraciones de los registros usados en el ejemplo que subí.
De esa forma no va a funcionar tu programa.

El bit 5 (RCIF = EUSART Receive Interrupt Flag bit) del registro PIR1 es el que necesitas comprobar para verificar si existió interrupción por recepción.

Ese bit se pondrá en 1 cuando contenga datos, tú no debes establecer esa condición.

Hay mas problemas en tu programa y te recomiendo que le des una buena leída a la hoja de datos.



muchas grasias dr por su correccion

tengo una duda es posible hacer inerrupciones usart con 2 o mas hserin o solo puedo usar un hserin

disable
If PIR1.5 = 1 Then ; ¿Ocurrió interrupción por recepción EUSART?
Flag_Rx = 1
hserin[dec1 a]
hserin[dec1 b]
hserin[dec1 c]
hserin[dec1 d]
hserin[dec1 e]
.
.
.
endif
resume
enable
end
Hace 4 Semanas #3070
Moderador

Avatar de D@rkbytes

No, porque de esa forma todas las variables contendrán lo que en el momento de la interrupción tenga el primer byte del buffer.
Lo correcto sería hacer uso de un único HSerIn, de ésta forma:
HSerIn ParityLabel, Timeout, Label, [a, b, c, d, e]
Así recibes de una sola vez cada byte del buffer en las variables.

ParityLabel, Timeout y Label, son parámetros opcionales.
La conversión con "Dec x" la puedes hacer posteriormente.
Hace 4 Semanas #3071

Avatar de willrey28

Hola muchachos,me preguntaba si hay una función similar en pic basic como la hay en arduino que es la funcion millis() ,en el que por comparación puedo realizar otras tareas como apagar y encender un led sin utilizar la función delay o pause.Ya que si uso la función delay detengo la ejecución del programa y no puedo realizar otras tareas segun el tiempo establecido a menos que use interrupciones.
Por ejemplo que un led parpadee y en simultaneo que pueda con un pulsador encender o apagar otro led.
Debido a mi escaso conocimiento sobre picbasic no lo se.
Muchas gracias por sus respuestas.
Hace 4 Semanas #3072

Avatar de papirrin

No, no la hay.,.. Como se hace es con un timer , interrupción de timer o un contador con un pauseus, y quizás con algún otro algoritmo similar.

Enviado desde mi W706 mediante Tapatalk
Hace 4 Semanas #3073


OK grasias por su explicacion ya comprendi
bueno tengo una duda, estoy implementando un pequeño proyecto con display de 7 segmentos,son 28 display que estan en serie con el registros 4094 controlados por puerto serial y 4 salidas del pic lo cual me ahorro muchos pines (data ,clock, enable,strobe)
los 28 numeros decimales que ingreso por puerto serial deben aparecer en los display
esa parte ya la tengo implementada, son 7 bloques de 4 displays .

la parte que no puedo controlar es el parpadeo de cada bloque que con 1 se activa el parpadeo y el 0 se desactiva A1B1C1D1E1F1G1 DISPLAYS PARPADEANDO A0B0C0D0E0F0G0 DISPLAY SIN PARPADEAR la verdad nose como implementar esta parte se me a acurrido de hacerlo con timers de pic es posible ,eso estoy trabajando con el pic 18f2550 o tengo que hacer un bucle internamente ,o tengo que aplicar interrupciones .
quisiera que usted me pueda decir que puedo emplear lo mas consistente posible .
muchas grasias espero su respuesta saludos
Hace 3 Semanas #3074
Suspendido


Cuando usas el puerto ssp, los PIC normales sólo suelen tener uno (hay algunos modelos con mas) sólo trasmiten y leen vía serial un dato de 8 bits.
U
na vez completados, se activa el banderín de interrupción para ir a leer la información que la pasa a SSPBUF.(El PICBasic ya la define como una variable)
Automáticamente sigue cargando los siguientes 8 bits, así que hay que coger el dato rápido de SSPBUF..

Por programa podrías crear varios serial en distintos pines, pero ya es otra cosa e iría mas lenta la información. (n así rápido de sobra.)

Con lo poco que has explicado, me da que pusiste un integrado serial a cada 8 segmentos del display, eso te ahorra pila de pines en el PIC y muchos integrados.
Está muy bien, sólo que escogiste un mal integrado. (A-veces hay que revisar bien el integrado a usar, porque ese barrido cada-vez que refresques los dígitos, no te-lo vas a poder quitar como mucho disimular)
Tenías que haber mirado un poco y verías que el 74HC595 te sería mucho mas útil. mucho mas util.
La terminal STCP carga los 8-bits a paralelo del tirón y la patilla OE invertida te serviría para regular el brillo por PWM..

Estaba pensado que el 4094 era un serial paralelo, así en groso sin traslado en paralelo.. (O cómo se llame, pero es idéntico al 595, sólo que en tecnología CMOS)...

Pregunta; ¿Y cuál es la frecuencia máxima reloj y dato?
El 74HC595 tiene una respuesta de 100-MHz. (Para un PIC es mas que de sobra.)
Me imagino que ese modelo, lo mismo....

Pues debería funcionarte perfectamente con STR.
Cargas el registro entero y OE te sirve para controlar el brillo.

n así, hay otros integrados muy prácticos para controlar matrices de 8 display y sólo es mandar la información tipo serial.. (Bueno, hay que configurar los modelos, los integrados tienen las 8 casillas de RAM que se cargan a la memoria y después el ya muestra los 8 displays)
Así sólo se utiliza un integrado para funcionar con 8 displays, incluso muchos reproductores DVD tienen ese integrado para controlar los displays y al mismo tiempo pulsadores para leer el registro y saber qué tecla está pulsada, o leer el registro de 8-bits de los 8 displays.)

Vamos, en sí es un integrado propio que tiene una memoria de 8-bytes y cada uno de ellos es para un display, él sólo hace los barridos, mostrando la información.
A-partir de ahí, hay modelos diversos con mas utilidades, cómo los pulsadores.
Funcionan con protocolo SPI, 8 bits para comandos con 8 bits de registro de memoria.

A-ver cuantas faltas de ortografía me pitan de penalti. (No tengo ganas de releer la última marlafada)

Un saludo.

---------- Actualizado después de 2 minutos ----------

Hoy quería saber si alguien me sabe contestar una pregunta..

¿Qué diferencia hay en un while, wend a un repeat, until o do... loop, a-la hora de compilarse el programa????

Es que me ha dejado rayado una conclusión y no se-me dio por analizar lo compilado de uno a otro.


Como no escribo correctamente, me editaron el mensaje por enésima vez.

Nota del Moderador:

Normas de Participación:

Consideraciones generales:
Los moderadores y/o administradores podrán cerrar, editar y borrar mensajes que violen estas normas sin aviso previo o posterior.
Si la conducta negativa se repite por parte de algún usuario, éste podrá ser expulsado.
Hace 3 Semanas #3075


Gracias por su colaboración, mi estimado.
Estoy usando el módulo EUSART del PIC, pero lo que no puedo implementar es el parpadeo. (Blinking)
Lo que controlo mediante la PC, estoy muy confundido con esta parte, ya que estoy usando el modulo EUSART y la verdad no sé si se pueden usar mas módulos como el del timer, pwm, etc. en un mismo programa.

Quissiera saber cómo puedo hacer ese parpadeo, si con timer, pwm , etc.
Si usted tuviera una idea de cómo implementarlo, sería de gran ayuda y si quiere mas información, no dude en decirme qué es lo que necesita saber.

Gracias por su atención.
Hace 3 Semanas #3076
Suspendido


Bueno, nelson enrique llontop. A-ver si la molestia de lo que preparé, sirve para hacerte una idea de cómo transferirlo serial sin usar el puerto SSP.

Yo lo tengo para mostrar los barridos de display con el serial y un multiplexor para cada dígito..

"digitos" sería la memoria donde cargarías la información a mostrar.
"digito" te sirve para indicar que dígito modificas.
Si quieres hacerlo parpadear, sólo tendrías que borrar la variable del dígito que sea un tiempo y volver a cargarla un tiempo después.
En éste caso uso un banderín por bit de memoria que se ha ¿treado? para indicar que se tiene que hacer un barrido y se pone a cero después de mandar los paquetes serial...
De esta manera, el programa se detiene un momento por tener que enviar todos los bits, pero el 74HC595 trabaja a 100 MHz.

En
el PIC, seguro usarás un oscilador inferior a eso, mas que son varias interrupciones.
Lo que quiero decir, que mandar los 24 bytes, será un pispas de unos pocos microsegundos.

Código:
'
'
' variables de tiempo y funciones
tiempo var word
temp var word
minuto var byte
reducetiem var byte
segundero var reducetiem.5
bit_estados Var byte
refresca_DisplaY var bit_estados.bit0
funcion_tiempo var bit_estados.bit1
tiempo_parada var bit_estados.bit2
'
' variable serial display
serial var byte
Lbit var serial.bit0
Hbit var serial.bit7
marcador var byte
digito var byte
digitos var byte [24]
'
' variables bariadas
temp1 var byte
temp2 var byte
temp3 var byte
'
' alias de pines
PIN_serialDATA var portb.1 '
PIN_serialCLK var portb.2 '
PIN_serialPARALELO var portb.3 ' 
'
' definicion interrucciones iniciales


'
'difinicion de puertos
trisa=%11111 ' define los bit del puerto entrada o salida
trisb=%00000000 
porta=%11111 ' define los bit del puerto
portb=%00000000
'
' definicion de bariables iniciales

'
'  programa
'
programa: ' aqui ya queda a lo que tu agas



if refresca_display=1 then gosub serial_74hc595 ' banderin para refrescar serial
goto programa
'
' serial 74hc595
'
serial_74hc595:
PIN_serialPARALELO=0 ' prepara serial paralelo
for digito=0 to 24 ' cantidad de display
    serial=digitos[display] ' bit display a pasar a serial
    for temp1=0 to 7 ' transferencia serial 74hc595
        pin_serialCLK=0 ' clk 74hc595
        pin_serialDATA=Hbit ' data bit serial
        serial=serial<<1 ' desplazamiento byte y estraer bit para serial
        pin_serialCLK=1 ' clk 74hc595
    next temp1
next display
PIN_serialPARALELO=1 ' refrecca paralelo 74hc595
refresca_display=0 ' borra banderin
return
Posiblemente tenga una errata, revísalo, quitando algunas cosas que son corta y pega de otros programas míos.
lo alpliqué un "for next" con los 24 dígitos.
(Como puse, tengo uno montado con el 595 y el 4017 o un multiplexor)

Los pines del PIC irían como están puestos, arriba puedes darles alias a relación del PIC que uses.
lo es definir CLK, DATA, SCLK (para pasar a paralelo). OE no está definida.
(Tampoco es que sea muy necesaria, pero si está conectado al PWM, no está mal aprovecharlo o crear un PWM por programa, también con TMR0)

El bit de alias de "refresca_display", pues tomando acopio de los banderines por interrupción, se me ocurrió lo mismo para poner bit de marcas para actuar algunas subrutinas.
En este caso pondrías el bit a uno cada vez que cambias un display, o lo apagues y enciendas..

Me imagino que tendrás otra variable tipo array para cargar los bytes de los displays 1234... etc, etc, etc..
Asíque tienes que contar con los 24-bytes de RAM de lo que vas a mostrar por los displays,
o los 12 o mas bytes de RAM de los segmentos del display, números y símbolos que vayas a mostrar.
(Eso, o usar la EEPROM para cargar los segmentos del display y ahorrarse RAM)
Y bueno, esas cositas cuando tienes que hacerlas sólo con un PIC, hay que replantear mucho la memoria que se tiene y a-veces simplificar algo.
Pon que con el PIC que vas a usar, no vas a tener muchos problemas de RAM, aún así para el acabado final, si no vas usar el USB ni ninguna funcn especial del PIC, optaría por economizar con algún PIC mas barato y pequeño, por ser más impresionante lo que hace tan poca-cosa de integrado.


Vaya, éste método te serviría para mandar varios serial a la vez.
CLK, SCLK y OE irían juntos y serialDATA o el pin de data, se pondría a varios pines del PIC,serialDATA1, serialDATA2, ....

Cargará mas rápida la información, pero tampoco es necesario.
Creo que es mejor ahorrarse los pines y como a puse mandar los 24 bits, no llega a un milisegundo.

Te diría ¿ el usar el usar ? ¿ pero que para eso no merece much pla pena ?
Pero sería muy parecido a lo escrito en el programa, sólo que en vez de detenerse en la subrutina serial, activaría el banderín cada vez que tengas que cargar el byte a SSPBUF, eso sin contar definirlo.

He hecho algunas cosas, pero no sé manejar a-la perfección del usar menos con instrucciones elaboradas de Basic.
Mas que nada, porque lo que suelo mirar son los datasheet de los integrados y con mis erratas y solo corrigiéndome a mi mismo.

Espero que mis molestias de montar ese cacho programa sirva de algo y entender que al usar instrucciones mas sencillas, puedes copiar y pegar mejor de tus trabajos y a leer el código.
El que sea Basic y no C, no quiere decir ¿ trambonear ? de continuo, sino darle forma a los procesos..


Un saludo.


Como no escribo correctamente, me editaron el mensaje por enésima vez.


Nota del Moderador:

Normas de Participación:

Consideraciones generales:
Los moderadores y/o administradores podrán cerrar, editar y borrar mensajes que violen estas normas sin aviso previo o posterior.
Si la conducta negativa se repite por parte de algún usuario, éste podrá ser expulsado.

Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.