Autor Tema: Ayuda inicio  (Leído 32958 veces)

0 Usuarios y 8 Visitantes están viendo este tema.

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Ayuda inicio
« 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

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Ayuda inicio
« Respuesta #1 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
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #2 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
   






Desconectado LabPIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 143
Re: Ayuda inicio
« Respuesta #3 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
¡¡¡Viva México cabrones!!!

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #4 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...


Desconectado PAOLA09

  • Moderador Local
  • PIC18
  • *****
  • Mensajes: 332
Re: Ayuda inicio
« Respuesta #5 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  :)


Desconectado LabPIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 143
Re: Ayuda inicio
« Respuesta #6 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

¡¡¡Viva México cabrones!!!

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #7 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...

Desconectado LabPIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 143
Re: Ayuda inicio
« Respuesta #8 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
« Última modificación: 12 de Junio de 2006, 12:59:04 por LabPIC »
¡¡¡Viva México cabrones!!!

Desconectado PAOLA09

  • Moderador Local
  • PIC18
  • *****
  • Mensajes: 332
Re: Ayuda inicio
« Respuesta #9 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:

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #10 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.


Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda inicio
« Respuesta #11 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: Ayuda inicio
« Respuesta #12 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)
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Ayuda inicio
« Respuesta #13 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?

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda inicio
« Respuesta #14 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.


 

anything