Lenguaje ensamblador para PIC desde 0

Y cuantos led tienes que prender???. Si vas a usar una secuencia es mejor realizar con la rotacion por el carry (rlcf)
 
Última edición:
mira tengo 5 pulsadores cada 1 activa una secuencia de 8 led (rb0-rb7)
ra0 no hace nada
ra1 activa la secuencia 10000000 ese valor tiene que pasar de forma secuencia por las otras salidas (rb0-rb7)
ra2 con la secuencia 11001100 y hace lo mismo incrementa el valor de la misma forma
y asi con cada secuencia activada por cada pulsador.
aaaaaa.al presionar 2 pulsadores no ocurre nada xd avance esto
List P=16F84A
Include <P16F84A.INC>
inicio
bsf STATUS,RP0
clrf TRISB
movlw b'11111111'
movwf TRISA
bcf STATUS,RP0

Principal

btfsc PORTA,0
call uno
btfsc PORTA,1
call dos
btfsc PORTA,2
call tres
btfsc PORTA,3
call cuatro
btfsc PORTA,4
call encender_5
call resetear

uno
btfsc PORTA,1
call resetear
btfsc PORTA,2
call resetear
btfsc PORTA,3
call resetear
btfsc PORTA,4
call resetear
call encender_1

dos

btfsc PORTA,2
call resetear
btfsc PORTA,3
call resetear
btfsc PORTA,4
call resetear
call encender_2
tres

btfsc PORTA,3
call resetear
btfsc PORTA,4
call resetear
call encender_3
cuatro

btfsc PORTA,4
call resetear
call encender_4

con esto activo cada entrada sin dejar funcionar las demas falta el programa con las salidas incrementadas ayuda no entiendoel comando xd
 
mira tengo 5 pulsadores cada 1 activa una secuencia de 8 led (rb0-rb7)
ra0 no hace nada
ra1 activa la secuencia 10000000 ese valor tiene que pasar de forma secuencia por las otras salidas (rb0-rb7)
ra2 con la secuencia 11001100 y hace lo mismo incrementa el valor de la misma forma
y asi con cada secuencia activada por cada pulsador.
aaaaaa.al presionar 2 pulsadores no ocurre nada xd avance esto
List P=16F84A
Include <P16F84A.INC>
inicio
bsf STATUS,RP0
clrf TRISB
movlw b'11111111'
movwf TRISA
bcf STATUS,RP0

Principal

btfsc PORTA,0
call uno
btfsc PORTA,1
call dos
btfsc PORTA,2
call tres
btfsc PORTA,3
call cuatro
btfsc PORTA,4
call encender_5
call resetear

uno
btfsc PORTA,1
call resetear
btfsc PORTA,2
call resetear
btfsc PORTA,3
call resetear
btfsc PORTA,4
call resetear
call encender_1

dos

btfsc PORTA,2
call resetear
btfsc PORTA,3
call resetear
btfsc PORTA,4
call resetear
call encender_2
tres

btfsc PORTA,3
call resetear
btfsc PORTA,4
call resetear
call encender_3
cuatro

btfsc PORTA,4
call resetear
call encender_4

con esto activo cada entrada sin dejar funcionar las demas falta el programa con las salidas incrementadas ayuda no entiendoel comando xd
Hola, no entendi que quieres hacer con el programa, pero si vas a usar el puerto A tienes que configurarlo digital antes de usarlo, ya que ese puerto se puede usar como analogico o digital. Y lo otro es, que hace resetear? y donde esta esa etiqueta?
 
Hola, soy nuevo en este fantastico foro, por el que os tengo que felicitar a todos los que lo haceis posible. Descubri por casualidad el mundillo de los PICs y me fascino, estoy intentando aprender por mi cuenta pero me esta costando un triunfo, y escribo este mensaje para ver si alguien me puede ayudar.

Para ir poco a poco me he propuesto realizar un programilla sencillo (y aun asi no consigo que funcione), se trata de un 16F874A con tres pulsadores conectados en el puerto A (RA0, RA1 y RA3) y dos leds conectados en el puerto B (RB0 y RB1) y consiste en que al pulsar P1 encienda L1, si pulso P2 encienda L2 y si pulso P3 encienda ambos L1 y L2. EEl codigo es el siguiente, pero no me enciende ningun led, lo he cambiado y recambiado pero no consigo encender ningun led. ¿Que es lo que estoy haciendomal?

LIST P = 16F874A

PORTA EQU 0X05
PORTB EQU 0X06
ESTADO EQU 0X03
W EQU 0

ORG 0

bsf ESTADO,05 ;pongo a 1 el bit 5 de estado (RP0)
bcf ESTADO,06 ;y a 0 RP1 para direccionar al banco 1
movlw 0xff ;meto en W la congiguracion de los pines
movwf PORTA ;los establezco en el puerto a como entrada los tres primeros
movlw 0x00 ;meto la configuracion para el puerto b en W
movwf PORTB ;pongo todsa como salidas
bcf ESTADO,05 ;vuelvo a poner a 0 RP0 (ahora apunta al banco 0 de la memoria)

inicio btfsc PORTA, 0 ;chequea el bit 0 de PORTA, si es 0 salta una instruccion
movf PORTB, 0x01 ;mete un 1 en el pin 0 del puerto b (enciende el led)
btfsc PORTA, 1 ;chequeo el bit 1 de la puerta A
movf PORTB, 0x02 ;si esta pulsado P2 enciende L2
btfsc PORTA, 2 ;chequeo P3
movf PORTB, 0x03 ;si esta pulsado P3 endiende ambos leds
goto inicio ;bucle infinito
end
 
Última edición:
Hola, soy nuevo en este fantastico foro, por el que os tengo que felicitar a todos los que lo haceis posible. Descubri por casualidad el mundillo de los PICs y me fascino, estoy intentando aprender por mi cuenta pero me esta costando un triunfo, y escribo este mensaje para ver si alguien me puede ayudar.

Para ir poco a poco me he propuesto realizar un programilla sencillo (y aun asi no consigo que funcione), se trata de un 16F874A con tres pulsadores conectados en el puerto A (RA0, RA1 y RA3) y dos leds conectados en el puerto B (RB0 y RB1) y consiste en que al pulsar P1 encienda L1, si pulso P2 encienda L2 y si pulso P3 encienda ambos L1 y L2. EEl codigo es el siguiente, pero no me enciende ningun led, lo he cambiado y recambiado pero no consigo encender ningun led. ¿Que es lo que estoy haciendomal?

LIST P = 16F874A

PORTA EQU 0X05
PORTB EQU 0X06
ESTADO EQU 0X03
W EQU 0

ORG 0

bsf ESTADO,05 ;pongo a 1 el bit 5 de estado (RP0)
bcf ESTADO,06 ;y a 0 RP1 para direccionar al banco 1
movlw 0xff ;meto en W la congiguracion de los pines
movwf PORTA ;los establezco en el puerto a como entrada los tres primeros
movlw 0x00 ;meto la configuracion para el puerto b en W
movwf PORTB ;pongo todsa como salidas
bcf ESTADO,05 ;vuelvo a poner a 0 RP0 (ahora apunta al banco 0 de la memoria)

inicio btfsc PORTA, 0 ;chequea el bit 0 de PORTA, si es 0 salta una instruccion
movf PORTB, 0x01 ;mete un 1 en el pin 0 del puerto b (enciende el led)
btfsc PORTA, 1 ;chequeo el bit 1 de la puerta A
movf PORTB, 0x02 ;si esta pulsado P2 enciende L2
btfsc PORTA, 2 ;chequeo P3
movf PORTB, 0x03 ;si esta pulsado P3 endiende ambos leds
goto inicio ;bucle infinito
end
Bienvenido:
Te equivocas a usar la instrucción movf; lo que hace es mover o copiar el contenido del registro a dos posibles lugares que son 'W' (al acumulador o registro de trabajo) o al mismo registro. MOVF solo permite el valor '0' y '1' que son 'W' y el mismo registro respectivamente; al poner otros valores mayores de '1', compila bien pero al ser mayor lo considera como '1'.

Para escribir en los registros usa:
Código:
movlw   0x03
movwf   PORTB
...
...
bsf       PORTB,0
...
bcf       PORTB,0
Luego, los registros donde se establece entradas/salidas de un puerto son en los TRISx (TRISA, TRISB, etc.) que se encuentran en el Banco 1 que empieza en la dirección 0x80. Entonces:

-Para establecer I/O de pines en este PIC usa.
TRISA equ 0x85
TRISB equ 0x86
- Para leer o escribir en los puertos del PIC usa.
PORTA equ 0x05
PORTB equ 0x06

PD: Para que no estés declarando cada registro, usa la directiva #INCLUDE <P16F874A.INC> debajo de LIST.

saludos.
 
Gracias x contestar ByAxel, creo que me estoy liando yo solo con el chequeo de los pines de PORTA y con la escritura de los de PORTB. He realizado las siguientes modificaciones, me lo podrias corregir como al ignorante que soy?

LIST P = 16F874A

#INCLUDE <P16F874A.INC>

TRISA EQU 0x85
TRISB EQU 0x86
PORTA EQU 0X05
PORTB EQU 0X06
ESTADO EQU 0X03
W EQU 0

ORG 0

bsf ESTADO,05 ;pongo a 1 el bit 5 de estado (RP0)
bcf ESTADO,06 ;y a 0 RP1 para direccionar al banco 1
movlw 0xff ;meto en W la congiguracion de los pines
movwf TRISA ;los establezco en el puerto a como entrada los tres primeros
movlw 0x00 ;meto la configuracion para el puerto b en W
movwf TRISB ;pongo todsa como salidas
bcf ESTADO,05 ;vuelvo a poner a 0 RP0 (ahora apunta al banco 0 de la memoria)

inicio movlw 0x01
btfsc PORTA,00 ;chequea el bit 0 de PORTA, si es 0 salta una instruccion
movwf PORTB
movlw 0x02 ;mete un 1 en el pin 0 del puerto b (enciende el led)
btfsc PORTA,01 ;chequeo el bit 1 de la puerta A
movwf PORTB ;si esta pulsado P2 enciende L2
movlw 0x03
btfsc PORTA,02 ;chequeo P3
movwf PORTB ;si esta pulsado P3 endiende ambos leds
goto inicio ;bucle infinito
end
 
HOLA A TODOS..no era este el lugar pero nose como abrir un tema tengo un problema quiero hacer un control de temp con un lm 35 le pongo un amplificador y a los 50 grados me entrega 3 volt eso lo meto a la entrada A0 del conversor del PIC 16f88 pero nunca lo encuentra a ese valor osea queria prender un led para probar cuando llege a ese valor mi duda es si estoy configurando mal el pic o que este es el codigo:

int16 a;
int16 b;

void main()
{
b=0x0265;
setup_adc_ports(sAN0|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_a(1);
set_tris_b(0);
set_adc_channel(0);
a=read_adc();
output_b(0);
if(a>=b){
while(true){
output_b(1);
delay_ms(2000);
}

}
Soy principiante en esto ... uso PICC eso me olvide de decir por favor necesito ayuda gracias a todos ..y perdon si me fui de tema lei lo de ASM y esta muy interesante..
 
En caso de usar el #INCLUDE <P16F874A.INC>, ya no necesitas declarar los registros (PORTx, TRISx, etc...) ya que todos se encuentran en el archivo P16F874A.INC, si quieres revisarlo por lo general se encuentra en la carpeta de microchip "C:\Program Files\Microchip\MPASM Suite" incluidos los Fuses que son importantes y que no los veo en tu ejemplo.

Código:
        LIST P = 16F874A

#INCLUDE <P16F874A.INC>
        __CONFIG _CP_OFF & _DEBUG_OFF & _WDT_OFF & _LVP_OFF & _XT_OSC 
                        ; Config es para configurar los fuses y el resto lo encuentras al último del archivo
                        ; P16F874A.INC. Para saber que son debes de revisar el Datasheet del PIC en
                        ; "CONFIGURATION WORD" donde explica que hace cada uno.
Ya no es necesario que declares ESTADO EQU 0X03, puedes o no usarlo ya que dentro del archivo P16F874A.INC, se le conoce como STATUS y de esa forma lo encontraras en todo sitio al igual que W EQU 0 que también está declarado en el archivo.

Todo eso no genera código, es para uso exclusivo del compilador... ahora todo lo considerado como instrucción que escribas entre ORG 0x00 y END, eso si genera código.

El resto esta bien, solo una duda... una vez enciendas uno o todos los LEDs ¿Como los apagas? ya que aria falta un grupo de código que mantenga apagados los LEDs mientras las entradas sean cero (0) :unsure:

saludos.
 
Última edición:
No fastidies que va a ser ese el problema!!!!!!! me faltan las instrucciones para que se apaguen? A ver la idea es un circuitillo con tres pulsadores en PORTA y dos leds en PORTB, los leds quiero que esten siempre apagadoe excepto kuando accione los pulsadores (L1 enciende cuando pulso P1, L2 cuando pulso P2 y ambos leds cuando pulso P3) igual es una idea feliz mia, pero he dado x sentado que si los pulsadores estan abiertos los leds estaran apagados, el pic no funciona igual que si haria el montaje analogico?, es decir estimulando los pulsadores en PORTA no meto y quito corriente en los pines de PORTB? Menudo cacao tengo montao!!!!!!!
 
Eso de...
quiero que esten siempre apagadoe excepto kuando accione los pulsadores
es lo que hace falta...
Los pulsadores en PORTA deben de tener una resistencia conectado a GND (Pull-down), así el PIC leerá cero (0) y los pulsadores conectados a +V, cuando pulses, el PIC leerá uno (1)... lo que hace falta es el código que apague el/los LEDs cuando el pulsador respectivo se encuentre abierto...

Algo así para solo una entrada...
Código:
Loop:
  btfsc   PORTA,0
  bsf     PORTB,0
  btfss   PORTA,0
  bcf     PORTB,0
  goto    Loop
Se me olvidaba... ese PIC tiene un ADC (convierte de análogo a digital) ubicado en el PORTA, pero debes de desactivar ese módulo ya que el PORTA los usas como entrada digital, para eso pones en el banco 1:

movlw 0x07 ; PORTA como I/O digitales.
movwf ADCON1

saludos
 
Última edición:
Joer ByAxel, no sabes lo ke te agradezco la ayuda, eres la primera persona ke enkuentro dispuesta a enseñarme. He cambiao lo ke me has komentao y ke no hay manera, en la simulacion no vario los pines de PORTB, las resistencias ya las tenia puestas lo ke pasa ke en la linea power, las he cambiao pero nada. No sera ke tengo algo mal en la simulacion??? me extraña x ke es un circuito muy simple pero visto lo visto no descarto nada. Igual me he puesto un ejercicio demasiado komplejo para no tener ni idea :). Ahora mismo lo tengo asi:

LIST P = 16F874A

#INCLUDE <P16F874A.INC>

ORG 0

bsf ESTADO,05 ;pongo a 1 el bit 5 de estado (RP0)
bcf ESTADO,06 ;y a 0 RP1 para direccionar al banco 1
movlw 0xff ;meto en W la congiguracion de los pines
movwf TRISA ;los establezco en el puerto a como entrada los tres primeros
movlw 0x00 ;meto la configuracion para el puerto b en W
movwf TRISB ;pongo todsa como salidas
bcf ESTADO,05 ;vuelvo a poner a 0 RP0 (ahora apunta al banco 0 de la memoria)
movlw 0x07 ; PORTA como I/O digitales.
movwf ADCON1

inicio btfsc PORTA,0 ;chequea el bit 0 de PORTA, si es 0 salta una instruccion
bsf PORTB,0 ;mete un 1 en el pin 0 del puerto b (enciende el led)
btfss PORTA,0
bcf PORTB,0
btfsc PORTA,1 ;chequeo el bit 1 de la puerta A
bsf PORTB,1 ;si esta pulsado P2 enciende L2
btfss PORTA,1
bcf PORTB,1
btfsc PORTA,2 ;chequeo P3
bsf PORTB,2 ;si esta pulsado P3 enciende ambos leds
btfss PORTA,2
bcf PORTB,2
goto inicio ;bucle infinito
end
 
He comentado la mayoría:
Código:
	ORG	0x00
	bsf	 STATUS,5	 	; Banco 1
	bcf	 STATUS,6	 	;  
	movlw 	0x07 			; PORTA como I/O digitales.
	movwf 	ADCON1
	movlw	0xFF	 		; meto en W la congiguracion de los pines
	movwf 	TRISA	 		; >> Con 0xFF estableces todo el puerto como ENTRADAS
	movlw 	0x00	 		; meto la configuracion para el puerto b en W
	movwf 	TRISB	 		; pongo todsa como salidas
	bcf	 STATUS,5	 	; Banco 0

BucleA
	clrf	PORTB			; borra todo el PORTB (mantiene apagados los LEDs)
BucleB	
	btfsc	PORTA,0 		; Chequea RA0, ¿Es cero? => salta una instrucción
	bsf 	PORTB,0	 		; de lo contrario pone a '1' el RB0 (LED1)
	btfss	PORTA,0			; Chequea RA0, ¿Es uno? => salta una instrucción
	bcf	 PORTB,0			; de lo contrario pona '0' el RB0
	btfsc 	PORTA,1	 		; ... RA1?
	bsf 	PORTB,1	 		; pone a '1' el RB1	(LED2)
	btfss 	PORTA,1			; ... RA1?
	bcf 	PORTB,1			; pone a '0' el RB1
	
	btfss	PORTA,2			; Chequea RA2, ¿Es uno? => salta una instrucción
	goto	BucleA			; de lo contrario salta a Bucle externo donde...
	bsf	PORTB,0			; pone a '1' RB0 y RB1 (LED1 y LED2)
	bsf	PORTB,1
	goto	BucleB			; Continua con el bucle interno...
	
	END
Recuerda que si incluyes el archivo P16F874A.INC ya no es necesario declarar ningún registro, es por eso que yo uso STATUS... y el registro ADCON1 está en el banco 1.
El MPLAB revisa sintaxis, mayúsculas, minúsculas, declaraciones, instrucciones y en base a eso genera los mensajes/errores, por lo que no te va a avisar si alguna secuencia la haces mal, aunque todo esté bien escrito y el PIC no funcione, es un indicio que algo se ha configurado mal... (error humano :confused: ).

La parte de encender ambos LEDs lo he resuelto de esa forma, pero hay muchas más... cada programador tiene su estilo... poco a poco usa las 35 instrucciones y veras que haces maravillas :LOL:

saludos.
 
Definitivamente tiene ke ser la simulacion!!!! No hay modificaciones en el PORTB cuando pulso, de hecho no se modifica nada en el watch window y para mayor desesperacion mia veo que el estado de las lineas de los pulsadores si cambian (estan con el cuadradito en rojo y cuando pulso cambia a azul pero no cambia ningun bit de ningun registro). Muchas gracias x animarme pero si me estoy volviendo loko ya kon los pulsadores estos no te digo nada para llegar a realizar el proyecto ke tengo en mente...uffff. En la simulacion tengo: los tres pulsadores a tierra x un extremo y por el otro a +5v con una resistencia de 10k intercaladas a cada uno y estos conectados respectivamente a PORTA y a la salida de PORTB los leds con una res de 680. Madre mia!!! kon lo facil ke me las prometia y lo ignorante ke me estoy sintiendo.
 
Supongo, ya lo simule (Stimulus RA0, RA1, RA2 + WatchWindow + Simulación en StepInto) y si corre... hay varias cosas a tomar en cuenta que obligado harán que el código crezca pero para ser como prueba funciona.
 
En el programa checas a que una entrada esté a '1' (pulsador cerrado) para encender el LED respectivo pero en el esquema hace lo contrario... cambia las resistencias a GND y los pulsadores a +V.
Las resistencias para los LED (solo en la simulación) ponlo a 100 Ohm para que se vea el brillo y hace falta poner a V+ la pata del MCLR.
- Te dejo el code que use..., ahora queda mejorar la parte donde encienden dos LED a la vez..

saludos
 

Adjuntos

Última edición:
Ke grande eres!!!!!!!, ya funciona, pero lo has conseguido tu :). Lo ke si al kompilarlo me he fijado ke no te kaska ningun warning y a mi me saltaban 6 o asi, ¿eso es x la configuracion de la cabecera? supongo ke sera x lo de errorlevel -302. Se lo ke son algunas instrucciones (_XT_OSC y _WDT_OFF) pero eske eso a mi me keda muy lejos todabia, veras estoy siguiendo un libro y en el principio (donde estoy) no mete esas cabeceras de momento, lo mismo ke el include, me suenan de haber leido codigo x ahi pero hasta ke llegue... kon la ke he liao pa tres pulsadores y dos leds...

Muchas gracias otra vez, el codigo kuando lo leo, lo sigo mas o menos pero escribirlo ya es otra kosa, sobre todo kuando no tienes kien te diga lo ke estas haciendo mal. ¿te seria mucha molestia mandarme programas para hacer? tengo mucho interes x aprender y poder ir progresando en hacer kosillas mas komplikadas y utiles, pero ke sean basicos gg, a ver si te vas a pasar
 
Esto: http://www.pic16f84a.org/, es un libro muy usado por el que empieza... es un PIC algo viejo pero sirve bastante la información...
- Siempre ten a la mano el datasheet del PIC que uses.
- Los PIC16F son en su mayoría compatibles por lo que "Si aprendes a programar uno, aprendes a programar todos" los de la serie 16F.
- Las diferencias están es sus registros, fuses, por eso "Siempre revisa el datasheet".
- Introduccion a la programacion de PIC's (assembler).

Suerte.
saludos...
 
Última edición:
Me referia a la hora de korregir, toda esa informacion la tengo y es realmente util, pero en kuanto me salgo un poko del guion y me atasko... El codigo kon el ke habia empezado estaba bien estructurao, kitando el mal uso del movf, pero si tu no me lo llegas a komentar no hubiera salido de ese bucle para mi estaba bien y segun el libro tb.
 
hay una duda que tengo con respecto a como se realizan los salto indexados cuando se tiene una tabla que sobrepase las 256 pociciones.¿Como se trabaja en esos casos los registros PCLATCH,PChigh y PClow para acceder a la posicion de la tabla deseada?
podrian realizar un ejemplo al respecto.

Felicitaciones a Leon Elec y Meta por este curso.:aplauso:

saludos.
 
Arriba