fbpx

Expresate

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

dudas con unas expr...
 
Avisos
Vaciar todo

dudas con unas expresiones

10 Respuestas
3 Usuarios
0 Reactions
14.2 K Visitas
pou
Respuestas: 23
 pou
Topic starter
(@pou)
Eminent Member
Registrado: hace 13 años

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!

Responder
9 respuestas
sistemasorp
Respuestas: 478
(@sistemasorp)
Ardero
Registrado: hace 15 años

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:

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

Responder
pou
Respuestas: 23
 pou
Topic starter
(@pou)
Eminent Member
Registrado: hace 13 años

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.

Responder
sistemasorp
Respuestas: 478
(@sistemasorp)
Ardero
Registrado: hace 15 años

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

Exactamente.
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?

Responder
akita
Respuestas: 2
(@akita)
New Member
Registrado: hace 13 años

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.

Responder
Página 1 / 2
Compartir: