# Problema con el trisb



## arex (Feb 13, 2008)

Hola esto intentanto hacer un programa controlado por un pic16f876.

El tema es muy simple en la salidas Rb del pic tengo conectado lo siguiente:

RB0 Tengo conectado el enable de un L298 (control para un motor)
RB1 Tengo conectado el IN1 del L298
RB2 Tengo conectado el IN2 del L298
RB3 Tengo conectado un led

Las demas salidas RB sin conectar

El caso esque para controlar esto tengo que poner el TRISB como salidas, y lo hago asi:

TRISB=0b11110000;

El problema esque no funciona y lo que he hecho es ir probando con cada uno de las salidas RB, es decir primero puse: 
TRISB=0b11110111; Y el led se encendia
luego:
TRISB=0b11110110; funcionaba
TRISB=0b11110010; funcionaba y se encendia el led y el motor giraba en un sentido
pero..TRISB=0b11110000; encuanto ponia el RB1 como salida, ya sea con los demas o por si solo no me funciona NADA he comprobado la placa y no esta en corto ni nada

Que puede ser?


----------



## AleixForo (Feb 13, 2008)

Mira si lo programas con el CCS, la instruccion es SET_TRIS_B( 0x32 ); (por ejemplo)
sino prueba primero de ponerlo en hexadecimal como en el ejemplo anterior en vez de en binario y sino no funciona, no pongas nada de configuracion de entrada salida, en los pic's funciona igual de bien.


----------



## Paloky (Feb 13, 2008)

Hola Arex.

Supongo que una vez configurado el TRISB, pones IN1=0 y IN2=1 y biceversa para hacer girar el motor, no?.

Que compilador usas:  Assembler o C ?

Pon el código completo a ver si vemos algo raro.

Saludos.


----------



## arex (Feb 13, 2008)

Paloky dijo:
			
		

> Hola Arex.
> 
> Supongo que una vez configurado el TRISB, pones IN1=0 y IN2=1 y biceversa para hacer girar el motor, no?.
> 
> ...



Si efectivamente luego utilizo el IN1 y el IN2 Enable..., uso como como compilador el Mplab, el programa que he realizado es de los mas simple y lo hice con el unico objetivo de comprobar que mi placa funcionaba, es decir el programa gordo todavia no lo he hecho, por cierto si no lo configuro como salida no me funciona y no se porque pero bueno.
Lo mas raro esque tengo un entrenador con leds y demas y cuando conecto pruebo el micro parece estar bien, pero en mi placa no me va.

Ya he preguntado a 3 profesores y tampoco saben decirme.

El programita:
#include <pic1687x.h>  /* declaración de registros apra el PIC16F876 */

void main (void){

OPTION=0;
TRISA=0b00111111;
ADCON1=0b00000111; //  todas las líneas son digitales


TRISB=0b11110000; //aquí creo qe esta el problema

TRISC=0b11111111;
INTCON=0;

while(1){

if (RC1) {RB3=1; RB0=1;RB2=1;RB1=0;} else {RB3=0; RB0=1;RB2=0;RB1=1;}

  }

}

Lo mas raro es que el Rb2 que controla el IN2 del L298 no me da problemas, y para comprobar el funcionamiento de la placa he quitado el micro e introducido manualmente 5 voltios al Rb1 que ataca al IN1 y funcinaba, es decir, el hardware no puede ser. Tambien he probado varios micros por si estubiera defectuoso.

salu2 y muchas gracias por todo

Por cierto RC1 es un pulsador con resistencia de pull-up


----------



## Paloky (Feb 14, 2008)

Busca y utiliza el compilador CCS, y prueba este programa.




#include <16F876.h>
#device adc=8

#FUSES NOWDT                 	//No Watch Dog Timer
#FUSES HS                    	     //High speed Osc (> 4mhz)
#FUSES NOPUT                 	 //No Power Up Timer
#FUSES NOPROTECT             //Code not protected from reading
#FUSES BROWNOUT             //Reset when brownout detected
#FUSES LVP                   	   //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD                 	//No EE protection
#FUSES NOWRT                   //Program memory not write protected
#FUSES NODEBUG               //No Debug mode for ICD

#use delay(clock=20000000)


/*
RB0 Tengo conectado el enable de un L298 (control para un motor)
RB1 Tengo conectado el IN1 del L298
RB2 Tengo conectado el IN2 del L298
RB3 Tengo conectado un led
*/


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);


while(1)
  {

	if (input(PIN_C1))
	 {
		output_high(PIN_B3);		// Led ON
		output_high(PIN_B0);		// Enable L298
		output_high(PIN_B2);		// Sentido_1
		output_low(PIN_B1);
	}

 	else
	 {
		output_low(PIN_B3);			// Led OFF
		output_high(PIN_B0);		// Enable L298
		output_low(PIN_B2);			// Sentido_2
		output_high(PIN_B1);
	}


  }	// Fin del While(1)

}   // Fin del Main





Te tendria que funcionar a la primera.

Ya me dirás a ver.

Saludos.


----------



## arex (Feb 19, 2008)

Paloky gracias por tu aportacion pero como me obligan a usar ese compilador, no me quedan mas narices.

Bueno como mi problema es rarisimo pues decidí hacer otra plaquita (esta ultima mucho mejor echa y comprobada), esta la he probado con el programita que os dije y me funciona, ha sique he ido creando un programa mas complejo (aunque no mucho) el caso es que inserto el micro en la placa pulso un fin de carrera el motor comienza a girar pero no para desconecto de alimentacion y veo que el micro esta muy caliente, enciendo la fuente otra vez y la fuente me indica que esta en corto y no funciona nada, despues quito el micro y ya no hay corto, asique digo bueno pues voy a poner el micro que use antes con el primer programa y nada mas ponerlo se empieza a calentar y otra vez en corto, vuelvo a quitar el micro y se quita el corto, en resumidas, me he cargado dos micros.

A que puede ser debido?

al principio me funcionó y no he cambiado nada, y me da miedo volver a probar y cargarme otro.


----------



## Ardogan (Feb 19, 2008)

Como calienta tanto el micro puede ser que tu circuito le esté pidiendo más corriente de la que puede dar el microcontrolador en alguno de sus pines.
Para ver si es algo de eso tendrías que postear el circuito que usaste (una imagen jpg o gif es lo más fácil de ver), para que te puedan contestar con precisión.
Saludos


----------



## arex (Feb 19, 2008)

Adjunto os dejo el circuito que realice con el capture, yo creo que esta bien pero si ven algo raro...


----------



## Ardogan (Feb 20, 2008)

Lo primero que noté es que para inicializar los puertos de I/O recomiendan escribir un 0, y después configurar los TRIS (si bien no creo que esto para nada elimine el problema):

"It is recommended that when initializing the port, the data latch (PORT register)
should be initialized ?rst, and then the data direction (TRIS register). This will elim-
inate a possible pin glitch, since the PORT data latch values power up in a random
state."
"  CLRF   STATUS       ; Bank0 
    CLRF   PORTB        ; Initialize PORTB by clearing output 
                        ;    data latches 
    BSF    STATUS, RP0  ; Select Bank1 
    MOVLW  0xCF         ; Value used to initialize data direction 
    MOVWF  TRISB        ; PORTB<3:0> = inputs, PORTB<5:4> = outputs 
                       ;    PORTB<7:6> = inputs "

No ví nada raro en el esquema del circuito. Pensaba que podían llegar a ser incompatibles las entradas del L298 con las salidas del PIC, pero no según las hojas de datos.

En la hoja de datos del L298/características eléctricas dice que la tensión en Vs tiene que ser al menos 2.5V mayor a Vih (nivel alto con el que se excitan las entradas lógicas), y veo que lo estás con Vss=Vs=Vcc.

En fin, nada de lo anterior explica el calentamiento del PIC...
Revisa si las resistencias en la placa son de los mismos valores del esquemático, quizás soldaste alguna de menor valor sin querer... Es lo único que se me ocurre para explicarlo.

Saludos


----------



## arex (Feb 20, 2008)

He colocado un condensador de 100nF en paralelo con uno de 100uF a la entrada de alimentacion del l298 y parece que ya se ha solucinado, alomejor eran los pico de tension que hacian cosas raras, pero ahora se me plantea otra duda, esta vez con el programa

Este es mi programa:

#include <pic1687x.h>  /* declaración de registros para el PIC16F876 */

#define    FCd		RC2
#define    FCi		RC1
#define    pul		RC0
#define    derecha	                1
#define    izquierda                 0

bit ok;

void main (void){

OPTION=0;
ADCON1=0b00000111;

PORTB=PORTC=0;			/* CONVIENE PONER LOS PUERTOS A CERO */
				/* FALTABA LOS TRIS */
TRISA=0b11111111;		/* Todo como entradas*/
TRISB=0b11110000;
TRISC=0b11111111;

if (ok==derecha) {if (FCd==0){

			      RB0=RB1=RB2=RB3=0;                              
			      if (pul==0){
				         ok=!ok; /*+++*/
				         }
	                               }

                   else {RB0=1;RB1=1;RB2=0;RB3=1;} /*+++*/

		 }


else  if (FCi==0){

		 RB0=RB1=RB2=0;RB3=1;
                                if (pul==0){
			 ok=!ok; /*+++*/
			 }

                  }

       else {RB0=1;RB1=0;RB2=1;} /*+++*/ 


  }/*de main*/ 

Bueno pues donde aparece esto "/*+++*/" es por que en ese punto tendria que volver al principio del programa, es decir tendria que volver a hacer todo desde el main y no se como acerlo, talvez con funciones pero no se muy bien como se hace, me podeis ayuda?

muxas gracias a todos


----------



## Ardogan (Feb 20, 2008)

Lo más común es usar un
while(1){
  //parte del cógido que se repite
}

La parte de inicialización (registros de configuración, constantes, etc) dejala afuera del bucle.
Para tener una idea de como se escriben los programas fijate en los codigos de ejemplo de www.microchip.com -> Code examples, ahi vas a tener una buena referencia.

Para tu caso particular, yo metería adentro del while desde

if (ok==derecha) {if (FCd==0){

hasta 


else {RB0=1;RB1=0;RB2=1;} (inclusive)

Otra cosa que podrías optimizar sería poner PORTB=valor en vez de RBx= 0 o 1.
No debería ocasionar ningún problema a los pines de RB que tenés configurados como entrada, ya que cuando se escribe un dato al port se escribe el latch de salida y no afecta directamente al pin.

Bueno, me alegra haber podido darte una mano.
Saludos


----------

