TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Abago en 29 de Septiembre de 2003, 19:09:00

Título: Manejo de interrupciones!!!! Help
Publicado por: Abago en 29 de Septiembre de 2003, 19:09:00
Manejo de interrupciones!!!! Help[/b]

<
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: marmatar en 25 de Noviembre de 2003, 14:54:00
Abago...
Creo que queda claro que no hace poco que estás en el foro... y si nadie te ayudó es porque no sabíamos que querías saber específicamente de las interrupciones.
Sería facil solo derivarte a un link de un  sitio donde esté la explicación, pero tu pediste ayuda... solo en el Asunto del subforo.
Creo que lo correcto hubiera sido especificar cual era la duda... porque creo que  la mayoría pensó que se te "escapó" el dedo al subir el mensaje sin contenido.
Creo que todos estamos para ayudarnos mutuamente, y que nadie hace las cosas con mala intensión.
Por otra parte... Luis quiso darte una mano, y de mas está decir que es un maestro de la didáctica... y no veo porqué reaccionas así con él... incluso después de que ya solucionaste tu problema él igualmente colocó la respuesta para otros foristas.
Creo que lo mismo deberías hacer tu... y no por ser "de cosecha propia" quedartelo hasta averiguar por ti mismo si es la mejor opción o era una guarrada que podría solucionarse de otra manera.
De los aciertos y errores propios y de los demás, aprendemos todos, de eso se trata el foro... por eso te recomiendo comentar como lo has solucionado... porque quizás es esa la manera de haberlo hecho desde el principio... colocar algo, y preguntar acerca de que falta, en que le estoy errando, como es?
No es mi intención acalorar la discusión, pero creo todo se debe a una falta de interpretación de un mensaje "vacío"...

Un gran abrazo a ambos... y a decir verdad, yo también tengo problemas con las interrupciones... recién estoy aprendiendo sobre ellas... pero prefiero leer algo mas antes de preguntar, porque apenas tengo una somera idea de que se trata, quizá cuando me surja alguna duda me podrías ayudar vos, no Abago?

marmatar
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: LuisFrino en 25 de Noviembre de 2003, 19:16:00
Que es una interrupcion ?
Cuando se utilizan interrupciones?
Se utilizan interrupciones cuando se programa para que el micro realice operaciones en tiempo real.
Una interrupcion es una directiva  que se da al microcontrolador para realice una tarea desde el programa fuente
y el micro deja de hacer lo que esta haciendo para atender un evento  
en forma inmediata o sea que se le da la orden de ir a determinado ((bit de un puerto  o pin del micro))
haga un chequeo determinado y dependiendo de la informacion que recoge en ese ((bit del puerto o pin del micro))
realice una determinada operacion
supongamos que estamos con un desarrollo donde actuan sensores por ejemplo de temperatura
y debemos mantener una temperatura estable a 70 grados
tenemos que tener en cuenta que deberemos tener algunos dispositivos externos al micro  

primero un elemento calefactor para subir la temperatura
segundo un elemento para enfriar el ambiente Forzador  o ventilador    
tercero un sensor de tempertatura para poder medir los grados
cuarto visualizar esa temperatura en un display

dentro del listado del programa hay que tener en cuenta cuales son las prioridades
para eso antes de comenzar un desarrollo hay que tener muy bien estudiado lo que queremos que el micro realice pues el micro es un dispositivo sin inteligencia o sea estupido tonto o como quieran llamarle  
solo hace lo que le indicamos,nosotros lo hacemos inteligente o mas tonto si no le damos las intrucciones precisas

volviendo al tema de las interrupciones
y el ejemplo del programa para mantener una temperatura constante
el micro tiene un solo contador de programa PC por lo tanto no puede realizar dos tareas a la misma vez

la primera orden es medir la tempertaura actual supongamos que es 20 grados
para los 70 grados estan faltando 50 grados entonces que hacemos?
activamos el calefactor y mientras tanto mostramos la temperatura en el display
cada determinado tiempo indicamos al micro que vuelva a leer el sensor  y despues mostrar
la nueva temperatura asi hasta que lleguemos al valor de 70 grados

cada vez que estamos enviando al micro a leer la temperatura con el sensor estamos realizando una interrupcion cada interrupcion debe estar contenida en un bucle o lopp
para que retorne y siga con las demas tareas asignadas
por ejemplo si llego a 70 grados cortar el calefactor volver a medir si supera los 70 grados
encender el enfriador volver a medir si sigue en 70 no hacer nada volver a medir
si bajo la temperatura volver a calefacionar volver a medir etc etc etc

cada una de esas directivas ES UNA INTERRUPCION  
     
Muchos de ustedes ya han trabajado con interrupciones y tal vez ni siquiera se han dado cuenta
lo que pasa es que pueden estar confundidos con el tema de que estan utilizando instrucciones en basic
una instruccion en basic contiene una o varias instrucciones en lenguaje ensamblador o assembler

cuando uno escribe el comando poe ejemplo PULSIN para basic  es una instruccion sola
pero el compilador tiene que realizar un llamado a un macro que interpreta la intruccion
y la adapta al codigo ensamblador y luego esta es pasada al formato intel .HEX

o sea que tiene que realizar multiples operaciones para lograr un lenguaje entendible por el micro y es por eso que al programar en basic el tamaño del archivo final :HEX generado en basic es mas extenso que el realizado en lenguaje ensamblador

ME CANSE DE ESCRIBIR MUCHOS SALUDOS
SI ME EQUIVOQUE EN ALGO MIL PERDONES
lUIS FRINO

     
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: marmatar en 26 de Noviembre de 2003, 06:26:00
Luis... gracias por la explicación... hasta ahí mas o menos tenía idea, pero me confirmaste que había entendido bien.

Un abrazo...
marmatar
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: jorgeansuini en 26 de Noviembre de 2003, 07:45:00
Buenas:

No quisiera crear una polémica, pero el concepto de interrupción , a nivel micros ,por lo que yo entiendo tiene un funcionamiento diferente.-
Basicamente uno escribe un programa para que efectue una serie de tareas, pero, le interesa dar algún tipo de prioridad a otra tarea, ejemplo: estoy mostrando algún dato en display multiplexado ,y a su vez , en el caso de apretarse una tecla, necesito atender el teclado. Bueno en ese caso ,si tengo habilitadas las interrupciones del portb, cableo el teclado a ese puerto y cuando se produzca un cambio, el cotador del programa del micro saltara a la direccion de interrupción ,en el caso de los pic H004, y en esa zona ejecuta una rutina de atención del teclado y terminada retorna a la antigua dirección de programa.-
Lo mismo se aplica a timer interno,uart,grabación de la eeprom de datos ,etc.-

Espero haber sido claro en la explicación
Saludos
Jorge
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: ejmc en 26 de Noviembre de 2003, 08:11:00
Hola a todos, ya que estan en el tema, si yo estoy en un for...next y se produce una interrupcion, esta es atendida o espera que termine el for....next. Otra cosita, si el programa se encuentra leyendo el valor logico de los pins del portb hasta que ocurre una interrupcion y esta es atendida, la ejecuta y regresa, como puedo hacer para que vaya a otra etiqueta, no se si se entendio
Saludos
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: jorgeansuini en 26 de Noviembre de 2003, 08:19:00
Buenas:

En teoría,si se produce una interrupción,saldria del for-next para atender la rutina.-
Por otro lado,para que vaya a otra etiqueta, tendrias que ver algun tipo de variable "testigo" que sea cambiada dentro de la rutina de inerrupción ,para que cuando retorne a la rutina normal,de alguna manera testearla a ver si cambió.-

Hay que ver un poco que queres hacer con el programa.-
Saludos
Jorge
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: MGLSOFT en 26 de Noviembre de 2003, 09:31:00
Las interrupciones en PBP no se manejan igual que en assembler, lean bien el manual de Luis y veran que instrucciones como PAUSE o SERIN, hacen esperar hasta terminarlas antes de otorgar el permiso de atencion de interrupcion, pueden llevarse una sorpresa.

Yo hago temporizaciones con ciclos While  Wend, metiendo el valñor de una variable como condicion, la que se actualiza por interrupciones del timer0 cada 1 Mseg, por ejemplo.
Esto me permite trabajar con tiempos exactos y mantener la interrupcion OK, para atender la interrupcion de la USART sin demoras, sino agarro un caracter por la mitad y ya no sincronizo mas....

Detalles..je..je..
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: jorgeansuini en 26 de Noviembre de 2003, 09:44:00
Bueno Luis:

El hecho es que ya sea explicado a tu manera o a la mia, el resto de la gente lo entienda, y por supuesto, que luego se las arreglen solos y se guarden el código. porque como les costo hacerlo ,no tienen porqué compartirlo.-

Lo que si propongo es abrir un subforo para clarividentes, cosa que solo leyendo el título del tema, ya sepan adivinar de que se trata.-
Saludos
Jorge
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: MGLSOFT en 26 de Noviembre de 2003, 12:53:00
Demostremos mas de lo que nos muestran...
Pongamos la otra mejilla...
Hace mas de 2000 años alguien nos quiso enseñar esto.

Este foro hasta el momento no tuvo grandes encontronazos entre los foristas, porque habriamos ahora a empezar a pelearnos?

Solo porque alguien dice haber hecho una experiencia y dudamos que sea asi, por la forma de actuar suya?

Me parece poco cabal que quienes empiecen en el foro, encuentren este tema, que seguramente nos habra partido la cabeza a varios en su momento, y ni bien empieza a leer para meterse en tema, se encuentre conque los foristas \"viejos\" se estan peleando entre ellos solo por......  falta de una explicacion????

Encendamos las neuronas , muchachos, y pongamos aqui nuestras experiencias, sin importar el como empezo el post, que no deja de ser interesante para todos.

Recuperemos el espiritu del FORO !!!!
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 26 de Noviembre de 2003, 13:22:00
Se puede ?????
Si me permitís un comentario sobre interrupciones en picbasic usando ON INTERRUPT GoTo INTERRUPCION es un autentico desastre por el despilfarro de de memoria y de velocidad que se pierde .
Picbasic tiene algunos comandos muy bien hechos y estudiados creo que incluso obras maestras que no envidian a los hechos en asm .
Usando este comando lo que hace picbasic es poner debajo de cada comando es esto :

Lcdout “12”
bcf     STATUS, RP0
clrf   PCLATH
call    L00001
A=0
bcf     STATUS, RP0
clrf   PCLATH
call    L00001
A=A+1
bcf     STATUS, RP0
clrf   PCLATH
call    L00001

y la label L0001 es esta :

L00001  btfsc   INTCON, GIE
 return
bsf     PCLATH, 3
 bcf     PCLATH, 4
goto    INTERRUPCION

Y no se termina aquí pero para que os hagais una idea de la perdida de tiempo que se produce .
Quien use este sistema es una gozada , no hay que preocuparse por nada , pero que sepais lo que hace .
Podeis hacer la prueba en un codigo un poco largo de simplemente quitar la linea  ON INTERRUPT GoTo , os dareis cuneta que los words de programa bajan cosiderablemente . en codigos no muy exigentes no hay problema en usarlo , pero......

Yo siempre utilizo Define  INTHAND interrupcion , esto dice al compilador simplemente que en org4 ponga el salto a la rutina que utilizamos , ademas se ancarga de salvar ya algunos registros y solo tenemos que restaurarlos al salir .

De esta manera en la rutina interrupción con el código escrito no podemos pasarnos como con el otro sistema , es mejor escribirla en asm preferiblemente, solo la precaución de salvar y restaurar los registros afectados y no se pierde ni una pistonada .

Buenooo... saludaros a todos despues de tanto rollo
sisco

Título: RE: Manejo de interrupciones!!!! Help
Publicado por: marmatar en 26 de Noviembre de 2003, 13:23:00
Totalmente de acuerdo MGL...  creo que tus palabras no hacen mas que confirmar todo lo ya dicho, la única intensión es que se faciliten las cosas y no crear polémica.
Por ese motivo se sugiere una consulta bien hecha, o mostrar el código, (no por desconfianza)... principalmente porque el foro es compartir experiencias, erradas o acertadas... en las correcciones está la lección., además se hace mas facil para los que quieran ayudar.
Todos sabemos que hay muchas maneras de hacer lo mismo en lo que respecta a la programación de PICs... por eso sería interesante ver como soluciona los problemas cada uno, creo yo que es la mejor manera de aprender.
No es porque uno lo haga mejor que otro, sino para enterarnos de alguna otra manera que nos pudiera ser útil en uno u otra situación.
Si en éste momento vé ése tema un nuevo forista, solo verá que somos humanos... y que hay diferencias... nos equivocamos y corregimos nuestros errores... y además aprenderá como se hace una consulta correctamente.
Cuando envié mi primer mensaje, lo envié llenando solo el asunto, sin contenido... como le ha sucedido a mas de uno... y tube la suerte de encontrarme con un forista que me explicó la modalidad de trabajo , entre ellas, hacer las preguntas claras, puntuales y que tengan relación con el tema donde se coloca.

Finalmente, como tu dices, aclaraciones mediante, mejor sigamos con el tema de  las interrupciones.

Un gran abrazo a tod@s, y creo que sonó el gong...último round... ganador, el Foro.

marmatar
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: MGLSOFT en 26 de Noviembre de 2003, 13:31:00
Genial lo tuyo SISPIC!!
En adelante voy a copiarte, con tu permiso..
Habia observado como aumenta el codigo utilizando On Interrupt, pero no sabia bien como resolverlo.

Pregunta:
Que pasa si aparece una interrupcion, la estas utilizando en assembler y justo esta en una instruccion como Pause o Serin??

La atiende o solo espera igual que utilizando On Interrupt??


Marmatar:
Gracias por tus conceptos, entiendo que todos no pueden ser perfectos ni saber de todo, como yo....

je..je..es una joda.
Nadie nacio sabiendo y nos metimos en este foro para aprender...

Un abrazo.
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: MGLSOFT en 26 de Noviembre de 2003, 13:35:00
Perdon, me quedo algo en el tintero para Sispic...

El codigo en la rutina de interrupcion debe ser assembler o puede ser en basic??
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: ejmc en 27 de Noviembre de 2003, 08:40:00
Hola a todos, si yo no uso ese ON INTERRUPT GOTO ETIQUETA, y si por ejemplo habilito la interrupcion del RB0/INT, cuando una interrupcion ocurra.....¿para donde saltara el programa?.....
(este careto no se donde aplicarlo,pero lo pongo para integrarlo nomas)
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 27 de Noviembre de 2003, 09:06:00
Hola ejmc

Cuando  una interrupcion ocurra el micro empezara a ejecutar las intrucciones que encuentre en la posicion de memoria que haya asignado el fabricante .
por ejemplo el 16f876 saltara a ORG 4 .  

Es responsabilidad tuya decirle al compilador que las utilizas , si no es asi , en org 4 pbp puede poner cualquier cosa y cuando se produzca la interrupcion el micro puede colgarse , resetearse vete a saver  .

Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 27 de Noviembre de 2003, 09:41:00
me olvidaba de tí amigo MGLSOFT  :

Con respecto a tu primera pregunta te diré que no se espera a que termine ni Pause o Serin , cuando se produce..... a correr todos , a diferencia del metodo  On Interrupt.


Normalmente las rutinas de interrupción son para realizar tareas muy escuetas aunque de gran importancia  cuando el hardware lo solicita , ejemplo incrementar algún contador , guardar el valor del teclado  etc. y no hay que abusar del código . Imagina que estas guardando los impulsos que entran por rb0 y tu rutina de interrupción  tarda más tiempo en ejecutarse que en recibir el siguiente impulso. En este caso habría que inhibir las interrupciones para que la rutina no se llame a sí misma al producirse , pero el contage no seria correcto .
   
Lo ideal seria diseñar el código puramente en ensamblador ya que tienes todo el control , pero si nos empeñamos en usar comandos pbp dentro de ella pues a currarlo  y a conocer pbp a fondo.

Ejemplo:
Codigo:

Define  INTHAND  _Interrupcion
wsave        var byte bank0 system  
ssave        var byte bank0 system    
psave        var byte bank0 system

Main:
Pause 1000
Goto Main


Interrupcion:           ‘código de interrupción , pbp salva PCLATH,STATUS y W                        
INTCON=0               ‘ inhibir interrupcion
PAUSE 10
INTCON = $90         ‘restaurar interrupcion
asm
    movf  psave            ; restauramos los registros guardados
    movwf PCLATH
    swapf ssave,w
    movwf STATUS
    swapf wsave,f
    swapf wsave,w                
    retfie
endasm


Esto no funcionaria correctamente ya que  PAUSE utiliza 3 variables temporales del tipo word R0,R1,R2  y como también utilizamos PAUSE en la interrupción  el código  al entrar en ella tiene que guardar estos 6 registros byte R0,R0+1,R1,R1+1,R2,R2+1 y restaurarlos a la salida  ya que al salir y continuar con la PAUSE de Main contendrían los valores usados en pause de la interrupción y fallaría  .

También  si usamos otro comando pbp distinto en el código de interrupción que utilice estas 3 variables para que al regresar , pause del Main continue funcionando correctamente .

Espero que esto no te desanime a usar el método , pero en mi opinión es la mejor manera para que nuestro programa se ejecute con soltura y este a la altura de cualquier asm . El basic es para que nos ayude con el código, pero  lo mejor es no casarse del todo con él e intentar conocerlo internamente un poco .

Para cualquier programador creo que es imprescindible que se tengan unas mínimas nociones de asm antes de usar los lenguajes de alto nivel .

Échale un vistazo a los .LST que genera si compilas con el parámetro –l

En el proyecto que puse del control de un Nokia con pic esta escrito en un 90% en pbp y se comunica con el celular a 115.200 bps sin problemas .
Sin este 10% de asm el proyecto integramente con pbp seria mision imposible .

y cambiando de tema.
Abago no entiendo por que pides disculpas , entiendo mejor a los bytes que a las personas , pero no creo que nadie se haya ofendido por lo menos no veo el motivo por ninguna parte .

retfie
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: MGLSOFT en 27 de Noviembre de 2003, 11:21:00
Una de las utilizaciones mas criticas que tengo es una interrupcion del port serial donde uso Hserin y luego de comprobar si le corresponde responder (analiza la direccion y el Checksum) , si le corresponde utiliza Hserout para hacerlo.

Me paso en mas de una ocasion perderme los mensajes por falta de un caracter inicial, con velocidades no muy altas (9600 baudios).

Que me recomendas hacer al respecto??

En tu ejemplo del Nokia haces esto??

Si es asi en donde lo encuentro??

Gracias por la colaboracion.
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 27 de Noviembre de 2003, 12:25:00

Pero usas interrupciones para saver si se recibe algun byte , creo que es RCIF , una manera podria ser :
Caracter inicial , comando , longitud en bytes , byte , byte  , byte ,,,,,,,,, chksum .

Esta aqui
http://miarroba.com/foros/ver.php?temaid=960789&foroid=168219

No usa  interrupcion para la recepcion por que es el pic que le pide la informacion cuando la necesita y entonces espera la respuesta .

No se como será en tu caso , pero si me das mas detalles de como funciona tu programa le ponemos un poco de turbo asm

Título: RE: Manejo de interrupciones!!!! Help
Publicado por: MGLSOFT en 28 de Noviembre de 2003, 13:33:00
Ok SISPIC, si demenuzo demasiado el codigo voy a convertirlo en ilegible, por lo tanto lo cuelgo aqui mismo a ver si me puedes orientar hoy que es mu cumple, je..je..

Codigo:



"****************************************************************
"*  Nombre  : Medidor de Presion 1.BAS                          *
"*  Autor   : Marcos Lazcano - MGLSOFT                          *
"*  Notice  : Copyright (c) 2002 MGLSOFT                        *
"*          : Todos los derechos reservados.                    *
"*  Fecha   : 01/10/2002                                        *
"*  Versión : 1.1                                               *
"*  Uso     : Medidor de usos multiples con conversor A/D serial*
"*          : SPI, con calibracion digital.                     *
"****************************************************************

"   Este programa lee un conversor A/D serial MCP3204 de 12 Bits
"   se utilizan 2 de los 4 canales posibles del conversor.
"   Utiliza un PIC16F877
   
    INCLUDE "modedefs.bas"

"******************** Seteo del display LCD **************
" El display LCD sera connectado de la siguiente forma:  
"  Port LCD     Port PIC
"       DB0-3   No conectar
"       DB4     PortC.0
"       DB5     PortC.1
"       DB6     PortC.2
"       DB7     PortC.3
"       RS      PortA.4
"       E       PortA.5
"       RW      Ground
"       Vdd     +5 volts
"       Vss     Ground
"       Vo      potenciometro de 20K (o ground)
DEFINE LCD_DREG PORTC
DEFINE LCD_DBIT 0   " Setear bit de comienzo de dato (0 o 4) si es bus a 4-bit
DEFINE LCD_RSREG PORTA      "       RS      PortA.4
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTA       "       E       PortA.5
DEFINE LCD_EBIT 5
DEFINE LCD_BITS 4           " Tamaño del bus de datos (4 o 8 bits)
DEFINE LCD_LINES 2          " Seteo del numero de lineas en LCD
DEFINE LCD_COMMANDUS 2000   " Seteo del retardo entre comandos en LCD
DEFINE LCD_DATAUS 50        " Seteo del retardo entre datos del LCD

"**************************************************************************
" Definicion de constantes y posiciones EEPROM
BitsConv    con     12           "cantidad de bits del convertidor
eeKal       con     0           "lugar de la eeprom donde se guarda eeKal
ValLow      con     eeKal + 2   "lugar donde se almacena el valor bajo
ValHigh     con     ValLow + 2  "lugar de almacenamiento del valor alto
eeOffset    con     ValHigh + 2 "lugar de la eeprom donde se guarda Offset
eeSpan      con     eeOffset + 2"lugar de la eeprom donde se guarda Span
eeFinal     con     eeSpan + 2  "final de escala del display
TempHigh    con     eeFinal + 2  "lugar de almacenamiento del valor alto
eeDir       con     TempHigh + 2  "lugar de almacenamiento de la Id de red
Menu        con     eeDir + 1  "maxima cantidad de menues activos

"Pines de manejo de conversiones (puede habilitarse el conversor interno)
CS          VAR     portA.0     "pin de Chip Select del conversor
Din         VAR     portA.1     "pin de entrada serial del conversor
CLK         VAR     portA.2     "pin de Clock del convertidor
Dout        VAR     portA.3     "pin de salida serial del conversor

"Pines a usar con teclado 4 teclas
TeclaClear  var     portB.7     "tecla borrar (Clear)
TeclaProg   var     portB.6     "tecla programacion
TeclaDown   var     portB.5     "tecla abajo (Down)
TeclaUp     var     portB.4     "tecla arriba (Up)

"Puertos de comunicacion COMM1 y COMM2
TxComm1     var     portC.6     "pin de transmicion del COMM1
RxComm1     var     portC.7     "pin de recepcion del COMM1
TxComm2     var     portB.3     "pin de transmicion del COMM2 (futuro CAN)
RxComm2     var     portB.2     "pin de recepcion del COMM2 (futuro CAN)
Habil       var     portB.1     "habilitacion transmicion RS422 en COMM1
INT         var     portB.0     "pin de interrupciones (futuro uso en CAN)

"PortC y PortD estan preparados para conectar una placa de 10 entradas / salidas
Ent1       VAR     portD.0     "entradas placa I/O
Ent2       VAR     portD.1
Ent3       VAR     portD.2
Ent4       VAR     portD.3
Sal1       VAR     portC.4     "salidas placa I/O
Sal2       VAR     portC.5
Sal3       VAR     portD.4
Sal4       VAR     portD.5
Sal5       VAR     portD.6
Sal6       VAR     portD.7

"Salidas de control a reles
Rele1       VAR     portE.0     "salida de control presion baja
Rele2       VAR     portE.1     "salida de control presion alta
Rele3       VAR     portE.2     "salida de control temperatura alta

"las teclas pueden generar interrupciones, de ser necesario

"******************************************************************
" variables de trabajo del conversor , calibracion y lecturas
Config      var byte         "palabra de configuracion del conversor A/D
MaxBits     var word         "numero de divisiones del convertidor
Temperat    var word         "contiene la temperatura actual leida
Presion     var word         "contiene el valor actual de la presion
ValorDisp   var word         "contiene el valor a mostrar en display
CteKal      var word         "contiene la constante de calibracion
Final       var word         "contiene el valor final de escala de display
Span        var word         "maximo de escala luego de calibrar
Offset      var word         "minimo de la escala luego de calibrar
Rango       var word         "longitud de escala de medicion
"Prom        var word         "sumatoria de conversiones
DataIn      var word         "dato directo de cada conversion A/D
DatoConv    var word         "dato resultante de las conversiones promediadas
Prom        VAR WORD(Promedio)
Filtro      var word
Index       VAR BYTE

"********************************************************************
" variables de uso general
Var1        var word         "variable de uso general1
Var2        var word         "variable de uso general2
Z           var word         "variable de uso general3
"**********************************************************************
" variables usadas en comparaciones
MaxTemp     var word         "limite de temperatura maxima
MaxPres     var word         "limite de presion maxima
MinPres     var word         "limite de presion minima
"***********************************************************************
"  variables de usos variados
"Promedio    var byte            "variable con la cantidad posible de promedios a ejecutar
Promedio      CON 12
Medida      var byte            "valor a mostrar antes del nominal actual
MaxMenu     var byte            "maximo valor de la cantidad de menues 255
X           var byte            "variable de contadores pulsacion teclas
I           var byte            "variable de uso general
J           var byte            "variable de uso general
Init        var bit             "marca inicio de programa
ticks       var byte            "numero de interrupciones
Convert     var byte            "habilitacion de conversiones
CantConv    var word            "cantidad de conversiones por segundos acumulada
AuxConv     var word            "cantidad de segundos acumulada
second      var word            "cantidad de segundos acumulada
"**********************************************************************
" variables de uso en muestreo en display
B0          VAR BYTE            "variable DISPLAY que contiene digito 0
B1          VAR BYTE            "variable DISPLAY que contiene digito 1
B2          VAR BYTE            "variable DISPLAY que contiene digito 2
B3          VAR BYTE            "variable DISPLAY que contiene digito 3
B4          VAR BYTE            "variable DISPLAY que contiene digito 4
B5          VAR BYTE            "variable DISPLAY que contiene signo

T0          VAR BYTE            "variable DISPLAY que contiene digito 0 TEMP
T1          VAR BYTE            "variable DISPLAY que contiene digito 1 TEMP
T2          VAR BYTE            "variable DISPLAY que contiene digito 2 TEMP

"**********************************************************************
" variables de registros de transmicion y recepcion
ChecKsum    var byte            "contiene el checksum de transmision
ChecKsum2   var byte            "contiene el checksum de transmision 2
ChecKIn     var byte            "contiene el checksum de recepcion
MiCheck     var byte            "checksum para comparacion con checkin
Direccion   var byte            "valor de la direccion de red
Espera      var byte            "valor del tiempo de espera comunicacion
DirIn       var byte            "direccion de envio transmicion
ByteDir1    var byte            "digitos del checksum de entrada
ByteDir2    var byte            "digitos del checksum de entrada

TX0          VAR BYTE            "variable TX que contiene digito 0
TX1          VAR BYTE            "variable TX que contiene digito 1
TX2          VAR BYTE            "variable TX que contiene digito 2
TX3          VAR BYTE            "variable TX que contiene digito 3
TX4          VAR BYTE            "variable TX que contiene digito 4
TX5          VAR BYTE            "variable TX que contiene digito 5
TX6          VAR BYTE            "variable TX que contiene digito 6
TX7          VAR BYTE            "variable TX que contiene digito 7

RX0          VAR BYTE            "variable RX que contiene digito 0
RX1          VAR BYTE            "variable RX que contiene digito 1
RX2          VAR BYTE            "variable RX que contiene digito 2
RX3          VAR BYTE            "variable RX que contiene digito 3
RX4          VAR BYTE            "variable RX que contiene digito 4


"Configuracion de puertos
        TRISA = %00001000
        ADCON1 = 6              "Dout es entrada y el resto son salidas
        TRISB = %11111001       "CAN TX y Habil son salidas y el resto son entradas
        TRISE = %000            "todas son salidas
        TRISD = %00001111       "entrada y salidas
"Inicializacion de la USART para comunicacion
        TRISC = %10000000       "RX es entrada TX y el resto son salidas
        "SPBRG = 25              " Velocidad a 9600 bps
        SPBRG = 12              " Velocidad a 19200 bps
        RCSTA = %10010000       "Habilita puerto serial y recepcion continua
        TXSTA = %00100100       "Habilita transmicion en modo asincronico
        PIE1 = %00100000        "interrupcion de recepcion habilitada

" Set TMR0 to interrupt every 16.384 milliseconds
        OPTION_REG = %11000101        " Set TMR0 configuration and not enable PORTB pullups
     

        INTCON = %11100000      "Habilitar interr. generales,perifericos
                                "y TMR0

        Init = 1                "marca de inicio
"*************************************
"Inicio del programa
"*************************************
Inicio:
    gosub ApagSalidas
" Guarda CteKal, Set1 y Set2 arrancando en posicion 1 cuando se programa

EEPROM ValHigh,[$F0,$00]
EEPROM ValLow,[$32,$00]
EEPROM TempHigh,[$F0,$00]
EEPROM eeFinal,[$FA,$00]
eeprom eeDir,[$07]
eeprom Menu,[$07]

    clear                       "poner las variables a cero en arranque
    "calcular divisiones internas
    gosub   VerBits
    Espera = 20 "carga valor inicial en tiempo de espera Comm
    pause   100                    "pausa para habilitar el display

    for I = 1 to 6
      LCDOut $FE,1
        pause 200   
      LCDOut "Inicializando..."
       lcdout  $FE, $C0                "a segunda linea
       LCDOut dec BitsConv, "Bits="
       LCDOut $fe, $C9              "seguir en segunda linea
       LCDOut dec MaxBits,   "Div"
        pause 200
    next I
    PAUSE 1200
    LCDOut $fe, 1               "Borrar LCD
    lcdout  " Controlador de "
    LCDOut $fe, $C0              "posicionar en inicio segunda linea
    LCDOut " PRESION FILTROS"
    pause 2000
   
    "restaurar valores de la EEprom
    read eeKal, CteKal.byte0     "levanta el valor de la constante
    read eeKal+1, CteKal.byte1    "de calibracion del instrumento
    read eeOffset, Offset.byte0     "levanta el valor del Offset
    read eeOffset+1, Offset.byte1    "de calibracion del instrumento
    read eeSpan, Span.byte0     "levanta el valor del Span
    read eeSpan+1, Span.byte1    "de calibracion del instrumento
    read eeFinal, Final.byte0     "levanta el valor del maximo de escala
    read eeFinal+1, Final.byte1    "de calibracion del instrumento
    read ValHigh, MaxPres.byte0     "levanta el valor de maxima presion
    read ValHigh + 1, MaxPres.byte1    "de calibracion del instrumento
    read ValLow, MinPres.byte0     "levanta el valor de minima presion
    read ValLow + 1, MinPres.byte1    "de calibracion del instrumento
    read TempHigh, MaxTemp.byte0     "guarda el valor de maxima temperatura
    read TempHigh + 1, MaxTemp.byte1    "de calibracion del instrumento
    read eeDir, Direccion           "levanta direccion de red
    read Menu, MaxMenu              "levanta el maximo de menues activo
    gosub    CalcCheckIn            "calcula checksum entrada
"rutina de testeo general ante pulsacion de boton UP al inicio
    X = 0
   " button  TeclaUp,1,100,10,X,1,MensInit
    ClickUp:
        pause 100                   "pausa de 100 milisegundos
        X = X + 1                   "incrementa X
           if X > 10 then MensInit     "presionada un segundo va a mensaje
       if TeclaUp = 1 then ClickUp "repite hasta liberar boton
      X = 0                       "pongo en cero la variable
"rutina de testeo general ante pulsacion de boton Prog al inicio          
    ClickProg:
        pause 100                   "pausa de 100 milisegundos
        X = X + 1                   "incrementa X
            if X > 20 then Calibrar     "presionada dos segundos va a calibrar
        if TeclaProg = 1 then ClickProg "repite hasta liberar boton
"rutina de testeo general ante pulsacion de boton Left al inicio
    X = 0
   " button  TeclaDown,1,100,10,X,1,PruebaIO
    ClickLeft:
        pause 100                   "pausa de 100 milisegundos
        X = X + 1                   "incrementa X
           if X > 10 then PruebaIO     "presionada un segundo va a mensaje
       if TeclaDown = 1 then ClickLeft "repite hasta liberar boton
   " gosub PruebaIO
"**********************************    
"rutina principal
"**********************************
    on interrupt goto Interrupcion  "ante interrupcion usar handler int.
   
Loop:
    if ticks >= Convert then
    disable
        gosub   Convertir
    enable
    "if ticks >= Convert then
        gosub   Calculo             "preparo valor a mostrar en display
        gosub   Display             "muestra el resultado en display
        Var2 = Var2 + 1             "incrementa conteo de pasadas por aqui
      "  Convert = ticks + 2         "solo muestra dentro de tres ticks    
        Convert = ticks + 3         "solo muestra dentro de cuatro ticks          
    "actualiza display (60/2=30) 30 veces por segundo "28/10/02
    endif
    gosub   Comparar            "compara con limites y toma accion
    gosub   Teclado             "atiende acciones del teclado
goto Loop

    INCLUDE "calibrac4.bas"
    INCLUDE "convertir 12 bits Rev2.bas"
    INCLUDE "calculo.bas"
    INCLUDE "Display2.bas"
    INCLUDE "VerBits.bas"
    include "Teclado.bas"
    Include "Comparar.bas"
    Include "Filtrado.bas"

"************************************
"rutina de puesta a cero salidas I/O
"************************************
 ApagSalidas:
    High Sal1
    High Sal2
    High Sal3
    High Sal4
    High Sal5
    High Sal6
 Return
"**********************************
"rutina de prueba de reles
"**********************************
PruebaReles:
    LCDOut $FE, 1               "Borrar LCD
    LCDOut "Probando reles"  
    lcdout  $FE, $C0                "a segunda linea
    LCDOut "Relay "
    for X = 0 to 2
        B0 = 1
        high Rele1
        lcdout  $FE, $C7                "a segunda linea
        LCDOut dec B0," ON "
        pause 500
        low Rele1
        lcdout  $FE, $C7                "a segunda linea
        LCDOut dec B0," OFF"
        pause 500
        B0 = 2
        high Rele2
        lcdout  $FE, $C7                "a segunda linea
        LCDOut dec B0," ON "
        pause 500
        low Rele2
        lcdout  $FE, $C7                "a segunda linea
        LCDOut dec B0," OFF"
        pause 500
        B0 = 3
        high Rele3
        lcdout  $FE, $C7                "a segunda linea
        LCDOut dec B0," ON "
        pause 500
        low Rele3
        lcdout  $FE, $C7                "a segunda linea
        LCDOut dec B0," OFF"
        pause 500
    next X
return

"**********************************
"rutina de prueba de placa I/O
"**********************************
PruebaIO:
    for X = 0 to 4
        low Sal1
        pause 100
        high Sal1
        pause 100
        low Sal2
        pause 100
        high Sal2
        pause 100
        low Sal3
        pause 100
        high Sal3
        pause 100
        low Sal4
        pause 100
        high Sal4
        pause 100
        low Sal5
        pause 100
        high Sal5
        pause 100
        low Sal6
        pause 100
        high Sal6
        pause 100
    next X
    goto Loop
return

"**********************************
"rutina del mensaje de inicio
"**********************************
MensInit:    "*******sacado 13/3/2002 por falta de memoria
        "mensaje de bienvenida o prueba de display segun modelo
    LCDOut $fe, 1               "Borrar LCD
    LCDOut "Medidor multipro"     
    lcdout  $FE, $C0                "a segunda linea
    LCDOut "posito -MGL 2002"  
    pause 2000
    LCDOut $FE, 1               "Borrar LCD
    LCDOut "Pulse Prog para"  
    lcdout  $FE, $C0                "a segunda linea
    LCDOut "ver prueba reles"  
    X = 0
   " button  TeclaProg,1,100,30,X,1,Loop
"rutina de testeo general ante pulsacion de boton Prog  
    ClickPRG:
        pause 100                   "pausa de 100 milisegundos
        X = X + 1                   "incrementa X
           if X > 10 then Sigo     "presionada un segundo va a mensaje
       if TeclaProg = 1 then ClickPRG "repite hasta liberar boton
" Vuelve1:
     "  if  TeclaProg = 0 then  Vuelve1      
    "ClickProg2:
     "  if TeclaProg = 1 then ClickProg2 "repite hasta liberar boton
Sigo:    
    gosub   PruebaReles
   " gosub   Display
   "gosub   Transmitir
    goto    Loop
 return
 
    disable
 Interrupcion:
    INTCON.7 = 0        "apago interrupciones generales
    INTCON.6 = 0        "idem con perifericas
    INTCON.5 = 0        "idem con Int de TMR0

    if (PIR1.5 = 1) then    "no es interrupcion del TMR0, es TX
        hserin Espera,LabelExit2,[WAIT (">",hex2 DirIn,SKIP 1,hex2 CheckIn]    
"        hserin Espera,LabelExit,[WAIT (">",RX4),SKIP 1,hex2 CheckIn]
       " hserin Espera,LabelExit,[hex2 DirIn,SKIP 1,hex2 ChecKIn]  
        gosub  CalcCheckIn
        if (DirIn = Direccion)and (ChecKIn = MiCheck) then
            Gosub   PrepDigitos
            gosub   TXint
        endif
    endif  
    if (INTCON.2 = 1) then  "Si hay bandera de interrupcion por Timer0  
        ticks = ticks + 1      " Cuenta partes de segundo
        INTCON.2 = 0    " Reseteo bandera de interrupcion por Timer0  
        IF ticks < 61 Then LabelExit  
        " 61 ticks por segundo (16.384ms por tick)
        ticks = 0   " Paso un segundo - actualizo tiempo
        Convert = ticks
        second = second + 1
        CantConv = AuxConv "guardo cantidad de conversiones por segundo
        AuxConv = 0        "limpio auxiliar de conversiones por segundo
        Var1 = Var2        "guardo actualizaciones de display por segundo
        Var2 = 0           "limpio actualizaciones de display por segundo
        IF second >= 3600 Then  "si algo no paso antes borro cuenta
            second = 0
        endif
    endif  
 LabelExit2:
    RCSTA.4 = 0        "reparo error de recepcion
 LabelExit:
    RCSTA.4 = 1        "habilito recepcion continua
    INTCON.7 = 1        "enciendo interrupciones generales
    INTCON.6 = 1        "idem con perifericas
    INTCON.5 = 1        "idem con Int de TMR0
    RESUME
    enable

 "Transmitir:
  "  ChecKsum2 = "<" + (B4+30) + (B3+30) + (B2+30) + (B1+30) + (B0+30)
  "  high Habil                       "habilitacion para usar RS422
  "  hserout  ["MGLSOFT 2002",CR,LF] "Mensaje 1
  "  hserout  ["<",dec B4,dec B3,dec B2,dec B1,dec B0,dec ChecKsum2,CR,LF] "Mensaje 3
  "  low  Habil                       "RS422 a alta impedancia
" return
 
 TXint:
    high Habil                       "habilitacion para usar RS422
    ChecKsum ="<"+(TX4+30)+(TX3+30)+(TX2+30)+(TX1+30)+(TX0+30)+(T2+30)+(T1+30)+(T0+30)
    hserout ["<",dec TX4,dec TX3,dec TX2,dec TX1,dec TX0,dec T2,dec T1,dec T0,hex ChecKsum,CR,LF] "Mensaje 3
    low  Habil                       "RS422 a alta impedancia
 return
 
 CalcCheckIn:
   asm
        movf   _Direccion,w      ;cargar direccion en W
      andlw   0FH               ;comparar eliminando parte alta
        movwf   _ByteDir1
        swapf   _Direccion,w      ;leer direccion invertida
      andlw   0FH                  ;comparar eliminando parte alta
      movwf   _ByteDir2
    endasm
    "read eeDir, Direccion
      MiCheck = (ByteDir1+48)+(ByteDir2+48)+"m"
 return




Fijate si te es posible orientarme a ver como puedo interrumpir mejor, si observas veras un Label hecho para tratar el error de mala recepcion, lo puse ante la colgada que se me pegaba el PIC por falsa recepcion.

Gracias por colaborar.
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: MGLSOFT en 28 de Noviembre de 2003, 13:40:00
Mi mayor problema ya no es la comunicacion, que mal o bien esta resuelta, sino la brutal cantidad de Words usada por el On Interrupt, tal como vos dijiste antes.
Tal es asi que veras muchas de las rutinas comentadas por el hecho de falta de memoria, siendo que el PIC tiene 8 K !!!
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 28 de Noviembre de 2003, 15:31:00
Al parecer tienes la rutina de interrupcion ocupadita heee..?? Marcos .

Haver si lo podemos solucionar esto de la falta de memoria .

un par de preguntas .

los datos rs232 te vienen de un pc   ?
si es asi te sobran dos pines para utilizar control de fujo y de esta manera comprovar en el loop  principal estos pines sin utilizar la interrupcion para la comunicación?

estaria bien si la interrupcion solamente incrementara los segundos y chequearlos en el loop principal para hacer el resto de calculos ?

Te pregunto ya que es tarea dificil para mi ponerme en poco tiempo en el programa  .

Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 28 de Noviembre de 2003, 23:46:00
Hola Luis , no he utilizado nunca ningun conversor a/d , pero no creo que se pueda por software , ya que es el diseño interno hardware el que tiene el control de la conversión y simplemente lo que podemos hacer es leer el valor .

Si el chip que utilizas de 12 bits pudiera tener una resolucion de 16 , seguro que te lo venderian  como de 16 .

No descarto haciendo algun invento y seguramente digo una tonteria ,  utilizando  dos conversores con tensiones de referencia distintos y leyendolos por separado , umm .. no se .

haver si puede contestarte algun componente del foro con mas experiencia que yo en este tema .

Aprovecho para  darte mi enhorabuena por tu estupenda pagina .

sisco
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: MGLSOFT en 29 de Noviembre de 2003, 06:23:00
Escrito originalmente por Sispic
Al parecer tienes la rutina de interrupcion ocupadita heee..?? Marcos .

Haver si lo podemos solucionar esto de la falta de memoria .

un par de preguntas .

los datos rs232 te vienen de un pc   ?
si es asi te sobran dos pines para utilizar control de fujo y de esta manera comprovar en el loop  principal estos pines sin utilizar la interrupcion para la comunicación?

estaria bien si la interrupcion solamente incrementara los segundos y chequearlos en el loop principal para hacer el resto de calculos ?

Te pregunto ya que es tarea dificil para mi ponerme en poco tiempo en el programa  .




Vamos por partes, como dijo Jack...

Los datos vienen de un PC, pero en RS422 (o RS485 full duplex), si tiene control de flujo no se como se hace.
Ademas no tengo pines sobrantes (acostumbro utilizar todo el hardware disponible), ni voy a tenerlos, pues voy a mudar esto a un 16F876, con la misma memoria, pero con un puerto menos, asi que estoy frito..je..je..

Tema tiempos, si, es posible hacerlo afuera de la interrupcion.
No se si es aconsejable, pues es para implementar a futuro un reloj barato, y no tengo seguridad de chequear Just In Time el overflow de los Ticks de incremento de los segundos, entiendes??

Encima hay un protocolo, que espera recibir un caracter > para continuar con el examen...

Queres mas complicaciones?? Tengo, ehh ??

Un abrazo.
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: MGLSOFT en 29 de Noviembre de 2003, 06:29:00
Escrito originalmente por LuisFrino
Hola Sispic
queria hacerte una pregunta
estoy haciendo un intrumento utilizando un conversor A/D de 12bits
y quiero obtener una resolucion de 16 bits es posible ???
recibe mi saludo
Luis
PD estoy trabajando en un 90 % en asm y el resto en basic



Lamento informarte Luis que si quieres sacar 16 bits de un conversor este tiene que tener al menos esa capacidad.
Muy distinto seria el hecho inverso, sacarle 12 bits a uno de 16, ya que esto esta permitido en algunos de ellos, sino tambien lo podrias implementar por software.
Cual es la aplicacion que necesita tanta precision??

Mi curiosidad es para ayudarte, yo utilizo el MCP3204 de Microchip y no tengo realmente una utilizacion completa del rango, ya que termino haciendo calibracion digital (retrucha hecha por mi) y termino utilizando el 40% del rango.
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: LuisFrino en 29 de Noviembre de 2003, 07:23:00
Escrito originalmente por Sispic
Hola Luis , no he utilizado nunca ningun conversor a/d , pero no creo que se pueda por software , ya que es el diseño interno hardware el que tiene el control de la conversión y simplemente lo que podemos hacer es leer el valor .

Si el chip que utilizas de 12 bits pudiera tener una resolucion de 16 , seguro que te lo venderian  como de 16 .

No descarto haciendo algun invento y seguramente digo una tonteria ,  utilizando  dos conversores con tensiones de referencia distintos y leyendolos por separado , umm .. no se .

haver si puede contestarte algun componente del foro con mas experiencia que yo en este tema .

bueno te comento que utilizo un solo dispositivo
de 12 bits con velocidad de conversion de  200Khz estoy monitoreando
en 16 bits ningun invento solo soft y matematicas
saludos
Luis Frino


Aprovecho para  darte mi enhorabuena por tu estupenda pagina .

sisco

Título: RE: Manejo de interrupciones!!!! Help
Publicado por: MGLSOFT en 29 de Noviembre de 2003, 07:28:00
Aunque me indicaste por privado que "no me prenda", me interesa saber como lo hiciste , Luis.

Si eso no te trae problemas podrias compartirlo con todos, no es asi??
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 29 de Noviembre de 2003, 09:59:00

Me has hecho sacarle el polvo a la calculadora .
Podria ser asi por ejmplo .

$FFFF div $FFF = $10

cuatro lecturas :

$000 -> ($000*$10)+$F=$000F
$001 -> ($001*$10)+$F=$001F
$0FF -> ($0FF*$10)+$F=$0FFF
$FFF -> ($FFF*$10)+$F=$FFFF

Puedes monitorear  hasta en 32 bits si quieres pero el conversor continuará teniendo una resolución de 12 bits .
No se si es esto a lo que te refieres luis .
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: RGL en 29 de Noviembre de 2003, 10:55:00
Hola muchachos,

Yo propongo no hablar mas de este tema. Ya ha quedado claro, pienso que bastante claro.

Nosotros (todos nosotros) siempre hemos ayudado en la medida de nuestras posibilidades a la gente que ha puesto sus consultas, tambien hemos sido ayudados en numerosas ocasiones. Bien, ahi esta la clave de nuestro exito, la libertad de accion y la pretension de un bien comun sin importarnos obtener un "pago" por ello. Siempre hemos funcionado bien y hemos ido creciendo, en general la gente ha vivido feliz en este mundo virtual que Norberto creo. Bien, como en todo organismo vivo, siempre hay alguna friccion o malentendido entre algunos de nosotros pero eso es una excepcion en un mar de tranquilidad.

En definitiva, somos un foro muy activo y bueno !!sigamos asi muchachos!!, Seamos libres y aportemos libremente lo que podamos o queramos.

Por ultimo me gustaria pro poner que para que no haya malentendidos describamos los problemas lo mas detalladamente posible, a ser posible con un poco de codigo y si todavia no hay codigo pues con una descripcion detallada y documentada y nos abstengamos de poner "Necesito ayuda", sin singun comentario, porque en este caso no se sabe si queremos ayuda para el oscilador, para alimentacion o es estamos pidiendo 10 dolares para comprarnos unos pantalones.

Un abrazo para todos y nos vemos en el foro con nuevas preguntas-respuestas

Ricky
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: RGL en 29 de Noviembre de 2003, 11:04:00
Creo que me he precipitado al escribir y no me he dado cuenta que la discusion ya habia sido zanjada, al leer la primera pagina me lance sin darme cuenta que habia otras dos paginas mas.

Asi que pido disculpas por mi precipitacion

Saludos
Ricky
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 30 de Noviembre de 2003, 03:04:00
Heyyyy Marcos ande te has ido ..... asi que privaditos con luis heeee ???? . Haver si comparte con nosotros su secreto .

Espabila que tienes tajo :
Codigo:

Define  INTHAND  _Interrupcion


wsave        var byte bank0 system  " estos registros en banco 0 obligatorio
ssave        var byte bank0 system
psave        var byte bank0 system
ticks        var byte bank0 system
Convert      var byte bank0 system
segundos     var byte bank0 system
minutos      var byte bank0 system

Interrupcion: "********* Asegurate que este en pagina 0 *************
asm
   bcf INTCON , GIE ; apaga interrupciones generales

   ; interrupcion por Timer0
 
   decfsz ticks,f
   goto SalInt
   movlw 122     ; Paso un segundo - actualiza tiempo
   movwf ticks
   movlw 6
   movwf tmr0
   clrf Convert         ; Convert = 0
   incf   segundos,f
   movf   segundos,w
   sublw 60
   btfss STATUS,Z   ; 60 segundos ?
   goto  SalInt   ; no
   clrf   segundos   ; si
   incf   minutos,f
   
SalInt
    bcf   INTCON , T0IF  ; Resetea bandera de interrupcion por Timer0   
    bsf INTCON , GIE   ; Activa interrupciones generales
    movf  psave,w      ; restaura
    movwf PCLATH
    swapf ssave,w
    movwf STATUS
    swapf wsave,f
    swapf wsave,w
    retfie
EndAsm

ActivaInterr:  "***********************************************

ticks=122     " OSC 4 Mhz.  ok ???
segundos=0
minutos=0
TMR0=6
OPTION_REG=%00000100   " prescaler 1:32
INTCON.5=1 "T0IE  - TMR0 Overflow Interrupt Enable
INTCON.7=1 "GIE   - interrupciones generales
Return


Haber si puedes adaptar esto a tu programa , olvídate de momento del RS422 y en vez de usar una word para los segundos , utiliza dos bytes segundos y minutos .

ya contaras .
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: MGLSOFT en 01 de Diciembre de 2003, 05:18:00
OK, Sisco, lo pruebo y te aviso.
Tal como lo leo me parece logico, ademas descular de a tramos es tambien logico.
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: MGLSOFT en 01 de Diciembre de 2003, 05:56:00
Una mas Cisco y me voy...


Interrupcion: "********* Asegurate que este en pagina 0 *************
asm
   bcf INTCON , GIE ; apaga interrupciones generales



Como me aseguro que la rutina esta en pagina 0 ???
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 01 de Diciembre de 2003, 09:21:00
Si , ponlo al principio del programa para ir a lo seguro .
por  ejemplo despues de la definicion de las variables .

a var byte
b var byte
etc .

goto Main  " saltas el handle de interrupcion

Interrupcion:
bla
bla
bla
retfie


Main " inicio del programa

Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 19 de Diciembre de 2003, 22:25:00
Hola a Todos, Tras unos dias de intentar dar con la solución,
me decido a preguntar de nuevo....
mis conocimientos de asm, son minimos, y mi cerebro ha quedado colapsado....
supongo que la solución, no será demasiado compleja, pero para mi, lo es...
.
explico mis intenciones

tengo un programilla en PBP, en el que me he creado 4 variables
flag, para controlar los estados de lectura de 4 pines

FL_var1, FL_var2, FL_var3, FL_var4
estas 4 varialbes, en el modulo principal en PBP, se setean a unos valores, por ejemplo 16,4,32,1 (estos van a ser los valores de inactividad en minutos)

ahora viene la duda...
En los post anteriores, sispic, dejo una parte de código, que me ha sido muy util, pero lo que necesito, es adaptarla, para que en vez de que cada 60 segundos, incremente un minuto,  decremente las variables FL_var1 - FL_var4, siempre y cuando estas no esten a 0.

para que esta idea????
Pues, la necesito, para controlar que no se lea el valor de cada uno de los pines, por determinado tiempo en minutos.

Alguna sugerencia???

Muchas gracias de antemano

--
Atentamente
Abago
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 20 de Diciembre de 2003, 00:23:00
Que te parece  .......
puedes usar basic sin problemas para decrementar variables en la interrupcion , aunque  será in pelin mas lenta.

pruebalo así  y si acaso se diseña directamente en asm si te da problemas aunque no hay mucha diferencia .


Codigo:

FL_var1  var byte bank0 system
FL_var2  var byte bank0 system
FL_var3  var byte bank0 system
FL_var4  var byte bank0 system

Interrupcion: "********* Asegurate que este en pagina 0 *************
asm
   bcf INTCON , GIE ; apaga interrupciones generales

   ; interrupcion por Timer0
 
   decfsz ticks,f
   goto SalInt
   movlw 122     ; Paso un segundo - actualiza tiempo
   movwf ticks
   movlw 6
   movwf tmr0
   clrf Convert         ; Convert = 0
   incf   segundos,f
   movf   segundos,w
   sublw 60
   btfss STATUS,Z   ; 60 segundos ?
   goto  SalInt      ; no
   clrf   segundos   ; si
   endasm
   if FL_var1 <> 0 then FL_var1=FL_var1-1
   if FL_var2 <> 0 then FL_var2=FL_var2-1
   if FL_var3 <> 0 then FL_var3=FL_var3-1
   if FL_var4 <> 0 then FL_var4=FL_var4-1
   asm
   
SalInt



salud2
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 20 de Diciembre de 2003, 12:44:00
Muchas Gracias Sispic, pedí una soluciñon, y ya la tengo.
La idea, es perfecta, en principio, empecé haciendo el modulo de interrupciones en PBP, al ver que comentabas, que no era recomendable, empecé a leer, y a preguntar, y ya tengo el handler en ASM, pero se me puso por medio, el problema que comento en el post anterior.
Me habia atascado.... Pero mi atasco se ha producido por pensar unicamente en asm...

Tu solución es perfecta... Muchas gracias....

Es muy complicado hacerlo en ASM???? Es que ya me lo he tomado como un reto personal...



Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 20 de Diciembre de 2003, 23:05:00
----------- Esta es parte de la pregunta....
..
..
...

PORQUE NO DECREMENTA????
En teoria, cada vez que pase un minuto, tendría que descontar las variables flag... Pero no es asi... Veis algo raro????

Tnks...


----------- He editado el post, y este codigo, ya funciona Perfectamente...

Define  INTHAND  _myint

TMR0=6
OPTION_REG=%00000100   " prescaler 1:32
INTCON.5=1 "T0IE  - TMR0 Overflow Interrupt Enable
INTCON.7=1 "GIE   - interrupciones generales


SALVAW       var byte bank0 system
SALVASTATUS  var byte bank0 system
SALVAPCL     var byte bank0 system
ticks        var byte bank0 system
Convert      var byte bank0 system
segundos     var byte bank0 system
minutos      var byte bank0 system

flvar1 var byte
flvar2 var byte
flvar3   var byte

cont var byte

ticks=122     " OSC 4 Mhz.  ok ???
minutos = 0
segundos = 0
flvar1 = 10
flvar2 = 2
flvar3 = 20

goto inicio

myint: "********* Asegurate que este en pagina 0 *************
asm
intt
      bcf     INTCON,GIE           ;Asegura la
      btfsc   INTCON,GIE           ;deshabilitacion
      goto    Intt                 ;global de las interrupciones
;
      bcf     INTCON,T0IF          ;Pone a cero para poder salir de la ISR
      ;bcf     INTCON,T0IE          ;Sacar si se quiere seguir capturando interrupciones en RB0
      decfsz ticks,f
      goto RestaurarRegistros
      movlw 122     ; Paso un segundo - actualiza tiempo
      movwf ticks
      movlw 6
      movwf tmr0
      clrf Convert         ; Convert = 0
      ;btfsc segundos
      incf   segundos,f
      movf   segundos,w
      sublw 60
      btfss STATUS,Z   ; 60 segundos ?
      goto  RestaurarRegistros   ; no
      clrf   segundos   ; si
      incf  minutos,f
      endasm
            if flvar1 > 0 then flvar1 = flvar1 - 1
            if flvar2 > 0 then flvar2 = flvar2 - 1
            if flvar3 > 0 then flvar3 = flvar3 - 1
      asm
;
RestaurarRegistros
      ; Retorna habilitando todas las interrupciones
      bcf   INTCON , T0IF  ; Resetea bandera de interrupcion por Timer0
      bsf     INTCON , GIE             ; Activa interrupciones generales
      movf    SALVAPCL,w                  ; Restore PCLATH, STATUS and W registers
      movwf   PCLATH
      swapf   SALVASTATUS,W        ;Invierte STATUS --> W
      movwf   STATUS               ;Restaura STATUS
      swapf   SALVAW,F             ;Invierte --> F
      swapf   SALVAW,W             ;Restaura W
    retfie
EndAsm



inicio:  "***********************************************
inr:    
            pause 300
            serout2 portb.7,188,[dec(segundos), " - " , dec(minutos) , " - " , dec(flvar1), " - " ,dec(flvar2), " - " , dec(flvar3), 13,10]
goto inr
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 21 de Diciembre de 2003, 01:14:00
Gracias Sispic...

He editado el anterio post, con las modificaciones pertinentes...
Ya funciona...
No queria cargar el foro con errores...

Muchas gracias por tu ayuda...

de momento, me quedo con que ya funciona... Pero seguro que le seguiré dando vueltas...
A ver si lo saco en ASM...

Reitero en darte las gracias...

Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 21 de Diciembre de 2003, 01:39:00
que compilador utilizas ?

si usas pbp 24x tendrias que usar esos nombres obligatoriamente para restaurar los registros ya que sin que tu se lo digas los salva antes de entrar en la interrupción.

wsave      
ssave
psave      

con el plus lo miro

Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 21 de Diciembre de 2003, 04:18:00
Hola Sispic...
Utilizo la version 2.43 de PBP
El programa, me funciona de los dos modos....
Pero tengo un problema...
Se me cuelga...

te dejo el programa completo, a ver si ves algo que pueda estar mal...


DEFINE OSC 4
Define  INTHAND  _myint

symbol Led_RF = porta.3

wsave       var byte bank0 system
ssave       var byte bank0 system
psave       var byte bank0 system
ticks        var byte bank0 system
Convert      var byte bank0 system
segundos     var byte bank0 system
minutos      var byte bank0 system

Flag_RF      var bit bank0 system
Flag_RB47        var byte bank0 system

flvar1      var byte
flvar2     var byte
flvar3       var byte

cont         var byte

SerialCNF con 188 " configuración del puerto serie con max232 4800 8N1 sin control de flujo




goto inicio

myint:
asm
intt
      bcf     INTCON,GIE           ;Asegura la
      btfsc   INTCON,GIE           ;deshabilitacion
      goto    Intt                 ;global de las interrupciones
;
      movwf   wsave                ;Salva W
      swapf   STATUS,W             ;Invierte STATUS --> W
      movwf   ssave                ;Salva STATUS
;
      btfsc   INTCON,INTF          ;? Hubo interrupcion en RB0 ?
      goto    In                   ;Si
      btfsc   INTCON,T0IF          ;? Hubo sobrefujo en TMR0 ?
      goto    T0                   ;Si
      btfss   INTCON,RBIF          ;? Hubo algun cambio de RB4-RB7 ?
      goto    RestaurarRegistros   ;No
;
Rb47  bcf     INTCON,RBIE  
      bsf     Flag_RB47            
      goto    RestaurarRegistros
;
T0    bcf     INTCON,T0IF
      decfsz ticks,f
      goto RestaurarRegistros
      movlw 122     ; Paso un segundo - actualiza tiempo
      movwf ticks
      movlw 6
      movwf tmr0
      clrf Convert         ; Convert = 0
      incf   segundos,f
      movf   segundos,w
      sublw 60
      btfss STATUS,Z   ; 60 segundos ?
      goto  RestaurarRegistros   ; no
      clrf   segundos   ; si
      incf  minutos,f
      endasm
            if flvar1 > 0 then flvar1 = flvar1 - 1
            if flvar2 > 0 then flvar2 = flvar2 - 1
            if flvar3 > 0 then flvar3 = flvar3 - 1
      asm    
;
      goto    RestaurarRegistros
;
In    bcf     INTCON,INTF        
      btfss   Flag_RF
      goto    in1
      bcf     Flag_RF
      goto    RestaurarRegistros
in1   bsf     Flag_RF
      goto    RestaurarRegistros
;
RestaurarRegistros
      ; Retorna habilitando todas las interrupciones
      bcf   INTCON , T0IF  ; Resetea bandera de interrupcion por Timer0
      bsf     INTCON , GIE             ; Activa interrupciones generales
      movf    psave,w                  ; Restore PCLATH, STATUS and W registers
      movwf   PCLATH
      swapf   ssave,W        ;Invierte STATUS --> W
      movwf   STATUS               ;Restaura STATUS
      swapf   wsave,F             ;Invierte --> F
      swapf   wsave,W             ;Restaura W
    retfie
EndAsm

ActivaInterr:

ticks=122     " OSC 4 Mhz.  ok ???
segundos=0
minutos=0
TMR0=6
OPTION_REG=%00000100   " prescaler 1:32

INTCON = %11110000    " Enable interrupt on general,PORTB.0, timer0

" -----------------------

Return


inicio:  "***********************************************
flvar1 = 10
flvar2 = 2
flvar3 = 20
Flag_rf = 0

call activainterr

inr:    
          while flag_rf > 0
          high led_Rf  
            serout2 portb.7,188,[dec(segundos), " - " , dec(minutos) , " - " , dec(flvar1), " - " ,dec(flvar2), " - " , dec(flvar3), 13,10]
          wend
          low led_rf        
goto inr


estoy testeando las interrupciones, para conocerlas mas a fondo... Pero me estoy dando una cantidad de golpes con ellas... que creo que van a acabar conmigo.,....

con este programa, lo que hago es leer la interrupción por rb0, y entrar en un bucle, que saca datos por puerto serie
en estos datos, leo los minutos, y los segundos testeados por la interrupción por timer0, y los datos de las variables flvarX, que van decrementando prograsivamente....
Supongo que esta explicación no seria necesaria... PEro la pongo por si acaso...

Bueno, pues me da un problema.. Y no se cual es....
Doy un pulso al portb.0, se me activa el flag_rf = 1...
y entro en el bucle que saca datos por puerto serie...
Hasta hay todo bien...
Los datos salen por el puerto serie a la perfección... Pero deberian salir... Constantemente hasta que entrase otro pulso por el portb.0... y se pusiese la varable Flag_rf  = 0... Pero cual es mi sorpresa....????
el bucle while, se termina por si solo.... Sin yo actuar sobre el portb.0

??????

A ver si veis algo.. que se me escape a mi....

Gracias.
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 21 de Diciembre de 2003, 04:27:00
Se me olvidaba....
Parece que el codigo, va un poco lento....
Es posible????

Hay alguna forma de calcular el tiempo que ha sido pulsado el RB0???
Necesito que mi programa, dependiendo del tiempo que tengo pulsado el RB0, haga una u otra cosa....

Tnks.

Perdonad, si no dejo de hacer preguntas....
Pero esto le pasa a uno por querer aprender demasiado rápido....

llevo dos dias sin dormir por culpa de estos maravillosos cacharritos.... (PIC)

Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 21 de Diciembre de 2003, 07:14:00
Te daré mi opinion , aunque tu puedes hacerlo como quieras .

******************************
intt
bcf INTCON,GIE ;Asegura la
btfsc INTCON,GIE ;deshabilitacion
goto Intt ;global de las interrupciones

Si pones a cero el bit GIE es absurdo  comprovar si esta a cero
**********************************
In bcf INTCON,INTF
btfss Flag_RF
goto in1
bcf Flag_RF
goto RestaurarRegistros
in1 bsf Flag_RF
goto RestaurarRegistros ......-> Esto te lo puedes ahorrar
;
RestaurarRegistros
**********************************
while flag_rf > 0
high led_Rf
serout2 portb.7,188,[dec(segundos), " - " , dec(minutos) , " - " , dec(flvar1), " - " ,dec(flvar2), " - " , dec(flvar3), 13,10]
wend

Esto te saturará rapidamente el buffer de recepcion del pc si no le pones un pause
************************************
while flag_rf > 0

yo lo haria así
while flag_rf = 1
************************************
se supone que tendras rb0 con una resistencia pushpull o como se llame , ademas tendrias que ponerle un pequeño retardo por software para los rebotes del pulsador.

Una forma seria esta aprobechando el serout::

if flag_rf = 1 then
high led_Rf
pause 50
INTCON.INTE=1 ***"permiso para otro impulso rb0 , no lo hagas en la interrupcion , ademas ponlo a cero al entrar en ella
INTCON.INTF=0  
while flag_rf = 1
serout2 portb.7,188,[dec(segundos), " - " , dec(minutos) , " - " , dec(flvar1), " - " ,dec(flvar2), " - " , dec(flvar3), 13,10]
pause 500
wend
endif

por lo demas parece correcto .

nos cuentas haver como te marcha .
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 22 de Diciembre de 2003, 15:21:00
casi todo funciona perfectamente...
PERO!!!!

en el modulo principal....
Tengo un problema

como me digiste sispic, puse lo siguiente...

if flag_rf = 1 then
high led_Rf
pause 50
INTCON.INTE=1 ***"permiso para otro impulso rb0 , no lo hagas en la INTCON.INTF=0
while flag_rf = 1
 serout2 portb.7,188,[dec(segundos), " - " , dec(minutos) , " - " ,     dec(flvar1), " - " ,dec(flvar2), " - " , dec(flvar3), 13,10]
 pause 500
 wend
else
 serout2 portb.7,188,[dec(segundos)]
 low led
endif
 
Ok... Casi funciona.... Pero....
Hago el testeo del programa por medio del hyèrterminal....
Y......
En la primera parte del if, cuando el flagrf esta a 1, funciona durante un tiempo.... Pero no se por que causa....
De vez en cuando, el pic, se resetea....

en la segunda parte del if, cuando el flagrf esta a 0
comienza la cuenta de los segundos... y cuando llega al 16....
se resetea...


Alguna idea????
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: MGLSOFT en 22 de Diciembre de 2003, 16:02:00
Agrega la instruccion CLRWDG en las partes que consumen tempo de tu programa, es posible que resetee por el Watchdog, que varias instrucciones del PBP lo configuran automaticamente.
La otra es que con el DEFINE lo deshabilites...
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 22 de Diciembre de 2003, 17:48:00
Tnks...

Me imaginaba, que era algo asi...
A ver si lo testeo y ya os cuento....

Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 23 de Diciembre de 2003, 16:23:00
He intentado deshabilitar el CLRWDG en los define del programa, y asi, no funciona...
Voy a internar limpiar el CLRWDG antes de hacer el serout, a ver si asi funciona...
la verdad, es que em el programa que quiero hacer, no manda serout constantemente, pero hay que forzar el codigo, al maximo, para que despues no tengamos sustos...

Muchas gracias por las recomendaciones...
Tnks
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 23 de Diciembre de 2003, 16:28:00
es posible que el serout cuelgue el micro???
supongo, que en el tiempo que se manda la sentencia serout, el timer, se active unas cuantas veces...
es posible que se deba a esto???
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 24 de Diciembre de 2003, 00:21:00
No me había fijado que salvas los registros

movwf wsave ;Salva W
swapf STATUS,W ;Invierte STATUS --> W
movwf ssave ;Salva STATUS

no tienes que hacerlo , pbp ya lo incluye en el codigo.
haver si puede ser esto.

y buenas fiestas para todos.
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 24 de Diciembre de 2003, 01:05:00
Si no salvo los registros, aun es peor...
Cuando el flagrf = 0, cuenta los segundos, como le viene en gana...
Y cuando el flagrf = 1 se queda colgado....

Sobre lo del CLEARWDT, lo he puesto, justo delante del serout, y parece que ha mejorado, pero sigue pegandosela...




Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 24 de Diciembre de 2003, 01:42:00
No esta solucionado... Pero funciona...
he incrementado los PAUSE del procedimiento principal...
Anteriormente, el serout, se ejecutaba cada 50 ms si el flagrf = 0
y casa 300ms si el flagrf = 1....
Los he puesto los dos a 900 ms.... Y parece que funciona....
Lo que realmente, me gustaria saber, es porque no funciona con los otros parametros...???

De todos modos, antes de cantar victoria, voy a dejar el circuito funcionando todo el dia a ver si le encuentro algun problema...

Muchas gracias por vuestra ayuda...


Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 27 de Diciembre de 2003, 06:57:00

NO FUNCIONA!!!!

Despues de dejar el circuito funcionando casi 2 dias....
Sorpresa... al ver el log.... parece que el pic, se resetea, cuando le viene en gana...

Alguna idea????

Tnks... A ver si antes del 2004.. Consigo que funcione...
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 27 de Diciembre de 2003, 11:39:00
no puedo provarlo pero yo estoy en que no tienes que salvar ningun registro al entrar en la interrupcion.
PBP ya lo hace y al hacerlo otra vez vete a saver lo que pasa.

Codigo:

si tu codigo es mayor de 2k que seguramente lo es , declara estas variables como estan

wsave      var   BYTE    $020 SYSTEM
wsave1      var   BYTE    $0a0 SYSTEM
wsave2      var   BYTE    $120 SYSTEM
wsave3      var   BYTE    $1a0 SYSTEM
ssave      var   BYTE    BANK0 SYSTEM
psave      var   BYTE    BANK0 SYSTEM

y restaura de esta manera al salir

    movf  psave,w          
    movwf PCLATH
    swapf ssave,w
    movwf STATUS
    swapf wsave,f
    swapf wsave,w
    retfie           



asegurate que el codigo de la interrupción se encuentre en pagina 0 y todas las variables que uses en ella esten en el banco 0 , o de lo contrario tendras que saver en que banco se encuentran , cambiarlo para trabajar con ellos y seleccionar el 0 antes de restaurar y salir .

Haver si lo consigues .
un saludo
sisco.
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 27 de Diciembre de 2003, 14:57:00
En cuanto llegue a casa...
lo intento... ahora me encuentro trabajando...

como ya lei en la pñagina 2 del post,  para poner el modulo de interrupción en la pagina 0... hay que poner el codigo en el principio del programa...
estoy en lo cierto???
o hay otra forma???

Tnks
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 28 de Diciembre de 2003, 07:28:00
No funciona!!!
lo primero, es que me da un error al compilar...

wsave      var   BYTE    $020 SYSTEM
wsave1      var   BYTE    $0a0 SYSTEM
wsave2      var   BYTE    $120 SYSTEM
wsave3      var   BYTE    $1a0 SYSTEM



de momento el codigo ocupa 406 words....
solo testeo las interrupciones y ejecuto los serout....

estoy utilizando el pic 16f84a....

en segundo lugar... si no guardo los registros al entrar en la interrupción....
de vez en cuando los datos que salen por el puerto serie.... no son correctos...

os dejo un ficherito log, para que veais que datos me salen por el serie.... y que veais que no tiene coherencia el reseteo del pic...
no se rige por ninguna regla... lo hace aleatoriamente...

Para mi consuelo... he conseguido que tarde muchisimo mas en reseterase... Pero aun lo hace...


Bueno, no os dejo el log... Porque no queda espacio en el foro, para ficheros adjuntos...
Si veis que os puede ser de utilidad... Os lo mando por mail...

GRacias....
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 08 de Enero de 2004, 13:16:00
Hola a todos....

Tras mi insistencia... Y fracaso...
he decidido migrar el proyecto a un pic 16f876...
La idea no ha salido sola... Ha sido de sispic.
Bueno, ahora me encuentro con el segundo dilema...
Como transmito datos por serie utilizando la uart del 16f876???

Como seteo el baudrate???...
Vamos en general... Como se trabaja con la uart en vez de usar el serout2???

Gracias!!!
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 08 de Enero de 2004, 14:02:00
puedes usar HSERIN y HSEROUT
http://www.todopic.com.ar/pbp_sp.html#hserin

Pero solo fué un consejo ya que serout2 consume muchos recursos .

Bueno ...haver que haces .
Suerte con tu proyecto.


Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 10 de Enero de 2004, 13:53:00
puedes usar hserout, hserin sin problemas.
por cierto ¿ conoces "Microchip Application Maestro" ?
lo configuras con tus necesidades  y te genera las macros en asm para USART,I2C,CAN etc .
Creo que está muy bien .

Tu archivo me llegó corrupto ,asi que no lo pude mirar .

Suerte.
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 12 de Enero de 2004, 10:41:00
Hola Sispic,
Ahora que migro el programa a 16f876, me da error en las declaraciones de:
DEFINE HSER_RCSTA = 90H
DEFINE HSER_TXSTA = 20H
DEFINE HSER_BAUD = 4800

Por lo demas, ha cambiado los pines RX, TX y poco mas....

el error me da en la fase de compilación:
Error c:pbppbppic14.lib 7411 : [226] Numeric Constant or symbol Name Expected

Tnks
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 12 de Enero de 2004, 10:52:00
" coloque el registro receptor en receptor habilitado

DEFINE HSER_RCSTA 90h

" coloque el registro de transmisión en transmisión habilitada

DEFINE HSER_TSTA 20h

" coloque baud rate

DEFINE HSER_BAUD 2400

No te despistsesssss .......:


Título: RE: Manejo de interrupciones!!!! Help
Publicado por: 25javier en 16 de Enero de 2004, 11:52:00
hola!!tengo unproblema con las interrupciones, encontre algo bastante extraño,en el programa que les mando genero una interrupcion por RBO ,intento prender y apagar un led cuando esto sucede pero parece no hacerme caso al delay(que hay entre el encendido y el apagado),el delay lo cheque afuera de la rutina de interrupcion y anda bien...
Cuando hay una interrupcion por RBO el programa entra bien en la rutina de interrupcion pero no me respeta el delay ,me prende el led mientras mientras esta presente la interrupcion y tendria que prenderlo ,esperar el delay y apagarlo ...bueno...ahi les mando el codigo a ver quien me puede dar una mano,saludos
Javier
pd:en el programa principal prendo y apago otro led(led2)

Define INTHAND _INTERRUPCION
SALVAW var byte bank0 system
SALVASTATUS var byte bank0 system
SALVAPCL var byte bank0 system
FLIP1 VAR BYTE bank0 system   "FLIP 1,FLIP2,FLIP3 VARIABLES USADAS PARA EL DELAY
FLIP2 VAR BYTE bank0 system
FLIP3 VAR BYTE bank0 system
led1 var porta.3              "LED 1
led2 var porta.2              "LED 2  
cont var byte
OPTION_REG=%10000000  "DESABILITO PULL UP,FLANCO DECRECIENTE RBO
INTCON=%10010000  "HABILITO INTERRUPCIONES GLOBAL,HABILITO INTERRUP RBO
trisa=0           "porta salidas
led2=0
led1=0
cont=0
FLIP1=0
FLIP2=0
FLIP3=0
goto Programa_principal

INTERRUPCION: "**********************

asm
 bcf INTCON,GIE ;desactivo interrup
 bcf INTCON,INTF ;borro bandera rbo
 bsf _led1      ;prendo led      
 call delay     ;llamo retardo aprox 1 seg  
 bcf _led1       ;apago led
 movf SALVAPCL,W ; Restore PCLATH, STATUS and W registers
 movwf PCLATH
 swapf SALVASTATUS,W ;Invierte STATUS --> W
 movwf STATUS ;Restaura STATUS
 swapf SALVAW,F ;Invierte --> F
 swapf SALVAW,W ;Restaura W
 bsf INTCON,GIE ; Activa interrupciones generales
 retfie

delay                   ;DELAY aprox 1 SEGUNDO(cristal 4mhz)
       MOVLW .5
       MOVWF FLIP3
AHI    movlw .255
       movwf FLIP1
ALLI   movlw .255
       movwf FLIP2
       DECFSZ FLIP2,f
       GOTO $-1
       DECFSZ FLIP1,f
       GOTO ALLI
       DECFSZ FLIP3
       GOTO AHI
       return
endasm
Programa_principal:
led2=1
pause 1000
led2=0
pause 1000
goto Programa_principal
end

Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 18 de Enero de 2004, 12:29:00
Si utilizas PBP 2xx tienes que usar estos registros para restaurar al salir .

wsave var byte bank0 system
ssave var byte bank0 system
psave var byte bank0 system

perece todo bien .

un saludo
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Sispic en 18 de Enero de 2004, 12:34:00
Fijate lo que hace al producirse una interrupcion.
Este codigo se genera solo .
Codigo:

* 1141   0004- 00A0                 movwf   wsave           ; Save the W register
* 1142   0005- 0E03                 swapf   STATUS, W
* 1143   0006- 0183                 clrf    STATUS          ; Point to bank 0
* 1144   0007- 00C1                 movwf   ssave           ; Save the STATUS register
* 1145   0008- 080A                 movf    PCLATH, W       ; Save PCLATH
* 1146   0009- 00BB                 movwf   psave
* 1147   000A- 3004                 movlw   ((INTHAND) >> 8)        ; Set PCLATH for jump
* 1148   000B- 008A                 movwf   PCLATH
* 1149   000C- 2CAE                 goto    INTHAND         ; Goto user interrupt handler



Si usamos otros registros no se que puede pasar .
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 18 de Enero de 2004, 17:39:00
He migrado el codigo al 16f876... Y parece que de momento, no se resetea....
Ahora me toca pegarme con los registros, porque al restaurar las variable, creo que tengo algo mal....
Al hacer el hserout de la variable minutos y segundos, de vez en cuando el hiperterminal, parece que lee,  lo que le viene en gana, o que las variables cambian de valor...
Voy a ver...

Tnks
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 18 de Enero de 2004, 18:22:00
Parece que ya funciona....
Haciendo caso a lo que nuestro querido amigo SISPIC, me comento anteriormente...
He retirado la parte de codigo que guardaba los registros antes de ejecutar el codigo de la interrupción... y todo parece que funciona bien....
Mañana os contaré, si no se ha resateado el pic...

Me resulta muy extraño, pero con el 16f84, si no guardaba estos registros... no funcionaba ni a palos.... y sin embargo, con el 16f876... es al contrario...

Bueno, en fin, que de momento todo funciona, y eso es lo que realmete queria... Asi que a seguir pensando para hacerle perrerias al circuito...

Saludos Para todos...
En particular a SISPIC...
TNKS...
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 18 de Enero de 2004, 18:29:00
Escrito originalmente por Sispic
Si utilizas PBP 2xx tienes que usar estos registros para restaurar al salir .

wsave var byte bank0 system
ssave var byte bank0 system
psave var byte bank0 system

perece todo bien .

un saludo


Tiene razon sispic.. Yo cai en el mismo error...

Suerte!!!...
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: 25javier en 19 de Enero de 2004, 16:45:00
Gracias por la ayuda!!!!!!;ahi estaba la metida de pata...les cuento que en el interin de resolver este problema,me meti por primera vez con el pbp plus y me anduvieron todas las interrupciones perfectamente sin hacer tantos "arreglos"
Saludos y  gracias!!
Javier
Título: RE: Manejo de interrupciones!!!! Help
Publicado por: Abago en 24 de Enero de 2004, 14:43:00
Ahora una duda exixtencial.....
No me funcionan las interupciones perifericas en portb4.7
??? despues de migrar el proyecto a pic16f876...
Y lo que realmente me interesa...
COMO??? puedo leer el tiempo que esta pulsado el pin portb.0???
el tema esta en que pongo el portb0 an alto, y hasta que no lo paso a estado 0, no entra en la interrupción....
Mi idea, es usando la interrupción, poder discriminar el tiempo que ha estado pulsado el portb0 para usar este pin para mas de una función.
por ejemplo si pulso el portb0 durante 3 segundos, enciendo un led, y si lo pulso 10 segundos, el led parpadea.

Alguna idea???

Se puede hacer??

TNKS.
Título: Re: Manejo de interrupciones!!!! Help
Publicado por: PIC-A-SHU en 06 de Julio de 2006, 17:56:23
HOLA, ME LLAMO ALEXIS Y SOY NUEVO EN ESTA SECCION DEL FORO. MI INTENSION ES APRENDER CON UDS. SIEMPRE Y CUANDO TENGAN LA AMABILIDAD DE AYUDARME EN LO QUE SE PUEDA.

YO ESTOY REALIZANDO UN CONTROL DE 2 SERVOMOTORES CON EL PIC 16F873 Y PROGRAMANDO EN PBP. SE MUY POCO DE PROGRAMACION, PERO CON AYUDA E LOGRADO HACER ALGO. YA LOGRO CONTROLARLOS DESDE UN PC MEDIANTE VB.
ADEMAS DEBO REALIZAR UN CONTADOR DE PULSOS, EL CUAL ME DEBE ENTRAGAR LAS RPM DE GIRO DE UN MOTOR. A LO MEJOR MI ERROR FUE HACER LOS PROGRAMAS POR SEPARADOS, POR QUE A LA HORA DE UNIRLOS NO ME FUNCIONAN. SE SUPONE QUE EL PIC DEBE REALIZAR AMBAS TAREAS AL MISMO TIEMPO, LO CUAL CREO QUE ES POSIBLE, POR LO MISMO ME HAN ACONSEJADO QUE UTILICE INTERRUPCIONES, PERO ESE ES MI PROBLEMA NO SE DE QUE SE TRATA. LEI EL APUNTE DE PBP, PERO REALMENTE NO ENTENDI MUCHO. ES POSIBLE QUE COLOQUE EN EL FORO MIS PROGRAMAS Y ALGUIEN ME PUEDA AYUDAR CON MI TAREA?????

DE ANTE MANO MUCHAS GRACIAS POR SU TIEMPO Y OJALA HAYA QUEDADO CLARO MI PROBLEMA, ESPERO TENER UN PRONTO CONTACTO Y OJALA CON BUENAS NOTICIAS. ADIOS.-
Título: Re: Manejo de interrupciones!!!! Help
Publicado por: Mario en 06 de Julio de 2006, 19:00:08
Hola.

A ver Alexis:

Las interrupciones son algo sencillas de utilizar y si tienes el PBP instalado verás que el la carpeta de "samples" viene un programa llamado ASMINT.BAS y ONINT.BAS. Revisa esos programas.
Título: Re: Manejo de interrupciones!!!! Help
Publicado por: PIC-A-SHU en 06 de Julio de 2006, 19:50:30
MARIO, MUCHAS GRACIAS POR TU RESPUESTA, NO SE ME HABIA OCURRIDO BUSCAR UN EJEMPLO AHI.
LO ESTOY REVISANDO Y OJALA ME SIRVA PARA LO QUE QUIERO, PERO CUALQUIER COSA, PUEDO CONTAR CON TU AYUDA????

YA, MUCHAS GRACIAS, ADIOS
Título: Re: Manejo de interrupciones!!!! Help
Publicado por: PIC-A-SHU en 10 de Julio de 2006, 14:25:06
HOLA AMIGOS DEL FORO. LES CUENTO QUE TODAVIA TENGO PROBLEMAS CON MIS PROGRAMAS, NO SE QUE HACER.
TENGO DESARROLLADO 2 PROGRAMAS, UNO QUE ME CONTROLA 2 SERVOS, Y ES EL SIGUIENTE:

include "MODEDEFS.BAS"
define osc 4
A var word
B var word
C var word
R var word
A1 var word
B1 var word
C1 var word
PORTB=0

inicio:
R=0
serin portb.1,n9600,A,B,C
LOOKDOWN A, ["0123456789"],A1
LOOKDOWN B, ["0123456789"],B1
LOOKDOWN C, ["0123456789"],C1
R=(A1*100+B1*10+C1)
pulsout portb.2,R
pulsout portb.4,R
goto inicio

ES ALGO SENCILLO, PORQUE MEDIANTE UNA PANTALLA DE CONTROL REALIZADA EN VB YO LE INGRESO DATOS Y MUEVO LOS SERVOS.

Y EL OTRO PROGRAMA ES EL QUE ME CUENTA PULSOS, PARA OBTENER RPM Y ES EL SIGUIENTE:



include "MODEDEFS.BAS"
define osc 4
w1 var word
w2 var word
a var word
b var word


inicio:

count portc.0,1000,w1
count portc.2,1000,w2
a=60*w1
b=60*w2
serout portc.1,t9600,["MOTOR1 :",#a," ","MOTOR2 :",#b]

goto inicio


NECESITO JUNTAR AMBOS PROGRAMAS AL PIC 16F873, PERO EL PROBLEMA ES QUE AL JUNTARLOS SOLO ME FUNCIONA UNO DE ELLOS. QUIEN ME PUEDE ACONSEJAR QUE HACER O AYUDARME DIRECTAMENTE CON LA PROGRAMACION.

LA TAREA ES LA SIGUIENTE: LOS SERVOS LOS ESTOY CONTROLANDO PARA MENEJAR LA VELOCIDAD DE 2 MOTORES DE COMBUSTION DE AEROMODELISMO Y EL CONTADOR ME DEBE ENTREGAR LA VELOCIDAD A LA QUE GIRAN LOS MOTORES Y ASI PODER REALIZAR UN CONTROL DEL SISTEMA MEDIANTE UN PC. ES POR ESO QUE UTILIZARE VB, EN DONDE DEBO INGRESAR DATOS Y LEE DATOS DIRECTAMENTE DEL PIC.

OJALA HAYA QUEDADO CLARO, ME DESPIDO ESPERANDO UNA GRAN AYUDA URGENTE, ADIOS.- 
Título: Re: Manejo de interrupciones!!!! Help
Publicado por: PIC-A-SHU en 24 de Julio de 2006, 16:57:38
HOLA, COMO ESTAN.
NECESITO UNA PEQUEÑA AYUDA QUE ME TIENE MEDIO COMPLICADO. NECESITO DESHABILITAR UNA INTERRUPCION, COMO LO HAGO??

GRACIAS SI LOGRAN AYUDARME, ADIOS.-
Título: Re: Manejo de interrupciones!!!! Help
Publicado por: Mario en 24 de Julio de 2006, 20:08:31
Hola.


He estado ocupado y no he podido responder.


Si no recuerdo mal cada interrupción puede desabilitarse con sus correspondientes bits de control.

Creo que están en los registros INTCON1 o 2 (depende de tu µicro) y en los registros PIE (1,2, etc. depende de tu µicro).