Autor Tema: dudas con unas expresiones  (Leído 2529 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pou

  • PIC12
  • **
  • Mensajes: 51
dudas con unas expresiones
« en: 10 de Octubre de 2011, 14:07:40 »
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 |= ...    o lo que es lo mismo:   CLKPR =  CLKPR | ((1<<CLKPS1) | (1<<CLKPS0)) ;   ??
porque si 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?

bueno 1 saludo!


Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: dudas con unas expresiones
« Respuesta #1 en: 10 de Octubre de 2011, 14:23:15 »
esto es programacion para PC, creo que te has confundido de apartado  :D

como tu dices deberia ser asi, ya que la 2ª instruccion reemplaza lo que se haya escrito en la 1ª, de todas formas hacer un desplazamiento de bits para configurar un registro lo veo una tonteria, mas que nada porque el desplazamiento de bits ocupa recursos, son unas cuantas instrucciones, y es mas facil poner CLKPR=0b11000100 (con el codigo binario deseado), o bien en HEX, DEC...

Para lo que tarda cada instruccion en ASM se puede saber, en C no, bueno si pero no a ciencia cierta, o una de dos, o miras el codigo en ASM y asi cuentas cuantas instrucciones tiene cada funcion, o bien usas un emulador tipo proteus-isis que te dice cuanto tarda de instruccion a instruccion.

El caso es que las instrucciones no siempre tardan igual, no es igual un if(char que un if(int o un if (*char....
la funcion switch lo que hace es comparar la variable con los distintos case, en el caso que coincidan pega un salto a la direccion donde esta el case. Entre mas case mas tardara, pero tienes que tener en cuenta que no es igual el case ULTIMO que case PRIMERO que solo tardaria una comparacion y salto.

Yo no me complicaria comprobando tiempos de instrucciones a no ser que sea un proyecto que necesite mucha resolucion.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: dudas con unas expresiones
« Respuesta #2 en: 10 de Octubre de 2011, 15:11:03 »
Eso de desplazar 0 o 1, cierta cantidad hacia la izquierda para configurar los registros lo he visto en AVR: http://www.olimex.cl/present.php?page=tut_avr_mt_intro&c=1

 :?

No contesto mensajes privados, las consultas en el foro

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: dudas con unas expresiones
« Respuesta #3 en: 10 de Octubre de 2011, 15:49:23 »
//pin 5 es entrada
DDRB &= ~(1 << 5);
//pin 2 es salida
DDRB |= (1 << 2);

yo veo mas eficaz

DDRB|=0b00100000;
DDRB&=0b00000100;

aunque quizas al ser expresiones constantes el compilador lo traduzca asi, y el codigo final sea el que yo pongo.

Desconectado pou

  • PIC12
  • **
  • Mensajes: 51
Re: dudas con unas expresiones
« Respuesta #4 en: 10 de Octubre de 2011, 15:53:22 »
Premio! el libro es "C para micros AVR"  :mrgreen:

si no me dices que es para PC no me entero jaja
bueno gracias por la ayuda!!

esto lo ponen para aclarar el codigo, aunque yo con el ASM veia muy comodo lo de ponerlo en binario, y ahora que dices que ocupa mas lo otro, pues en binario con comentarios y punto.

1 saludo