Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

18/09/2008 #1


Encender dos leds a la vez
Buenas.

Estoy realizando un proyecto con el PIC16F876 y todo ha ido más o menos bien. Tengo dos leds, que en función de la programación se enciende uno u otro. El caso es que quiero hacer que al iniciar el PIC se enciendan ambos a la vez y me presento con el siguiente problema:

Hago que las patas 4 (RA2) y 5 (RA3) sean salidas: TRISA.2 = 0; TRISA.3 = 0. Hasta ahí todo genial.
En otra parte del programa hago porta.2 = 1 y a continuación porta.3 = 1 (programo en mikroBasic) y observo que solo se enciende un led, el correspondiente a RB3. He probado a hacer un delay de un segundo entre una instrucción y la siguiente y en el osciloscopio observo que cuando pongo un 1 a la salida port1.3 se pone un cero en porta.2.

He pensado que podía ser debido a que el PIC no entregara la suficiente corriente, pero estoy mediendo directamente sin carga y se reproduce el mismo problema.

También he descartado que al tratarse del mismo puerto (A) y a la ubicación tan próxima entre pines pueda estar ahí el error, pero he probado en hacer el pin RB1 también como salida y sucede otro comportamiento que tampoco es el esperado:

Primero enciendo RB1, correcto.
Hago un delay de 1 sg, sigue encendido, correcto.
Enciendo RA2, y RB1 sigue encendido, correcto.
Delay de 1sg, siguen encendidos tanto RA2 y RB1, correcto.
Enciendo RA3 y en ese momento se apaga RA2, pero RB1 sigue encendido --> NO CORRECTO :(
Hago un delay de 2 sg, y es en ese momento cuando se me apaga RB1.

Ahora me acabo de dar cuenta que utilizo la librería de mikrobasic para utilizar una pantalla LCD y que al sacar por pantalla una frase, quizás sea quien haga que RB1 sea cero, aunque no esté conectado. Aunque esto podría contestar mi problema que RB1 se apague. ¿Por qué se apaga RA2 cuando enciendo RA3?

Alguien podría ayudarme.

Gracias de antemano y perdón si no me explicado lo suficiente.
18/09/2008 #2

Avatar de fernandoae

Quiza si pones el codigo del pic te podemos ayudar y... no tiene absolutamente NADA que ver que esten los pines muy proximos entre si!
19/09/2008 #3


Gracias por contestar.

He estado haciendo una prueba muy básica
Pongo a continuación el programa en Mikrobasic

Código:
program Prueba
dim aux as integer

main:
aux = 0
TRISB.1 = 0
portb.1 = 0
TRISA.2 = 0
porta.2 = 0
TRISA.3 = 0
porta.3 = 0


portb.1 = 1
delay_ms(1000)
porta.2 = 1
delay_ms(1000)
porta.3 = 1
end.

Y a continuación el que mikrobasic genera en ensamblador:

$0000	$2804			GOTO	_main
$0004	$	_main:
;Prueba.pbas,4 :: 		main:
$0004	$	_main_main:
;Prueba.pbas,5 :: 		aux = 0
$0004	$1303			BCF	STATUS, RP1
$0005	$1283			BCF	STATUS, RP0
$0006	$01A0			CLRF	_aux
$0007	$01A1			CLRF	_aux+1
;Prueba.pbas,6 :: 		TRISB.1 = 0
$0008	$1683			BSF	STATUS, RP0
$0009	$1086			BCF	TRISB, 1
$000A	$	Prueba_L_2:
;Prueba.pbas,7 :: 		portb.1 = 0
$000A	$1283			BCF	STATUS, RP0
$000B	$1086			BCF	PORTB, 1
$000C	$	Prueba_L_4:
;Prueba.pbas,8 :: 		TRISA.2 = 0
$000C	$1683			BSF	STATUS, RP0
$000D	$1105			BCF	TRISA, 2
$000E	$	Prueba_L_6:
;Prueba.pbas,9 :: 		porta.2 = 0
$000E	$1283			BCF	STATUS, RP0
$000F	$1105			BCF	PORTA, 2
$0010	$	Prueba_L_8:
;Prueba.pbas,10 :: 		TRISA.3 = 0
$0010	$1683			BSF	STATUS, RP0
$0011	$1185			BCF	TRISA, 3
$0012	$	Prueba_L_10:
;Prueba.pbas,11 :: 		porta.3 = 0
$0012	$1283			BCF	STATUS, RP0
$0013	$1185			BCF	PORTA, 3
$0014	$	Prueba_L_12:
;Prueba.pbas,14 :: 		portb.1 = 1
$0014	$	Prueba_L_13:
$0014	$1486			BSF	PORTB, 1
$0015	$	Prueba_L_14:
;Prueba.pbas,15 :: 		delay_ms(1000)
$0015	$3006			MOVLW	6
$0016	$00FC			MOVWF	STACK_12
$0017	$30FF			MOVLW	255
$0018	$00FB			MOVWF	STACK_11
$0019	$30FF			MOVLW	255
$001A	$00FA			MOVWF	STACK_10
$001B	$0BFC			DECFSZ	STACK_12, F
$001C	$281E			GOTO	$+2
$001D	$2825			GOTO	$+8
$001E	$0BFB			DECFSZ	STACK_11, F
$001F	$2821			GOTO	$+2
$0020	$2824			GOTO	$+4
$0021	$0BFA			DECFSZ	STACK_10, F
$0022	$2821			GOTO	$-1
$0023	$281E			GOTO	$-5
$0024	$281B			GOTO	$-9
$0025	$301A			MOVLW	26
$0026	$00FB			MOVWF	STACK_11
$0027	$30FF			MOVLW	255
$0028	$00FA			MOVWF	STACK_10
$0029	$0BFB			DECFSZ	STACK_11, F
$002A	$282C			GOTO	$+2
$002B	$282F			GOTO	$+4
$002C	$0BFA			DECFSZ	STACK_10, F
$002D	$282C			GOTO	$-1
$002E	$2829			GOTO	$-5
$002F	$3042			MOVLW	66
$0030	$00FA			MOVWF	STACK_10
$0031	$0BFA			DECFSZ	STACK_10, F
$0032	$2831			GOTO	$-1
;Prueba.pbas,16 :: 		porta.2 = 1
$0033	$	Prueba_L_15:
$0033	$1505			BSF	PORTA, 2
$0034	$	Prueba_L_16:
;Prueba.pbas,17 :: 		delay_ms(1000)
$0034	$3006			MOVLW	6
$0035	$00FC			MOVWF	STACK_12
$0036	$30FF			MOVLW	255
$0037	$00FB			MOVWF	STACK_11
$0038	$30FF			MOVLW	255
$0039	$00FA			MOVWF	STACK_10
$003A	$0BFC			DECFSZ	STACK_12, F
$003B	$283D			GOTO	$+2
$003C	$2844			GOTO	$+8
$003D	$0BFB			DECFSZ	STACK_11, F
$003E	$2840			GOTO	$+2
$003F	$2843			GOTO	$+4
$0040	$0BFA			DECFSZ	STACK_10, F
$0041	$2840			GOTO	$-1
$0042	$283D			GOTO	$-5
$0043	$283A			GOTO	$-9
$0044	$301A			MOVLW	26
$0045	$00FB			MOVWF	STACK_11
$0046	$30FF			MOVLW	255
$0047	$00FA			MOVWF	STACK_10
$0048	$0BFB			DECFSZ	STACK_11, F
$0049	$284B			GOTO	$+2
$004A	$284E			GOTO	$+4
$004B	$0BFA			DECFSZ	STACK_10, F
$004C	$284B			GOTO	$-1
$004D	$2848			GOTO	$-5
$004E	$3042			MOVLW	66
$004F	$00FA			MOVWF	STACK_10
$0050	$0BFA			DECFSZ	STACK_10, F
$0051	$2850			GOTO	$-1
;Prueba.pbas,18 :: 		porta.3 = 1
$0052	$	Prueba_L_17:
$0052	$1585			BSF	PORTA, 3
$0053	$	Prueba_L_18:
$0053	$	Prueba_L_0:
$0053	$2853			GOTO	$

Con este código, que el delay hace que parezca complejo, su resultado es el siguiente:

Se enciende el LED del RB1 sin problemas.
Al segundo se enciende el LED del RA2, también sin problemas.
Al cabo de otro segundo, el RB1 permanece encendido, el RA2 se apaga para encenderse el RA3, el cual ya permanece permanentemente encendido.

No entiendo por qué al encender RA3 se apaga RA2.

En el manual del PIC16F876, si no he entiendo mal, que creo que sí, al parecer cuando escribo en un pin de un puerto, el resto son leidos y no sé si ahí es cuando se pone a cero.
Copio textualmente del manual del PIC:

"Therefore, a write to a port implies that the port pins are read, the value is modified and then written to the port data latch."


Si alguien me pudiera orientar, estaría muy agradecido.

Un saludo,
Willow
19/09/2008 #4

Avatar de Elvic

el problema al parecer es que no tomas en cuenta el registro ADCON1 el cual debe llevar 0x06, para que puedas trabajar con salidas digitales, "1" o "0".

puesto que le puerto A esta multiplexado para trabajar con entradas analógicas el ADC

asi que al configurar el tris A para que port A sea salida, también debes carga el valor 0x06 a adcon1 para trabajar en forma digital.

suerT
19/09/2008 #5


Muchas gracias por tu pronta respuesta.
Voy a probarlo ahora mismo y con lo que sea te cuento.

Gracias de nuevo.
19/09/2008 #6


Buenas, ha funcionado como era de esperar.

Muchísimas gracias.

Un saludo, Roberto.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.