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
10.1 K 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
mosvack
Respuestas: 126
(@mosvack)
Estimable Member
Registrado: hace 19 años

cómo creas el proyecto? Con la opción wizard?

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

No entiendo muy bien la pregunta, para compilar y programar uso el ccs y a la hora de escribir el programa para que sea un entorno mas comodo uso el editor PCW C COMPILER IDE, y en el simulador me lo hice todo a mano sin ningun wizard, luego monté el cof y el .c y lo depuro alli. si hasta ahora no habia tenido problemas con ningun otro programa salvo al tratar de usar directamente la variable del Puerto

Responder
roboticsbcn
Respuestas: 244
(@roboticsbcn)
Estimable Member
Registrado: hace 20 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!

Responder
mosvack
Respuestas: 126
(@mosvack)
Estimable Member
Registrado: hace 19 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.

Responder
mosvack
Respuestas: 126
(@mosvack)
Estimable Member
Registrado: hace 19 años

Por cierto, esta opción lo que hace es establecer el .h y el principio del .C por ti...

Responder
Página 2 / 4
Compartir: