¿El voltaje de salida de mi atmega16 es cero?

-4

Estoy escribiendo un programa simple con winavr:

#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
#ifndef F_CPU
#define F_CPU 1000000
#endif
int main (void)
{
void init(void);
while(1){

PORTA = 0xff;
PORTB = 0xff;
PORTC = 0xff;
PORTD = 0xff;
_delay_ms(500);

PORTD = 0x00;
PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
_delay_ms(500);
}
return 0;
}
void init (void)
{
//  Enable Interrupts
sei();
DDRA = 0xff;
PORTA = 0xff;
//  Port b0-3 Initialization to statuse led 
DDRB = 0xff;
PORTB = 0x00;
//  Port C1-7 Initialization to led outpot
DDRC = 0xff;
PORTC = 0x00;
//  Port D4-7 Initialization to key input
DDRD = 0xff;
PORTD = 0xff;
}

Uso usbasp para el programa y IC es nuevo. todo funciona bien y el programador no informa de ningún error, pero cuando se conecta un led a un pin de cada puerto, el led parpadeante tiene muy poca luz y el voltaje de salida del pin también es bajo. ¿Tiene alguna sugerencia sobre este problema? IC dañado? ...

    
pregunta ahmadjn

5 respuestas

3
  

todo el trabajo es bueno y el programador no informa de ningún error, pero cuando se conecta un led a un pin de cada puerto, el led parpadeante tiene muy poca luz y la tensión de salida del pin también es baja. ¿Tiene alguna sugerencia sobre este problema? IC dañado?

Como no conocemos ninguna de las especificaciones de su configuración, no podré entrar en demasiados detalles. Sin embargo, la buena noticia es que todo suena como si estuviera funcionando.

El voltaje que producirá un pin, depende del voltaje de entrada para el AtMega16. (Hay algunas excepciones, como el puerto A, etc., pero lo mantendré básico). Entonces, si la MCU funciona con 3vDc y debería esperar ver 3v en un pin de salida que esté activo.

La corriente máxima que puede suministrar (proporcionar) el AtMega16 es de 20 mA. Esto no es demasiado Esta es la razón por la que las personas suelen usar un transistor que se activa mediante un pin Atmega, para controlar los dispositivos que necesitan más energía. Aquí hay un ejemplo del uso de un transistor:

YaquenosabemosquétipodeLEDestáusandoycuálessonsusespecificaciones,¡elhechodequepuedaverloparpadearesfantástico!Aunqueestáoscuro,parecequetienestodolistoyfuncionando.TambiéndeboseñalarqueF_CPU1000000eslafrecuenciaconlaqueseejecutaelchip.Sielchipesnuevoynolotieneconectadoaunafuentederelojexterna,creoquetienelaconfiguracióncorrecta.LamayoríadelosAtMegavienenconunosciladorinternode8Mhzyunjuegodefusiblesdivididopor8,porloquelafrecuenciadeoperaciónpredeterminadaesde1Mhz.

Comodijo@ChintalagiriShashank,delay_ms()debeusarseconvaloresmenoresa262ms/MHz.Aquíestáelextractodela Documentación AVR-GCC :

  

El retraso máximo posible es de 262.14 ms / F_CPU en MHz.

     

Cuando el usuario solicite un retraso que exceda el máximo posible,   _delay_ms () proporciona una funcionalidad de resolución disminuida. En este modo, _delay_ms () trabajará con una resolución de 1/10 ms, proporcionando   Retrasos de hasta 6.5535 segundos (independientemente de la frecuencia de la CPU). El usuario   no será informado sobre la resolución disminuida.

     

Si la cadena de herramientas avr-gcc tiene __builtin_avr_delay_cycles (sin signo largo)   soporte, el retraso máximo posible es 4294967.295 ms / F_CPU en MHz. por   valores mayores que el máximo retraso posible, los desbordamientos resultan en   sin demora, es decir, 0 ms.

Aquí hay una versión más limpia de tu código, aunque solo funciona con el Puerto B.

int main (void)
{
    DDRB = 0xff; // Set Data Direction for port B as output
    sei();  //  Enable Interrupts
    while(1){
        PORTB = 0xff; // 'turn on' all port B pins
        _delay_ms(250);
        _delay_ms(250);
        PORTB = 0x00; // Clear all port B pins
        _delay_ms(250);
        _delay_ms(250);
    }
    return 0;
}

Anexo

Como AngryEE señalado , también debe definir F_CPU ANTES DE #include <util/delay.h> . Así:

#define F_CPU 1000000
#include <util/delay.h>
    
respondido por el Garrett Fogerlie
1

F_CPU debe definirse ANTES de incluir delay.h. De lo contrario su tiempo estará apagado. Eso es casi seguramente parte de tu problema.

    
respondido por el AngryEE
1

Aunque has publicado una respuesta, no has explicado por qué lo estás viendo.

El código

int main (void)
{
 void init(void);

declara un vacío - > La función void se llama init , en lugar de llamar a la función void. Una declaración de función dentro de una definición de función es perfectamente válida en C o C ++, por lo que no recibirá una advertencia o error. Las declaraciones múltiples dentro de una 'unidad de compilación' (el archivo y todos los archivos que incluye) no son un error mientras sean compatibles.

Debido a que su función init está declarada pero no se llama, todos los puertos quedan como entradas.

Este código se ejecuta en el bucle

PORTA = 0xff;
PORTB = 0xff;
PORTC = 0xff;
PORTD = 0xff;

La configuración de PORTx tiene un comportamiento diferente dependiendo de si el puerto es de salida o entrada.

Para un puerto de entrada, habilita las resistencias de pull-up internas. En el Atmega16 estos están entre 20kΩ y 50kΩ.

Entonces, alternativamente, está conectando el LED a 5V a través de varias decenas de kΩ, y será menos brillante de lo deseado.

    
respondido por el Pete Kirkham
0

¡ENCONTRÉ el problema! El problema no es acerca del error F-cpu, _delay_ms (), tipo de led, voltaje de entrada ... Olvido una nota:

int main (void)
{
 void init(void);
 while(1){...

en esta función, init () debe estar antes de la función principal

**void init (void);**
int main (void)
{
 init();
 while(1){...

el problema se solucionó y gracias por todo (incluso para las personas que dan mi pregunta "-" o para las personas que no están listas, mi pregunta es cuidadosa !!!!

    
respondido por el ahmadjn
0

Tu pin ya está configurado para ingresar. No salida.
Tienes que usar esta declaración: DDRA=0x01;

    
respondido por el Saeed

Lea otras preguntas en las etiquetas