|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - Pegasux
1
« en: Martes 12 de Mayo de 2009, 12:04 »
http://www.microchip.com/stellent/idcpl ... m=en537796En esta pagina tienes los "PIC 12 MCU" y los "PIC 16 MCU", pinchas y ves en cada serie las caracteristicas de cada micro. Luego hay que ver cuales de ellos son faciles de conseguir... Saludos.
2
« en: Miércoles 25 de Febrero de 2009, 18:20 »
Muy buenas. Pues el proyecto va bien pero sigo con el mismo problema, mientras esta haciendo un retardo no salta la interrupcion del pulsador, y como pasa la mayor parte del tiempo haciendo retardos pues no funciona. He mejorado bastante el codigo, ahora direccionando bien los pines de entrada/salida he simplificado cosas mas complejas que hacia antes para evitar que me saltase la interrupcion del pulsador al sacar datos por pantalla. Voy a ir visualizando los datos de la RB7 para ver si en algun momento se deshabilita o algo asi que lo pueda estropear...
Saludos.
P.D: ¿Como harias para localizar de forma inalambrica un objeto con una precision de pocos centimetros? Se acepta cualquier propuesta...
3
« en: Jueves 19 de Febrero de 2009, 19:48 »
De nada majo, a mandar!!
Saludos.
4
« en: Miércoles 18 de Febrero de 2009, 16:29 »
Hola, es un placer poder ayudarte. Lo puedes hacer con la interrupcion del timer0 y colocando el pulsador en una de las lineas del RB4-7. Cuando pulse el pulsador entra en la interrupcion del pulsador, esperas 20ms para el antirebote y miras si el pin esta a 0 o a 1 (pulsado o no), si esta pulsado, pones a funcionar el timer0 lo mas lento posible, habilitas su interrupcion, reseteas el valor del timer (TMR0) y pones un contador a decrementar, si el cristal es de 4mhz saltara la interrupcion del timer0 15 veces por segundo, entonces para 0.5s tiene que estar mas o menos a 7 el contador. Cada vez que salte la irq del timer decrementas el contador y sales, y cuando el contador este a 0 entonces desactivas la TOIF y los demas registros del timer no te preocupes. Cuando suelte el pulsador entrara en la rutina de atencion de nuevo por cambio de estado en las lineas del RB4-7 y miras si la interrupcion del timer esta activada (bit T0IF a 1) eso significa que no ha pasado el medio segundo y por lo tanto es una pulsacion rapida. Si por contrario cuando entre al soltar el pulsador el timer ya esta apagado, es que ha pasado medio segundo desde que se pulso y por lo tanto es una pulsacion larga.
Espero que te sirva.
Un saludo.
5
« en: Miércoles 18 de Febrero de 2009, 09:52 »
Muy buenas, estoy usando un PIC16F876 recibiendo datos por la UART, si hago un retardo largo en el programa principal y durante ese retardo le envio los datos, funciona perfectamente, pero el aparato funcionaria a baterias, por lo que deberia dormirlo cuando no haya datos y despertarlo en cuanto comience a recibir datos. Para despertarlo he puenteado las lineas RX y RB0 y he programado la interrupcion INT0, como no uso el puertoB puedo hacerlo sin problemas y ademas el micro se despertara antes de que haya terminado el bit de "start" y pueda coger todo el primer byte correctamente. Pues bien, al llegar los datos, el micro se despierta, pero no recibe los datos, cuando entra en la rutina de atencion a la INT0 la desprogramo porque ya no me hace falta y asi solamente saltara la interrupcion por recepcion, he comprobado con un led los flags necesarios para la recepcion y estan correctamente, tambien he comprobado con un contador que sin dormirlo recibe 11 datos (correcto) y durmiendolo no recibe ningun dato . Algo pasa al dormirlo que me estropea la recepcion de datos y no se que es, he probado a volver a configurarlo segun salta la INT0 y ese tipo de cosas pero nada. No se si es porque no recibe bien el primer bit y pierde toda la sincronizacion o que le pasa.
Gracias y un saludo.
6
« en: Miércoles 18 de Febrero de 2009, 09:39 »
Hola de nuevo. He comprobado que no tener los registros TRIS bien configurados puede traer bastantes dolores de cabeza, estoy modificando el codigo para que funcione correctamente la direccion de los datos, pero ahora hay otro problema que me preocupa mas y me esta fastidiando... lo pondre en otro post para no mezclar temas.
El aparato que hago consiste en controlar un modulo zigbee para comunicarse con otros, lo de la interrupcion del RB es para encender y apagar el aparato con un pulsador, pero si al final veo que no funciona, lo hare con un interruptor que es mucho mas rapido, lo del pulsador es mas bonito pero mas complejo.
Gracias y un saludo.
7
« en: Miércoles 11 de Febrero de 2009, 10:03 »
Muchas gracias por tu ayuda, ire paso a paso simulando el codigo a ver si encuentro el fallo, ya te dire algo. Por cierto ¿Sirve de algo cambiar la direccion de los puertos en los registros TRIS? Yo al principio lo hacia, pero me di cuenta de que funcionaba igual sin direccionarlos y ya no lo uso, asi que puede ser ese un origen del fallo... Un saludo.
PD: Si te gusta pensar... tengo unos desafios para ti... XD
8
« en: Martes 10 de Febrero de 2009, 09:59 »
Hola de nuevo, antetodo gracias por tu respuesta. Se me ha olvidado comentar unas cosillas, utilizo tambien un display LCD y la linea RB7 esta compartida, por lo que no puedo ponerlo a 5v, necesito que sea pull up porque sino cuando saque un 0 para el display estoy haciendo un corto. Lo del antirebote tambien lo uso, de 20ms, de hecho, utilizo un led, lo puedo hacer que se encienda antes del antirebote o despues y veo que a veces se producen falsas pulsaciones por utilizar el LCD, sin embargo no llega a pasar el antirebote porque si enciendo el led despues este no luce si no pulso el boton. Yo tambien pienso que tendria que entrar en la interrupcion, sin embargo no lo hace y es precisamente lo que intento averiguar.
Gracias por tu respuesta y un saludo.
9
« en: Lunes 9 de Febrero de 2009, 18:20 »
Hola. Gracias por la respuesta. Estoy usando un pic 16F876A, el problema resumiendo, es que cuando en el programa principal entra en un retardo, la interrupcion del puertoB deja de funcionar, pero mientras no esta en el retardo, la interrupcion funciona bien, sin embargo, la interrupcion del timer0 funciona bien siempre. El programa principal es un bucle en el que hago cuatro cosillas y un retardo, si uso el pulsador mientras esta haciendo cosillas la interrupcion del puertoB funciona bien. Se ve claramente con un retardo largo y uno corto, con el corto esta mas tiempo haciendo cosillas que en el retardo, asi que es facil activar el pulsador fuera del retardo, sin embargo con un retardo largo esta mucho mas tiempo haciendo el retardo, por lo que hay que pulsar el boton justo cuando no esta en el retardo para que funcione, cosa bastante dificil.
Gracias de nuevo y un saludo.
10
« en: Lunes 9 de Febrero de 2009, 11:17 »
Gracias campeon, seguro que se usaran mucho!!
Saludos.
11
« en: Viernes 6 de Febrero de 2009, 18:02 »
Muy buenas. El problema que tengo consiste en que cuando llamo a la rutina de un retardo largo, durante ese retardo no me salta a la interrupcion RB, la del timer funciona bien y no me explico el porqué. He probado a meter directamente el codigo de la rutina en la funcion principal, pero tampoco salta. Mas datos, he observado con un led que se enciende el solo cuando salta la interrupcion, al leer el bit RBIF dentro de la rutina de atencion a la interrupcion, el problema es que yo no estoy pulsando nada y ademas no hace nada porque no se aguanta el tiempo suficiente para superar el antirebote por software y sale de la rutina, pero cuando aprieto el pulsador ni siquiera llega a encenderse. He probado a habilitar las interrupciones pertinentes antes de llegar al retardo, pero funciona igual. Gracias y un saludo.
12
« en: Miércoles 4 de Febrero de 2009, 12:46 »
Muchas gracias por la respuesta. Lo de desactivar la RB ya lo hago, pero el flag parece que se activa aunque este deshabilitada. Ahora funciona medianamente, aunque el pulsador no funciona siempre cuando intento apagarlo, para encenderlo va bien. Lo que hago es basicamente en la rutina de interrupcion es aparte de deshabilitar, guardar el contenido del registro INTCON y restaurarlo despues de haber sacado por el LCD y vuelvo a habilitar la RBIE. Lo complicado viene ahora que tengo que ponerle la interrupcion por recepcion de datos via UART. A ver si lo mejoro un poco...
13
« en: Martes 3 de Febrero de 2009, 16:38 »
Pues si que es por el LCD o al menos eso parece ahora, el tema es que la interrupcion salta por cualquier cambio de los bits 4 a 7, por lo que en la rutina de atencion a la interrupcion he de mirar si efectivamente esta presionado el pulsador (RB7) y sino que se salga. Seguire investigando.
14
« en: Martes 3 de Febrero de 2009, 16:19 »
Acabo de modificar un poco el codigo usando 2 leds, cuando el aparato funciona se enciende uno, y cuando esta parado se enciende el otro, no he habilitado el timer y desconecto el bit portb,7 del lcd. Veo que los leds se intercambian sin parar, como si la interrupcion RB saltase constantemente... al menos ahora ya se que no es por el Lcd ni por el timer...
Saludos.
15
« en: Martes 3 de Febrero de 2009, 12:37 »
Muy buenas. Llevo unos dias atascado (otra vez...) Utilizo un 16F876, la interrupcion del tmr0 y la del RB a la vez, cuando salta el timer mira el ADC y me saca el valor por pantalla, y cuando acciono el pulsador me cambia el valor de un registro y asi en el programa principal, que no es mas que un bucle que decide si conectar el timer o no, decide segun ese registro si el aparato funciona o no. Si no funciona desactiva el timer para que no muestre en pantalla y se duerme, y si funciona activa el timer si es que estaba desactivado y hace un retardo. El problema que tengo es que salta el flag RBIF constantemete, cada vez que salta la interrupcion por lo que sea miro si esta a 1 y muestro en el LCD una letra, lo borro y despues hace lo del ADC. Supuestamente si yo no acciono el pulsador, RBIF no se puede poner a 1 y por lo tanto no ha de mostrarme la letra en pantalla, ademas que al borrar el flag siempre que entra, parece como si el pulsador estuviese constantemente pulsandose, ya que para saltar necesita el flanco de bajada en la patilla RB7... Como no sea el LCD que me esta interaccionando no se me ocurre nada, el tema es que si no activo el timer, me funciona perfectamente la rutina del pulsador, se activa y desactiva bien, pero en cuanto le pongo el timer como que se estorban... asi que no creo que sea por el LCD. Cualquier tipo de ayuda sera agradecida.
Saludos.
16
« en: Viernes 30 de Enero de 2009, 13:28 »
Solucionado, no se como ha sido la cosa pero por arte de magia ahora parece que funciona medianamente bien.
Gracias de todas formas.
Saludos.
17
« en: Viernes 30 de Enero de 2009, 12:53 »
Muy buenas. Tengo un problema con un programilla, lo que hago basicamente es con un pulsador pongo en marcha o paro el programa, lo hago con las interrupciones del RB, cuando el programa funciona solamente tiene que usar el ADC y sacar el valor por pantalla, y cuando esta parado, saco un mensaje por pantalla para avisar y le dejo en sleep habilitando el pulsador para poder encenderlo. La rutina de atencion del pulsador no es mas que cambiar un bit de un registro, asi sabe si esta encendido o apagado y cambia ese valor al pulsar. El problema es que cuando habilito la interrupcion RBIE, el micro se queda parado despues de haber usado el CAD y sacado el dato por pantalla 1 vez, solamente con poner BSF INTCON,RBIE y seguido BCF INTCON,RBIE se supone que no pasaria nada si el flag RBIF esta a 0 (lo borro previamente) pues ya no funciona, se queda dormido en ese punto, lo se porque despues de ese punto saco un mensaje por pantalla y al pulsar el boton salta la interrupcion, el programa continua el flujo y me sale el mensaje por pantalla, lo mismo que si hubiera hecho un sleep y al saltar la interrupcion del pulsador continuase el programa. Logicamente, si no habilito la RBIE, el CAD funciona continuamente y puedo verlo en pantalla variando la tension que le meto con un potenciometro, pero entonces ya no puedo detener el aparato usando el pulsador porque no esta habilitada la RBIE. Llevo 2 dias parado con este problema, y anteriormente lo intente hacer usando un timer, cada cierto tiempo saltaba el timer y me sacaba el valor usando el CAD, pero tenia el mismo problema con el pulsador y no funcionaba bien. Intentare comprar otro micro (16F876A) para ver si es eso, pero no lo creo... Si alguien me puede echar un cable se lo agradeceria enormemente.
Saludos.
18
« en: Miércoles 24 de Diciembre de 2008, 10:21 »
Muchas gracias de nuevo, Jonathan!! Pues me he pasado ayer toda la tarde revisando y no encuentro nada, las variables de memoria las declaro todas seguidas en el programa principal. Lo que si he observado es que si introduzco los valores por teclado muy rapido funciona bien, pero si los introduzco a una velocidad normal ya va mal... no se si esto servira de algo, asi que voy a colgar el codigo, es bastante extenso, pero puede que otros ojos lo vean mejor que los mios.. Hay subrutinas que no pongo porque es evidente lo que hacen y ocuparia mucho mas el codigo:
; ZONA DE DATOS
GUARDA_W EQU 0X20 ; variables para guardar los registros GUARDA_S EQU 0X21 GUARDA_FSR EQU 0X22
PDel0 EQU 0x24 PDel1 EQU 0x25 PDel2 EQU 0x26
R_ContA EQU 0x27 ; Contadores para los retardos. R_ContB EQU 0x28 R_ContC EQU 0x29
ASCII_H EQU 0x2A ASCII_M EQU 0x2B ASCII_L EQU 0x2C HEXADECIMAL EQU 0x2D HEXADECIMAL_X EQU 0X2E ASCII1 EQU 0X2F ASCII2 EQU 0X30
INNER EQU 0x31 ;delay variable mS OUTER EQU 0x32 ;delay variable mS Digito EQU 0x33
CBLOCK 0X40 ; aqui esta el status de lo enviado startdelimiterst lenght_hst lenght_lst apiidentifierst ; desde aqui se calcula el checksum frameidst ; statusst ; (ack/nack) checksumst FF CHECK ENDC
CBLOCK 0X50 ; aqui estan los datos enviados startdelimitertx lenght_htx lenght_ltx apiidentifiertx ; desde aqui se calcula el checksum frameid ; address_htx ; address_ltx ; CHECKSUM optionstx ; dato1tx ; dato2tx ; hasta aqui checksumtx datotx rc_reg ; 0x5C ENDC
CBLOCK 0x5F ; aqui estaran los datos recibidos counter startdelimiter lenght_h lenght_l apiidentifier saddress_h saddress_l rssi options dato1 dato2 checksum cuenta_timer1 ; 0x5B posicion_cursor ENDC
CBLOCK 0x6E TEMPORAL CONTADOR ; todo esto sirve para los comandos AT MEMORIA MEMORIA2 MEMORIA3 MEMORIA4 MEMORIA5 MEMORIA6 teclapulsada ; almacena la tecla actual pulsada pulsaciones ; pulsaciones que quedan para finalizar centenas decenas unidades velocidad ; velocidad en hexadecimal tipo ; tipo circ ; circunstancia flujo ; sirve para saber en que punto nos encontramos
ENDC
processor 16F876
LIST P=16F876 ;Se indica el modo de procesador INCLUDE <P16f876.inc> ;se incluye la definicion de los ;registros internos
__config 3D31
;----------------------------------------------------------------------------
org 0x00 ;vector de inicio goto INICIO
org 0x04 ;despues del vector de interrupcion goto ServicioInterrupcion
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>> ;----------------------------------------------------------------------------
INICIO
call configura_micro
call inicializa_lcd
call MuestraBien
call PDelay ; retardo de 2 segundos
otratipo call Borra_home movlw 0x80 ;Direccion caracter call LCD_REG
call PideTipo
movlw 0x01 movwf pulsaciones ; inicializamos pulsaciones maximas clrf flujo ; esta en tipo --> flujo=0
movlw 0xFF ; ponemos a algo distinto de 0 movfw centenas movfw decenas movfw unidades
otra call Teclado_Inicializa
call Habilita_Int_Teclado
sleep
; mira si tiene que volver a dormir o no movlw 0x0A subwf teclapulsada,0 ; es A? btfsc STATUS,Z ; goto otratipo ; si, borra
movlw 0x0B subwf teclapulsada,0 ; es B? btfsc STATUS,Z ; goto fintipo ; si, pasa a lo siguiente
call Retardo_100ms goto otra
fintipo
;********************************************************************
otravel call Borra_home movlw 0x80 ;Direccion caracter call LCD_REG call PideVel
movlw 0x03 movwf pulsaciones ; inicializamos pulsaciones maximas movlw 0x01 movwf flujo ; esta en velocidad --> flujo=1 clrf centenas clrf decenas clrf unidades
call Cursor_on otra2 call Teclado_Inicializa
call Habilita_Int_Teclado
sleep
; mira si tiene que volver a dormir o no movlw 0x0A subwf teclapulsada,0 ; es A? btfsc STATUS,Z ; goto otravel ; si, borra
movlw 0x0B subwf teclapulsada,0 ; es B? btfsc STATUS,Z ; goto FinVel ; si, va a calcular
call Retardo_100ms goto otra2
FinVel
; metemos el valor de la velocidad en dato1tx
movfw velocidad movwf dato1tx
;********************************************************************
otracirc
call Borra_home movlw 0x80 ;Direccion caracter call LCD_REG call PideCirc
movlw 0x01 movwf pulsaciones ; inicializamos pulsaciones maximas movlw 0x02 movwf flujo ; esta en circunstancia --> flujo=2
movlw 0xFF movwf centenas movwf decenas movwf unidades ; para que sea erroneo si no se mete nada
call Cursor_on otra3 call Teclado_Inicializa
call Habilita_Int_Teclado
sleep
; mira si tiene que volver a dormir o no movlw 0x0A subwf teclapulsada,0 ; es A? btfsc STATUS,Z ; goto otracirc ; si, borra
movlw 0x0B subwf teclapulsada,0 ; es B? btfsc STATUS,Z ; goto FinCirc ; si, va a calcular
call Retardo_100ms goto otra3
FinCirc
call montadato2tx
;******************************************************************* ;******************************************************************* ;******************************************************************* ;******************************************************************* ; ; ya esta todo metido, nos preparamos para transmitir ;
call configura_micro
;**************************
call Borra_home
call INITX ; inicializamos la transmision
call SET125K ; micro a 125Kbps
retransmitir
movlw 0X40 ; dirección de memoria RAM a escribir. movwf counter ; el TX STATUS que manda el Xbee
call BORRAAPIST
call RX ; nos preparamos para recibir por interrupciones
call APITX
call Retardo_10ms ; tiempo reducido al maximo
call MUESTRAAPIST
LeeVelocidad
banksel PORTA bcf PORTA,2 ;Desactiva LCD
call LeeTecla movwf teclapulsada
bsf STATUS,RP0 ;banco 1
movlw b'00000000' ; deshabilita interrupciones movwf INTCON
bcf STATUS,RP0 ; banco 0
;******************************************************* ; aqui lee lo introducido, lo almacena en variables y calcula lo que va a enviar
; antes de nada ha de mirar si es A o B para salir del bucle y ordenar los datos ; antes de calcular el valor de la velocidad en hexadecimal
movlw 0x0A subwf teclapulsada,0 ; es A? btfsc STATUS,Z ; goto otravel ; si, repite
movlw 0x0B subwf teclapulsada,0 ; es B? btfsc STATUS,Z ; goto calcular_vel ; si, va a calcular
; no es ni A ni B ; almacena lo tecleado ; goto continuavel ; esta bien, continua
error_vel call Borra_home movlw 0x80 ;Direccion caracter call LCD_REG call Cursor_off call MensVelInc call PDelay ; retardo 2 segundos
goto otravel ; vuelve a pedir la velocidad
continuavel decf pulsaciones movlw 0x02 subwf pulsaciones,0 ; es centenas? btfsc STATUS,Z ; goto mete_centenas ; si, lo guarda
movlw 0x01 subwf pulsaciones,0 ; es decenas? btfsc STATUS,Z ; goto mete_decenas ; si, lo guarda
movlw 0x00 subwf pulsaciones,0 ; es unidades? btfsc STATUS,Z ; goto mete_unidades ; si, lo guarda
; si llega aqui es que se ha pasado, no hace nada y ; espera a que se pulse A o B goto finesperavel
mete_centenas movfw teclapulsada movwf centenas goto fincalcula
mete_decenas movfw teclapulsada movwf decenas
goto fincalcula
mete_unidades movfw teclapulsada movwf unidades
goto fincalcula
calcular_vel ; llega aqui si se pulsa B ; aqui mira si son 1, 2 o 3 digitos pulsados y organiza los datos ; si pulsaciones es 0 es que ha metido 3 datos, si es 1 ha metido 2 datos
movlw 0x00 subwf pulsaciones,0 ; pulsaciones-0=pulsaciones --> afecta al flag Z btfsc STATUS,Z ; ha metido 3 digitos? goto bienmetido ; si, esta bien ordenado ; no, hay que reordenar los 2 datos
movlw 0x01 ; ha metido 2? subwf pulsaciones,0 ; btfss STATUS,Z ; ha metido 2 digitos? goto error_vel ; no, esta mal
; si, hay que ordenarlos movfw decenas movwf unidades
movfw centenas movwf decenas ; ya esta ordenado clrf centenas ; centenas tiene que ser 0
bienmetido ; a partir de aqui hay que pasar los 3 bytes a un solo valor clrf velocidad ; centenas movlw 0x00 subwf centenas,0 ; centenas-0 --> afecta al flag Z btfsc STATUS,Z ; centenas es 0? goto metedecenas ; si, centenas es 0 ; no, centenas no es 0 movlw d'100' addwf velocidad ; valor+100 metedecenas ; multiplica las decenas por 10 (bucle) movlw 0x0B movwf TEMPORAL ; reutilizo esta variable como contador bucle decf TEMPORAL btfsc STATUS,Z ; es 0? goto meteunidades ; si, guarda el resultado
; no, sigue en el bucle movfw decenas addwf velocidad,1 ; decenas+decenas goto bucle
; ya esta almacenado en valor meteunidades ; solamente hay que sumar las unidades
movfw unidades addwf velocidad,1
; en valor tenemos el resultado de la velocidad en hexadecimal ; si es mayor de 120 esta mal
movlw 0x79 ; 121 subwf velocidad,0 ; velocidad-121 = negativo btfsc STATUS,C ; si C=0 es negativo --> salta goto error_vel ; la velocidad esta mal --> repetir
movlw 0xA ; 10 subwf velocidad,0 ; velocidad-10 = negativo btfss STATUS,C ; si C=1 es positivo --> bien goto error_vel ; si C=0 es negativo --> error ; la velocidad esta bien
goto finesperavel
;**************************************************** fincalcula
movfw teclapulsada call hextoascii movfw ASCII2 call LCD_DATOS ; Visualiza caracter finesperavel return
;************************************************************************ ;************************************************************************ ;************************************************************************ ;************************************************************************ ;************************************************************************ ;************************************************************************ ;************************************************************************
LeeTipo
banksel PORTA bcf PORTA,2 ; Desactiva LCD
call LeeTecla movwf teclapulsada ; guardamos la tecla pulsada
bsf STATUS,RP0 ;banco 1
movlw b'00000000' ; deshabilita interrupciones movwf INTCON
bcf STATUS,RP0 ; banco 0
;******************************************************* ; aqui lee lo introducido, lo almacena en variables y calcula lo que va a enviar
; antes de nada ha de mirar si es A o B para salir del bucle y ordenar los datos ; antes de calcular el valor de la velocidad en hexadecimal
movlw 0x0A subwf teclapulsada,0 ; es A? btfsc STATUS,Z ; goto otratipo ; si
movlw 0x0B subwf teclapulsada,0 ; es B? btfsc STATUS,Z ; goto mete_unidades_tipo ; si
; no es ni A ni B ; almacena lo tecleado
decf pulsaciones movlw 0x00 subwf pulsaciones,0 ; es unidades? btfss STATUS,Z ; goto finespera_tipo ; no, no hace nada movfw teclapulsada ; si movwf unidades ; guarda unidades
goto fincalcula_tipo ; pinta la letra y vuelve al sleep
mete_unidades_tipo ; llega aqui si pulsa correctamente B ; solo puede haber 1 digito, 0, 1 o 2
movlw 0x01 subwf pulsaciones,0 ; ha pulsado solo B? btfsc STATUS,Z ; si, Z estara a 1 goto error_tipo ; no, no hace nada
movlw 0x03 ; comprueba si es mayor de 2 subwf unidades,0 ; unidades-3 = negativo btfsc STATUS,C ; si C=0 es negativo --> salta goto error_tipo ; el tipo esta mal --> repetir tipo movfw unidades ; el tipo esta bien, lo almacena movwf tipo ; en tipo
goto finespera_tipo
error_tipo call Borra_home movlw 0x80 ;Direccion caracter call LCD_REG call Cursor_off call MensTipoInc call PDelay ; retardo 2 segundos
; call Borra_home
goto otratipo ; vuelve a pedir el tipo
;**************************************************** fincalcula_tipo
movfw teclapulsada call hextoascii bsf PORTA,2 ; activa LCD movfw ASCII2 call LCD_DATOS ; Visualiza caracter finespera_tipo
return
;************************************************************************
;************************************************************************ ;************************************************************************ ;************************************************************************ ;************************************************************************ ;************************************************************************ ;************************************************************************ ;************************************************************************
LeeCirc
banksel PORTA bcf PORTA,2 ;Desactiva LCD
call LeeTecla movwf teclapulsada ; guardamos la tecla pulsada
bsf STATUS,RP0 ;banco 1
movlw b'00000000' ; deshabilita interrupciones movwf INTCON
bcf STATUS,RP0 ; banco 0
;******************************************************* ; aqui lee lo introducido, lo almacena en variables y calcula lo que va a enviar
; antes de nada ha de mirar si es A o B para salir del bucle y ordenar los datos ; antes de calcular el valor de la velocidad en hexadecimal
movlw 0x0A subwf teclapulsada,0 ; es A? btfsc STATUS,Z ; goto otracirc ; si
movlw 0x0B subwf teclapulsada,0 ; es B? btfsc STATUS,Z ; goto mete_unidades_circ ; si
; no es ni A ni B ; almacena lo tecleado
decf pulsaciones movlw 0x00 subwf pulsaciones,0 ; es unidades? btfss STATUS,Z ; goto finespera_circ ; no, no hace nada movfw teclapulsada ; si movwf unidades ; guarda unidades
goto fincalcula_circ ; pinta la letra y vuelve al sleep
mete_unidades_circ ; llega aqui si pulsa correctamente A o B ; solo puede haber 1 digito, 0, 1 o 2
movlw 0x0A ; comprueba si es mayor de 9 subwf unidades,0 ;unidades-A = negativo btfsc STATUS,C ; si C=0 es negativo --> salta goto error_circ ; el tipo esta mal --> repetir mensaje movfw unidades ; el tipo esta bien, lo almacena movwf circ ; en tipo
goto finespera_circ
error_circ call Borra_home movlw 0x80 ;Direccion caracter call LCD_REG call Cursor_off call MensCircInc call PDelay ; retardo 2 segundos
call Borra_home
goto otracirc ; vuelve a pedir el tipo
;**************************************************** fincalcula_circ
movfw teclapulsada call hextoascii bsf PORTA,2 ; activa LCD movfw ASCII2 call LCD_DATOS ; Visualiza caracter
finespera_circ
return
;************************************************************************
ServicioInterrupcion
; GUARDAR WREG, STATUS, FSR EN LA PILA
MOVWF GUARDA_W SWAPF STATUS,W MOVWF GUARDA_S SWAPF FSR,W MOVWF GUARDA_FSR
bcf STATUS,RP0 ; banco 0
btfss PIR1,RCIF ; ha sido por recepcion? goto otras ; no, mira otras interrupciones
bcf PIR1,RCIF ; si, borra el bit de aviso
; escribimos en ram con direccionamiento indirecto
call escribeindir ; pinta en pantalla lo recibido goto finirq
otras ; aqui ponemos las otras interrupciones (teclado)
bcf STATUS,RP0 ;banco 0
movlw 0x00 subwf flujo,0 ; mira a ver si es 0 btfsc STATUS,Z ; si es velocidad (1) o circunstancia (2), salta goto estaentipo movlw 0x01 subwf flujo,0 ; mira a ver si es 1 btfss STATUS,Z ; si es velocidad (1), salta goto estaencirc
goto estaenvel
estaentipo call LeeTipo goto finirq
estaenvel call LeeVelocidad goto finirq
estaencirc call LeeCirc goto finirq
finirq
; RECUPERAMOS DE LA PILA
MOVF GUARDA_FSR,W MOVWF FSR SWAPF GUARDA_S,W MOVWF STATUS SWAPF GUARDA_W,W
retfie
INCLUDE <MENSAJES_P.INC> INCLUDE <MICRO.INC> INCLUDE <CONVIERTE.INC> INCLUDE <LCD.INC> INCLUDE <RETARDOS.INC> INCLUDE <COMUNICACION.INC> INCLUDE <TECLADO_3X4.INC> INCLUDE <API.INC> INCLUDE <AT.INC>
END
19
« en: Martes 23 de Diciembre de 2008, 09:44 »
Muchas gracias por tu respuesta, Jonathan, y felices fiestas a ti y a todos los del foro!! El tema va por lo que tu dices, he descubierto que si meto un valor erroneo a proposito, sale el tipico mensaje de error y vuelve a pedir el mismo dato, pero entonces la parte de la transmision funciona bien, luego alguna variable tiene que haber por ahi que falla....
Un saludo muy gordo.
20
« en: Lunes 22 de Diciembre de 2008, 12:47 »
Muy buenas. Tengo un dispositivo con un 16F876 en el que he desarrollado dos codigos, uno consiste en manejar teclado y pantalla, esto me funciona bien, el otro consiste en enviar unos datos sencillos por el puerto serie, tambien me funciona bien, pero cuando junto los codigos, osea, primero pido los datos y luego intento enviarlos, la parte de pedirlos funciona bien, pero la parte de enviarlos funciona mal, el caso es que por separado todo funciona bien y si lo junto deja de funcionar. He probado a modificar los valores de los registros principales y reescribirlos con los datos que habia al principio, para hacer como una especie de "reset" en caliente, pero sigue igual, creo que una solucion seria conseguir una especie de reset en caliente sin que pierda los datos de la ram y que la parte de enviar funcione como cuando esta sola. No es que sea una solucion muy buena, pero no se me ocurre otra cosa, y haciendolo como creo que deberia ser no funciona. ¿Alguien puede ayudarme?
Gracias y un saludo.
21
« en: Jueves 11 de Diciembre de 2008, 17:59 »
Hola de nuevo, el WDT si que parece estar desactivado, en el programa de grabar el micro he mirado la configuracion y esta correcta. La Int0 parece que la hace bien, ya que si despieto a mano el micro funciona correctamente, pero despues de despertarle le mando los datos por la linea rx y el checksum da mal, por otro lado, si le conecto directamente a la linea rx, el micro despierta del sleep inmediatamente sin haberle enviado nada (y eso que tiene una resistencia pull up) como si se le enviara algun dato por la linea rx, y ademas el checksum da incorrecto. Me parece que va a tener mas culpa el modulo inalambrico que el pic... Voy a empaparme bien como funciona el modulo XBee para ver si es el causante de todo esto.
Saludos.
22
« en: Jueves 11 de Diciembre de 2008, 11:54 »
Hola de nuevo, acabo de percibir que al apagar el transmisor no siempre reinicia, solamente lo hace a veces....
23
« en: Jueves 11 de Diciembre de 2008, 11:41 »
Ahora que he cambiado el LCD por unos leds en los bits del puerto C que no utilizo, estoy observando cierto fenomeno. Al encender el aparato los leds parpadean 2 veces y luego se quedan apagadados en sleep (bien), cuando le mando datos, sale del sleep, pero no continua con el programa, se reinicia, los leds vuelven a parpadear 2 veces, lo mas curioso de todo es que los datos se los envio por un dispositivo inalambrico desde otro circuito, cuando recibe los datos por RF estos son enviados al pic por el puerto serie y es cuando tiene que despertarse, pues bien, tanto cuando enciendo el aparato emisor de RF como cuando lo apago el micro se sale del sleep y se reinicia, repito que es muy curioso porque el otro dispositivo que emite la RF esta totalmente separado, no tienen en comun mas que el aire. Posiblemente cuando lo apago, el modulo inalambrico local detecta que ha perdido la señal del emisor y envia un paquete de datos al micro para avisarle (digo yo) pero de todas formas, cuando enciendo el emisor y este acto seguido envia los datos, el microcontrolador deberia recibir el paquete de datos o cualquier cosa y comprobar que es correcto el checksum, encendiendo un led verde en caso de ser correcto o uno rojo en caso de ser incorrecto. El asunto es que en vez de comprobar el checksum, el micro se resetea porque veo claramente que los leds parpadean como les indico al principio del programa.
En resumen, al encender el micro los leds parpadean 2 veces, enciendo el transmisor, los leds parpadean 2 veces (cuando tendria que encenderse solamente el verde o el rojo) y cuando apago el transmisor otra vez parpadean (cuando no deberian hacer nada). Evidentenmente, si no enciendo el transmisor los leds se quedan apagados indefinidamente...
Un saludo.
24
« en: Jueves 11 de Diciembre de 2008, 10:00 »
Una vez mas gracias por tu ayuda. Acerca del WDT puede que este activado, no lo se porque yo uso la secuencia de configuracion __config 3D31 y no se lo que esta incluido, el tema es que si pongo la tipica: __config _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC el circuito no funciona, no hace absolutamente nada (compilar compila bien) y por eso no la uso.
He visto en el libro que en sleep los valores de los puertos se mantienen, por lo que si que puedo usar el transistor para conectar las lineas.
Un saludo.
25
« en: Miércoles 10 de Diciembre de 2008, 17:49 »
Hola de nuevo. En el puerto C tampoco puedo colocar el LCD, tengo las lineas 6 y 7 que son las de la UART y tendria el mismo problema. He estado haciendo unas pruebas con un led colocado en el puerto C y le ordeno que lo encienda si se despierta del sleep, el tema es que si deshabilito el INT0 el led no se enciende, pero si lo habilito, el led se enciende aunque aparentemente no este recibiendo datos. Si fijo la linea RB0 a 1 quitando la linea de recepcion, el led no se enciende, luego parece que el problema viene de oscilaciones en la linea de recepcion cuando la linea deberia estar a 1 permanente mientras no le mande datos... Una pregunta que se me viene a la cabeza, Si el micro esta dormido ¿Funciona la recepcion de datos? porque si no funciona puede que parte del primer byte no se reciba correctamente mientras el micro despierta y eso fastidie la comunicacion, aunque al final consiga despertarse correctamente se puede perder el dato... Lo tengo configurado a 125kbps.
|
|
|