Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
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!
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;
}
}
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
//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.
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
//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?
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.