;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
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'
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
returnRead
bsf STATUS , RP0 ;Bank1
movlw 0x02
movwf EEADR
bsf EECON1 , RD ;start read
movf EEDAT , W
bcf STATUS , RP0 ;Bank0
returnLEER_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
returnpero yo quiero empezar desde abajo con el ASM...:shock:
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.
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.
; EEPROM-Data
Org 0x2100
DE 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00 ; ..
Ok, entonces si omito esta linea no me afectara en nada?
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
:-/
.........
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.
.........
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
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'.
Para saber como trabajan las operaciones lógicas, tendrías que leer sobre electronica digital y las operaciones. AND, OR, NAND, NOR, XOR
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.
Código: ASM
movlw 10 ; en realidad seria el numero que tengas que sumar addwf variable,F ; hago la suma y guardo el resultado en la variable movlw 19h ; el numero a comparar subwf variable,F ; a variable le resto W btfsc STATUS,C ; si el carry esta en 1 variable es mayor a 19h goto $+2 ; salto a la linea actual + 3 btfsc STATUS,Z ; si el Z esta en 1 variable es igual a 19h movwf variable; como W valia 19h lo guardo en variable, porque esta linea se ejecuta si el Zero era 1 ;aca seguiria el flujo del programa
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?
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
En tu código veo mal que estás cambiando al banco 1 (con la instrucción)Código: ASM
bsf STATUS,RP0
... y luego hacesCódigo: ASM
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.
banksel TRISB ;selecciona el banco 1 ya que TRISB pertenece a ese bancobsf STATUS,RP0 ;Pone a uno el bit RP0 del registro STATUS
bcf STATUS,RP1 ;Pone a cero el bit RP1 del registro STATUSHabría que ver el código como está hecho.
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
movlw b'00000010' 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
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?
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.