Pages: [1]   Go Down
Author Topic: COMPARACION DE BITS EN REGISTROS  (Read 769 times)
0 Members and 1 Guest are viewing this topic.
Dos Hermanas( Sevilla)
Offline Offline
Jr. Member
**
Karma: 2
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola a todos.
Quiero comparar el registro TIFR1 en el bit TOV1 si ha babido desbordamiento, para poder sumar 1 a una variable y colocar el timer1 a 0 otra vez( TCNT1).

Lo he hecho asi y no me sale.

if((TIFR1 & (1<<TOV1))==(1<<TOV1))
 {
   Overflow++;
  TIFR1 |= (0<<TOV1);  //el flag a 0;
 }
rogaria me pudieran ayudar.
muchas gracias de antemano.
PD: no quiero prescaler.
un saludo.
Logged

Maracaibo
Online Online
Full Member
***
Karma: 6
Posts: 152
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Saludos
No se que quieres hacer pero no es mejor usar millis() y micros()
Logged

Dos Hermanas( Sevilla)
Offline Offline
Jr. Member
**
Karma: 2
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

gracias max por contestar.
si, ya se que se puede hacer por millis pero se pierde mucho tiempo y no funciona bien.
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 543
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola. Prueba a ver así:

if(TIFR1 & (1<<TOV1)) // también valía como lo tenías tú, pero más sencillo así
 {
   Overflow++;
  TIFR1  &=  ~(1<<TOV1);  // No estabas poniendo el flag a cero con el otro comando
 }

Saludos
Logged

Dos Hermanas( Sevilla)
Offline Offline
Jr. Member
**
Karma: 2
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hola noter,
tienes razon es mas facil y mas legible por nosotros.
Estoi con esto de los timer y se pueden hacer muchas cosas con esto,
me gustaria hacerte una pregunta.
si TIFR1 es un registro de 8bits
y TOV1 es 1 bit
Y & es and
1<<TOV1 significa que TOV1 lo pongas a 1
como se compara la instruccion que has puesto?
que es lo que hace  1&1=1, es asi?
sino corrigeme por favor.
Otra cosa no consigo escribir el signo encima de la ñ
se que es alt+126 pero en el arduino no lo consigo
hay algun truco
gracias.
un saludo.

« Last Edit: August 11, 2014, 08:58:12 am by pincho41700 » Logged

Maracaibo
Online Online
Full Member
***
Karma: 6
Posts: 152
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

SAludos

ñ = ALT +164  ===> Serial.write(164)
Ñ = ALT + 165 ===> Serial.write(165)
~ = ALT + 126 ===> Serial.write(126)
« Last Edit: August 11, 2014, 04:25:54 pm by max_saeta » Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 543
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hola noter,
tienes razon es mas facil y mas legible por nosotros.
Estoi con esto de los timer y se pueden hacer muchas cosas con esto,
me gustaria hacerte una pregunta.
si TIFR1 es un registro de 8bits
y TOV1 es 1 bit
Y & es and
1<<TOV1 significa que TOV1 lo pongas a 1
como se compara la instruccion que has puesto?
que es lo que hace  1&1=1, es asi?
sino corrigeme por favor.
Otra cosa no consigo escribir el signo encima de la ñ
se que es alt+126 pero en el arduino no lo consigo
hay algun truco
gracias.
un saludo.



Deberías echar un vistazo a las operaciones a nivel de bit. No obstante intentaré darte unas nociones rápidas.
Efectivamente, TIFR1  es un registro de 8 bits.
TOV1 es un bit de ese registro. Para arduino es un número que indica en qué posición (0 - 7) está ese bit. No sé ahora mismo qué posición es, pero supongamos que es el bit 2 (es decir, tercera posición por la derecha, recordemos que la primera es el bit 0). Entonces si hacemos un desplazamiento de 1 (00000001) dos (TOV1) posiciones, obtendremos 00000100 (1<<TOV1) . Si hacemos un or de bits con ese número a un registro que por ejemplo contenía 10101010, obtendremos 10101110, es decir, ponemos a 1 el bit de la posición 2, sin afectar al resto de bits. Para apagarlo, lo que debemos hacer es un and de bits con el número negado. Para ello, si negamos ~(00000100) obtenemos (11111011), y haciendo un and a nivel de bit lo que conseguimos es poner a 0 el bit 2 sin afectar a los demás.
Logged

Dos Hermanas( Sevilla)
Offline Offline
Jr. Member
**
Karma: 2
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok
muchas gracias a los 2
un  saludo
Logged

Maracaibo
Online Online
Full Member
***
Karma: 6
Posts: 152
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Saludos
Noter tambien estoy aprendiendo con esto, mi pregunta y si usamos las instrucciones bitClear y bitSet? No es ma rapido que usar and's y or's? claro si es para un silo bit.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Faltan datos para hacer un código correcto sobre lo que quieres hacer, pero vamos, yo haría uso de las interrupciones, un código básico sobre lo que quieres hacer sería algo así como:

#include <avr/io.h>
#include <avr/interrupt.h>

void Timer1_Init (void);

Overflow = 0;

int main(void)
{

Timer1_Init ();
sei();
   
while(1)
{
}
}

void Timer1_Init (void)
{
TCCR1B = (1 << WGM12);
OCR1A = (Valor hasta el cual quieres que cuentes);
TIMSK1 = (1 << OCIE1A);
}

ISR(TIMER1_COMPA_vect)
{
Overflow++;
}

La bandera de interrupción se limpia sola y el registro de conteo del Timer se reinicia sólo al llegar al valor máximo de conteo.

Como ya te he dicho, faltan muchos datos en tu enunciado para hacer un código correcto, pero un código básico sería ese.
Logged

Dos Hermanas( Sevilla)
Offline Offline
Jr. Member
**
Karma: 2
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

muchas graciias iburol
lo tendre en cuenta y te cuento a ver que tal.
Logged

Pages: [1]   Go Up
Jump to: