Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi
Foros Registrarse ¿Olvidaste tu contraseña?
26/06/2014 #1


DigitalReadFast y DDRB
Quiero trabajar a una alta velocidad por lo que necesito optimizar la funcion DigitalRead.

Con la funcion para definir los puertos como entrada o salida no he tenido problema:

DDRB, pero lei que los bits altos (6 y 7) estan definidos para el reloj del atmega del arduino

Estoy utilizando esta funcion exactamente:
DDRB = B11101111;

He probado mi programa sin ningun problema, pero puede haber algun problema de definir los bits 6 y 7 como salidas?

Volviendo a DigitalRead , segun la pagina de arduino puedo utilizar PINB para hacer lectura del puerto pero no logro leerlo.

if PINB == B11110011 ... No reconoco , pero con digitalRead(5) si funciona.

Tambien he probado con PINB5 == 1 , PORTB5 == 1, etc pero ninguna me a funcionado.

La funcion de digitalread es esta:

int digitalRead(uint8_t pin)
{
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);

if (port == NOT_A_PIN) return LOW;

// If the pin that support PWM output, we need to turn it off
// before getting a digital reading.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);

if (*portInputRegister(port) & bit) return HIGH;
return LOW;
}


Gracias de antemano.
26/06/2014 #2
Moderador

Avatar de Chico3001

A que le llamas alta velocidad??
27/06/2014 #3


Chico3001 dijo: Ver Mensaje
A que le llamas alta velocidad??
En Arduino, un clock de un 1MHz.

para obtener algo aproximado a esta señal o esa velocidad de procesamiento, necesito trabajar con Assembler , debido a que me quita mucho tiempo usar la funcion digitalread() (creo que aproximadamente 1.5us), pero si utilizo varias veces esa funcion, el retardo es mayor.

alguna solucion?

como dije probe con lo que recomienda la pagina de arduino "PINB" pero no se como utilizarlo para que funcione igual a digitalread()

Gracias de antemano
28/06/2014 #4


Era error mio , si funciona el PINB
lo tengo asi:
if (PINB == B00101110) ...

Pero me surge otro problema, ya que estoy trabajando con botones que presentan ruido, por lo que hablar de tiempos inferiores a 10us se torna complicado, estoy pensando añadir buffers que quiza sean la solucion.

Para cerrar el tema, como configuro los bits 6 y 7 del puerto B de arduino?
Son los pines donde esta el cristal del atmega que usa el arduino para correr el programa.

Los he configurado como entrada y salida. No se me presento ningun problema ni parece que se haya desconfigurado nada pero no estoy seguro.
DDRB = B11110111;
DDRB = B00110111;

Alguien sabe como deben estar configurados.

Gracias
28/06/2014 #5

Avatar de MikeLunatiko

Para los botones, utiliza retardos en el código:
Código:
if (boton == nivel alto)
{
    retardo 5ms;
    if (boton == nivel alto) //sigue a nivel alto, luego es una pulsación buena
    {
        código
    }
}
o usa un condensador en la entrada para que el nivel de tensión se estabilice.
29/06/2014 #6


Gracias por la ayuda pero si añado retardos se demoraria mas en realizar el proceso, condensadores tampoco me ayudan porque son otro retardo, creo que lo optimo seria añadir un driver o algo asi para trabajar con los pulsadores.

Pude comparar la diferencia entre PINB y digitalRead() y la diferencia aproximadamente es 3.5us que es bastante para lo que quiero hacer.

Exactamente me refiero a la logica de los mandos de NES



Donde cada dato se desarrolla en aproximadamente 10us.

gracias
30/06/2014 #7

Avatar de MikeLunatiko

Los condensadores no añaden un retraso al micro. Sí que añaden un retardo entre la acción de pulsar del usuario y la detección de la misma, pero no importa, porque este tiempo es muy pequeño, y no afecta a la ejecución del programa en el micro. Puesto que no puedes predecir cuándo va a pulsar un botón el usuario, lo mismo da ese retardo.

Pero si estamos hablando el mando de NES, todo esto no hace falta, ya que no accedes físicamente al pulsador, sino que el mando tiene su propio circuito que devuelve una señal digital con la información sobre el botón pulsado.

Si quieres usar un mando de NES, puedes usar esta biblioteca. Le he echado un vistazo al código, y parece que con digitalRead, digitalWrite y delayMicroseconds se apaña. Por supuesto, hacérselo uno mismo es mucho más interesante y gratificante, pero no es óptimo reinventar la rueda si la quieres para alguna aplicación en concreto.

Saludos.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Arduino y Raspberry Pi

Cerrar
Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.