TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: picto en 12 de Junio de 2006, 07:51:24

Título: Ayuda inicio
Publicado por: picto en 12 de Junio de 2006, 07:51:24
Hola. Estoy iniciandome en el mundillo de el assembler (tengo un post abierto sobre un programa inicial).

Tengo tantas dudas...

Una que seguro es fácil para vosotros... como hago para  mi programa este "quieto" hasta que por el RC0 gracias a un pulsador le llegue "1".

He leido y no sé comos ería exactamente, que instrucción debo utilizar? BTFSS?

Gracias
Título: Re: Ayuda inicio
Publicado por: maunix en 12 de Junio de 2006, 08:40:53
Una que seguro es fácil para vosotros... como hago para  mi programa este "quieto" hasta que por el RC0 gracias a un pulsador le llegue "1".

He leido y no sé comos ería exactamente, que instrucción debo utilizar? BTFSS?

Si, algo como

Código: ASM
  1. _ESPERAR:
  2.         btfss   PORTC,0
  3.         goto    _ESPERAR

Saludos
Título: Re: Ayuda inicio
Publicado por: picto en 12 de Junio de 2006, 09:29:06
Gracias maunix...

Creo que debería apuntarme a un cursillo de assembler...
Mira la idea  es ampliar el programa, pero quiero empezar e ir arreglandolo mientras vaya aprendiendo cosas.

En un principio el programa esperará a que en RC0 le llegue un "1" con un pulsador. Si no le llega un 1 estará quieto, y cuando le llegue un "1" ejecute unas instrucciones. En este caso por ejemplo sería activar todo el puerto A y B.

He cogido un programa de encender 1 led y lo quiero ir modificando para aprender.

Mi nivel es 0 de momento.

Código: [Seleccionar]
LIST P=16F877, ; usar PIC 16F877
#include <p16f877.inc>

__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off
; power up timer on
; watchdog off
; osc XT

ORG 0
BSF STATUS,5 ; activa la pagina 1
MOVLW B'000000' ; carga 00000 en W
MOVWF TRISA ; puerto a todos salidas
MOVLW B'00000000' ; carga 00000000 en W
MOVWF TRISB ; puerto b todos salidaS
MOVLW B'11111111' ; cargo 11111111 en W
MOVWF TRISC ; PUERTO C TODO ENTRADAS.
MOVLW B'11111111' ; cargo 11111111 en W
MOVWF TRISD ; PUERTO D TODO ENTRADAS.
MOVLW B'11111111' ; cargo 11111111 en W
MOVWF TRISE ; PUERTO E TODO ENTRADAS.
BCF STATUS,5 ; volvemos a la pagina 0



BCF PORTA,0 ; ponemos a 0 RA0
BCF PORTA,1 ; ponemos a 0 RA1
BCF PORTA,2 ; ponemos a 0 RA2
BCF PORTA,3 ; ponemos a 0 RA3
BCF PORTA,4 ; ponemos a 0 RA4
BCF PORTA,5 ; ponemos a 0 RA5

BCF PORTB,0 ; ponemos a 0 RB0
BCF PORTB,1 ; ponemos a 0 RB1
BCF PORTB,2 ; ponemos a 0 RB2
BCF PORTB,3 ; ponemos a 0 RB3
BCF PORTB,4 ; ponemos a 0 RB4
BCF PORTB,5 ; ponemos a 0 RB5
BCF PORTB,6 ; ponemos a 0 RB6
BCF PORTB,7 ; ponemos a 0 RB7


_ESPERAR

btfss PORTC,0 ; espera a que haya un 1 en RC0
goto _ESPERAR


BSF PORTA,0 ; pone a 1 RA0
BSF PORTA,1 ; pone a 1 RA1
BSF PORTA,2 ; pone a 1 RA2
BSF PORTA,3 ; pone a 1 RA3
BSF PORTA,4 ; pone a 1 RA4
BSF PORTA,5 ; pone a 1 RA5

BSF PORTB,0 ; pone a 1 RB0
BSF PORTB,1 ; pone a 1 RB1
BSF PORTB,2 ; pone a 1 RB2
BSF PORTB,3 ; pone a 1 RB3
BSF PORTB,4 ; pone a 1 RB4
BSF PORTB,5 ; pone a 1 RB5
BSF PORTB,6 ; pone a 1 RB6
BSF PORTB,7 ; pone a 1 RB7



END ; fin de programa

Segurisimo que se puede hacer con menos funciones...

Con ese código y el circuito, al activar pulsador solo me activa todo el puerta B...

Saludos
   





Título: Re: Ayuda inicio
Publicado por: LabPIC en 12 de Junio de 2006, 12:08:08
Seguro que si picto  :mrgreen:

Citar
BCF   PORTA,0; ponemos a 0 RA0
BCF   PORTA,1; ponemos a 0 RA1
BCF   PORTA,2; ponemos a 0 RA2
BCF   PORTA,3; ponemos a 0 RA3
BCF   PORTA,4; ponemos a 0 RA4
BCF   PORTA,5; ponemos a 0 RA5

Esta parte la puedes reducir a la siguiente manera

CLRF PORTA

Citar
BSF   PORTA,0; pone a 1 RA0
BSF    PORTA,1; pone a 1 RA1
BSF    PORTA,2; pone a 1 RA2
BSF    PORTA,3; pone a 1 RA3
BSF    PORTA,4; pone a 1 RA4
BSF   PORTA,5; pone a 1 RA5

BSF   PORTB,0; pone a 1 RB0
BSF   PORTB,1; pone a 1 RB1
BSF   PORTB,2; pone a 1 RB2
BSF   PORTB,3; pone a 1 RB3
BSF   PORTB,4; pone a 1 RB4
BSF   PORTB,5; pone a 1 RB5
BSF   PORTB,6; pone a 1 RB6
BSF   PORTB,7; pone a 1 RB7

Y esta parte de igual manera la puedes reducir a la siguiente:
MOVLW b'111111'
MOVWF PORTA

MOVLW b'11111111'
MOVWF PORTB

Respectivamente  :)

Saludos LabPIC
Título: Re: Ayuda inicio
Publicado por: picto en 12 de Junio de 2006, 12:32:58
LAbpic muchas gracias por la ayuda.

Estoy empezando desde 0... eh pero esto empieza a viciar con lo del proteus.

Aún me tengo que aprender que hace cada instrucción exactamente.

Por ejemplo lo que comentaba maunix:

ESPERAR

   btfss   PORTC,0            
   goto   _ESPERAR

Exactamente que significa btfss PORTC,0, me refiero sería algo así comosaltar a la siguiente isntrucción si RC0 = 1? o como? Si es 0 saltar a esperar de nuevo?

Ahora que empiezo, os daré la brasa  :D Me gustaría poder compensaros con algo :-/

Y me leo el foro, pero hay tanto que aprender...

Título: Re: Ayuda inicio
Publicado por: PAOLA09 en 12 de Junio de 2006, 12:38:08
hola picto

exactamente hace lo que has dicho. BTFSS pregunta por el bit seleccionado en este caso RC0 y salta si se cumple la condicion. como termina en s BTFSS significa salta si esta seteado en caso contrario terminaria en c BTFSC y es salta si esta clareado o cero. cuando la condición no se cumple este seguira su proceso normal continuando con la línea siguiente.

es una pequeña explicacion espero me haya hecho entender  :)

Título: Re: Ayuda inicio
Publicado por: LabPIC en 12 de Junio de 2006, 12:44:25
 :D :D entiendo, bueno las siglas btfss son acronimo de Bit Test File, Skip if Set algo asi como "Si el bit x del archivo y es uno escapa", la tarea que realiza es la siguiente:

Si el bit ‘b’ en el registro ‘f’ is ‘0’, la siguiente instrucción es ejecutada. Si el bit ‘b’ es ‘1’, entonces la siguiente instrucción es descartada y un NOP es ejecutado instantaneamente, haciendo esto en 2 TCY instrucciones.

Veo que PAOLA09 se me ha adelantado  :D, de todas formas pongo algo, espero y te sirva.

Saludos LabPIC

Título: Re: Ayuda inicio
Publicado por: picto en 12 de Junio de 2006, 12:52:21
Entre los 2 me ha queda muchisimo más claro. Os dedicaré un día algún programa  :-/

Entonces una cosa... el siguiente código no haría lo que yo quiero no?

Yo quiero que esten por ejemplo los puertos A y B (salidas) a 0, y cuando pulse un pulsador y ponga RC0=1 me saque un 1 en todos los puertos es decir A y B, más o menos.

ESPERAR

   btfss   PORTC,0           
   goto  ESPERAR


Pero con este código le estoy diciendo si RC0=0 pasa a la siguiente instrucción... y la siguiente le dice que vuelva... entonces cuando séa RC0=1 que pasará? porque en ese caso quiero que cambie de estado los puertos A y B que estaban a 0.

Perdon si la lío mucho...
Título: Re: Ayuda inicio
Publicado por: LabPIC en 12 de Junio de 2006, 12:56:58
ESPERAR

   btfss   PORTC,0           
   goto  ESPERAR
   MOVLW b'111111'
   MOVWF PORTA
   MOVLW b'11111111'
   MOVWF PORTB

Saludos LabPIC
Título: Re: Ayuda inicio
Publicado por: PAOLA09 en 12 de Junio de 2006, 13:00:20
bueno en el ejmplo quetienes esta incomplento la cosa seria asi

primero tendras:

clrf  porta    para iniciar el puerto en ceros
clrf  portb

ESPERAR

   btfss   PORTC,0       ;si es uno saltara el goto  asignando altos en el puerto    
   goto  ESPERAR
   movlw  0xFF
   movwf  PORTB
   movwf  PORTA

Asi quedaria espero te sea útil.

creo que labpic me gano esta vez  :lol:
Título: Re: Ayuda inicio
Publicado por: picto en 12 de Junio de 2006, 13:14:19
Vale, entonces si se cumple la condición se salta la linea siguiente (goto en este caso)? Osea omite la siguiente linea despues de btfss   PORTC,0 , si no se cumple la ejecuta?

bueno, creo que el tema BTFSS, BTFC CLRF y GOTO ya los domino un poco.

Muchas gracias.

P.D: Ya os iré preguntando, si no os importa.

Título: Re: Ayuda inicio
Publicado por: BrunoF en 12 de Junio de 2006, 14:22:42
Asi es.
btfss es Bit Test File Skip if Set y btfsc es Bit Test File Skip if Clear.
Si se cumple la condicion, saltan la linea siguiente de codigo.Si no se cumple, no la salta.
Saludos y pregunta sin miedo.
Título: Re: Ayuda inicio
Publicado por: pibe en 13 de Junio de 2006, 13:40:51
No te olvides de poner

bsf STATUS,RP0 ; para cambiar de banco
....
clrf TRISB
clrf TRISA
...
....
Movlw 07h
movwf ADCON1 ; para hacer puerto A digital, sino es analógico por defecto
....
.....
bcf STATUS,RP0 ; para volver a banco 0


Y si, yo lo leo así :
BTFSS = Bit Test iF iS Set (mira si es 1 y si lo es saltea la intruccion que sigue)
Título: Re: Ayuda inicio
Publicado por: picto en 13 de Junio de 2006, 19:48:04
No te olvides de poner

bsf STATUS,RP0 ; para cambiar de banco
....
clrf TRISB
clrf TRISA
...
....
Movlw 07h
movwf ADCON1 ; para hacer puerto A digital, sino es analógico por defecto
....
.....
bcf STATUS,RP0 ; para volver a banco 0


Y si, yo lo leo así :
BTFSS = Bit Test iF iS Set (mira si es 1 y si lo es saltea la intruccion que sigue)


Gracias pibe.

Exactamente que es eso de cambair de banco? que hay 2 bancos? Para que sirven? Q pasa si no cambio de banco?
Título: Re: Ayuda inicio
Publicado por: BrunoF en 13 de Junio de 2006, 20:18:09
Exactamente que es eso de cambair de banco? que hay 2 bancos? Para que sirven? Q pasa si no cambio de banco?

El PIC que estas utilizando actualmente(16F877) tiene cuatro banco.
Cada banco es una sub-division de la memoria total, tanto FLASH como RAM del PIC.
Si no cambias de banco, todos los registros que esten ubicados en bancos distintos al que estas no van a verse afectados por mas que te refieras a ellos(ejemplo: registros TRISA,TRISB) y en lugar de afectarlos, se veran afectados los registros de memoria ubicados a la misma "altura" de las mismas(ver Memory Organization en el datasheet del PIC que uses).

Ejemplo si no cambio de banco:

INICIO
bcf STATUS,RP0
bcf STATUS,RP1
clrf TRISA
clrf TRISB

Analizando: Fijate en la tabla(Memory Organization del datasheet del PIC) y vas a ver que TRISA = 0x85 y TRISB=0x86.
Estos registros estan ubicados en el banco 1 del PIC, sin embargo en el ejemplo que puse arriba, no pase al banco 1 antes de aplicarles alguna instruccion, entonces lo que sucede es que:
El ensamblador considera solo los 7 bits de menor peso de la direccion ingresada(¿por que? Mira en "Instruction Set Summary" y veras que el valor ingresado para trabajar con registros RAM deben ser / 0x00<=X<=0x7F), entonces:
En lugar de hacer: clrf  0x85, hara clrf 0x05 y en lugar de clrf  0x86 hara clrf 0x06.
Si te fijas en la tabla, veras que 0x05 es PORTA y 0x06 es PORTB. Y estan a la misma "altura" de los registros de configuracion de cada puerto(los TRIS).
Por lo tanto, debes ubicarte en el banco correcto antes de trabajar con registros que esten en un banco distinto al que estas.
Saludos.
Título: Re: Ayuda inicio
Publicado por: pibe en 14 de Junio de 2006, 03:42:26
Mírate este mapa de memoria.

(http://img.photobucket.com/albums/v165/carlyvalente/memory.jpg)


Es facil. Ves debajo de la tabla dice Bank 0, Bank 1 etc etc? Pues eso. Que si quieres usar uno de los registros debes mirar en que banco está.
El micro arranca con bank0 de default.
Por ejemplo: Que quieres usar el PIE1? pues antes debes pasar al banco 1 y eso se hace con bsf STATUS,RP0 y luego no olvidarse de volver a bank 0 con bcf STATUS,RP0.
Otro ejemplo: Quiero usar el INTCON pero veo que está en los 4 bancos. Pues nada usa cualquier banco.
Que quiero pasar a bank 2? en este caso (para el 16f877) es innecesario ya que como ves, casi todos los registros que estan en bank 2 y 3 también los tienes en bank 0 y 1.  Salvo quieras usar la eeprom en ese caso para pasar al Bank 2 es bsf STATUS,RP1 y para el Bank 3 es
bsf STATUS, RP0
bsf STATUS, RP1

En resumen:
Bank0 = bcf STATUS,RP0
             bcf STATUS, RP1

Bank1= bsf STATUS,RP0
             bcf STATUS, RP1

Bank2= bcf STATUS,RP0
             bsf STATUS, RP1

Bank3= bsf STATUS,RP0
             bsf STATUS, RP1

Yo tengo una fotocopia del mapa de memoria a mi lado siempre, luego ya los memorizas.

Saluten :)
Título: Re: Ayuda inicio
Publicado por: picto en 14 de Junio de 2006, 06:18:51
Pibe una explicación genial! Por lo que véo es básico. Otra cosa que he aprendido, gracias.

Pero una cosa... a ver si lo he entendido bien.
Exactamente

Bank0 = bcf STATUS,RP0
             bcf STATUS, RP1

Bank1= bsf STATUS,RP0= Del 0 pasa
             bcf STATUS, RP1

Bank2= bcf STATUS,RP0
             bsf STATUS, RP1

Bank3= bsf STATUS,RP0
             bsf STATUS, RP1

RP0 que significa? A que equivale? Y RP1?
Y que diferencia de BSF a BCF?

Muchas gracias
Título: Re: Ayuda inicio
Publicado por: pibe en 14 de Junio de 2006, 06:47:11
El registro STATUS te sirve , entre otras cosas, para indicarle al micro a que banco de memoria
te refieres. Si miras la hoja de datos del 877 verás que este registro (como todos) tiene 8 bits
de los cuales el bit 5 es el RP0 y el bit 6 es el RP1. Si limpias (BCF) ambos bits le indicas al micro
que trabaje en el banco 0, si pones a 1 (BSF) el bit 5 le indicas que se pase al banco 1 y así sucesivamente.

BCF = pon el bit a 0
BSF = pon el bit a 1

Ejemplo:
BSF PORTB,3 ; pon a 1 el bit 3 del puerto B
BCF prueba,4  ; pon a 0 el bit 4 de la variable "prueba"
Título: Re: Ayuda inicio
Publicado por: picto en 14 de Junio de 2006, 06:57:24
Pibe, poco a poco voy entendiendo.

Ya entiedo Banco 0= 00000000.
Banco 1 = 00000100.
Banco 2 = 00001000.
Banco 3= 00001100.

no? Algo así?

Ya capto el significado de RPO. Supongo entonces que STATUS si en vez de poner los bits 5 y 6 por ejemplo el 1 o 2 significará otra cosa no?

Muchas garcias pibe
Título: Re: Ayuda inicio
Publicado por: pibe en 14 de Junio de 2006, 07:15:17

Ya entiedo Banco 0= 00000000.
Banco 1 = 00000100.
Banco 2 = 00001000.
Banco 3= 00001100.

no? Algo así?


NO

En todo caso sería así:

Banco 0=  00000000.
Banco 1 = 00100000.
Banco 2 = 01000000.
Banco 3=  01100000.

El registro STATUS
******************

Contiene el estado aritmético de la ALU (unidad aritmético lógica)
, el estado del reset y los bits de selección del bacno de datos.

O sea:

STATUS register

bit 7 = IRP   ; se usa para direccionamento indirecto
bit 6 = RP1   ; bit de selección de banco
bit 5 = RP0 ; bit de seleccion de banco
bit 4 = TO   ; bit time out
bit 3 = PD  ; bit power down
bit 2 = Z   ; flag resultado de una operación aritmético lógica
         ;(si fue 0 la operación anterior este flag se pone a 1)
bit 1 = DC  ; acarreo (carry)
bit 0 = C   ; acarreo del bit mas significativo.

En nuestro caso nos interesan los bits 5 y 6 que son los de seleccion de banco, por lo
tanto no es necesario cargar 8 bits a este registro sino solamente "tocar" los bits
que te interesan.

bcf STATUS,5 o bien bcf STATUS,RP0

Una aclaración aquí:
En el encabezado de tu programa debes poner include   "P16F877a.INC", de esta manera
no es necesario que sepas cada bit de cada registro.

ejemplo: bcf STATUS,5 (el bit 5 que era????, ufff... a buscar por las hoja de datos...)

en cambio bcf STATUS,RP0 es mas entendible para nosotros y con el include   "P16F877a.INC"
que pusiste al principio el ensamblador MPLAB se encarga de traducir tu STATUS,RP0 a STATUS,5

Lo entiendes?
Título: Re: Ayuda inicio
Publicado por: picto en 15 de Junio de 2006, 09:44:35
Si pibe, esto empieza a viciar. La verdad que uno solo es muy difícil empezar, pero con vuestros consejos se me hace más fácil.

Por ejemplo ahora quiero que cuando por RE0 tenga un 1, active todas las salidas a 1 de los puertos A, B y C.

Bien, pues no sé porque que en el proteus al pulsar el pulsador no cambian de estado...

Os pongo el código (por favor si veis algo mal corregidme)  :-/

Código: [Seleccionar]
LIST P=16F877, ; usar PIC 16F877
#include <p16f877a.inc>

__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off
; power up timer on
; watchdog off
; osc XT

ORG 0

bsf STATUS,RP0 ; activamos banco 1, poniendo RP0 a 1 y RP1 a 0
bcf STATUS,RP1 ; activamos banco 1, poniendo RP0 a 1 y RP1 a 0

MOVLW 0X00 ; carga 00000 en W
MOVWF TRISA ; puerto A todos salidas
MOVLW 0X00 ; carga 00000 en W
MOVWF TRISB ; puerto B todos salidas
MOVLW 0X00   ; carga 00000 en W
MOVWF TRISC ; puerto C todos salidas
MOVLW 0XFF ; carga 1111 en W
MOVWF TRISE ; puerto E todo entradas

bcf STATUS,RP0 ; vovlemos al banco 0 poniendo RP0 a 0 y RP1 a 0
bcf STATUS,RP1 ; vovlemos al banco 0 poniendo RP0 a 0 y RP1 a 0


CLRF PORTA ;inicializamos a 0 el puerto A
CLRF PORTB ;inicializamos a 0 el puerto B
CLRF PORTC ;inicializamos a 0 el puerto C


ESPERAR ;etiqueta
btfss   PORTC,0      ;si RE0 es 1 saltara el goto, si es 0 pasará a GOTO ESPERAR
goto  ESPERAR ;salta a la etiqueta esperar
   
movlw 0xFF ;cargo todo a 1 en W
movwf PORTB ;pongo a 1 todo el puerto B
movwf PORTA ;pongo a 1 todo el puerto A.
movwf PORTC ;pongo a 1 todo el puerto C.

END
Título: Re: Ayuda inicio
Publicado por: BrunoF en 15 de Junio de 2006, 10:05:14
Hola, estas checkeando el PORTC,0 cuando en realidad deberia ser el PORTE,0
Cambia:

btfss   PORTC,0         ;si RE0 es 1 saltara el goto, si es 0 pasará a GOTO ESPERAR

Por
btfss   PORTE,0         ;si RE0 es 1 saltara el goto, si es 0 pasará a GOTO ESPERAR

Saludos.
Título: Re: Ayuda inicio
Publicado por: picto en 15 de Junio de 2006, 10:44:11
Exactamente que es eso de cambair de banco? que hay 2 bancos? Para que sirven? Q pasa si no cambio de banco?

El PIC que estas utilizando actualmente(16F877) tiene cuatro banco.
Cada banco es una sub-division de la memoria total, tanto FLASH como RAM del PIC.
Si no cambias de banco, todos los registros que esten ubicados en bancos distintos al que estas no van a verse afectados por mas que te refieras a ellos(ejemplo: registros TRISA,TRISB) y en lugar de afectarlos, se veran afectados los registros de memoria ubicados a la misma "altura" de las mismas(ver Memory Organization en el datasheet del PIC que uses).

Ejemplo si no cambio de banco:

INICIO
bcf STATUS,RP0
bcf STATUS,RP1
clrf TRISA
clrf TRISB

Analizando: Fijate en la tabla(Memory Organization del datasheet del PIC) y vas a ver que TRISA = 0x85 y TRISB=0x86.
Estos registros estan ubicados en el banco 1 del PIC, sin embargo en el ejemplo que puse arriba, no pase al banco 1 antes de aplicarles alguna instruccion, entonces lo que sucede es que:
El ensamblador considera solo los 7 bits de menor peso de la direccion ingresada(¿por que? Mira en "Instruction Set Summary" y veras que el valor ingresado para trabajar con registros RAM deben ser / 0x00<=X<=0x7F), entonces:
En lugar de hacer: clrf  0x85, hara clrf 0x05 y en lugar de clrf  0x86 hara clrf 0x06.
Si te fijas en la tabla, veras que 0x05 es PORTA y 0x06 es PORTB. Y estan a la misma "altura" de los registros de configuracion de cada puerto(los TRIS).
Por lo tanto, debes ubicarte en el banco correcto antes de trabajar con registros que esten en un banco distinto al que estas.
Saludos.
Bruno una explicación maestra! No sé como agradeceros la ayuda.

Cada vez que quiera utilizar un registro PORTA o FSR tengo que cambiar de banco, perfecto.

Una cosa, por ejemplo los registros FSR, PCL, PIR1 por decir algunos, para que sirven?
Título: Re: Ayuda inicio
Publicado por: picto en 15 de Junio de 2006, 10:48:35
Hola, estas checkeando el PORTC,0 cuando en realidad deberia ser el PORTE,0
Cambia:

btfss   PORTC,0         ;si RE0 es 1 saltara el goto, si es 0 pasará a GOTO ESPERAR

Por
btfss   PORTE,0         ;si RE0 es 1 saltara el goto, si es 0 pasará a GOTO ESPERAR

Saludos.

Bruno, antes lo tenía en PORTE,0 pero no hacúia nada y he pegado el código de las pruebas´. PEro ya lo he solucionado!

Por cierto, es normal que con el MPlab al compilar me salgan todos estos errores?

Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F877 "Probador_prueba.asm" /l"Probador_prueba.lst" /e"Probador_prueba.err"
Message[301] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\P16F877A.INC 36 : MESSAGE: (Processor-header file mismatch.  Verify selected processor.)
Warning[205] C:\I-O\PROBADOR_PRUEBA.ASM 12 : Found directive in column 1. (ORG)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 14 : Found opcode in column 1. (bsf)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 15 : Found opcode in column 1. (bcf)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 17 : Found opcode in column 1. (Movlw)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 18 : Found opcode in column 1. (movwf)
Message[302] C:\I-O\PROBADOR_PRUEBA.ASM 18 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 20 : Found opcode in column 1. (MOVLW)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 21 : Found opcode in column 1. (MOVWF)
Message[302] C:\I-O\PROBADOR_PRUEBA.ASM 21 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 22 : Found opcode in column 1. (MOVLW)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 23 : Found opcode in column 1. (MOVWF)
Message[302] C:\I-O\PROBADOR_PRUEBA.ASM 23 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 24 : Found opcode in column 1. (MOVLW)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 25 : Found opcode in column 1. (MOVWF)
Message[302] C:\I-O\PROBADOR_PRUEBA.ASM 25 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 26 : Found opcode in column 1. (MOVLW)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 27 : Found opcode in column 1. (MOVWF)
Message[302] C:\I-O\PROBADOR_PRUEBA.ASM 27 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 29 : Found opcode in column 1. (bcf)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 30 : Found opcode in column 1. (bcf)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 33 : Found opcode in column 1. (CLRF)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 34 : Found opcode in column 1. (CLRF)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 35 : Found opcode in column 1. (CLRF)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 39 : Found opcode in column 1. (btfss)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 40 : Found opcode in column 1. (goto)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 42 : Found opcode in column 1. (movlw)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 43 : Found opcode in column 1. (movwf)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 44 : Found opcode in column 1. (movwf)
Warning[203] C:\I-O\PROBADOR_PRUEBA.ASM 45 : Found opcode in column 1. (movwf)
Warning[205] C:\I-O\PROBADOR_PRUEBA.ASM 47 : Found directive in column 1. (END)
Loaded C:\I-O\Probador_prueba.COD.
BUILD SUCCEEDED: Thu Jun 15 15:46:59 2006
Título: Re: Ayuda inicio
Publicado por: LabPIC en 15 de Junio de 2006, 11:45:40
Minetras no te aparezca un mensaje de Error todo anda bien :mrgreen:.

Saludos LabPIC
Título: Re: Ayuda inicio
Publicado por: picto en 15 de Junio de 2006, 12:47:47
Minetras no te aparezca un mensaje de Error todo anda bien :mrgreen:.

Saludos LabPIC

Ya he montado el circuito para probar... pero ahora quiero hacer un antirrebotes y no sé si ahcerlo via software (creo que se puede) o vía hardwar.

Que me recomiendas?
Título: Re: Ayuda inicio
Publicado por: LabPIC en 15 de Junio de 2006, 12:54:22
Lo mas comun es hacerlo vía software, generalmente el antirrebote no necesita un tiempo mayor a los 20 ms.

Saludos LabPIC
Título: Re: Ayuda inicio
Publicado por: picto en 15 de Junio de 2006, 12:56:49
Lo mas comun es hacerlo vía software, generalmente el antirrebote no necesita un tiempo mayor a los 20 ms.

Saludos LabPIC

Estoy buscando como hacerlo pero no lo encuentro...
Es complicado?
Título: Re: Ayuda inicio
Publicado por: LabPIC en 15 de Junio de 2006, 12:58:21
¿A que frecuencia manejas el cristal oscilador del micro?. Enseguida te muestro un ejemplo.

Saludos LabPIC
Título: Re: Ayuda inicio
Publicado por: picto en 15 de Junio de 2006, 13:05:26
¿A que frecuencia manejas el cristal oscilador del micro?. Enseguida te muestro un ejemplo.

Saludos LabPIC

4Mhz...   :(
Título: Re: Ayuda inicio
Publicado por: LabPIC en 15 de Junio de 2006, 13:11:26
Código: ASM
  1. ;* Rutina de Pausa para tiempos largos
  2. ;* (Adecuada para un reloj de 4 Mhz)
  3. ;**************************************************************************
  4. ;Define constantes Para 20 milisegundos
  5. N     EQU 0x1A
  6. M     EQU 0x0
  7. cont1 EQU 0x20
  8. cont2 EQU 0x21
  9. ;inicia rutina
  10. pau   MOVLW N ;(1) Carga dato N
  11.       MOVWF cont1 ;(1) inicializa contador1 ciclo externo
  12. rep1  MOVLW M ;(1) Carga dato M
  13.       MOVWF cont2 ;(1) inicializa contador2 ciclo interno
  14. rep2  DECFSZ cont2,1 ;(1,2)Decrementa contador2 y escapa si cero
  15.       GOTO rep2 ;(2) si no es cero, repite ciclo interno
  16.       DECFSZ cont1,1 ;(1,2)Decrementa contador1 y escapa si cero
  17.       GOTO rep1 ;(2) si no es cero repite ciclo externo
  18. esc   RETURN ;(2) regresa de esta subrutina
  19. end

La duración de esta rutina en ciclos de reloj será

Tsub = 2+1+1+N*[1+1+(M-1)*(1+2)+2+1+2]+1-2+2+2 ciclos

Lo cual se puede simplificar como sigue

Tsub = [N*(3M+4)+7] Tcy

Donde Tcy es la duración en segundos de un ciclo de instrucción.

Cálculo de N.- Para lograr que la duración de la subrutina presentada sea de 20
milisegundos es necesario elegir adecuadamente el valor de la constante N.

Para una frecuencia de 4 Mhz Tcy = 1 µseg, entonces Tsub máximo =0.197639 seg.

Si deseamos Tsub = 20 mseg, haciendo M=256, despejando N

N = (Tsub/Tcy – 7)/(3M+4)

Sustituyendo valores N= 25.89 » 1Ah. (debido a la aproximación la rutina realmente
dura 20.08 mseg.

Espero y te sea de ayuda, cualquier duda o comentario pues unicamente lo posteas.

Saludos LabPIC
Título: Re: Ayuda inicio
Publicado por: picto en 15 de Junio de 2006, 13:42:03
Código: [Seleccionar]
ORG 0

bsf STATUS,RP0 ; activamos banco 1, poniendo RP0 a 1 y RP1 a 0
bcf STATUS,RP1 ; activamos banco 1, poniendo RP0 a 1 y RP1 a 0
N     EQU 0x1A
M     EQU 0x0
cont1 EQU 0x20
cont2 EQU 0x21

Movlw 07h ; pongo en digital el puerto A.
movwf ADCON1
MOVLW 0X00 ; carga 00000 en W
MOVWF TRISA ; puerto A todos salidas
MOVLW 0X00 ; carga 00000 en W
MOVWF TRISB ; puerto B todos salidas
MOVLW 0X00   ; carga 00000 en W
MOVWF TRISC ; puerto C todos salidas
MOVLW 0XFF ; carga 1111 en W
MOVWF TRISE ; puerto E todo entradas

bcf STATUS,RP0 ; volvemos al banco 0 poniendo RP0 a 0 y RP1 a 0
bcf STATUS,RP1 ; volvemos al banco 0 poniendo RP0 a 0 y RP1 a 0


CLRF PORTA ;inicializamos a 0 el puerto A
CLRF PORTB ;inicializamos a 0 el puerto B
CLRF PORTC ;inicializamos a 0 el puerto C


DEMORA
pau   MOVLW N ;(1) Carga dato N
      MOVWF cont1 ;(1) inicializa contador1 ciclo externo
rep1  MOVLW M ;(1) Carga dato M
      MOVWF cont2 ;(1) inicializa contador2 ciclo interno
rep2  DECFSZ cont2,1 ;(1,2)Decrementa contador2 y escapa si cero
      GOTO rep2 ;(2) si no es cero, repite ciclo interno
      DECFSZ cont1,1 ;(1,2)Decrementa contador1 y escapa si cero
      GOTO rep1 ;(2) si no es cero repite ciclo externo
esc   RETURN ;(2) regresa de esta subrutina
  END     

INICO

ESPERAR ;etiqueta
btfss   PORTE,0      ;si RE0 es 1 saltara el goto, si es 0 pasará a GOTO ESPERAR
CALL DEMORA
goto ESPERAR ;salta a la etiqueta esperar


enciende
movlw 0XFF ;cargo todo a 1 en W
movwf PORTB ;pongo a 1 todo el puerto B
movwf PORTA ;pongo a 1 todo el puerto A.
movwf PORTC ;pongo a 1 todo el puerto C.
btfsc PORTE,0      ;si RE0 está a 0 saltara el goto, si es 1 pasará a GOTO 
CALL DEMORA
goto enciende ;salta a la etiqueta apaga

CLRF PORTA ;inicializamos a 0 el puerto A
CLRF PORTB ;inicializamos a 0 el puerto B
CLRF PORTC ;inicializamos a 0 el puerto C
goto ESPERAR
END

Hay algo que estoy haciendo mal, porque ahora el proteus cuando pulso el pulsador no me activa a 1 los puertos A,B y C.

Título: Re: Ayuda inicio
Publicado por: LabPIC en 15 de Junio de 2006, 14:01:47
Quita el END de la subrutina de DEMORA, unicamente puede haber uno, y este es al final de todo el programa.

Saludos LabPIC
Título: Re: Ayuda inicio
Publicado por: LabPIC en 15 de Junio de 2006, 14:07:00
Cambia esta parte esta alreves:

Citar
ESPERAR   ;etiqueta
btfss   PORTE,0;si RE0 es 1 saltara el goto, si es 0 pasará a GOTO ESPERAR
goto ESPERAR;salta a la etiqueta esperar
CALL DEMORA

De igual manera
Citar
enciende
movlw 0XFF;cargo todo a 1 en W
movwf PORTB;pongo a 1 todo el puerto B
movwf PORTA;pongo a 1 todo el puerto A.
movwf PORTC;pongo a 1 todo el puerto C.
btfsc PORTE,0;si RE0 está a 0 saltara el goto, si es 1 pasará a GOTO 
goto enciende;salta a la etiqueta apaga
CALL DEMORA

Saludos LabPIC
Título: Re: Ayuda inicio
Publicado por: LabPIC en 15 de Junio de 2006, 21:08:49
Código: ASM
  1. LIST P=PIC16F873A       ; PIC16F873A
  2.  
  3.                 #include "P16F873A.INC" ;
  4.  
  5.                 cblock 0x20             ;
  6.                 cont1                   ;
  7.                 cont2                   ;
  8.                 N                       ;
  9.                 M                       ;
  10.                 endc
  11.  
  12.                 org     0x00            ;Vector de reset        
  13.                 goto    INICIO          ;
  14.                 org     0x05            ;Página 0 de memoria de programa
  15.  
  16. INICIO          BSF     STATUS,RP0      ;Banco 1
  17.                 BCF     STATUS,RP1      ;Banco 1
  18.                 MOVLW   0x07            ;
  19.                 MOVWF   ADCON1          ;Puerto A como Digital
  20.                 CLRF    TRISA           ;Puerto A como salidas
  21.                 CLRF    TRISB           ;Puerto B como salidas
  22.                 CLRF    TRISC           ;Puerto C como salidas
  23.                 MOVLW   b'11101111'     ;
  24.                 MOVWF   TRISE           ;Puerto E como entradas
  25.  
  26. ESPERAR         BCF     STATUS,RP0      ;Banco 0
  27.                 BCF     STATUS,RP1      ;Banco 0
  28. checa           btfss   PORTE,0         ;si RE0 es 1 saltara el goto, si es 0 pasará a ESPERAR        
  29.                 goto    ESPERAR         ;salta a la etiqueta esperar   
  30.                 CALL    DEMORA          ;Limpiado del rebote
  31. chec1           BTFSS   PORTE,0         ;checa nuevamente si RE0=1
  32.                 GOTO    checa           ;si RA1=0 falsa alarma, vuelve a checar
  33.  
  34. enciende        movlw   0XFF            ;cargo todo a 1 en W
  35.                 movwf   PORTA           ;pongo a 1 todo el puerto B
  36.                 movwf   PORTB           ;pongo a 1 todo el puerto A.
  37.                 movwf   PORTC           ;pongo a 1 todo el puerto C.
  38.                 btfsc   PORTE,0         ;si RE0 está a 0 saltara el goto, si es 1 pasará a GOTO  
  39.                 goto    enciende        ;salta a la etiqueta apaga
  40.                 CALL    DEMORA
  41.  
  42.  
  43. DEMORA          MOVLW   N               ;Carga dato N
  44.                 MOVWF   cont1           ;Inicializa contador1 ciclo externo
  45. rep1            MOVLW   M               ;Carga dato M
  46.                 MOVWF   cont2           ;Inicializa contador2 ciclo interno
  47. rep2            DECFSZ  cont2,1         ;Decrementa contador2 y escapa si cero
  48.                 GOTO    rep2            ;si no es cero, repite ciclo interno
  49.                 DECFSZ  cont1,1         ;Decrementa contador1 y escapa si cero
  50.                 GOTO    rep1            ;Si no es cero repite ciclo externo
  51. esc             RETURN                  ;Regresa de esta subrutina
  52. end

picto te dejo el codigo con algunas correcciones, espero y te sea de ayuda.

Saludos LabPIC
Título: Re: Ayuda inicio
Publicado por: BrunoF en 15 de Junio de 2006, 21:12:28
Hola picto, bueno...nunca dejes que una rutina llegue hasta el END.Podes obtener resultados indeseados. Cuando no queres que el micro haga nada mas, simplemente pone:

LOOP     goto   LOOP

por ej. eso es suficiente para que el micro se quede estancado alli de manera segura.



Hola, estas checkeando el PORTC,0 cuando en realidad deberia ser el PORTE,0
Cambia:

btfss   PORTC,0         ;si RE0 es 1 saltara el goto, si es 0 pasará a GOTO ESPERAR

Por
btfss   PORTE,0         ;si RE0 es 1 saltara el goto, si es 0 pasará a GOTO ESPERAR

Saludos.

Bruno, antes lo tenía en PORTE,0 pero no hacúia nada y he pegado el código de las pruebas´. PEro ya lo he solucionado!

Por cierto, es normal que con el MPlab al compilar me salgan todos estos errores?

No son errores, si tenes un error, no se crea el archivo .hex.

Message[301] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\P16F877A.INC 36 : MESSAGE: (Processor-header file mismatch.  Verify selected processor.) <- Tenes configurado un modelo de PIC en el MPLAB distinto al que estas trabajando. Anda en el MPLAB a la pestaña Configure--> Select Device y selecciona el que estes usando.

Warning[205] : Found directive in column 1. (ORG) -> Todas las directivas deben ir a partir de la segunda columna de codigo, es decir, hace un TAB antes de poner una instruccion.

Warning[203] : Found opcode in column 1. (bsf) -> Todas las instrucciones deben ir a partir de la segunda columna de codigo, es decir, hace un TAB antes de poner una instruccion.

Message[302] : Register in operand not in bank 0.  Ensure that bank bits are correct.
Te indica que estas haciendo referencia a un registro que no esta ubicado en el BANCO 0 del pic. Es simplemente para recordarte que verifiques que has pasado al banco correcto antes de trabajar con dicho registro.


Saludos.
Título: Re: Ayuda inicio
Publicado por: LabPIC en 15 de Junio de 2006, 21:14:21
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_ENABLE_ON & _LVP_OFF & _CPD_OFF

Esta es la configuración de bits del PIC.

Saludos LabPIC
Título: Re: Ayuda inicio
Publicado por: BrunoF en 15 de Junio de 2006, 21:17:33
LabPIC, esta instruccion de tu programa:

chec1       BTFSS    PORTA,0    ;checa nuevamente si RA0=1

deberia ser:

chec1       BTFSS    PORTE,0    ;checa nuevamente si RE0=1

Saludos.
Título: Re: Ayuda inicio
Publicado por: LabPIC en 15 de Junio de 2006, 21:20:25
Tienes razon BrunoF :D, una disculpa ando un poco despistado.

Saludos LabPIC
Título: Re: Ayuda inicio
Publicado por: pibe en 16 de Junio de 2006, 02:59:07
Esto está mal:


MOVLW b'11111111' ;

MOVWF   TRISE

El bit 4 debe estar a 0 para ser entradas salidas digitales, sino estas habilitando el puerto E para  modo PSP.
Título: Re: Ayuda inicio
Publicado por: picto en 16 de Junio de 2006, 04:53:15
Hola amigos, vamos por partes. Antes de probar el código que habeis colocado (muchas gracias) os pongo el código que he colocado al final para probar (sin demora) y lo he montado para ver como funciona.

La idea para empezar y aprender es es que cuando pulse el pulsador se iluminen todos los leds coenctados a los puertos A,B y C y si lo dejo de pulsar se apaguen.

He montado el circuito con este código (ahora me faltra depurarlo con lo que habeis puesto más arriba) y lo que pasa que cuando pulso el pulsador y lo dejo apretado el led parpadea muy rápido y lo que quiero es que se quede encendido hasta que yo deje de pulsar.

Esto es lo que he programado en el pic cuando lo he montado:
Código: [Seleccionar]
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off
; power up timer on
; watchdog off
; osc XT

ORG 0
bsf STATUS,RP0 ; activamos banco 1, poniendo RP0 a 1 y RP1 a 0
bcf STATUS,RP1 ; activamos banco 1, poniendo RP0 a 1 y RP1 a 0
Movlw 07h ; pongo en digital el puerto A
movwf ADCON1 ; pongo en digiatl el puerto A
MOVLW 0X00 ; carga 00000 en W
MOVWF TRISA ; puerto A todos salidas
MOVLW 0X00 ; carga 00000 en W
MOVWF TRISB ; puerto B todos salidas
MOVLW 0X00   ; carga 00000 en W
MOVWF TRISC ; puerto C todos salidas
MOVLW 0XFF ; carga 1111 en W
MOVWF TRISE ; puerto E todo entradas
bcf STATUS,RP0 ; volvemos al banco 0 poniendo RP0 a 0 y RP1 a 0
bcf STATUS,RP1 ; volvemos al banco 0 poniendo RP0 a 0 y RP1 a 0

espera_apaga ;etiqueta
CLRF PORTA ;inicializamos a 0 el puerto A
CLRF PORTB ;inicializamos a 0 el puerto B
CLRF PORTC ;inicializamos a 0 el puerto C
btfss PORTE,0      ;si RE0 es 1 saltara el goto, si es 0 pasará a esperar y apagar
Goto  espera_apaga ;salta a la etiqueta ESPERAR

enciende
movlw 0XFF ;cargo todo a 1 en W
movwf PORTB ;pongo a 1 todo el puerto B
movwf PORTA ;pongo a 1 todo el puerto A.
movwf PORTC ;pongo a 1 todo el puerto C.
btfss PORTE,0      ;si RE0 está a 1 saltara el goto espera_apaga, si es 0 pasará a GOTO enciende
goto    espera_apaga ;al estar RE0 a 0 salta a espera_apaga
goto enciende ;al estar RE0 a 1 salta a la etiqueta enciende

end
Título: Re: Ayuda inicio
Publicado por: picto en 16 de Junio de 2006, 05:07:53
Esto está mal:


MOVLW b'11111111' ;

MOVWF   TRISE

El bit 4 debe estar a 0 para ser entradas salidas digitales, sino estas habilitando el puerto E para  modo PSP.

Lo cambio por MOVLW b'11101111' ok?

Título: Re: Ayuda inicio
Publicado por: picto en 16 de Junio de 2006, 05:46:15
He vuelto a compilar el HEX y lo he graabdo al PIC y ya hace lo que quería. Al pulsar se enciende el led, el dejar d epulsar se apaga, y si lo dejo pulsado se queda permanentemente encendido.

Lo raro que lo he hecho sin lo del antirrebotes y funciona....

Ahora voy a ir más allá.

Cada vez que pulse me encenderá 1 led, es decir 1 pulso= Patilla RA0 ON, segundo pulso RA1= ON así sucesivamente hasta llegar a RC7.

Que nervios. :mrgreen:

Todoe sto gracias a vosotros
Título: Re: Ayuda inicio
Publicado por: BrunoF en 16 de Junio de 2006, 05:55:27
Hola picto, si haces eso que decis, vas a ver el problema de no poner el antirrebote :D :D
Si no pones el antirrebote te va a contar mas de un pulso cuando presiones el pulsador  y mas de uno nuevamente cuando lo sueltes.
Saludos.
Título: Re: Ayuda inicio
Publicado por: pibe en 16 de Junio de 2006, 06:20:54
EAAAA !! :-/ FELICIDADES!

Es el primer pasito a este apasionante mundo...ya verás que es como una droga; no lo podrás dejar  :mrgreen:

Por lo pronto acostúmbrate a poner esto en el encabezado de cada programa que hagas usando este micro (incluso sería interesante lo grabes como .asm para que lo tengas como plantilla):

   LIST p=16f877a      ; esto lo cambias si usas otro micro
   #include <p16f877a.inc>   ;y esto también
    __config  _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & BODEN_OFF

; Esto es para suprimir los mensajes de warning del MPLAB ( a veces son molestos)
   ERRORLEVEL -302      ;suppress "not in bank 0" message
   ERRORLEVEL -203      ;suppress  message
   ERRORLEVEL -305      ;suppress  message
   ERRORLEVEL -205      ;suppress  message

        org     00h              ; Vector de reset (aqui viene el micro cuando arranca)
        goto    Inicio           ; Y inmediatamente lo mandamos a Inicio
        org     04h              ; Vector de interrupciones             
        goto interrupciones ; para uso futuro si usas interrupciones
        org     05h              ; Aqui le dices al micro en que posicion de memoria comienza lo ;que sigue

   Inicio
; Aqui escribe tu programa principal
;
;


interrupciones
; Aqui escribes tu programas de interrupciones si lo tienes, sino no pasa nada. Es para usos ;futuros.
retfie

end ; aqui termina         
Título: Re: Ayuda inicio
Publicado por: picto en 16 de Junio de 2006, 06:50:21
Pibe, eso es perfecto, así también aprendo a organziar bien el programa.

Lo que quiero hacer es el antirrebotes en la electrónica.

Mirad, he empezado lo de pulsar y encender RA0, pulsar otra vez y poner RA0 y RA1 ON,etc...

Sería hasta RC3, pero seguro existe otra opción menos larga.
Citar
      btfss    PORTE,0            ;si RE0 es 1 saltara a enciende si es 0 salta a espera_apaga
      Goto     espera_apaga      ;salta a la etiqueta ESPERAR
      GOTO   enciende

enciende
      movlw    b'00000001'      ;cargo a 1 en W
      movwf    PORTA   ;pongo a 1 RA0 del puerto A
      btfss   PORTE,0       ;si RE0 es 1 saltara a enciende2 si es 0 salta a enciende
      goto enciende
      GOTO enciende2

enciende2
      movlw b'00000011'
      movwf   PORTA
      btfss   PORTE,0   ;si RE0 está a 1 saltara a enciende3 si es o a enciende2
      goto    enciende2
      goto   enciende3
      
enciende3
      movlw b'00000111'
      movwf   PORTA
      btfss   PORTE,0    ;si RE0 está a 1 saltara a enciende4 si es o a enciende3
      goto    enciende3
      goto   enciende4

enciende4
      loop goto loop
Título: Re: Ayuda inicio
Publicado por: pibe en 16 de Junio de 2006, 08:28:23

   btfss    PORTE,0            ;si RE0 es 1 saltara a enciende si es 0 salta a espera_apaga
      Goto     espera_apaga      ;salta a la etiqueta ESPERAR (no veo la etiqueta espera_apaga)
      GOTO   enciende ; esto es innecesario , ya que salta a la linea que sigue

enciende
      movlw    b'00000001'      ;cargo a 1 en W (aqui es mas corto BSF PORTA,0)
      movwf    PORTA   ;pongo a 1 RA0 del puerto A
      btfss   PORTE,0       ;si RE0 es 1 saltara a enciende2 si es 0 salta a enciende
      goto enciende
      GOTO enciende2 ; innecesaria

enciende2
      movlw b'00000011'
      movwf   PORTA
      btfss   PORTE,0   ;si RE0 está a 1 saltara a enciende3 si es o a enciende2
      goto    enciende2
      goto   enciende3 innecesaria
      
enciende3
      movlw b'00000111'
      movwf   PORTA
      btfss   PORTE,0    ;si RE0 está a 1 saltara a enciende4 si es o a enciende3
      goto    enciende3
      goto   enciende4 innecesaria

enciende4
      loop goto loop
[/quote]

Sube el programa completo porque no sé si todo el resto está correcto.
Otra cosa, te paso un programa que te genera demoras en asembler. Solo ponle la frecuencia de trabajo y la demora en milisegundos. Copias y pegas a tu programa. Tendras que definir algunas variables (PDel0 , PDel1 etc etc) al principio del programa. Mira el programita que te genere y que variables te pide que definas.
Si no lo haces el mismo MPLAB te dirá cuales son las variables sin definir cuando ensambles.

Ejemplo:


PDel0 equ 20h ;registro para variable del contador de la pausa
PDel1 equ 21h ; registro para variable del contador de la pausa

org 00h
goto Inicio
...
.....

end

Vas bien, aunque te has liado un poco con el programa, a ver si me hago tiempo y te lo modifico.
Título: Re: Ayuda inicio
Publicado por: pibe en 16 de Junio de 2006, 09:39:00

      LIST p=16f877a      ;list directive to define processor
      #include <p16f877a.inc>   ;processor specific definitions
       __config  _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_OFF
   ERRORLEVEL -302      ;suppress "not in bank 0" message
   ERRORLEVEL -203      ;suppress  message
   ERRORLEVEL -305      ;suppress  message
   ERRORLEVEL -205      ;suppress  message

temp_1 equ 20h
temp_2 equ 21h





;************************ RESET Y VERCTORES INT *******************************
        org     00h
         goto    Inicio           ;Reset vector 0
        org     0x05            ;Interrupcion vector



Inicio   ;------------------------ INICIALIZA MICROPOCESADOR ---------------------------
;Inicializa puertos
IniPorts
      clrf    PORTA
       clrf    PORTB                    ;Outputs low
        clrf   PORTC
        clrf    PORTD                  ;       /
       clrf    PORTE                   ;       /
          bsf STATUS,RP0               ;Selecciona Bank 1
      movlw   0x06                 
         movwf   ADCON1
      clrf   TRISA
      clrf   TRISB
      clrf    TRISC
      clrf    TRISD                   
          MOVLW b'11101111'   ;ojo que TRISE tambien actua sobre puerto D y
      movwf TRISE         ; es analógico
      bcf STATUS,RP0         ;Selecciona Bank 0


Main
clrf PORTA         ;inicio puerto A
call demora80ms      ; espera antirrebote
btfss PORTE,0      ;pin 0 a +?
goto $-1         ;aun no, volvemos a la instrucción anterior
bsf PORTA,0         ; si, activa led 0

call demora80ms
btfss PORTE,0
goto $-1
bsf PORTA,1

call demora80ms
btfss PORTE,0
goto $-1
bsf PORTA,2

call demora80ms
btfss PORTE,0
goto $-1
bsf PORTA,3

call demora80ms   ; espera
btfss PORTE,0   ; y testeo para volver a empezar
goto $-1

goto Main

; Demora 80ms a 4mhz
demora80ms   movlw   0xFF
      movwf   temp_1
      movlw   .105
      movwf   temp_2
      decfsz   temp_1,f
      goto   $-1
      clrwdt
      decfsz   temp_2,f
      goto   $-4
      return   
      end


He puesto 80ms porque no tengo pulsadores a mano y tuve que pulsar con un cablecito :P
Si ves que es demasiado, baja el .105 de la demora a .27 (20ms).
Obviamente se puede reducir código con un contador y comparando resultados pero
para esta aplicación no lo veo necesario liarse tanto.
Título: Re: Ayuda inicio
Publicado por: picto en 16 de Junio de 2006, 09:54:11
Pibe, pero lo has simulado en realidad?  :-)

Estoy haciendo pruebas para que empieze a pulsar hasta RA3. Te copio el código.

Por cierto, veo simbolos que no conozco... $-1?


Por cierto ejecutando el programa en circuito el led se queda encendido, peroen realidad se apagan y encienden muy rápido...

Es como si el programa no se parara. Yo de momento quiero que cuando pulse 4 veces encienda hasta RA3 y si pulso otra vez vuelta a empezar.

Luego colocaré el programa en el pic a ver que hace (el tuyo).
Código: [Seleccionar]
LIST p=16f877      ; Indicamos que se utiliza el PIC16F877
   
#include <p16f877.inc>  ;y esto también

__config  _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF

; Esto es para suprimir los mensajes de warning del MPLAB ( a veces son molestos)
   ERRORLEVEL -302      ;suppress "not in bank 0" message
   ERRORLEVEL -203      ;suppress  message
   ERRORLEVEL -305      ;suppress  message
   ERRORLEVEL -205      ;suppress  message


        org     00h              ; Vector de reset (aqui viene el micro cuando arranca)
        goto    inicio            ; Y inmediatamente lo mandamos a Inicio
        org     04h              ; Vector de interrupciones             
        goto interrupciones ; para uso futuro si usas interrupciones
        org     05h              ; Aqui le dices al micro en que posicion de memoria comienza lo que sigue

   
inicio

bsf STATUS,RP0 ; activamos banco 1, poniendo RP0 a 1 y RP1 a 0
bcf STATUS,RP1 ; activamos banco 1, poniendo RP0 a 1 y RP1 a 0
Movlw 07h ; pongo en digital el puerto A
movwf ADCON1 ; pongo en digiatl el puerto A
MOVLW 0X00 ; carga 00000 en W
MOVWF TRISA ; puerto A todos salidas
MOVLW 0X00 ; carga 00000 en W
MOVWF TRISB ; puerto B todos salidas
MOVLW 0X00   ; carga 00000 en W
MOVWF TRISC ; puerto C todos salidas
MOVLW b'11101111' ; carga 1111 en W
MOVWF TRISE ; puerto E todo entradas digitales
bcf STATUS,RP0 ; volvemos al banco 0 poniendo RP0 a 0 y RP1 a 0
bcf STATUS,RP1 ; volvemos al banco 0 poniendo RP0 a 0 y RP1 a 0

espera_apaga ;etiqueta
CLRF PORTA ;inicializamos a 0 el puerto A
CLRF PORTB ;inicializamos a 0 el puerto B
CLRF PORTC ;inicializamos a 0 el puerto C
btfss PORTE,0      ;si RE0 es 1 saltara a enciende si es 0 salta a espera_apaga
Goto  espera_apaga ;salta a la etiqueta espera_apaga

enciende1
movlw b'00000001' ;cargo a 1 en W
movwf PORTA ;pongo a 1 RA0 del puerto A
btfss PORTE,0      ;si RE0 es 1 se saltara el goto si es 0 hace el goto
goto enciende1 ;salta a enciende1
enciende2
movlw b'00000011' ;movemos el valor 00000011 a W
movwf PORTA ;colocamos a 1 las salidas RA0 y RA1
btfss PORTE,0      ;si RE0 está a 1 se saltará el goto si es 0 hace el goto
goto enciende2 ;salta a enciende 2
enciende3
movlw b'00000111' ;movemos el valor 00000111 a W
movwf PORTA ;pasamos a 1 las salidas RA0,RA1 y RA2
btfss PORTE,0      ;si RE0 está a 1 se saltará el goto, si es 0 hace el goto
goto enciende3
enciende4
movlw b'00001111' ;movemos el valor 00001111 a W
movwf PORTA ;pasamos a 1 las salidas RA0,RA1,RA2 y RA3
btfss PORTE,0      ;si RE0 está a 1 se saltará el goto, si es 0 hace el goto
goto enciende4
clrf PORTA
goto espera_apaga
interrupciones

; Aqui escribes tu programas de interrupciones si lo tienes, sino no pasa nada. Es para usos
;futuros.
retfie


end ; aqui termina el programa       
 
 
 

Título: Re: Ayuda inicio
Publicado por: LabPIC en 16 de Junio de 2006, 12:41:24
Hola picto un saludo, antes que nada felicitarte por el empeño que le has puesto al ensamblador y en hora buena por los avances que has logrado. Ademas de  comentar que he modificado los errores que habian quedado en el programa que he subido anteriormente :D (una disculpa, pero andaba un poco despistado :mrgreen:).

Con respecto a lo que has comentado en el mensaje anterior estoy seguro que es por lo del antirrebotes, se aconseja que cuando a un solo pulsador se asignen dos o más tareas diferentes en un programa se de be considerar el efecto de rebote.

Por eso creo que sería conveniente lo del antirrebote, como te ha comentado BrunoF anteriormente.

Saludos LabPIC
Título: Re: Ayuda inicio
Publicado por: picto en 16 de Junio de 2006, 20:15:19
Hola picto un saludo, antes que nada felicitarte por el empeño que le has puesto al ensamblador y en hora buena por los avances que has logrado. Ademas de  comentar que he modificado los errores que habian quedado en el programa que he subido anteriormente :D (una disculpa, pero andaba un poco despistado :mrgreen:).

Con respecto a lo que has comentado en el mensaje anterior estoy seguro que es por lo del antirrebotes, se aconseja que cuando a un solo pulsador se asignen dos o más tareas diferentes en un programa se de be considerar el efecto de rebote.

Por eso creo que sería conveniente lo del antirrebote, como te ha comentado BrunoF anteriormente.

Saludos LabPIC

Labpic, todo es gracias a vosotros, que me estais enseñando y ayudando, y poco a poco voy entendiendo algo sobre assembler. Sé que me queda muchisimo por aprender, pero espero que poco a poco y con vuestros consejos, algún día puedo yo ayudar a algún novato.

Os prometo que cuando termine lo que quiero hacer os colgaré una foto del circuito.

Lo que estoy haciendo ahora es ir probando, ya que es la primera vez que me embarco en este tipo de tareas. Una vez tenga un poco más claras las cosas y aprenda funciones nuevas, intentaré hacer el programa final desde 0 y depurandolo hasta tenerlo listo.

Como ya dije al final lo que quiero es un probador para conectarlo a una electrónica y poder ver si la electrónica funciona o nó gracias a un circuito probador hecho con pic.

También espero poder añadirle un LCD que vaya mostrando mensajes, y cuando haya terminado de probar la electr´noca muestre Pruebas Ok, etc.

De momento no sé 100% seguro como será pero si sé que más o menos será con un par d epusladores y que el display vaya guiando: Pulsa el puslador y observa la salida X , Salida X OK, etc.

Por cierto dar las garcioas a todos en especial a Labpic, pibe, BrunoF, maunix,  PAOLA09,

ME gustarñia poder compensaro de alguna manera por la ayuda y las molestias, sin vosotros estaría muy perdido aún... :-/
Título: Re: Ayuda inicio
Publicado por: LabPIC en 16 de Junio de 2006, 20:22:54
Hola picto pues yo soy de Querétaro, México. Una pregunta a que te refieres:

Citar
Como ya dije al final lo que quiero es un probador para conectarlo a una electrónica y poder ver si la electrónica funciona o nó gracias a un circuito probador hecho con pic.

No te molestes por lo de la compensación, dijo para ayudar es el foro :mrgreen:. "Hoy por ti, mañana por mi :mrgreen:.

Saludos LabPIC
Título: Re: Ayuda inicio
Publicado por: picto en 16 de Junio de 2006, 21:16:52
Hola picto pues yo soy de Querétaro, México. Una pregunta a que te refieres:

Citar
Como ya dije al final lo que quiero es un probador para conectarlo a una electrónica y poder ver si la electrónica funciona o nó gracias a un circuito probador hecho con pic.

No te molestes por lo de la compensación, dijo para ayudar es el foro :mrgreen:. "Hoy por ti, mañana por mi :mrgreen:.

Saludos LabPIC

Me refiero a que el primer programa que haga con assembler, me refiero al terminado 100% será un circuito al que yo le conectaré unas electrónicas estropeadas y que gracias al pic y su programa, me sirva para comprobar las entradas y salidas de la eletrónica a reparar comprendes?

Un ejemplo, tengo una tarjeta eletrónica que si por el pin1 recibe 5v por el pin 2 saca 25v por ejemplo. Pues bien yo haré un circuito probador con el pic, al cual se le conectará esa electrónica que quiero verificar y yo pulsando el pulsador enviará 5v a la entrada de esa electróncia y confirmará si a la salida hay 25v (en este caso la tarejta funcionaría) y si a la salida no dá 25v el pic me mostraría ERRO EN ELETRONICA EN SALIDA 2 entiendes? Por ejemplo.

Yo soy de España!

Saludos!
Título: Re: Ayuda inicio
Publicado por: LabPIC en 16 de Junio de 2006, 21:22:28
OK, ahora entiendo :mrgreen:, me parece una buena idea de tu parte, pues a ehcarle kilos de ganas. Luego nos dices como vas.

Por cierto que aguante de tu parte, pues en el momento de publicar este mensaje en España son las 2:27 AM, demasiado temprano para estar despierto :D, o demasiado tarde para empezar a dormir :D :D.

Saludos LabPIC
Título: Re: Ayuda inicio
Publicado por: PAOLA09 en 16 de Junio de 2006, 21:35:09
Hola picto

gracias por tenerme en cuenta lastima que no he podido seguir ayudandote ultimamente, ya que me han tenido algo ocupada intentare seguir pendiente para ayudar en lo que pueda. Te aseguro que mas adelante seras tu quien termine enseñandos.  :) Siempre se empieza en ceros cuando menos se ve yahasta le enseñas a los que te ayudaron al principio intentare poder colaborarte mas  :)
Título: Re: Ayuda inicio
Publicado por: picto en 16 de Junio de 2006, 21:55:39
OK, ahora entiendo :mrgreen:, me parece una buena idea de tu parte, pues a ehcarle kilos de ganas. Luego nos dices como vas.

Por cierto que aguante de tu parte, pues en el momento de publicar este mensaje en España son las 2:27 AM, demasiado temprano para estar despierto :D, o demasiado tarde para empezar a dormir :D :D.

Saludos LabPIC

Jajaja  :D Ahora mismo son las 2:50... tengo un sueño... esto del assembler...  :D


PAOLA09, piensa que yo he empezado desde 0 y he podido seguir gracias a lo que vosotros me habeis explicado... no tenía ni idea de lo de cambiar de banco 0,1,2,, etc y eso ahora ya lo tengo claro. Si por ejemplo nadie me hubiera hechado un cable, estaría perdido...  :D Tampoco es cuestión de leerme un manual entero, siempre se entienden mejor las cosas cuando te las explica un amigo.

Ahora sí que me voy a la cama :mrgreen:
Título: Re: Ayuda inicio
Publicado por: pibe en 17 de Junio de 2006, 07:01:44
Holas:

El programa lo he grabado en un 877 y funciona perfectamente.
Te comento que tuve el mismo problema que me dices: cuenta sin parar , y eso se debe a que el puerto E no está con su resistencia a masa.
En resumen: Ponle una resistencia al del pin E0 de entrada a masa de 10k y el pulsador entre este pin y positivo. Entonces ese pin siempre será 0 volts y cuando pulses le entrará los +5v .

La instrucción goto $-1 le dice al micro que vaya una instrucción atrás. Si le pones goto $-2 irá 2 renglones atrás. Si pones goto $+2 irá dos renglones por delante. Es mas facil que ir poniendo etiquetas y llamándolas con el goto , no?

Título: Re: Ayuda inicio
Publicado por: picto en 17 de Junio de 2006, 09:01:44
Holas:

El programa lo he grabado en un 877 y funciona perfectamente.
Te comento que tuve el mismo problema que me dices: cuenta sin parar , y eso se debe a que el puerto E no está con su resistencia a masa.
En resumen: Ponle una resistencia al del pin E0 de entrada a masa de 10k y el pulsador entre este pin y positivo. Entonces ese pin siempre será 0 volts y cuando pulses le entrará los +5v .

La instrucción goto $-1 le dice al micro que vaya una instrucción atrás. Si le pones goto $-2 irá 2 renglones atrás. Si pones goto $+2 irá dos renglones por delante. Es mas facil que ir poniendo etiquetas y llamándolas con el goto , no?



Pibe, gracias por la ayuda enserio.

Te cuento, el interruptor que tengo puesto en RE0 lo tengo puesto con resistencias y condensador. Durante el fin de semana no puedo probar el circuito, pero sí simularlo en proteus.

Hice un antirrebotes con condensador y rsistencia, pero aparte ccomo bien decis creo que tambien hay que hacer una demora en assembler...

Probé tu programa en el circuito y funcionaba correctamente, lo únicoque como biend ecías tendría que aumentar un poco el tiempo de demora, poque el puslador según le dabas de rápido contaba de dos en dos  :D

Pensaba que con solo el antirrebotes con condensador ya estaba, pero veo que hay que poner una demora aparte.


Título: Re: Ayuda inicio
Publicado por: pibe en 17 de Junio de 2006, 09:36:09
Pero hazme caso tal y como te dije que lo conectaras: PIN E0 con resistencia a masa de 10k y pulsador entre el mismo pin y +. Ni condensador ni leches  :mrgreen:
Título: Re: Ayuda inicio
Publicado por: picto en 17 de Junio de 2006, 10:03:40
Pero hazme caso tal y como te dije que lo conectaras: PIN E0 con resistencia a masa de 10k y pulsador entre el mismo pin y +. Ni condensador ni leches  :mrgreen:

Sí sí, si lo tenía desde un principio así  :-/ Tanto en Proteus como en el circuito montado en placa.

Tengo ganas de que sea lunes y puedo ponerme manos a la obra de nuevo  :lol:
Título: Re: Ayuda inicio
Publicado por: picto en 19 de Junio de 2006, 03:30:03
Buenos días gente!

Bueno, me voyt a poner manos a la obra... voy a cojer el prgrama de pibe y voy a estudiarlo para entenderlo. Colgaré las dudas que tenga... y a ver si luego lo puedo hacer yo solo.

Por cierto pibe el programa funciona ok? Lo único que cambiaré el tiempo porque a 80ms tienes quie pulsar muy rápido sinó se encienden 2 led's de golpe.

Lo siguiente es lo que n otengo claro del todo: El comentario lo he escrito que es lo que yo creo que es:

temp_1 equ 20h   ;definimos variable temp_1 para la demora / Porque le ponemos 20h?
temp_2 equ 21h   ;definimos variable temp_2 para la demora / porque le ponemos 21h?

Que es la posición de memoría donde guardaremos el valor de temp_1 y 2? Y porque se pone 20 y 21?


movlw   0x06 ; Ponemos a 06 W / proque 06?             
movwf   ADCON1   ; Esto recuerdo que era para poner las salidas en digital? Todas?
clrf   TRISA   ;indicamos puerto A salidas / Correcto?
clrf   TRISB   ;indicamos puerto B salidas / "
clrf   TRISC   ;indicamos puerto C salidas / "
clrf   TRISD   ;indicamos puerto D salidas / "               
MOVLW b'11101111'   ;ojo que TRISE tambien actua sobre puerto D / porque aveces se pone b'00000000' y otras pones 06 por ejemplo?
movwf    TRISE       ;es analógico / le indicas que seá analógico? Porque?
-----------------------------------------
;Demora 80ms a 4mhz
demora80ms   movlw   0xFF
            movwf   temp_1
            movlw   .105 ; que funcion tiene .105? es decir siempre veo algo como movlw 0xff, porque aquí es .105?
            movwf   temp_2
            decfsz   temp_1,f
            goto   $-1
            clrwdt
            decfsz   temp_2,f
            goto   $-4
            return   
end

Pibe, perdona las moelstías y gracias.
Esto vícia...

Título: Re: Ayuda inicio
Publicado por: picto en 19 de Junio de 2006, 03:42:43
Otra dudilla... porque ponemos clrwdt? Clear watchdog timer?

Y si poniendo .105 són 80ms? Si quiero poner por ejemplo 1 segundo?

He cambiado el valor de 105 por 180 y el programa yá vá perfecto, es decir, cada pulsación activa 1 led.

Es dificil la fórmula del tiempo?

Saludos
Título: Re: Ayuda inicio
Publicado por: picto en 19 de Junio de 2006, 04:03:55
LIST p=16f877a      ;indicamos procesador que utilizamos
   
#include <p16f877a.inc>   ;processor specific definitions
__config  _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_OFF

   ERRORLEVEL -302      ;elimina mensaje de warning "not in bank 0"
      ERRORLEVEL -203      ;elimina mensaje de warning
      ERRORLEVEL -305      ;elimina mensaje de warning
      ERRORLEVEL -205      ;elimina mensaje de warning

temp_1 equ 20h   ;definimos variable temp_1 para la demora
temp_2 equ 21h   ;definimos variable temp_2 para la demora


;************************ RESET Y VERCTORES INT *******************************
org     00h      ;Vector de reset (aqui viene el micro cuando arranca)
goto    Inicio   ;inmediatamente lo mandamos a Inicio
org     0x05    ;Le indicamos en que posición de memoria comienza lo que sigue


Inicio   ;------------------------ INICIALIZA MICROPOCESADOR ---------------------------
;Inicializa puertos
IniPorts
clrf   PORTA   ;pone a 0 el puerto A   
clrf            PORTB   ;pone a 0 el puerto B
clrf      PORTC   ;pone a 0 el puerto C
clrf            PORTD   ;pone a 0 el puerto D
clrf    PORTE   ;pone a 0 el puerto E
bsf    STATUS,RP0  ;Seleccionamos Bank 1
movlw   0x06    ;???       
movwf   ADCON1   ;???
clrf      TRISA   ;indicamos puerto A salidas
clrf      TRISB   ;indicamos puerto B salidas
clrf    TRISC   ;indicamos puerto C salidas
clrf    TRISD   ;indicamos puerto D salidas               
MOVLW b'11101111'   ;ojo que TRISE tambien actua sobre puerto D y
movwf    TRISE       ;es analógico
bcf    STATUS,RP0  ;Seleccionamos Bank 0

Main
clrf    PORTA        ;inicio puerto A
call    demoraXms ;espera antirrebote para que al pulsar no cuente más de 1 pulsación
btfss    PORTE,0     ;pin 0 a +?
goto   $-1           ;aun no, volvemos a la instrucción anterior
bsf   PORTA,0   ;si, activa led 0

call demoraXms          ;espera X segundos antes de volver a mirar el el RE0   
btfss PORTE,0            ;si RE0 =1 escapa, si es 0 hace el goto, que vuelve subir a la instrucción anterior
goto $-1                  ;sube a la instruccion anterior
bsf PORTA,1               ;como RE0=1 ponemos un 1 RA0

call demoraXms   ;espera X segundos antes de volver a mirar el el RE0
btfss PORTE,0    ;si RE0 =1 escapa, si es 0 hace el goto, que vuelve subir a la instrucción anterior
goto $-1          ;sube a lka instrucción anterior
bsf PORTA,2       ;como RE0=1 ponemos RA1 a 1

call demoraXms  ;espera X segundos antes de volver a mirar el el RE0
btfss PORTE,0    ;miramos estado pin RE0, si es 0 hace la siguiente instrucción, si es 1 se salta el goto
goto $-1          ;ejecuta la instrucción anterior
bsf PORTA,3      ;ponemos un 1 en el pin RA2

call demoraXms  ; espera X segundos antes de volver a mirar el el RE0
btfss PORTE,0   ; miramos estado pin RE0, si es 0 hace la isntrucción siguiente, si es 1 hace goto Main
goto $-1

goto Main       ;vuelve a empezar

;Demora Xms a 4mhz
demoraXms   
movlw   0xFF       ;ponemos FF en W
movwf   temp_1   ;guardamos FF en la variable temp_1
movlw   .180        ;cuanto mayor sea este numero más larga será la demora???
movwf   temp_2    ;ponemos 180 en la variable temp_2
decfsz  temp_1,f   ;decrementamos temp_1 salta si es 0???
goto   $-1     ;ejecutamos la instrucción anterior
clrwdt                 ;Limpiamos el tiempo del watchdog???
decfsz temp_2,f    ;decrementamos temp_2 salta si es 0???
goto      $-4     ; salta 4 isntrucciones hacia atras, osea salta a decfsz temp_1
return                 ;vuelve a la instrucción donde estaba 
end


Bueno, esto es lo que yo entiendo, hay algunas cosas que me falta confirmar, las que estan en negrita sobretodo.


Título: Re: Ayuda inicio
Publicado por: picto en 19 de Junio de 2006, 05:01:33
call demoraXms  ; espera X segundos antes de volver a mirar el el RE0
btfss PORTE,0   ; miramos estado pin RE0, si es 0 hace la instrucción siguiente, si es 1 salta el goto
goto $-1         ; ejecuta 1 instrucción más atrás
bsf PORTB,7      ; ponemos un 1 en el pin RB7

Simulando con el proteus no consigo encender el pin RB7, está mal el código? Hay algo que se me escapa?
Título: Re: Ayuda inicio
Publicado por: pibe en 19 de Junio de 2006, 06:54:01
Y que te toma el proteus como RE0?
Como sabe si es 0 o 1? le pones un pulsador?

Grábalo directamente al micro y me comentas
Título: Re: Ayuda inicio
Publicado por: picto en 19 de Junio de 2006, 07:01:09
Ya he solucionado el problema, me faltaba un par de instrucciones del tipo call demora.

Por cierto he puesto :

;Demora Xms a 4mhz
demoraXms   
movlw   0xFF   ;ponemos FF en W
movwf   temp_1   ;guardamos FF en la variable temp_1
movlw   .250   ;cuanto mayor sea este numero más larga será la demora???movwf   temp_2   ;ponemos 180 en la variable temp_2
decfsz  temp_1,f          ;decrementamos temp_1 salta si es 0???
goto $-1                   ;ejecutamos la instrucción anterior
clrwdt      ;Limpiamos el tiempo del watchdog???
decfsz temp_2,f           ;decrementamos temp_2 salta si es 0???
goto   $-4                   ; salta 4 isntrucciones hacia atras, osea salta a decfsz temp_1
return          ;vuelve a la instrucción donde estaba 
end

He puesto en vez de .105 .250 para que el tiempo sea mayor, pero al poner .300 me daba error el Mplab, no sé porque.

Ahora mismo ya me enciende todos las salidas que quiero  :-/


Pibe, que tiempo realmente le estoy metiendo al poner .250? es dificil calcular?

Saludos
Título: Re: Ayuda inicio
Publicado por: jfh900 en 19 de Junio de 2006, 07:30:24
El acumulador es de 8 bits, 1 byte y por consiguiente solo se puede cargar hasta 255 => 0xFF. Al poner 300 te tiene que dar error. Aunque me da la ºimpresión que estas utilizando mal la función demoraXms, ya que los valores de retardo se deberian poner en temp_1 y temp_2, para especificar la demora.

Un saludo.

Título: Re: Ayuda inicio
Publicado por: picto en 19 de Junio de 2006, 07:52:03
Hola jfh900, he puesto .250 y me funciona. A que te refieres con que lo estoy utilizando mal? Acabo de empezar con esto del assembler y me estan ayudando todos, te agradecería me explicaras que estoy haciendo mal para solucionarlo.
Gracias
Título: Re: Ayuda inicio
Publicado por: pibe en 19 de Junio de 2006, 08:45:40
Sigue la rutina paso por paso:

No son mas que dos contadores hacia atrás, uno dentro del otro.
El interno cuenta hasta 255 (FF) y el externo repite el interno tantas veces como le pongas; en este caso 250.

En síntesis: cuentas 255 microsegundos (aproximadamente) con el contador interno ya que a 4mhz es una instrucción por microsegundos. Y luego cuentas 250 veces 255 microsegundos = 63750 microsegundos = 63 milisegundos, pero falta contar los saltos que haces entre instrucciones que terdan 2 ciclos= 2 microsegundos.

La mejor manera es simulándolo con el mplab y corriendo la subrutina de principio a fin con la configuración correspondiente a 4mhz
Título: Re: Ayuda inicio
Publicado por: picto en 19 de Junio de 2006, 09:21:15
Ok, pibe  :-)

Gracias

El proyecto vá avanzando :-/
Título: Re: Ayuda inicio
Publicado por: picto en 20 de Junio de 2006, 04:19:46
Bueno, esto vá cogiendo forma.  :D

Lo siguiente qyue tengo en mente es utilizar 6 salidas más, que serían:
RC4, RC5, RC6,RC7,RE1 y RE2.

Como sabeis el programa toma como entrada RE0, mi pregunta es... se puede hacer que RE0 sea solo entrada y RE1 y RE2 sean salidas? Como lo hago?

Entonces me sobran 8 salidas osea todo el puerto D que estoy pensando colocarme un LCD para que muestre mensajes, lo veis muy complicado para mi nivel?

Gracias
Título: Re: Ayuda inicio
Publicado por: picto en 20 de Junio de 2006, 04:45:50
El LCD en cuestión que quiero manejar es de 16x2 y su pin out es el siguiente:

(http://img208.imageshack.us/img208/856/lcd0uo.jpg) (http://imageshack.us)

Se puede controlar dicho display? O hay algo a tener en cuenta?

Título: Re: Ayuda inicio
Publicado por: picto en 20 de Junio de 2006, 05:44:18
Bueno, esto vá cogiendo forma.  :D

Lo siguiente qyue tengo en mente es utilizar 6 salidas más, que serían:
RC4, RC5, RC6,RC7,RE1 y RE2.

Como sabeis el programa toma como entrada RE0, mi pregunta es... se puede hacer que RE0 sea solo entrada y RE1 y RE2 sean salidas? Como lo hago?

Entonces me sobran 8 salidas osea todo el puerto D que estoy pensando colocarme un LCD para que muestre mensajes, lo veis muy complicado para mi nivel?

Gracias

Me cito yo mismo... mirando el datasheet creo que en vez de poner:

 MOVLW b'11101111'  si cambio los 3 ultimos bits tal que así MOVLW b'11101001' le estoy diciendo que RE1 y RE2 sean salidas porque los he puesto a 0 ok? Todo esto deducción...

Pero siempre es 0= salida 1= entrada?

Porcierto al usar
MOVLW b'11101001'
movwf    TRISE

Con los 3 ultimos bits 001 le estoy diciendo RE0 entrada, RE1 salida y RE2 salida... pero con los otros bits que le estoy diciendo?

Gracias
Título: Re: Ayuda inicio
Publicado por: picto en 20 de Junio de 2006, 05:48:45
Pudiera ser que al poner 11101001 le esté diciendo aparte de RE0 entrada, RE1 salida Re2 salida, que:

0 en el bit4= PSPmode functions in general purpose I/O mode ?

Y porque en el bit 3 hay un 1?

Gracias
Título: Re: Ayuda inicio
Publicado por: pibe en 20 de Junio de 2006, 10:40:50
Pudiera ser que al poner 11101001 le esté diciendo aparte de RE0 entrada, RE1 salida Re2 salida, que:

0 en el bit4= PSPmode functions in general purpose I/O mode ?

Y porque en el bit 3 hay un 1?

Gracias

Lo del bit 4 del PORTE ya te lo he explicado antes.
Es correcta tu deducción: 1 entrada, 0 salida. En todos los puertos es igual. La única excepción es el puerto E, que al solo tener 4 pines solo utiliza los 4 primeros bits para setear entrada o salida con TRISE.

Puedes conectar un lcd de 2 maneras: usando 4 u 8 pines.
 Mira la página www.todopic.com.ar, pincha en el boton asembler y busca LCD en el directorio. Creo que hay un programa para usar el LCD.

Picto: Todo esto está en la hoja de datos, pero asumo que no entiendes ni papa de inglés, o si? De todas maneras y aunque no entiendas , echale una ojeada y veras que hace cada bit del TRISE.



Título: Re: Ayuda inicio
Publicado por: LabPIC en 20 de Junio de 2006, 11:49:08
picto en realidad los ultimos 5 bits no importan el estado en que se encuentren pq el Puerto E unicamente cuenta con 3 pines.

Saludos LabPIC :mrgreen:
Título: Re: Ayuda inicio
Publicado por: maunix en 20 de Junio de 2006, 14:58:30
picto en realidad los ultimos 4 bits no importan el estado en que se encuentren pq como ya ha mencionado pibe el Puerto E unicamente cuenta con 4 pines.

Saludos LabPIC :mrgreen:

pibe y LabPIC el puerto E en el 16F877A tiene 3 pines ( no 4).  ;) ;)

Saludos

Título: Re: Ayuda inicio
Publicado por: pibe en 20 de Junio de 2006, 15:39:41
whatever  :-/

Título: Re: Ayuda inicio
Publicado por: picto en 21 de Junio de 2006, 03:17:17
Pudiera ser que al poner 11101001 le esté diciendo aparte de RE0 entrada, RE1 salida Re2 salida, que:

0 en el bit4= PSPmode functions in general purpose I/O mode ?

Y porque en el bit 3 hay un 1?

Gracias

Lo del bit 4 del PORTE ya te lo he explicado antes.
Es correcta tu deducción: 1 entrada, 0 salida. En todos los puertos es igual. La única excepción es el puerto E, que al solo tener 4 pines solo utiliza los 4 primeros bits para setear entrada o salida con TRISE.

Puedes conectar un lcd de 2 maneras: usando 4 u 8 pines.
 Mira la página www.todopic.com.ar, pincha en el boton asembler y busca LCD en el directorio. Creo que hay un programa para usar el LCD.

Picto: Todo esto está en la hoja de datos, pero asumo que no entiendes ni papa de inglés, o si? De todas maneras y aunque no entiendas , echale una ojeada y veras que hace cada bit del TRISE.





Ok, en el pic ya solo me quedan 8 salidas, voy a ver que puedo hacer.

Por cierto pibe MOVLW b'11101111'   ;ojo que TRISE tambien actua sobre puerto D , porque actua sobre el puerto D?


De ingles se algo... pero se mezcla que el datasheet es amplio, y no controlo mucho el assembler  :lol:

Gracias
Título: Re: Ayuda inicio
Publicado por: maunix en 21 de Junio de 2006, 08:43:31
Por cierto pibe MOVLW b'11101111'   ;ojo que TRISE tambien actua sobre puerto D , porque actua sobre el puerto D?
De ingles se algo... pero se mezcla que el datasheet es amplio, y no controlo mucho el assembler  :lol:

Si te fijas en el datasheet, el TRISE en sus bits 4 al 7 se usa para configurar y controlar el Parallel Slave Port que es un módulo que usa todo el puerto D (para los datos) y el puerto E (para la señalización).

Saludos



Título: Re: Ayuda inicio
Publicado por: picto en 21 de Junio de 2006, 09:01:37
Por cierto pibe MOVLW b'11101111'   ;ojo que TRISE tambien actua sobre puerto D , porque actua sobre el puerto D?
De ingles se algo... pero se mezcla que el datasheet es amplio, y no controlo mucho el assembler  :lol:

Si te fijas en el datasheet, el TRISE en sus bits 4 al 7 se usa para configurar y controlar el Parallel Slave Port que es un módulo que usa todo el puerto D (para los datos) y el puerto E (para la señalización).

Saludos

Ah ok ok.

Ahora estoy intentando conectar un display que me muestre unos mensajes con los 8 bits del puerto D que me sobran del Pic16f877, pero es más complejo de lo que pensaba...



Título: Re: Ayuda inicio
Publicado por: LabPIC en 21 de Junio de 2006, 13:16:38
picto si quieres visita este link y luego cuentas tus comentarioa o dudas. Alli se explican las conexciones de los modulos LCD a un PIC. Espero y te sea de ayuda.

http://www.x-robotics.com/rutinas.htm#LCD (http://www.x-robotics.com/rutinas.htm#LCD)

Saludos LabPIC
Título: Re: Ayuda inicio
Publicado por: picto en 23 de Junio de 2006, 09:51:50
Gracias Labpic, muy buena página!
Título: Re: Ayuda inicio
Publicado por: LabPIC en 23 de Junio de 2006, 12:27:37
De nada picto :mrgreen:, espero y te sirva un poquito de ayuda.

Saludos LabPIC

Título: Re: Ayuda inicio
Publicado por: tapi8 en 06 de Julio de 2006, 14:08:27
hola yo tambien soy un novato pero creo que deberias usar el hexadecimal en vez del binario para configurar los puertos en binario es muy facil equivocarse.leo en una de estas respuestas que la memoria flash esta dividida en bancos ogual que la RAM ¿estais seguros de eso? yo creo que no
Título: Re: Ayuda inicio
Publicado por: jfh900 en 06 de Julio de 2006, 15:35:25
tapi8 me puedes explicar por que es mas facil equivocarse en binario que en hexadecimal?. Un ejemplo:

Palabra de configuración del puerto en binario: 0b1101 0110 => EESE SEES <= Entradas y salidas con:
 0 = Salida y 1 = Entrada

Hexadecimal: 0xD6 ¿Esto que son entradas o salidas?

Un saludo.
Título: Re: Ayuda inicio
Publicado por: BrunoF en 06 de Julio de 2006, 17:19:22
jaja creo que es una cuestion de comodidad personal el sistema a utilizar. Personalmente, te puedo asegurar que lo mas facil es usar binario.Saludos.
Título: Re: Ayuda inicio
Publicado por: maunix en 06 de Julio de 2006, 17:31:34
tapi8 me puedes explicar por que es mas facil equivocarse en binario que en hexadecimal?. Un ejemplo:

Palabra de configuración del puerto en binario: 0b1101 0110 => EESE SEES <= Entradas y salidas con:
 0 = Salida y 1 = Entrada

Coincido con que para definir puertos no hay como la notación binaria.


Solo quisiera agregar una cosita que parece tonta pero nuestros amigos que diseñan estas cosas parece que están como muy atento a los detalles

tapi8, fijate esto

Un 1 se puede leer fácilmente como una I  de Input
Un 0 se puede leer fácilmente como una O de Output

Es muuuuuuy fácil de esa forma acordarnos como setear los bits en el registro TRISx de cada puerto.

                          7  6  5  4  3  2  1  0     <Nro bit>
Donde --> 0b1101 0110   = I  I  O  I  O  I  I  O


Saludos!

PD: tal vez alguno no lo sabía y bueno, siempre es lindo saber estas cosillas. :)


Título: Re: Ayuda inicio
Publicado por: tapi8 en 08 de Julio de 2006, 09:07:29
yo soy novato en esto asi que no me hagais mucho caso(mejor ninguno),pero en casi todos los sitios que hago consultas lo recomiendan asi porque en hex. solo se ponem dos digitos y en b. 8.enlos ejemplos en C que hay por este foro tambien usan siempre hex.
Título: Re: Ayuda inicio
Publicado por: jfh900 en 08 de Julio de 2006, 12:03:52
No te hagas caso maunix lo ha explicado impecablemente. Si tuvieras que escribir miles de líneas de código en binario, se entenderia, si no la mejor forma de definir puertos de entrada, salida o registros en general, es en binario.

Un saludo.
Título: Re: Necesito Mucha ayuda estoy desesperado
Publicado por: juanivan_fime en 20 de Agosto de 2006, 23:22:42


ESTOY USANDO EL PIC 16F874A
PERO TENGO EL PROBLEMA DE QUE AL QUERER CORRER UNA SUBRUTINA EL PROGRAMA NO LA LLAMA
LA SUBRUTINA QUE LES COMENTO SE TRATA DE UN TIEMPO DE ESPERA
NO SE SI TENGA QUE CONFIGURAR UN REGISTRO ANTES.
LES AGRADECERIA MUCHA SU AYUDA 
Título: Re: Ayuda inicio
Publicado por: vszener en 21 de Agosto de 2006, 09:46:16
Sube el codigo...


Suerte!!! :wink:
Título: Re: Ayuda inicio
Publicado por: Fer_TACA en 22 de Agosto de 2006, 13:09:57
Hola amigo:
Como dice el compañero si no nos dices como está desarrolado el código dificilmente podremos ayudarte.
Un saludo