fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Problemas al cambia...
 
Avisos
Vaciar todo

Problemas al cambiar el estado de un Pin de un puerto en CCS

19 Respuestas
7 Usuarios
0 Reactions
8,089 Visitas
vcs
Respuestas: 114
 vcs
Topic starter
(@vcs)
Estimable Member
Registrado: hace 18 años

Buenas a todos.

Otra vez tengo un poquito de tiempo (de 6 mese en 6 meses saco un par de dias) y he vuelto a retomar un anteanteproyecto de placa que quiero hacer (la misma de todas las dudas que he ido posteando tiempo atras) tengo problemas con un programa en CCS version 3.222 para un 16F877 y es una tonteria pero no veo el fallo, resulta que lo que quiero es cambiar el estado de dos pines del puerto D de dicho pic, y resulta que he usado varias intrucciones para probar y me pasa algo muy raro y es que en lineas de programa consecutivas cambio el estado del pin 5 del puerdo D (Lo ativo por alta, lo pongo a uno) y en la siguiente linea repito la operacion para el pin 7 del mismo puerto, pero al llegar a esta linea el pin 7 se activa y se desactiva el 5, he probado varias intrucciones y la unica solucion que he encontrado para acceder a nivel de bit a sido haciendolo con una variable intermedia, por ejemplo ponia lo siguiente

bit_set(PORTD,5);
bit_set(PORTD,7);

y al llegar a la segunda linea el pin 5 cambia a valer 0 y el 7 a valer 1, cuando lo que deberia de hacer es mantenerse a 1 los dos bit, todo esto lo he ido programando en CCS y lo he corrido paso a paso bajo simulacion en el Proteus, asi que no se si realmente hago algo mal, es el CCS lo que falla o es el Proteus, no lo he podido probar en Hardware porque no dispongo del Micro en este momento, aqui dejo el codigo donde aparece lo que me ha funcinado (pero no me gusta porque no creo que sea la mejor forma de hacerlo, me ha recordado a horrores al asm cojo una variable a modo acumulador, la modifico y luego la saco por el Puerto) como se puede ver he dejado tambien enmascarados como si fueran comentarios:

// bit_set(PORTD,5);
// bit_set(PORTD,7);

algunos de los otros modos y en todos he obtenido resultados identicos, a ver si algun alma caritativa me puede iluminar un poquito sobre estos misterios que siempre se me escapan.

GRACIAS
#include <16F877A>
#fuses XT,NOWDT
#use delay (clock=1000000)

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
#byte PORTA=0x05
#byte PORTB=0x06
#byte PORTC=0x07
#byte PORTD=0x08
#byte PORTE=0x09
#BIT D5=0X08.5
#BIT D7=0X08.7

int arranque=0;
int numero_piso=0;
int subida=0;
int bajada=0;
int piso_pulsado=0;
int variable=0;
int lectura_A=1;
int puertod=0;

#int_rb
VOID interrupcion()
{ lectura_A=PORTB;
if(INPUT(PIN_B4))
{
bit_clear(PORTD,5);
bit_clear(PORTD,7);
bit_set(PORTE,2);
// delay_ms(1500);
bit_clear(PORTE,2);
lectura_A=0;
}
if (INPUT(PIN_B5))
{
bit_clear(PORTA,1);
bit_clear(PORTA,2);
}
}

void main(void)
{
disable_interrupts(GLOBAL);

set_tris_a(0b111111);
set_tris_b(0b11111111);
set_tris_c(0b11111111);
set_tris_d(0b00011111);
set_tris_e(0b000);

PORTD=0;
PORTE=0;

enable_interrupts(int_rb);
enable_interrupts(int_ext);
enable_interrupts(GLOBAL);

do
{
if (arranque==0)
{

//bit_set(PORTD,7);
//bit_set(PORTD,5);

//Output_high(PIN_D5);
//Output_high(PIN_D7);

//D5=1;
//D7=1;

bit_set(puertod,7);
bit_set(puertod,5);
PORTD=puertod;

while (lectura_A|=0)
{}
arranque=1;
}

// Delay_ms(5000);
bit_set(PORTE,0);

if (input(pin_c0))
{
variable=porta;
rotate_right(&variable,1);
rotate_right(&variable,1);
rotate_right(&variable,1);
bit_clear(variable,3);
bit_clear(variable,4);
bit_clear(variable,5);
portb=variable;
delay_ms(1000);
}

}WHILE(TRUE);
} // Fin

Responder
18 respuestas
vcs
Respuestas: 114
 vcs
Topic starter
(@vcs)
Estimable Member
Registrado: hace 18 años

No tengo ni idea del PIC q usas, pero asegurate de que tienes las entradas y salidas bien configuradas, especialmente si esos PINs coinciden con un comparador interno del PIC.
Suerte!

Nas uso un 16F877A y en principio no uso ningun comparador ni he definido nada en obsoluto (creo porque en esto estoy un poco verde) el codigo completo está adjuntado en el primer post que puse, por si ese te puede ayudar a ver si la he cagado en algo.

Asias

Responder
vcs
Respuestas: 114
 vcs
Topic starter
(@vcs)
Estimable Member
Registrado: hace 18 años

La opción wizard se encuentra en:

ProjectNewPic Wizard

Cuando la ejecutas aparece un asistente que te permite crear el proyecto de una forma cómoda. Sólo tienes que asegurarte de revisar todas las pestañas y seleccionar lo que quieras en cada una.

Lo bueno de este método es que es más difícil que cometas algún error de configuración que te despiste.

Ja ja Vaya no tenia ni idea de que existia esta opcion, sino seguro que la habria usado para alguna que otra cosilla, ahora lo que si tengo seguro es que la usaré cuando comience a intentar comunicar via I2C a ver si esto me ayuda en algo, de todas, formas esto lo hice a mano picando todas las lineas y el .h del pic esta correcto y los fuses los fui poniendo poco a poco con vuestra ayuda, de todas formas el wizard está muy bien pero el problema es saber para que valen la mitad de las cosas :p

Responder
dragonet80
Respuestas: 1328
(@dragonet80)
Ardero
Registrado: hace 17 años

A ver si te sirve de ayuda, porque a mi también me ha pasado (con un dsPIC30F6010A) y me ha costado llegar a descubrir cual era el error:

Me pasaba lo mismo, activaba cuatro salidas pero sólo se me activaban 2. El código que usaba era éste (en Mplab C):
_RE0 = 1;
_RE1 = 0;
_RE2 = 1;
_RE3 = 0;
Con esto sólo cambiaban de estado dos, los otros dos ni se inmutaban. Después de varios días dándole vueltas recordé que a las entradas analógicas había que dejarles tiempo para que convirtiesen el valor y pensé que quizá podría pasar lo mismo o parecido con las salidas digitales. Lo probé y PERFECTO. Para que funcionase, ese código lo modifiqué de la siguiente manera:
_RE0 = 0;
Nop();
_RE1 = 1;
Nop();
_RE2 = 0;
Nop();
_RE3 = 1;
Nop();
Ahora ya funciona perfectamente. Lo que hace el "NOP" es gastar un ciclo de microprocesador sin hacer realmente nada, sólo consume tiempo, pero se ve que con ese ciclo es suficiente para que el puerto vuelva a estar listo para modificar su estado. No recuerdo si en los datasheet de microchip comentaba algo al respecto o no, pero a mí me ha funcionado (con el dsPic30F6010A).

Puede que con el 16F877A pase algo similar, que debas dejar tiempo a que el puerto se estabilice antes de cambiar otro pin. Por lo visto, en algunos micros, la velocidad interna debe ser muy superior a la de los puertos. Prueba a ver si te funciona y ya comentas como te ha ido.

Un saludo.

Responder
vcs
Respuestas: 114
 vcs
Topic starter
(@vcs)
Estimable Member
Registrado: hace 18 años

Muchas gracias por el aporte pero el resultado es el mismo, el tema esta en que cambiarlo si lo cambia con y sin el Nop (en mi caso un delay_cycle(3)) lo que pasa es que es como si no se pudiera acceder a nivel de bit al canal de memoria donde está el puerto, al hacer D5=1; lo que hace es poner el pin 7 a uno pero todos los demas a cero, por eso cuando en la linea siguiente hago D7=1; machaca el dato anterior pone a 0 el pin 5 y activa el 7 por eso lo tengo que hacer de forma indirecta sobre una variable que ahi parece no haber problemas si activo el bit 5 de una variable solo toca ese bit y los demas los deja como estaban (que es lo que deberia de hacer tambien con el puerto)

Un saludo y gracias por el aporte.

Responder
vcs
Respuestas: 114
 vcs
Topic starter
(@vcs)
Estimable Member
Registrado: hace 18 años

Vaya que desilusion con este tema, he cambiado la version de CCS y la version de Proteus (donde simulo) con la esperanza de que esto cambiara pero igualmente al cambiar un solo bit del puerto de salida me lo cambia todo.

Al final tendré que seguir trabajando como hasta ahora, moviendo el bit en una variable de apoyo y luego sacando esta variable por el puerto:

....
#byte PORTB=0x06
....
int KK=0;
....

set_bit(KK,1);
PORTB=KK;
delay_ms(100)
clear_bit(KK,1);
PORTB=KK;

Un fallo un poco gordo del compilador ¿no?, pero entonces me surge una duda, como haceis vosotros para cambiar el estado de una sola patilla de un puerto?

Responder
Página 3 / 4
Compartir: