dudas con unas expresiones

Postea aqui toda la parte de programación del lenguaje C, C++, C#...

Moderator: Junta Directiva

Post Reply
pou
Principiante
Principiante
Posts: 23
Joined: Wed Sep 28, 2011 8:39 pm
Nombre: pou

dudas con unas expresiones

Post by pou » Mon Oct 10, 2011 8:03 pm

Hola a todos.
Tenia una duda, detras de otra jej, y es que estoy aprendiendo C leyendo un libro, y a veces no me cuadra lo que pone. Aparece este codigo para configurar el reloj:

CLKPR = (1<<CLKPCE) ; // set clock preescaler change enable
// set preescaler = 8, internal RC 8Mhz/ 8 = 1 Mhz
CLKPR = (1<<CLKPS1) | (1<<CLKPS0) ;


No deberia ser la 2º expresion CLKPR |= ... ó CLKPR = CLKPR | ((1<<CLKPS1) | (1<<CLKPS0)) ; ??
porque si no, no se guardaria lo de la primera expresion no?

no se si se llama "expresion" a eso, es libro es en inglis y las paso putillas para entenderlo :?

y ya puestos, no hay algun sitio donde vengan los ciclos que tarda cada instruccion?
por ejemplo si puedes usar una instruccion switch o una if, else if.. luego compiladas una queda mas larga que otra?
lo mismo con los operandos, por ej. una resta (x - y) es mas rapido para un micro cambiarla por esto (x & ~y)

bueno 1 saludo!

sistemasorp
Usuario Experto
Usuario Experto
Posts: 472
Joined: Fri Jan 29, 2010 9:51 pm

Re: dudas con unas expresiones

Post by sistemasorp » Tue Oct 11, 2011 11:30 am

Ten en cuenta que es un registro, no una variable de memoria, por lo que detecta cambios automáticamente y actúa en consecuencia cuando lo modificas. Funciona de la siguiente manera:
-Cuando pones a uno el bit CLKPCE le dices al microcontrolador que permita el cambio del prescaler del reloj.
-Después cualquier valor que le metas a ese registro será el valor del prescaler.

Tu imagínatelo como si dentro del AVR estuviese programado el registro a algo parecido a la siguiente función:

Code: Select all

 int prescaler = 0;
.
.
.
 void CLKPR(byte valor)
 {
  static byte permite = 0;
  if(valor & CLKPCE)
  {
   permite = 1;
  }
  else if(permite == 1)
  {
   prescaler = valor;
   permite = 0;
  }
 }

pou
Principiante
Principiante
Posts: 23
Joined: Wed Sep 28, 2011 8:39 pm
Nombre: pou

Re: dudas con unas expresiones

Post by pou » Tue Oct 11, 2011 7:52 pm

pero para la mayoria registros que no tienen bits de enable o no esten relacionados, ya no valdria eso no?

ya puestos pongo otra duda de ese mismo programa :mrgreen:

//wait for timer2 compare flag
while ( ! ( TIFR2 && (1<<OCF2A)) );

Si esto solo espera hasta que el bit de flag OCF2A del registro TIFR2 se ponga a uno, no se puede hacer directamente esto?
while ( !OCF2A );

gracias por la ayuda sistemasorp.

sistemasorp
Usuario Experto
Usuario Experto
Posts: 472
Joined: Fri Jan 29, 2010 9:51 pm

Re: dudas con unas expresiones

Post by sistemasorp » Tue Oct 11, 2011 10:21 pm

pou wrote:pero para la mayoria registros que no tienen bits de enable o no esten relacionados, ya no valdria eso no?
Exactamente.
pou wrote: ya puestos pongo otra duda de ese mismo programa :mrgreen:

//wait for timer2 compare flag
while ( ! ( TIFR2 && (1<<OCF2A)) );

Si esto solo espera hasta que el bit de flag OCF2A del registro TIFR2 se ponga a uno, no se puede hacer directamente esto?
while ( !OCF2A );

gracias por la ayuda sistemasorp.
¿Una pregunta, ese código viene en la página 123 de tu libro?

akita
Posts: 2
Joined: Thu Sep 29, 2011 1:25 am

Re: dudas con unas expresiones

Post by akita » Tue Oct 11, 2011 10:38 pm

CLKPR = (1<<CLKPS1) | (1<<CLKPS0) ; con esta sentencia estás metiendo 00000011 (pongamos que clkps1:0 son los bits bajos) en el registro clkpr, machacando el valor anterior.

CLKPR |= (1<<CLKPS1) | (1<<CLKPS0) ; así pondrías los dos bits a 1 dejando el resto de los bits del registro como estaban.

OCF2A no es un bit, representa un valor númerico para el compilador, pongamos que se refiere al bit 5 edl registro luego hacer (1<<OCF2A) es lo mismo que hacer (1<<5) o 00100000, por lo que escribir while ( !OCF2A ); es lo mismo que escribir while ( !5); lo que no tiene ningún sentido.

pou
Principiante
Principiante
Posts: 23
Joined: Wed Sep 28, 2011 8:39 pm
Nombre: pou

Re: dudas con unas expresiones

Post by pou » Wed Oct 12, 2011 1:17 am

si, en esa pagina viene jejej.

akita muy buena tu aclaracion :wink:

saludos

sistemasorp
Usuario Experto
Usuario Experto
Posts: 472
Joined: Fri Jan 29, 2010 9:51 pm

Re: dudas con unas expresiones

Post by sistemasorp » Wed Oct 12, 2011 7:23 am

pou wrote:si, en esa pagina viene jejej.
Ok

Según este enlace: http://www.smileymicros.com/index.php?m ... PAGE_id=54" onclick="window.open(this.href);return false; dice que en la página 123 la versión correcta es

Code: Select all

while ( !(TIFR2) & (1<<OCF2A)) );
aunque creo que le falta un paréntesis

Code: Select all

while ( !((TIFR2) & (1<<OCF2A)) );
tal y como puedes ver en estos enlaces:

http://www.avrfreaks.net/index.php?name ... ic&t=57183" onclick="window.open(this.href);return false;
http://b3r1.googlecode.com/svn-history/ ... bot_util.c" onclick="window.open(this.href);return false;
http://avr.15.forumer.com/a/the-incredi ... 17-30.html" onclick="window.open(this.href);return false;
http://lists.gnu.org/archive/html/avr-g ... 00070.html" onclick="window.open(this.href);return false;

Si te fijas en este otro enlace http://www.icqoso.com/data-OCF2A.html" onclick="window.open(this.href);return false; verás que OCF2A es un #define con un valor 1, por tanto al final el compilador traduce a

Code: Select all

while ( !(TIFR2 & 2) );
o lo que es lo mismo, no salgas del bucle while mientras que el segundo bit del registro TIFR2 sea 0.

pou
Principiante
Principiante
Posts: 23
Joined: Wed Sep 28, 2011 8:39 pm
Nombre: pou

Re: dudas con unas expresiones

Post by pou » Thu Oct 13, 2011 6:12 pm

ok, esa ultima es entonces parecida a lo que aparece en la pagina 143:
if (PORTD &= 1) ... lo mismo para el bit0, aunque nose porque pone el =

gracias por los links, habra que ir mirando ese de smileymicros

hay otra cosa que no me cuadra en otro programa: (empiezo a sentirme pesado jj)

Code: Select all

int parse_set (char s[] )	// recibe la cadena "Setxxx"
{				// xxx es cualquier numero de 0 a 256
	char set[11];
	unsigned char i=3, j=0;

	while ( (s[i] != '\0') && ( j<=11 ) )
	{
		if ( (s[i] >= '0') && (s[i] <= '9') )
		{
			set[j++] = s[i++]; //mientras sean numeros copia la cadena
		}
		else
		{
		...
		return 0;
		}
	}

	set[j] = '\0';  // aqui entiendo que si el tercer numero se guarda en set[2]
			// el '\0' se guarda en set[3] , no??

	if (j>4) // must be < 256
	{
	...manda señal de error
	return 0;
	}
	else
	...
if (j>4) no deberia ser (j>=4) ó (j>3) ?

sistemasorp
Usuario Experto
Usuario Experto
Posts: 472
Joined: Fri Jan 29, 2010 9:51 pm

Re: dudas con unas expresiones

Post by sistemasorp » Thu Oct 13, 2011 10:11 pm

pou wrote:ok, esa ultima es entonces parecida a lo que aparece en la pagina 143:
if (PORTD &= 1) ... lo mismo para el bit0, aunque nose porque pone el =
Deja todos los bits de PORTD a 0 excepto el primero que respeta su valor, entonces dependiendo si al final PORTD es distinto de 0 o no entrará en el if o no.
pou wrote:

Code: Select all

int parse_set (char s[] )	// recibe la cadena "Setxxx"
{				// xxx es cualquier numero de 0 a 256
	char set[11];
	unsigned char i=3, j=0;

	while ( (s[i] != '\0') && ( j<=11 ) )
	{
		if ( (s[i] >= '0') && (s[i] <= '9') )
		{
			set[j++] = s[i++]; //mientras sean numeros copia la cadena
		}
		else
		{
		...
		return 0;
		}
	}

	set[j] = '\0';  // aqui entiendo que si el tercer numero se guarda en set[2]
			// el '\0' se guarda en set[3] , no??

	if (j>4) // must be < 256
	{
	...manda señal de error
	return 0;
	}
	else
	...
if (j>4) no deberia ser (j>=4) ó (j>3) ?
Con respecto a '\0', efectivamente, cuando sale del bucle while j tiene un incremento más que cuando se metió el último número.

Y como bien dices el if debería ser (j > 3)

pou
Principiante
Principiante
Posts: 23
Joined: Wed Sep 28, 2011 8:39 pm
Nombre: pou

Re: dudas con unas expresiones

Post by pou » Sun Oct 16, 2011 10:48 pm

gracias por la ayuda sistemasorp!
ahora a practicar un poco con lo aprendido que si no aprendo lo nuevo y se me olvida lo anterior :lol:

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest