desktop

Usar variables en retardos en C de Atmel studio.

Saludos, espero el titulo esté bien.
Necesito ésto, pero no lo logro, me da error, estoy empezando a usar Atmel studio 7, en lenguaje C.
Quiero cargar la variable tiempo, en el retardo. como se ve en el código, pero me da error, me dice que cree una función, pero no encuentro un ejemplo de como hacerlo.
esto, _Delay_us(100); funciona. Esto; _delay_us(tiempo); da error, como se ve. Agradezco la ayuda.

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
unsigned long tiempo;

int main(void)
{
tiempo= 100;
while (1)
{
_delay_us(tiempo);
//PORTA ^=0x01;
_delay_us(tiempo);
}
}
mensaje:
Severity Code Description Project File Line
Error __builtin_avr_delay_cycles expects a compile time integer constant blink_variable c:\program files (x86)\atmel\studio\7.0\toolchain\avr8\avr8-gnu-toolchain\avr\include\util\delay.h 276
 
El C es case sensitive delay≠Delay
Si delay está definida funciona, si quieres usar Delay no está definida y no funciona.
Tendrás que definir la función, algo así:

void Delay(tiempo){
delay(tiempo);
}

O algo así, creo que al revés, que Delay si que esxiste y delay no. Aunque no le veo sentido a hacer eso.
 
Última edición:
Hola scooter.
Lo que me sugieres, ya lo intenté, pero no me funcionó.
El retardo en en C de atmel estudio 7, me lo recibe así, en caso de milis o microsegundos _delay_us (tiempo); con el guion abajo antes, si no da error.
'---------------
Int retardo = 100; //solo un ejemplo.
While(){
PORTA1=^0X01;
delay(retardo) //llamo a funcion, que me escribes
}
La cuesntion es que llega ahi, y sale, retorna normal, pero no ejecuta el retrdo. Subo el valor del registro retardo para probar.
El sentido que tiene esto, esto es hacer unas luces de velocidad variable, con un potenciómetro, conectado a alguno de los canales del adc. Pero para simplificar, estoy probando primero que esto funcione.
En CCS C de pic, trabaja tal cual sin funcion, pero estoy aprendiendo es Atmel studio. Gracias, por cualquier otro comentario, estoy atento.
 
Pues la verda pensé, que Atmel studio era más flexible, tal cual los compiladores para pics.
Era lo que no quería, tener que cargar un timer, para algo tan simple.
De todas formas, si saben una silucion lo agradezco. La idea mia es aprender por saber, igual le voy a seguir luchando con delay. Dejo la pregunta abierta por unos dias más, cualquier cosa me comentan.Gracias.:cry:
 
Dos cosas:

1- Tiempo es distinto a tiempo, tal como te dijo Scooter arriba, en C las mayúsculas y minúsculas se diferencian. Los mismo ocurre con _D y _d.

2- La función recibe una variable del tipo double, usá una variable de ese tipo. De lo contrario castea:

Código:
unsigned long tiempo = 100;
_delay_us ((double)(tiempo));
 
Gracias amigo cosmefulanito04.
Pues esa era la respuesta que esperaba, no entendía muy bien, y ya funciona.
Gracias a todos por su ayuda. En aras de seguir avanzando, y si me pueden recomendar algún sitio, donde hayan librerias fuera de microchip, se los agradezco, me refueiro librerias de usurios. Un saludo, que gran foro.
 
Bueno, me parece que abrí muy rapido la boca. haciendo pruebas ya con adc, y enviando al puerto del atmega trabaja perfecto sin meter retardo con el potenciómetro.
/*--------------------------------------------------
estas lineas de trabajan perfecto
/*---------------------------------------------------
unsigned long tiempo = 100;
_delay_us((double)(tiempo));
PORTB ^= 0x01;

/********************************************************
estas lineas ya no trabajan, da error, y creo que me esta diciendo que espera una constante entero
de compilación.
Ahora como paso ese registro ADC, a esa constante, si es que eso es lo que me dice.
/***************************************************************
unsigned long tiempo = ADC;
_delay_us((double)(tiempo));
PORTB ^= 0x01;
/*-----------------------------------------------------
ERROR.
__builtin_avr_delay_cycles expects a compile time integer constant.
 
Este tipo de programa, lo hago para pic en CCS C PCW, sin ningun problema, por la catidad de librerías, donde las operaciones se hacen directas.
Pero esto es un tanto diferente, además por los manuales que he leido, no encuentro nada al respecto. Ya el valor del registro adc, esta en la variable tiempo, pero el retardo no lo toma, y es eso lo que ni idea. Por supuesto y como dije al principio, estoy aprendiendo.
 
Última edición:
Te lo estaban diciendo desde hace rato caramba, con razón no termina la gente su bachillerato, no leen.
Otra cosa ave studio es plataforma ANSI C, Pic C compiller o CCS no es ANSI.
No te confundas o mejor lee.
 
Ya te dije, no es es ANSI el pic C compiller.
Por eso es diferente es la sopa instantánea, sería un insulto que fueras a un restaurante y te dieran sopa instantánea.

No digo que no sirva , yo lo e usado pero te atrofia el cerebro por lo fácil que es.

Un ADC se tiene que declarar el registro del microcontrolador y hacer una función.
Ccs ya tiene esa función hecha y no se ve como está hecha.

No te escudes con estoy aprendiendo soy nuevo, no hay nada en castellano .
Yo veo mucho programador aferrado a los delays y a las librerías cuestionables.
 
Hola.
Esas funciones solo reciben valores constantes... es decir si necesitas un delay de 100, pon 100 y no una variable de valor 100.
o es envolver ese delay dentro de una función que contenga un bucle, entonces ahí si puedes variar cuantas veces quieres repetir dicho bucle que contiene ese delay de valor estático. Obviamente no es preciso.

Saludos
 
Era para usar el valor capturado por el ADC, como valor del retardo. Pero ya lo hice con ciclo for, y ajustando la frecuencia minima y maxima, con dos variables.
Con ésto, ya queda solucionado el tema. Gracias.
 
Atrás
Arriba