Problema de prueba del microcontrolador AVR

Recientemente, mi microcontrolador no ejecuta ningún programa, estoy probando el siguiente código:

#include <mega32.h>
#include <delay.h>
#define xtal 16000000
void main(void)
{
    DDRA=0xFF;
    DDRB=0xFF;
    DDRC=0xFF;
    DDRD=0xFF;

    while (1)       
    {
        PORTA=0x00;
        PORTB=0x00;
        PORTC=0x00;
        PORTD=0x00;
        delay_ms(500);
        PORTA=0xFF;
        PORTB=0xFF;
        PORTC=0xFF;
        PORTD=0xFF;
        delay_ms(500);
    }
}

He probado cuatro controladores diferentes, tanto mega32a como mega16a. El código es compilado por CodeVisionAVR Evaluation y programado por Atmel Studio 6.1 (también probé PROGISP). El programador es una programación MK2 e ISP original.

Fusibles:

  • bajo: 0xEF
  • Alto: 0xC9

Cristal de reloj interno y externo probado. LED con 220 Ω resistencia conectada a un pin.

Otro código de prueba:

Cuando programo el siguiente código:

#include <mega32.h>
#include <delay.h>
void main(void)
{
    DDRA=0xFF;
    DDRB=0xFF;
    while (1)       
    {
        PORTA=0x00;
        PORTB=0x00;
        delay_ms(500);
        PORTA=0xFF;
        PORTB=0xFF;
        delay_ms(500);
    }
}  

Todos los LED están apagados, y cuando programo el siguiente código:

#include <mega32.h>
#include <delay.h>
void main(void)
{
    DDRA=0xFF;
    DDRB=0xFF;
    while (1)       
    {
        PORTA=0xFF;
        PORTB=0xFF;
        delay_ms(500);
        PORTA=0x00;
        PORTB=0x00;
        delay_ms(500);
    }
}

Todos los LED están encendidos. ¿Cuál es el problema? Otra prueba:

#include <mega32.h>
#include <delay.h>
#define xtal 16000000
void main(void)
{
    DDRA=0xFF;
    DDRB=0x01;
    while (1)       
    {
       PORTA=0x00;
       PORTB=0x02;
       delay_ms(500);
       PORTA=0xFF;
       PORTB=0x00;
       delay_ms(500);
    }
}

El segundo pin del puerto B tiene poca luz y PORTB=0x00;después delay_ms(500);No importa si es: 0x00;o0xFF;

¿Ha definido la macro F_CPU?
Defino "#define xtal 16000000". ¿Es cierto y suficiente?
¿Cómo implementa delay_ms() el retraso? ¿Se basa en un periférico Timer? ¿Has configurado el periférico Timer?
No configuré el periférico del temporizador. La configuración del temporizador está predeterminada.
#define xtalno hará absolutamente nada en absoluto, no lo usará en ningún lado. Además, los #defines son visibles solo en el archivo en el que están definidos y cualquiera que incluya el archivo. <delay.h>no va a ver nada de ti #defineen tu archivo c. Debe definir F_CPU globalmente. Asumiendo GCC, puede usar el interruptor de línea de comando:-DF_CPU=16000000

Respuestas (1)

De lo que declaró en la última declaración sobre dos códigos, uno con todos los LED encendidos y otro apagado, primero suponga que estas condiciones son verdaderas:

  • La programación se realiza sin ningún error y la verificación de datos con el programador es válida.
  • Has probado diferentes MCU con este problema.
  • Sus MCU no se sobrecalientan y consumen poca corriente. (Sugiero medir el consumo actual de MCU. No debe ser cero o cien de miliamperios).

Entonces el problema es sobre su reloj. Debido a que la diferencia de sus dos últimos códigos se trata principalmente de antes de la declaración "delay_ms (500)". Entonces creo que el problema se relaciona con el reloj de su MCU. En primer lugar, compruebe la frecuencia de su programa mediante:

Proyecto->Configurar->C-Compiler->Frecuencia de reloj.

y asegúrese de que sea 8 en la unidad de megahercios.

Ahora cambie sus bits de fusible MCU a:

BAJO: 0xE4

Alto: 0xD9

¡Ahora esperamos que su código funcione bien!

He hecho todas estas cosas. Pero el problema sigue sin resolverse.
Ejecutarías un programa como este y verías qué sucede: DDRB=0x01; PUERTOB=0x02; En while(1) : PORTB.0=PINB.1; y acoplar un Pulsador a B.1 y una serie de led con 220R a B.0. Verlo funcionar o no.
Sí, funciona muy bien.
@musefian Entonces el problema es principalmente sobre el reloj y tal vez su función de retraso. Pruebe algunas partes internas de su MCU, como temporizadores / contadores, y vea si la salida de la onda PWM en la salida del temporizador es como la configuró o no. por ejemplo, haga una salida de 1 Hz y pruébela con un LED de la manera más fácil.