TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: sQs en 11 de Febrero de 2011, 21:22:21

Título: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 11 de Febrero de 2011, 21:22:21
Hola a todos, primero que nada permitanme presentarme con ustedes porque soy nuevo en la comunidad y felicitarlos porque veo mucha gente con potencial en la programacion con muy buenos proyectos, por eso espero puedan ayudarme con algo dejen les cuento mi problema.
Resulta que tengo algunos PIC 12F683 que e usado para unos proyectos usando unos HEX que me encontre por internet pero ahora que quiero aprender a programarlos se me aconvertido en un dolor de cabeza, despues de buscar informacion en el foro solo encontre ejemplos en C y en BASIC pero yo quiero empezar desde abajo con el ASM y ejemplos con este lenguaje no encontre, me e leido todo el tutorial de Leon Pic (ASM desde 0) y en base a eso y a los ejercicios que van haciendo con los PIC 16F... trate de hacer prender por lo menos un LED cuando presionara un Push Botton pero parece que me fue imposible, les anexo el codigo que hice en MPLAB que se que esta mal y les anexo un diagrama que hice en FlowCode que por cierto funciona en el simulador pero en la protoboar no, les doy las gracias de antemano y si alguien puede ayudarme se lo agradecere.
Código: [Seleccionar]
;Declarando PIC

list p=12F683
#include <p12F683.inc>

__CONFIG   _FCMEN_OFF & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTOSCIO

; Declarando Variables
LED equ 5
Pulsador equ 3


Reset

ORG 0x00
goto inicio
ORG 0x004


inicio
bcf LED

bucle
btfsc Pulsador
goto apagar
bsf LED
goto bucle

apagar
bcf LED

end
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: bigluis en 12 de Febrero de 2011, 14:57:32
Falta que configures los pines del puerto como entradas o como salidas, también esta mal esa parte cuando apagas el LED ya que jamás se volvería a encender y como recomendación final deberías declarar los pines del LED y Pulsador con la directiva #define.

Código: [Seleccionar]
list      p=12F683        ; list directive to define processor
#include <p12F683.inc>    ; processor specific variable definitions

errorlevel  -302          ; suppress message 302 from list file

__CONFIG   _FCMEN_ON & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT

; Declarando Variables
#DEFINE LED GPIO,5 ; Asignamos el pin GPIO,5 a LED
#DEFINE Pulsador GPIO,3 ; Asignamos el pin GPIO,3 a Pulsador

;**********************************************************************
ORG     0x000             ; processor reset vector



goto inicio
ORG 0x004


inicio
banksel TRISIO ; Seleccionamos el banco al que pertenece TRISIO (Banco 1)
bcf LED ; Ponemos como salida el pin correspondiente al LED (TRISIO,5)
banksel GPIO ; Seleccionamos el banco al que pertenece GPIO (Banco 0)

bucle
btfsc Pulsador; Salta si esta inactivo el Pulsador (GPIO,3)
goto apagar ; de lo contrario salta hacia la etiqueta apagar.
bsf LED ; Enciende el LED (GPIO,5 = 1)
goto bucle ; salta hacia la etiqueta bucle

apagar
bcf LED ; Apaga el LED (GPIO,5 = 1)
goto bucle ; Salta hacia la etiqueta bcle

END                       ; directive 'end of program'
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: El_cuarenton en 12 de Febrero de 2011, 20:51:01
Saludos sQs.

Veo que estas aprendiendo desde lo mas basico, te recomiendo la lectura del libro "Microcontrolador pic16f84 desarrollo de proyectos del señor Enrique Palacios". Es bastante simple y de seguro te va a ayudar su lectura. Buscalo que es simple de encontrar y bienvenido al mundo de los microcontroladores.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 13 de Febrero de 2011, 00:58:20
Gracias por su ayuda, ese libro que comentas le di una ojeada y la verdad que si esta muy bueno pero como me puse a intentar programar este PIC me fallan muchas cosas que por ejemplo este solo tiene puerto A y los 16F... cuantan con mas puertos y e batallado un poco con eso. Ahora si no es mucho abusar de su confianza no se si puedan aclararme algo.
Quiero guardar en memoria EEPROM supongo que es la que no se borra aunque se deje de suministrar corriente al PIC, encontre unas rutinas para guardar y leer datos de la memoria si pueden verlas.

ESCRIBIR EN MEMORIA:
Código: [Seleccionar]
Write
bsf    STATUS, RP0
movwf    EEDAT
movlw    0x02
movwf    EEADR
bsf    EECON1, WREN ;Enable write
bcf    INTCON, GIE ;Disable INTs
btfsc    INTCON, GIE ;See AN576
goto    $-2
movlw    0x55    ;Unlock write
movwf    EECON2
movlw    0xAA
movwf    EECON2
bsf    EECON1, WR    ;Start the write
WaitForEEWrite
btfsc   EECON1, WR ;wait for hardware to clear (done writing)
                goto    WaitForEEWrite
bcf    STATUS, RP0 ;Bank0
bsf    INTCON, GIE ;Enable INTS
    return

LEER EN MEMORIA:
Código: [Seleccionar]
Read
bsf     STATUS    , RP0 ;Bank1
movlw 0x02
    movwf   EEADR
    bsf     EECON1    , RD ;start read
    movf    EEDAT    , W
bcf     STATUS    , RP0 ;Bank0
    return

La gran duda que tengo es por ejemplo que con esta rutina leo y grabo algun dato pero en un espacio de memoria, si por ejemplo quiero almacenar 4 datos diferentes en diferentes localidades de memoria que tengo que cambiar o como le ago para que no me la guarde en una que ya esta guardada, digamos que usar 4 localidades de memoria diferentes donde lea y guarde, ¿Es necesario hacer las cuatro rutinas cambiando algun dato o con la misma rutina es posible?, estoy un poco confundido con esto, y por ejemplo en este caso que el valor de cual variable de todas las que estan ahi es la que va a grabar en memoria, no se alguien que tenga conocimiento avanzados en eso pueda explicarme un poco como podria hacerle y disculpen estar preguntando cosas que supongo han de ser basicas para ustedes.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: todopic en 13 de Febrero de 2011, 11:26:14
Hola, fijate si con esto se entiende... por ejemplo si quieres grabar algo en la posicion 02, colocas este valor en DIRECCION, luego cargas BYTE con el dato a grabar....  CALL GRABAR_EE y ya esta :mrgreen:, luego cambias la direccion y el dato y puedes grabar en otra direccion... se entiende?



Código: ASM
  1. ;****************************************************************
  2. GRABAR_EE
  3.         bsf STATUS,RP0 ;Bank 1
  4.         MOVF    DIRECCION,W     ;TOMA la posicion a grabar, que colocamos en DIRECCION
  5.         MOVWF   EEADR
  6.         MOVF    BYTE,W                     ;en el registro BYTE, cargamos el dato a grabar
  7.         MOVWF   EEDATA
  8.         bsf EECON1,WREN ;Enable write
  9.         bcf INTCON,GIE ;Disable INTs
  10.         movlw 55h ;Unlock write
  11.         movwf EECON2 ;
  12.         movlw 0XAA      ;.170 ;AAH
  13.         movwf EECON2 ;
  14.         bsf EECON1,WR ;Start the write
  15.         bsf INTCON,GIE ;Enable INTS
  16.  
  17. ESCRCOMPLETA
  18.         BTFSC   EECON1,WR       ;BYTE ESCRITO?
  19.         GOTO    ESCRCOMPLETA
  20.         BCF     STATUS,RP0
  21.         RETURN
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 13 de Febrero de 2011, 16:05:35
Ok a la variable DIRECCION la que vamos a cargar antes antes de llamar la rutina con la direccion de memoria que queremos grabar, pero el valor que quiero grabar entonces va cargado en BYTE?, BYTE seria otra variable o BYTE es una instruccion de ASM  :oops: sorry si es una pregunta tonta, y para hacer la rutina de leer siguiendo con tu ejemplo seria algo asi?

Código: [Seleccionar]
LEER_EE
bsf STATUS, RP0 ;Bank1
movf DIRECCION,W ;Carga la direcion de memoria en el acumulador
movwf   EEADR
bsf     EECON1, RD ;Empieza a leer
movf    EEDAT, W
bcf     STATUS, RP0 ;Bank0
return

Despues que llame esta rutina LEER_EE el valor que obtuvo de la memoria me lo llevara en "w"?
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: todopic en 13 de Febrero de 2011, 16:44:28
asi es, correcto, solo que escribiste mal, es eedata

Byte es un registro creado por nosotros, puedes ponerle otro nombre ok?

Saludos
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 13 de Febrero de 2011, 17:15:24
Muy bien parece que voy mejorando  :) cualquier problema que me atore les comento, gracias todopic y a todos por su ayuda.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 15 de Febrero de 2011, 04:20:34
Parece que funciono a la perfeccion el grabar y leer en la EEPROM  :) gracias por la ayuda, ahora si me pueden sacar de estas dudas.

Si declaro una variable al inicio por ejemplo (VARIABLEX  equ  0x34) sabemos que se esta alojando en la casilla 34h de la memoria del PIC pero el valor que toma por defaul tambien es 34h (D'52')?, o por default tendra valor 0?.
La otra duda es que hacer operaciones que se requiera usar decimales como 5.3 + 4.6, eso es imposible en ASM?, porque en cuanto a los valores hexadecimales todos son enteros que es lo que se puede hacer en estos casos. Creo que ya les voy a deber la cena a todos con tanta pregunta.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 15 de Febrero de 2011, 09:59:28
  Hacer operaciones con números reales no es imposible en ASM pero sí muy engorroso. En el sitio de microchip hay algunos documentos que explican como trabajar con número reales en ASM.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: dolphin_96 en 15 de Febrero de 2011, 11:18:46
Citar
pero yo quiero empezar desde abajo con el ASM...
:shock:
eso no es empezar desde abajo, sin embargo es la mejor manera de comenzar, ya que aon este lenguaje no solo aprends a programar si no que tambien comprendes la estructura de los micros y el manejo de sus registros, si dominas el ensamblador cualquier otro lenguaje sera mucho mas facil, te lo digo por expeiencia, en mi caso estube usando el ensamblador cerca de un año y la verdad nunca utilice ni basic ni C por miedo al cambio y por pensar que era lo mas dificil, pero cuando use C por primera vez, a la semana ya habia hecho un programa muy complejo que hasta la fecha despues de casi dos años esta funcionado al 100%,y lo mejor de todo es que es mucho pero mucho mas facil que el ensamblador, tambien debes aprender a diferenciar los lenguajes y ver las ventajas y desvntajas de cada uno y saber cuando usar uno y cuando usar el otro.

Saludos,suerte y mucha paciencia.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 16 de Febrero de 2011, 08:11:38
Hola de nuevo molestandoles, que tengo un problema que ya le di vueltas al goggle y no se como puedo hacerlo o mas bieno no supe como buscarlo, pero quiero hacer lo siguiente si me pudieran dar la mano.
Quiero guardar algo asi como una lista que sea digamos en 3 columnas y necesitare 8 filas pero aqui pongo 4 para el ejemplo.

--------------- LISTA -----------------
valor1    |    valor2    |    valor3    |
----------------------------------------
   5        0          D7
   8        4          D3
  20        9          CE
  13        8          FF
----------------------------------------

Como puedo hacer en este caso si digamos que de la EEPROM leo el valor 5 y que me de los otros 2 valores que estan relacionados con el 5, no se si me explique bien pero espero que si porque ya me hoze bolas.  :(
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 16 de Febrero de 2011, 09:00:59
  Yo guardaría los valores de cada fila de manera continua. Suponiendo que empiezo a guardar en la dirección 10h, dicha dirección va a tener el "valor1" de "fila1", luego el próximo corresponderá con "valor2" de la "fila1", después "valor3" de "fila1". El siguiente corresponderá a "valor1" de "fila2" y así sucesivamente.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: bigluis en 16 de Febrero de 2011, 16:07:10
Yo creo que el lenguaje ensamblador es útil si quieres conocer el funcionamiento interno del dispositivo, y si quieres que tu código sea eficiente. Para mí, es mejor comenzar con lenguaje C y a medida que vayas adentrandote en el tema aprendas lo básico sobre ASM.

Ciertamente yo aprendí a trabajar con los PIC con ASM, pero solamente lo básico luego me pasé a los lenguajes de alto nivel ya que todo es más fácil, pero utilizo los conocimientos de ASM para hacer que mis códigos sean eficientes y cuando el lenguaje de alto nivel no puede resolver el problema.

Pero de todos modos te deseo suerte.
 :-/
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 16 de Febrero de 2011, 16:21:56
Efectivamente el lenguaje C es mucho mas sencillo de hecho ya e trabajado con el lenguaje C pero no para programacion de PIC, pero pues quiero conocer a fondo lo mas que se puedo ASM y luego pasarme a Basic y por ultimo a C, y AngelGris no se si me pudieras dar el ejemplo un poco mas claro osea tu me dices que por ejemplo el valor de la fila1 columna1 osea el "5" lo guardarias en la direccion 10h y el siguiente de la misma fila1 que seria el "0" lo guardarias en la direccion 11h y por ultimo el siguiente de esa misma fila1 que seria el "D7" lo guardarias en la direccion 12h?.
Y ahora si quiesiera Guardar los valores de la fila 2 empezaria en la direccion 20h de la EEPROM y para la fila3 en la direccion 30h?, no se si eso es lo que me quieras decir ya estoy un poco desesperado con esto.
Por cierto estuve buscando informacion clara en el datasheet del pic y no pude saver de que direccion inicia y en cual es la ultima que puedo usar para grabar en la EEPROM, gracias por responder.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 16 de Febrero de 2011, 17:15:57
AngelGris no se si me pudieras dar el ejemplo un poco mas claro osea tu me dices que por ejemplo el valor de la fila1 columna1 osea el "5" lo guardarias en la direccion 10h y el siguiente de la misma fila1 que seria el "0" lo guardarias en la direccion 11h y por ultimo el siguiente de esa misma fila1 que seria el "D7" lo guardarias en la direccion 12h?.


  Claro, esa es la idea.


Y ahora si quiesiera Guardar los valores de la fila 2 empezaria en la direccion 20h de la EEPROM y para la fila3 en la direccion 30h?, no se si eso es lo que me quieras decir ya estoy un poco desesperado con esto.
Por cierto estuve buscando informacion clara en el datasheet del pic y no pude saver de que direccion inicia y en cual es la ultima que puedo usar para grabar en la EEPROM, gracias por responder.

  Yo no haría que la fila2 empieza en 20h, sino bien seguido del último dato de la fila1. O sea, si el valor3 de fila1 está guardado en 02h, el valor1 de fila2 lo guardaría en 03h.

  En cuanto a las direcciones de EEPROM, según la página 72 del datasseht van desde 00h hasta FFh
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 16 de Febrero de 2011, 17:36:26
  Yo no haría que la fila2 empieza en 20h, sino bien seguido del último dato de la fila1. O sea, si el valor3 de fila1 está guardado en 02h, el valor1 de fila2 lo guardaría en 03h.

Ok gracias viejo, ya te entendi pero como en este caso casi no voy a necesitar espacios de la EEPROM se me hace mas facil asi como te lo comenten yo que por ejemplo si quiero guardar los valores de la fila 1 empieze a usar la direccion 10h y si quiero guardar lo valores de la fila 2 empieze de la direccion 20h para llevar la secuencia de la fila con las memorias pero si entendi como tu me dices, ahora tengo declarado en las primeras filas de la programacion estas lineas, la verdad no se mucho que significan pero son con relacion a la EEPROM, ¿Crees que me afecte dejandola asi, o necesito cambiar algunos valores?

Código: [Seleccionar]
;   EEPROM-Data
    Org 0x2100
    DE 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00   ;  ..
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 16 de Febrero de 2011, 18:52:05
  Si no me equivoco, eso es para que dichos datos queden en el archivo .hex, y por consiguiente cuando lo grabes en el PIC se van a grabar también los datos.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 16 de Febrero de 2011, 19:14:53
Ok, entonces si omito esta linea no me afectara en nada?
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 16 de Febrero de 2011, 20:30:09
Ok, entonces si omito esta linea no me afectara en nada?

  En teoría no pasaría nada.... es cuestión de probar  :)
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 17 de Febrero de 2011, 00:49:51
Oigan ahi alguna instruccion que me sirva como para copiar el valor de una variable a otra porque me repase todas las instrucciones y no encuentro esa posibilidad, por ejemplo:
Tengo 2 variables
VARIABLE1 = h'10'
VARIABLE2 = h'5'

y que despues de hacer el copiado de la 1 a la dos me queden

VARIABLE1 = h'10'
VARIABLE2 = h'10'

Si uso el mov... pues la mueve, y si uso el ADD ps lo suma :( como puedo hacerle?
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: bigluis en 17 de Febrero de 2011, 02:54:46
Los pic10 12 y 16 no la tienen siempre tienes que hacer lo siguiente:

Código: ASM
  1. movf variable1,w
  2. movwf variable2

creo que puedes usar tambien

Código: ASM
  1. movfw variable1
  2. movwf variable2

Si observas en ambos ejemplos siempre tienes que utilizar el registro de trabajo para realizar casi cualquier operación, es esta característica la que se conoce como ortogonalidad.

Los pic18 en adelante si la tienen es la siguiente:

Código: ASM
  1. movff variable1,variable2
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: bigluis en 17 de Febrero de 2011, 03:00:57
Una recomendación que te puedo dar es que no trates de comerte al mundo de un solo bocado, es decir, comienza de lo más básico y ve subiendo de poco a poco, te recomiendo que leas y práctiques los ejemplos que suky ha subido al foro y también que leas el libro Microcontrolador PIC16F84 desarrollo de proyectos del autor Enrique Palacios para mi es el mejor.

Un error que comete la mayoría de personas es querer aprenderlo todo de una sola vez y olvida que es imposible, así mismo creen que los grandes maestros lo son porque son unos genios, posiblemente lo sean  :D, pero la verdad es que les ha costado mucho llegar a donde estan y para ello se han esforzado mucho.

Suerte
 :-/
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 17 de Febrero de 2011, 03:15:40
Una recomendación que te puedo dar es que no trates de comerte al mundo de un solo bocado, es decir, comienza de lo más básico y ve subiendo de poco a poco, te recomiendo que leas y práctiques los ejemplos que suky ha subido al foro y también que leas el libro Microcontrolador PIC16F84 desarrollo de proyectos del autor Enrique Palacios para mi es el mejor.

Un error que comete la mayoría de personas es querer aprenderlo todo de una sola vez y olvida que es imposible, así mismo creen que los grandes maestros lo son porque son unos genios, posiblemente lo sean  :D, pero la verdad es que les ha costado mucho llegar a donde estan y para ello se han esforzado mucho.

Suerte
 :-/

Entiendo lo que me dices y creeme que si e leido mucho de hecho ese libro que comentas lo empeze pero justo ahora estoy editando un proyecto y ya me falta muy poco para terminarlo es por eso que no e tenido el tiempo de leer mas, pero es lo primero que hare terminando esto.

En cuanto a lo que me comentas bigluis eso pues es facil pero segun yo esos ejemplos lo que hace es mover los valores no?
Osea que si de variable1 la muevo al registro de trabajo "w" la variable1 quedara en 0x00 no?, es por eso que se me complico un poco, Gracias por tu respuesta men.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 17 de Febrero de 2011, 09:12:12
.........
En cuanto a lo que me comentas bigluis eso pues es facil pero segun yo esos ejemplos lo que hace es mover los valores no?
Osea que si de variable1 la muevo al registro de trabajo "w" la variable1 quedara en 0x00 no?, es por eso que se me complico un poco, Gracias por tu respuesta men.

  No,  "movf variable, w" , lo que hace es copiar el valor de la variable a al registro W, pero la variable sigue manteniendo su valor
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 17 de Febrero de 2011, 12:19:34
.........
En cuanto a lo que me comentas bigluis eso pues es facil pero segun yo esos ejemplos lo que hace es mover los valores no?
Osea que si de variable1 la muevo al registro de trabajo "w" la variable1 quedara en 0x00 no?, es por eso que se me complico un poco, Gracias por tu respuesta men.

  No,  "movf variable, w" , lo que hace es copiar el valor de la variable a al registro W, pero la variable sigue manteniendo su valor

A ok eso no lo sabia, porque volvi a checar el manual de Leon y eso no me quedo claro, entonces para que me quede mas claro todas las intrucciones mov.... lo que hacen es copiar el valor, no borrar?.

Algo que siempre me da problemas es cuando uso el Call para llamar un Rutina y en ese block de codigo que llame vuelvo a llamar otra rutina digamos algo que aga demoras o algo parecido chico, pero esto siempre me da retrasos inesperados o simplemente no funciona como espero y lo que ago es mejor si llamo una rutina tener que generar el codigo que se necesite sin llamar otra rutina, entonces tambien tenia esa duda si hacer eso es posible o no, gracias y creo que va ir quedando un manual en este hilo ya de tanta duda :), les prometo en cuanto termine de editar este proyecto me pongo a terminar el manual del PIC 16F... que me han recomendado mucho
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 17 de Febrero de 2011, 12:40:08
Se me paso comentarles tambien que por mas que leo las instrucciones XORLW, XORWF, IORWF, IORLW y todas esas de tipo logico que no se si hay mas no las uso porque hasta ahorita no e sabido bien como es que trabajan por ejemplo en el tutorial de Leon dice:

Código: [Seleccionar]
XORLW

Realiza la operación lógica XOR entre un literal o valor y el registro W. El resultado queda guardado en el registro W.
Ejemplo:

Código:
               XORLW        B'11000101'
Si antes de la instrucción W vale B'11111000', después de la instrucción W vale B'00111101'.


Pero de plano no se como hace las comparaciones y mas bien no puedo entender como es que funcionan.

Otra cosa que no e encontrado instruccion que pueda hacerlo es como comparar el valor de una variable con un valor o con otra variable como tipo if en los lenguajes de alto nivel, algo como los btfss o btfsc pero estos solo comparan 1 bit y lo que tuve que hacer en un ejemplo qu eme toco es tener que comparar un numero pero lo tuve que hacer bit por bit usando esas instrucciones btfs...
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 17 de Febrero de 2011, 13:23:59
  Para saber como trabajan las operaciones lógicas, tendrías que leer sobre electronica digital y las operaciones. AND, OR, NAND, NOR, XOR

  Para comparar una variable con cierto número lo que tenés que hacer es una resta y luego revisar el registro STATUS para saber el resultado de dicha operacion.

Código: ASM
  1. variable EQU 20h
  2.  
  3. movlw 10
  4. movwf variable
  5. ; si quiero comparar con el numero 5, puedo hacer lo siguiente
  6. movlw 5
  7. subwf variable,w ; hago la resta y almaceno en el resultado en w para no afectar la variable

  Luego hay que revisar los bits de Carry, Zero y creo que había otro más pero no lo recuerdo. Según el estado de dichos bits se puede saber si la variable es igual (en el caso de que la resta de 0, el bit Zero se pone en 1), Si la variable es mayor, creo que el bit de Carry quedaría en 1.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 17 de Febrero de 2011, 16:27:16
  Para saber como trabajan las operaciones lógicas, tendrías que leer sobre electronica digital y las operaciones. AND, OR, NAND, NOR, XOR

Ok es por lo cual jamas pude entenderle, bueno pues eso creo que si lo tendre que dejar para cuando me lea los manuales.  :)

Código: ASM
  1. variable EQU 20h
  2.  
  3. movlw 10
  4. movwf variable
  5. ; si quiero comparar con el numero 5, puedo hacer lo siguiente
  6. movlw 5
  7. subwf variable,w ; hago la resta y almaceno en el resultado en w para no afectar la variable

  Luego hay que revisar los bits de Carry, Zero y creo que había otro más pero no lo recuerdo. Según el estado de dichos bits se puede saber si la variable es igual (en el caso de que la resta de 0, el bit Zero se pone en 1), Si la variable es mayor, creo que el bit de Carry quedaría en 1.
[/quote]

Bueno creo que este ejemplo que me diste si lo entiendo, aqui mas que nada jugaria a saber si la variable afectada quedo en 0 despues de un subw.. comparandolo con "Z".
Pero el problema por decirlo asi que tengo es hacer la comparacion cuando estoy usando el ADDLW de manera que no se pase de cierta cantidad, ejemplo:

Si quiero que variable1 no pase de 19h como puedo hacer esa comparacion para que una ves que le alla sumado con ADDLW saber si se paso o no de 19h, y si se paso volver a dejarlo en 19h y si no se paso pues que se aplique correctamente el ADDLW, no se si me explique.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 17 de Febrero de 2011, 17:23:11
Si quiero que variable1 no pase de 19h como puedo hacer esa comparacion para que una ves que le alla sumado con ADDLW saber si se paso o no de 19h, y si se paso volver a dejarlo en 19h y si no se paso pues que se aplique correctamente el ADDLW, no se si me explique.

  Tené en cuenta que las funciones que son SUBLW o ADDLW, restan o suman un número al registro W, no a una variable. Para trabajar con las variables son SUBWF Y ADDWF.

  Se podría resolver fácilmente de la siguiente manera

Código: ASM
  1. movlw 10 ; en realidad seria el numero que tengas que sumar
  2. addwf variable,F      ; hago la suma y guardo el resultado en la variable
  3. movlw 19h               ; el numero a comparar
  4. subwf variable,F      ; a variable le resto W
  5. btfsc STATUS,C        ;  si el carry esta en 1 variable es mayor a 19h
  6. goto $+2                 ; salto a la linea actual + 3
  7. btfsc STATUS,Z       ; si el Z esta en 1 variable es igual a 19h
  8. movwf variable; como W valia 19h lo guardo en variable, porque esta linea se ejecuta si el Zero era 1
  9. ;aca seguiria el flujo del programa
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 17 de Febrero de 2011, 18:13:18
Código: ASM
  1. movlw 10 ; en realidad seria el numero que tengas que sumar
  2. addwf variable,F      ; hago la suma y guardo el resultado en la variable
  3. movlw 19h               ; el numero a comparar
  4. subwf variable,F      ; a variable le resto W
  5. btfsc STATUS,C        ;  si el carry esta en 1 variable es mayor a 19h
  6. goto $+2                 ; salto a la linea actual + 3
  7. btfsc STATUS,Z       ; si el Z esta en 1 variable es igual a 19h
  8. movwf variable; como W valia 19h lo guardo en variable, porque esta linea se ejecuta si el Zero era 1
  9. ;aca seguiria el flujo del programa

Me confundi con la instruccion sorry, estoy usando la instruccion INCF para ir sumando de 1 en 1 y en este caso que no exeda de los 19h, entonces seria igual que el ejmplo solo eliminaria la linea 1 y cambiaria la 2, algo asi.

Código: ASM
  1. ;movlw 10 ; en realidad seria el numero que tengas que sumar
  2. incf variable,F      ; INCREMENTAR EN 1
  3. movlw 19h               ; el numero a comparar
  4. subwf variable,F      ; a variable le resto W
  5. btfsc STATUS,C        ;  si el carry esta en 1 variable es mayor a 19h
  6. goto $+2                 ; ------------En este me quedo la duda-------------
  7. btfsc STATUS,Z       ; si el Z esta en 1 variable es igual a 19h
  8. movwf variable; como W valia 19h lo guardo en variable, porque esta linea se ejecuta si el Zero era 1
  9. ;aca seguiria el flujo del programa

Algo asi quedaria usando INCF ?
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 17 de Febrero de 2011, 18:22:13
  Sí, creo que así debería funcionar bien
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 18 de Febrero de 2011, 18:36:33
Oigan me estoy volviendo loco como es que puedo declarar variables al inicio del programa que lleven guardadas direcciones de memoria EEPROM con las que quiero trabajar por ejemplo si quisiera trabajar con la direccion A, E1, FF como definiria esas 3 variables al inicio para despues que quiera leer en la eeprom solo tomo el valor de la variable, o no se puede?
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 18 de Febrero de 2011, 19:02:04
Oigan me estoy volviendo loco como es que puedo declarar variables al inicio del programa que lleven guardadas direcciones de memoria EEPROM con las que quiero trabajar por ejemplo si quisiera trabajar con la direccion A, E1, FF como definiria esas 3 variables al inicio para despues que quiera leer en la eeprom solo tomo el valor de la variable, o no se puede?

  No se puede hacer eso. Lee el datasheet del PIC en cuestión que siempre aparece un ejemplo de como leer y como escribir en la EEPROM.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 18 de Febrero de 2011, 22:12:23
Tendra alguien un mini proyecto en ASM que grabe y lea en la EEPROM por lo menos en 2 direcciones diferentes que pueda compartir, no importa que eliminen todo el contenido importante  :oops:
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 18 de Febrero de 2011, 22:14:07
Tendra alguien un mini proyecto en ASM que grabe y lea en la EEPROM por lo menos en 2 direcciones diferentes que pueda compartir, no importa que eliminen todo el contenido importante  :oops:

  No es nada difícil trabajar con la EEPROM. Vamos, un poco de voluntad
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 18 de Febrero de 2011, 22:48:15
  No es nada difícil trabajar con la EEPROM. Vamos, un poco de voluntad

Supongo que no debe ser dificil pero como son tantas cosas las que aun me fallan pues ya no se por donde empezar jeje repaso y repaso y solo logro grabar un registro en loa EEPROM y cuando leo la EEPROM del PIC siempre me pone los mismo datos de la EEPROM osea estos:
Código: ASM
  1. ;   EEPROM-Data
  2.     Org 0x2100
  3.     DE 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  4.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  5.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  6.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  7.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  8.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  9.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  10.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  11.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  12.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  13.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  14.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  15.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  16.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  17.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  18.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  19.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  20.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  21.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  22.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  23.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  24.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  25.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  26.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  27.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  28.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  29.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  30.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  31.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  32.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  33.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........
  34.     DE 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF   ;  ........

Y pues no puedo hacer mis conclusiones si estoy grabando en el lugar correcto o no, pero siempre me pone en 0x00 la direccion 0 y por eso ya no se como puedo hacerle tal vez sea algo insignificante pero ya me tiene un dia con eso :S
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 18 de Febrero de 2011, 23:22:19
  Mostrá el código que estás usando para grabar.

  Mirando en la página 73 del datasheet, muestra claramente que hay que realizar los siguientes pasos para escribir un dato en la EEPROM

Código: ASM
  1. bsf eecon1,wren
  2. bcf intcon,gie
  3. btfsc intcon,gie
  4. goto $-2
  5. movlw 55h
  6. movwf eecon2
  7. movlw aah
  8. movwf eecon2
  9. bsf eecon1,wr
  10. bsf intcon,gie

  Por supuesto hay que darle cierto tiempo para que se graben los datos, y tal vez lo que te ocurre es que intentas grabar uno seguido al otro y por ello se genere algún error.
  También tenés que tener en cuenta de colocar el dato adecuado en EEDATA y EEADR.

  La secuencia que yo usaba para grabar y esperar a que termine de grabar antes de hacer otra cosa era algo así

Código: ASM
  1. bcf intcon,gie ; esta linea solo es necesaria si estaban habilitadas las interrupciones
  2. bsf eecon1,wren
  3. movlw 55h
  4. movwf eecon2
  5. movlw aah
  6. movwf eecon2
  7. bsf eecon1,wr ;activo la escritura
  8. btfsc eecon,wr ; testeo el bit wr, si se hace 0 es porque termino de escribir
  9. goto $-1
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 19 de Febrero de 2011, 06:03:37
Ok mas omenos asi es como estoy manejando el codigo y no logro grabar ni leer en mas direcciones de la EEPROM no se en lo que este mal haber si me pueden corregir y hechar a volar esto de una vez.

Código: ASM
  1. ;--------------------------- INICIO DEL PROGRAMA -----------------------------
  2.  
  3.         list      p=12F683
  4.         #include <p12F683.inc>
  5.  
  6.         errorlevel  -302
  7.         __CONFIG   _FCMEN_OFF & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTOSCIO
  8.  
  9.        
  10. ; initialize eeprom locations
  11.  
  12.         Org 0x2100                                         ; ESTAS 2 LINEAS LAS E PUESTO AQUI Y AL FINAL IGUAL NO ME A FUNCIONADO
  13.         DE 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF  ; Como pueden ver se supone que la direccion 3h contiene el valor 80h
  14.  
  15.  
  16.  
  17. ;Variables que estoy usando para para la EEPROM (leer, grabar, direccion, y direcciones)
  18.  
  19. DATOSEE                 equ     0x44
  20. DIRECCIONEE             equ     0x45
  21.  
  22. DireccionEEPROM1        equ     0x01
  23. ;DireccionEEPROM1       equ     h'1' ;La he declarado tambien de esta manera y no me a funcionado
  24. DireccionEEPROM2        equ     0x02
  25. DireccionEEPROM3        equ     0x03
  26.  
  27.  
  28. ;---------------- Estas son las rutinas que e usado para leer y grabar en la EEPROM
  29. LeerEE
  30.         bsf     STATUS, RP0
  31.         movf    DIRECCIONEE, w
  32.         movwf   EEADR
  33.         bsf     EECON1, RD
  34.         movf    EEDAT, W
  35.         bcf     STATUS, RP0
  36.         return
  37.  
  38.  
  39. GrabarEE
  40.         bsf     STATUS, RP0
  41.         movf    DATOSEE, w
  42.         movwf   EEDAT
  43.         movf    DIRECCIONEE, w
  44.         movwf   EEADR
  45.         bsf             EECON1,WREN
  46.         bcf             INTCON, GIE
  47.         btfsc   INTCON, GIE
  48.         goto    $-2
  49.         movlw   0x55
  50.         movwf   EECON2
  51.         movlw   0xAA
  52.         movwf   EECON2
  53.         bsf     EECON1, WR
  54. EsperarAGrabarEE
  55.         btfsc   EECON1, WR
  56.         goto    EsperarAGrabarEE
  57.         bcf     STATUS, RP0
  58.         bsf     INTCON, GIE
  59.         return
  60.  
  61.  
  62. ;Cuando voy a Grabar lo hago asi
  63.         movlw   0x10                    ;Un valor cualquiera que quiera guardar
  64.         movwf   DATOSEE                 ;Lo paso a la variable DATOSEE que defini al inicio
  65.         movf    DireccionEEPROM1, w     ;Cargo el acumulador con la direccion que se supone defini al inicio
  66.         movwf   DIRECCIONEE             ;Paso W a la variable que DIRECCIONEE que es la que se supone va a leer la rutina de GrabarEE
  67.         call    GrabarEE                ;Llamo la rutina de grabar
  68.  
  69.  
  70. ;Cuando leo en la EEPROM lo ago asi
  71.         movf    DireccionEEPROM1, w     ;Cargo en el acumulador la direccion que supuestamente contiene la variable DireccionEEPROM1
  72.         movwf   DIRECCIONEE             ;Paso el valor a DIRECCIONEE
  73.         call    LeerEE                  ;Finalmente llamo la rutina de leer en la EEPROM

Asi es como lo estoy haciendo pero no me da resultados :S

ALgo mas que me gustaria preguntarles es si un puerto de este PIC 12F683 puede usarse como entrada y que tambien sirva como salida o solo se puede definirce por una de las 2, para ser mas especifico tengo los puertos GP0 y GP1 declarados como salida pero con el transcurso del proyecto necesito que tambien me sirvan como entrada en un apartado del proyecto, puede eso ser posible?, y si es posible como los tendria que definir en el MAIN?
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 19 de Febrero de 2011, 09:36:46
  En tu código veo mal que estás cambiando al banco 1 (con la instrucción)

Código: ASM
  1. bsf STATUS,RP0

  ... y luego haces

Código: ASM
  1. movf DIRECCIONEE,W

  ... pero DIRECCIONEE está en el banco 0, por ende W no está tomando el verdadero valor de DIRECCIONEE.

  En cuanto a la consulta de cambiar el puerto de entrada a salida o viceversa, sí se puede. Así como lo configuraste la primera vez, lo podés volver a configurar dentro del programa.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 19 de Febrero de 2011, 13:00:38
  En tu código veo mal que estás cambiando al banco 1 (con la instrucción)

Código: ASM
  1. bsf STATUS,RP0

  ... y luego haces

Código: ASM
  1. movf DIRECCIONEE,W

  ... pero DIRECCIONEE está en el banco 0, por ende W no está tomando el verdadero valor de DIRECCIONEE.

  En cuanto a la consulta de cambiar el puerto de entrada a salida o viceversa, sí se puede. Así como lo configuraste la primera vez, lo podés volver a configurar dentro del programa.


Código: ASM
  1. bsf STATUS,RP0
Pero en cuanto a esta linea en el mismo Data Sheet del PIC 12F683 esta especificada

Código: ASM
  1. movf DIRECCIONEE,W
Y esta linea yo la defini asi:

Código: ASM
  1. movf    DireccionEEPROM1, w
  2. movwf   DIRECCIONEE
Donde se supone que al inicio declare la variable  DireccionEEPROM1 y se cargo con la direccion de memoria 0x01, ya estoy hecho bolas demas

Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 19 de Febrero de 2011, 14:16:19
  Está bien que cambies al banco 1 porque los registros EECON1 y EECON2 están en dicho banco, pero tu variable DIRECCIONEE pertenece al banco 0, entonces no podes obtener los datos allí almacenados si estás trabajando en el banco 1
  Tu código debería quedar algo así...

Código: ASM
  1. bcf STATUS,RP0 ; me aseguro de estar en el banco 0 para trabajar con la variable DIRECCIONEE
  2. movf DIRECCIONEE,W ; guardo en W la dirección en la cual quiero escribir
  3. bsf STATUS,RP0 ; paso al banco 1
  4. movwf EEADR ; muevo al registro EEADR la direccion en la cual quiero escribir
  5. bcf STATUS,RP0 ; vuelvo al banco 0, para trabajar con la variable DATOSEE
  6. movf DATOSEE,W ; muevo a W los datos que quiero escribir
  7. bsf STATUS,RP0 ; vuelvo al banco 1
  8. movwf EEDAT; muevo al registro EEDAT el dato a escribir
  9. bcf INTCON,GIE ; deshabilito las interrupciones
  10. bsf EECON1, WREN ; habilito la escritura
  11. movlw 55h
  12. movwf EECON2
  13. movlw aah
  14. movwf EECON2
  15. bsf EECON1, WR ; comienzo la escritura
  16. btfsc EECON1,WR ; testeo para saber si termino la escritura
  17. goto $-1 ; si no termino vuelvo a la linea anterior
  18. ...
  19. ....
  20. ; si no voy a escribir mas....
  21. bsf STATUS,RP0 ; paso al banco 1
  22. bcf EECON1,WREN ; deshabilito la escritura
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: bigluis en 19 de Febrero de 2011, 14:29:38
Una instrucción sumamente útil es banksel esta se utiliza para seleccionar el banco al que pertenece el registro que vamos a utilizar sin necesidad de saber exactamente a cual banco pertenece.

Por ejemplo:
Código: [Seleccionar]
banksel TRISB   ;selecciona el banco 1 ya que TRISB pertenece a ese banco
Produce el mismo resultado que:
Código: [Seleccionar]
bsf   STATUS,RP0  ;Pone a uno el bit RP0 del registro STATUS
bcf   STATUS,RP1  ;Pone a cero el bit RP1 del registro STATUS

Nota: Esta instrucción no ahorra espacio de programa ya que solamente es un equivalente.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 19 de Febrero de 2011, 14:38:02
  Tiene razón el coleta bigluis. Yo no lo había mencionado ya que nunca la había utilizado pero sí la había visto en la ayuda del MPLAB.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 19 de Febrero de 2011, 14:58:03
Ok entonces la instruccion:

bcf    STATUS, RP0
movf DIRECCIONEE, W
bsf    STATUS, RP0

Si quiero utilizar otra direccion de memoria tengo que estar cambiando el RP0 a RP1 o a cual?, entonce no me servira una sola rutina de GrabarEE para grabar en diferentes direcciones?
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: bigluis en 19 de Febrero de 2011, 15:15:45
Tienes que saber que el PIC posee tres tipos de memoria.

Los Bancos que cambias son los de la memoria de datos tipo RAM, es decir, la memoria EEPROM solo posee un banco, por así decirlo, por lo tanto si puedes utilizar la misma rutina para grabar en distintas posiciones de la EEPROM.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 19 de Febrero de 2011, 15:18:59
  Sí, sirve si querés grabar en diferentes direcciones. Porque podés hacer lo siguiente

Código: ASM
  1. DIRECCIONEE equ 40h ; aqui se almacena la direccion a escribir
  2. fila1 equ 00h ; primera direccion a escribir
  3. fila2 equ 10h ; segunda direccion a escribir
  4. fila3 equ 20h ; tercera direccion a escribir
  5.  
  6. grabaree
  7. bcf STATUS,RP0 ; me aseguro de estar en el banco 0 para trabajar con la variable DIRECCIONEE
  8. movf DIRECCIONEE,W ; guardo en W la dirección en la cual quiero escribir
  9. bsf STATUS,RP0 ; paso al banco 1
  10. movwf EEADR ; muevo al registro EEADR la direccion en la cual quiero escribir
  11. bcf STATUS,RP0 ; vuelvo al banco 0, para trabajar con la variable DATOSEE
  12. movf DATOSEE,W ; muevo a W los datos que quiero escribir
  13. bsf STATUS,RP0 ; vuelvo al banco 1
  14. movwf EEDAT; muevo al registro EEDAT el dato a escribir
  15. bcf INTCON,GIE ; deshabilito las interrupciones
  16. bsf EECON1, WREN ; habilito la escritura
  17. movlw 55h
  18. movwf EECON2
  19. movlw aah
  20. movwf EECON2
  21. bsf EECON1, WR ; comienzo la escritura
  22. btfsc EECON1,WR ; testeo para saber si termino la escritura
  23. goto $-1 ; si no termino vuelvo a la linea anterior
  24. ...
  25. ....
  26. ; si no voy a escribir mas....
  27. bsf STATUS,RP0 ; paso al banco 1
  28. bcf EECON1,WREN ; deshabilito la escritura
  29. bcf STATUS,RP0
  30. return
  31.  
  32. principal
  33.  
  34.   movlw fila1 ; esto mueve el valor 00h al registro W
  35.   movwf DIRECCIONEE
  36.   call grabaree
  37.  
  38.   movlw fila3 ; esto mueve el valor 20h al registro W
  39.   movwf DIRECCIONEE
  40.   call grabaree
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 19 de Febrero de 2011, 15:45:02
Muchas gracias AngelGris llegando a mi casa lo pongo a prueba, creo que definitivamente no hubiera encontrado la solucion por mi solo en varios dias.
En tu codigo dejas un apartado con puntos, eso seria en caso de necesitar grabar otro dato en otra direccion ?, menciono esto por que en un apartado del codigo grabo en una direccion y en otras 4 ocaciones necesitare grabar 3 datos diferentes en diferentes localidades de memoria, yo pensaba hacerlo llamando en 3 veces seguidas la rutina de grabar cambiando el valor de la direcicon y el dato a grabar, si lo hiciera como tu ejemplo con una rutina para grabar 3 datos con una misma llamada tendria que repetir el codigo del ejemplo que me acabas de dar de la linea 7 a la 23 pero cambiando las variables DIRECCIONEE a DIRECCIONEE2 y DIRECCIONEE3, asi como la de DATOSEE a DATOSEE1 y DATOSEE2, esto no afectaria en nada si lo llamo solo para guardar 1 dato ?
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 19 de Febrero de 2011, 15:48:28
  En realidad esos tres puntos los dejé por si vos hacías otras cosas en ese lugar. Pero fijate que en mi último ejemplo hago tres llamadas a la rutina grabaree,
  Yo lo implementaría asi, cambiando el dato y la dirección y haciendo la llamada. Queda mas legible el código.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 19 de Febrero de 2011, 16:12:24
Asi es como lo tengo ahorita en el que no me a funcionado que claro que llegando debe quedar listo con el ejemplo que me diste solo te lo comento porque por ahi habia leido que es importante no cortar la corriente o cualquier cosa cuando este grabando porque se puede dañar el PIC entonces tratando que todo el proceso sea mas eficiente era solo esa mi duda, pero en mi opinion me agrada mas asi, llamar la rutina 10 veces si es necesario de manera seguida, Gracias por tu ayuda brother.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 21 de Febrero de 2011, 00:57:12
Bueno al fin pude hacerlo, con el ejemplo que me diste AngelGris solo que no pude hacerlo usando variables al inicio tuve que cargarle el valor al acumulador y pasarlo a DIRECCIONEE justo antes de llamar la rutina de grabar, al fin funciona, algo que me gustaria me sacaran de la duda, con que instruccion o algo que pueda optimizar el codigo, me pasa que en ocaciones por ejemplo si se trata de hacer parpadear un led habeces lo hace parpadear mas rapido que otras veces, que es lo que puede ocacionar esto?
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 21 de Febrero de 2011, 10:11:55
  Habría que ver el código como está hecho.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 21 de Febrero de 2011, 12:14:34
  Habría que ver el código como está hecho.


Entonces si es comun que suceda esto?, que el rendimiento del procesamiento del PIC dependa de algo mas que el codigo, digamos que cuando lo estoy probando funciona perfecto y cuando lo hecho a la practica el rendimiento o la velocidad parece disminuir, tal ves sea la fuente de energia que no se abastece correctamente.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 21 de Febrero de 2011, 13:52:20
  ¿Qué es lo que pasa en concreto?

  No es común que pierda rendimiento si se mantiene dentro de los parámetros de funcionamiento dispuestos por microchip y que están expresados en el datasheet.

  El código sí puede afectar, si por ejemplo se hacen atenciones a interrupciones, que puedan afectar a los retardos utilizados.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 21 de Febrero de 2011, 15:06:09
Pues creo que esta dentro de los parametros del datasheet este proyecto originalmente no es mio es por eso que batalle un poco para editar el codigo pero no movi parametros de interrupciones ni nada parecido mas bien agregue un poco de codigo con eso de guardar en la EEPROM y mas que nada condiciones de comparacion de bit (btfsc o btfss), tambien hice algunas rutinas y por lo tanto pues use mas el Call y el Goto, y ninguna de esta ultimas dos afecta algun bit del registro Status, algunos problemas que tuve eran por ejemplo cuando hacia un Call y a su ves esta rutina contenia otro call me daba fallas o se volvia mas lento, necesite eliminar los call que tenia cada rutina y resolvi esos problemas, tratare sa dar otro vistaso al codigo igual y puedo mejorar algo. Alguna sugerencia para hacer un codigo limpio y eficiente, que me aconsejas en cuanto a las interrupciones y cosas asi, saludos.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 21 de Febrero de 2011, 15:48:54
  No sabría decirte bien, pues sólo hago cosas por hobby. De todas maneras yo he usado call dentro de call y no he tenido problemas.

  Volviendo al caso que mencionabas anteriormente del parpadeo del led que en ocasiones lo hacía mas lento, ¿Podés poner el código?

  Tal vez lo que ocurra es que haces un testeo de alguna variable y si el valor es x querés grabar en la EEPROM (estoy especulando, no sé si hace eso tu programa) y en ese caso hay que tener en cuenta que escribir en la EEPROM lleva un tiempo, por lo tanto la frecuencia de parpadeo va a variar.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: dolphin_96 en 21 de Febrero de 2011, 17:50:52
debes buscar en la hoja de datos cuantos call anidados puedes hacer, todo depende de los niveles de la pila del micro, que es una especie de memoria interna que registra la direcciones en la cual se quedo antes de que hiciera dicha instruccion. por ejemplo para el pic16f877 tiene 8 niveles es decir pudes llamar un call dentro de otro call que a su vez este dentro de otro call y asi sucesivamente 8 veces, sin ningun problema, pero cuando hagas un noveno call este se sobreescribira en el primer nivel, por eso es recomendable que utilises con cuidado esta instruccion y que siempre las cierres con return para liberar un nivel del stack.

saludos
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 21 de Febrero de 2011, 17:57:03
  Es muy acertado el comentario de dolphin_96. En este caso en particular el micro tiene un stack de 8 niveles.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 22 de Febrero de 2011, 11:21:38
Bueno creo que ya pude darme cuenta del porque bajaba un poco el rendimiento y creo que fue porque la pila ya estaba un poco descargada lo cheque con una pila mejor cargada y al parecer funciono mejor, en cuanto al Stack pude verlo que en el MPLAB te lo da en (View - Hardware Stack) y si es correcto me marca 8 ahi mismo te va poniendo en el numero que vas, por cierto en ese mismo menu que quiere decir "File Registers" ? y otra cosa tengo por ejemplo una interrupcion que se hace cuando GP0 y GP1 reciben conrriente o mejor dicho cuando se ponen en estado 0 porque creo que en 1 es apagado, pero en realidad puedo usar desde GP0 a GP5 osea todas para evaluar si se genera la interrupcion o no en una de las 6 entradas esas, porque segun el DataSheet eso es posible.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: bigluis en 22 de Febrero de 2011, 13:24:34
Así es, a eso se le llama interrupt on change IOC, esta interrupción ocurre cada vez que hay un cambio en las entradas ya sea de alto a bajo o de bajo a alto.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 22 de Febrero de 2011, 19:52:29
Se me habia pasado comentarles algo raro, y es que todos los ejemplos que me ahn dado cuando me dan un numero hexadecimal por ejemplo 55h si yo lo pogo asi en el codigo me lo marca error no me di mucho a la tarea de ver el porque pero pues tenia que declararlo como 0x55 o por ejemplo cuando me dieron el ejemplo de ir a la direccion EEPROM .1 que se supone con el punto indico que es en decimal igual tuve que hacerlo con 0x01 es algo muy raro tal ves sea algo que alla que moverle al MPLAB, se me hace que usando la sintaxis de h'55' no me daba error o b'1010101' tampoco daba error.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 23 de Febrero de 2011, 19:41:22
Podrian ayudarme con esta duda.

Cuando se ejecuta un interrupcion sabemos que ejecuta cierto codigo que allamos especificado pero que sucede si por ejemplo dentro de la interrupcion tenemos un ciclo que genera un retardo digamos de 20 segundos y antes de que termine el retardo hubo un cambio en el mismo pin que hizo ejecutar ese interrupcion, en teoria seria como si nuevamente se volviese a ejecutar la misma interrupcion que estaba en curso no se si me explique, que pasaria en estos casos?
Nada porque la interrupcion que se ejecuto primero necesita terminar los 20 segundos de retraso
Ó
Pararia de ejecutar el retardo y vuelve a ejecutar el inicio de la interrupcion.

Se que hay varios tipo de interrupciones y que no es posible ejecutar una interrupcion cuando ya se esta ejecutando una pero en este caso seria ejecutar exactamente la misma que estaba en curso.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 23 de Febrero de 2011, 19:51:52
  Cuando uno programa una rutina de interrupción, una de las cosas que hay que hacer es deshabilitar las interrupciones haciendo 0 el bit GIE (GlobalInterrupEnable) del registro INTCON. Esto se hace para evitar que otra interrupción haga que el programa reingrese a la rutina de interrupción.
  Otra cosa a tener en cuenta es tratar de que la rutina de interrupción no insuma mucho tiempo, por ello es conveniente no llamar a funciones de retardo dentro de una interrupción.
  Otro punto muy importante es borrar el flag de la interrupción correspondiente, porque sino, al salir de la misma el flag seguiría activo y nuestro programa volvería a ingresar a la rutina de interrupción.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 24 de Febrero de 2011, 00:48:22
Ok creo que con eso esta mas que claro muchas gracias.
Tengo algunas dudas en cuanto a la forma en que trabajan las entradas y salidas
bcf GPIO, 2   ;Esto lo deja como entrada o salida, o apaga o enciende el pin 2???????
y la otra es es con
bcf TRISIO, 2

En realidad no tengo muy claro cual es la diferencia entre las dos o como es que trabajan o cuando se deberia usar una o la otra se que para trabajar con TRISIO tengo que pasar al banco 1

Por ejemplo si quisiera activar que saliera energia por GP0 cual tendria que usar o si quiesiera que en lugar de energia fuese un valor logico como un 1, espero su ayuda como si fuera para alguien que no sabe nada de ese tema gracias.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 24 de Febrero de 2011, 10:11:06
  En los datasheet está bien explicado el tema del tris y del gpio en tu caso. Esto dice en la página 31 del datasheet

"4.1GPIO and the TRISIO Registers
GPIO is a 6-bit wide, bidirectional port. The
corresponding data direction register is TRISIO.
Setting a TRISIO bit (= 1) will make the corresponding
GPIO pin an input (i.e., put the corresponding output
driver in a High-Impedance mode). Clearing a TRISIO
bit (= 0) will make the corresponding GPIO pin an
output (i.e., put the contents of the output latch on the
selected pin). An exception is GP3, which is input only
and its TRISIO bit will always read as ‘1’. Example 4-1
shows how to initialize GPIO."

  Está claro que para que un pin determinado (por ejemplo gp0) sea salida el tris correspondiente tiene que valer 0, para que sea entrada el tris correspondiente tiene que ser 1.

Código: ASM
  1. movlw b'00000010'
  2. movwf trisio

  eso configura todo el puerto como salida exceptuando gp1 que queda configurado como entrada.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 24 de Febrero de 2011, 16:56:01
  En los datasheet está bien explicado el tema del tris y del gpio en tu caso. Esto dice en la página 31 del datasheet

"4.1GPIO and the TRISIO Registers
GPIO is a 6-bit wide, bidirectional port. The
corresponding data direction register is TRISIO.
Setting a TRISIO bit (= 1) will make the corresponding
GPIO pin an input (i.e., put the corresponding output
driver in a High-Impedance mode). Clearing a TRISIO
bit (= 0) will make the corresponding GPIO pin an
output (i.e., put the contents of the output latch on the
selected pin). An exception is GP3, which is input only
and its TRISIO bit will always read as ‘1’. Example 4-1
shows how to initialize GPIO."

  Está claro que para que un pin determinado (por ejemplo gp0) sea salida el tris correspondiente tiene que valer 0, para que sea entrada el tris correspondiente tiene que ser 1.

Código: ASM
  1. movlw b'00000010'
  2. movwf trisio

  eso configura todo el puerto como salida exceptuando gp1 que queda configurado como entrada.

Estos malditos data sheet deberian hacerlos en varios idiomas no se que pensaran los gringos cuantas preguntas me hubiera evitado si eso estuviera en español en fin me explicaste lo del TRISIO que mas que nada es para dejarlo como salida o entrada y el GPIO?


Y algo mas es que me estyoy volviendo loco con la comparacion de una variable lo que quiero hacer checar si la variable esta en 0x00 hacer una cosa y si es mayor que 0x00 hacer otra no habia tenido problema con esto pero ahota que quiero comparar cuando es 0 estoy batallando un poco, podria alguien ayudarme con eso
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 24 de Febrero de 2011, 18:33:31
Estos malditos data sheet deberian hacerlos en varios idiomas no se que pensaran los gringos cuantas preguntas me hubiera evitado si eso estuviera en español en fin me explicaste lo del TRISIO que mas que nada es para dejarlo como salida o entrada y el GPIO?


Y algo mas es que me estyoy volviendo loco con la comparacion de una variable lo que quiero hacer checar si la variable esta en 0x00 hacer una cosa y si es mayor que 0x00 hacer otra no habia tenido problema con esto pero ahota que quiero comparar cuando es 0 estoy batallando un poco, podria alguien ayudarme con eso

  Pero podrías haber utilizado algún traductor online para entender lo del datasheet..... El GPIO es el puerto propiamente dicho, si yo escribo

Código: ASM
  1. bsf GPIO, 0

  El pin GP0 se hace 1, si es que estaba configurado como salida.

  La instrucción movf también afecta al registro STATUS. Tenés que chequear el bit ZERO de dicho registro, entonces podés escribir algo así...

Código: ASM
  1. movf variable,W
  2. btfss STATUS,ZERO ; si el bit ZERO está en 1 quiere decir que la variable vale 0

  Insisto en que trates de leer el datasheet, no es muy complicado teniendo un diccionario a mano y sino recurriendo a algún traductor online.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 24 de Febrero de 2011, 20:33:02
Gracias men tan sencillo como hacer eso para comparar si la variable es 0 funciona perfecto.
Y volviendo con el tema del TRISIO y GPIO.
En teoria el TRISIO seria para poner como salida o entrada un PIN del PIC.
Y el GPIO seria para activar o desactivar la salida o entrada de un PIN segun sea como se alla configurado no?

En el codigo que estoy editando veo que siempre que va a cambiar de salida a entrada o vicebersa primeramente pasa al banco 1 cambia la I/O y pasa al banco 0.
Algo asi:

  bsf  STATUS, RP0
  bsf  TRISIO, 4
  bcf  STATUS, RP0

Es necesario hacer esto siempre que se quiera cambiar de salida a entrada o vicebersa?
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 24 de Febrero de 2011, 20:37:49
Gracias men tan sencillo como hacer eso para comparar si la variable es 0 funciona perfecto.
Y volviendo con el tema del TRISIO y GPIO.
En teoria el TRISIO seria para poner como salida o entrada un PIN del PIC.
Y el GPIO seria para activar o desactivar la salida o entrada de un PIN segun sea como se alla configurado no?

En el codigo que estoy editando veo que siempre que va a cambiar de salida a entrada o vicebersa primeramente pasa al banco 1 cambia la I/O y pasa al banco 0.
Algo asi:

  bsf  STATUS, RP0
  bsf  TRISIO, 4
  bcf  STATUS, RP0

Es necesario hacer esto siempre que se quiera cambiar de salida a entrada o vicebersa?

  Sí, el TRISIO es para configurar que pines serán entradas y que pines serán salidas.
  Sí, el GPIO es el puerto propiamente dicho, por lo tanto al escribir un dato en él, los pines que estén como salida tomarán el valor que hayas escrito. Al leer el GPIO leerás el estado de los pines.

  Y sí, es necesario hacer esos pasos porque el registro TRISIO está en el banco 1 y justamente se cambia de banco variando el valor del bit RP0 del registro STATUS
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 24 de Febrero de 2011, 21:00:33
Ok entonces no ando muy perdido jeje, lo del AD como es que trabaja si no es mucho molestarte AngelGris?
En esto se que los pines se definen como analogicos o digitales  por medio del registro ANSEL, que si esta en 0 cierto PIN sera digital y si esta en 1 sera analogo.
De antemano se que si esta en analogo y es salida sera energia lo que salga
Si esta analogo como entrada pues se podra evaluar cuando es que el pin esta recibiendo energia
Pero mi duda es cual es la diferencia en que sea digital y lo que salga o entre sera 1 o 0.

Espero puedas ayudarme un poco con esas duda del AD cuando es que utilizan uno u otro, gracia spor tu grandicima ayuda men.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: AngelGris en 25 de Febrero de 2011, 15:33:03
Ok entonces no ando muy perdido jeje, lo del AD como es que trabaja si no es mucho molestarte AngelGris?
En esto se que los pines se definen como analogicos o digitales  por medio del registro ANSEL, que si esta en 0 cierto PIN sera digital y si esta en 1 sera analogo.
De antemano se que si esta en analogo y es salida sera energia lo que salga
Si esta analogo como entrada pues se podra evaluar cuando es que el pin esta recibiendo energia
Pero mi duda es cual es la diferencia en que sea digital y lo que salga o entre sera 1 o 0.

Espero puedas ayudarme un poco con esas duda del AD cuando es que utilizan uno u otro, gracia spor tu grandicima ayuda men.


  En este link http://www.todopic.com.ar/foros/index.php?topic=33287.0 hay una fantástica explicación del funcionamiento del ADC, hecha por uno de los maestros del foro
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 13 de Mayo de 2011, 22:46:10
Hola a todos nuevamente estoy de regreso programando un PIC 12F683 jejeje, queria preguntarle si fuera tan amable alguien, como puedo hacer una demora estando en una interrupcion de por lo menos medio segundo a 1 segundo, digamos que la interrupcion se va a ejecutar cuando cambie de estado cierto pin y necesito que se aga una demora en el tiempo aproximado que les comento para luego dar una salida por ese mismo pin que ejecuto la interrupcion.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: bigluis en 13 de Mayo de 2011, 23:09:04
Para eso lo mejor es que hagas una interrupcion por desbordamiento de un TIMER.
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 16 de Mayo de 2011, 20:25:18
Hola men gracias por tu respuesta pero la verdad como todavia no se muy bien del todo creo que lo hare de la manera mas facil sin interrupcion osea solo con un siclo que se repita preguntando cuando se presiono el boton, eso creo que se me hace mas sencillo no se si seria mucha molestia que me ayudaran con eso, les explico mas omenos como es como quiero hacerlo.

Quiro que todo lo aga por el puerto GP1, digamos que el ciclo estaria haciendo su labor deciclo preguntando cuando es cuando esa entrada detecto un cambio (o que recibo una señal) para despues de eso hacer un pausa de algunos 800 milisegundos y despues dar una señal de salida por ese mismo puerto algo como un chispaso rapido, entonces supongo que hay que tener el puerto configurado como entrada y una vez que detecta el cambio hacer la pausa y pasarlo a salida y luego volver a dejarlo como entrada para que el ciclo siga haciendo su trabajo, :( espero me ayuden y me tengan pasiencia gracias.

Algun alma caritativa...  :oops:
Título: Re: Dolor de cabeza con PIC 12F683...
Publicado por: sQs en 17 de Mayo de 2011, 15:32:16
Help me please....   :(