• Martes 5 de Noviembre de 2024, 07:43

Mostrar Mensajes

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

Páginas: [1] 2 3 ... 6
1
Microcontroladores / Re: asesoria con respecto al uso de un pic
« en: Martes 12 de Mayo de 2009, 12:04 »
http://www.microchip.com/stellent/idcpl ... m=en537796

En 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
Microcontroladores / Re: Problema con interrupcion RB y retardos
« 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
Microcontroladores / Re: problema de codigo fuente
« en: Jueves 19 de Febrero de 2009, 19:48 »
De nada majo, a mandar!!

Saludos.

4
Microcontroladores / Re: problema de codigo fuente
« 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
Microcontroladores / al salir del sleep no me recibe por la UART
« 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
Microcontroladores / Re: Problema con interrupcion RB y retardos
« 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
Microcontroladores / Re: Problema con interrupcion RB y retardos
« 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
Microcontroladores / Re: Problema con interrupcion RB y retardos
« 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
Microcontroladores / Re: Problema con interrupcion RB y retardos
« 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
Microcontroladores / Re: Rutinas Modulo Mssp Para Pic16f87x
« en: Lunes 9 de Febrero de 2009, 11:17 »
Gracias campeon, seguro que se usaran mucho!!

Saludos.

11
Microcontroladores / Problema con interrupcion RB y retardos
« 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
Microcontroladores / Re: Problemon con la RBIF y timer0
« 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
Microcontroladores / Re: Problemon con la RBIF y timer0
« 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
Microcontroladores / Re: Problemon con la RBIF y timer0
« 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
Microcontroladores / Problemon con la RBIF y timer0
« 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
Microcontroladores / Re: Se me queda dormido al habilitar RBIE
« 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
Microcontroladores / Se me queda dormido al habilitar RBIE
« 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
Microcontroladores / Re: Problema al juntar dos codigos
« 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
Microcontroladores / Re: Problema al juntar dos codigos
« 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
Microcontroladores / Problema al juntar dos codigos
« 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
Microcontroladores / Re: Despertar el micro por RX
« 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
Microcontroladores / Re: Despertar el micro por RX
« 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
Microcontroladores / Re: Despertar el micro por RX
« 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
Microcontroladores / Re: Despertar el micro por RX
« 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
Microcontroladores / Re: Despertar el micro por RX
« 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.

Páginas: [1] 2 3 ... 6