Testproblem des AVR-Mikrocontrollers

In letzter Zeit führt mein Mikrocontroller kein Programm aus, ich teste den folgenden Code:

#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);
    }
}

Ich habe vier verschiedene Controller getestet, sowohl mega32a als auch mega16a. Der Code wird von CodeVisionAVR Evaluation kompiliert und von Atmel Studio 6.1 programmiert (ich habe auch PROGISP ausprobiert). Der Programmierer ist eine originale MK2- und ISP-Programmierung.

Sicherungen:

  • niedrig: 0xEF
  • Hoch: 0xC9

Interner und externer Uhrenquarz getestet. LED mit 220 Ω Widerstand an einem Pin angeschlossen.

Ein weiterer Testcode:

Wenn ich folgenden Code programmiere:

#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);
    }
}  

Alle LEDs sind aus, und wenn ich den folgenden Code programmiere:

#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);
    }
}

Alle LEDs sind an. Was ist das Problem? Ein weiterer Test:

#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);
    }
}

Zweiter Pin von Port B ist auf schwachem Licht und PORTB=0x00;nach delay_ms(500);Egal ob: 0x00;oder0xFF;

Haben Sie das Makro F_CPU definiert?
Ich definiere "#define xtal 16000000".ist es wahr und genug?
Wie implementiert delay_ms() die Verzögerung? Verlässt es sich auf ein Timer-Peripheriegerät? Haben Sie das Timer-Peripheriegerät eingerichtet?
Ich habe das Timer-Peripheriegerät nicht eingerichtet. Die Timer-Einstellungen sind voreingestellt.
#define xtalwird überhaupt nichts tun - Sie verwenden es nirgendwo. Auch #defines sind nur in der Datei sichtbar, in der sie definiert sind, und in allen, die die Datei enthalten. <delay.h>wird nichts sehen, was Sie #definein Ihrer c-Datei. Sie müssen F_CPU global definieren. Unter der Annahme von GCC können Sie den Befehlszeilenschalter verwenden:-DF_CPU=16000000

Antworten (1)

Nehmen Sie von dem, was Sie in der letzten Aussage über zwei Codes erklärt haben, einen mit allen LEDs an und andere alle aus, zunächst an, dass diese Bedingungen wahr sind:

  • Die Programmierung erfolgt fehlerfrei und die Überprüfung der Daten mit dem Programmiergerät ist gültig.
  • Sie haben verschiedene MCU mit diesem Problem ausprobiert.
  • Ihre MCUs werden nicht überhitzt und verbrauchen wenig Strom. (Ich schlage vor, den Stromverbrauch der MCU zu messen. Er sollte nicht null oder hundert Milliampere betragen.)

Dann liegt das Problem an Ihrer Taktung. Denn der Unterschied Ihrer beiden letzten Codes betrifft hauptsächlich die Anweisung "delay_ms (500)". Dann denke ich, dass das Problem mit der Taktung Ihrer MCU zusammenhängt. Überprüfen Sie zunächst die Häufigkeit Ihres Programms, indem Sie:

Projekt->Konfigurieren->C-Compiler->Taktfrequenz.

und stellen Sie sicher, dass es 8 in Megahertz-Einheit ist.

Ändern Sie nun Ihre MCU-Fuse-Bits in:

NIEDRIG: 0xE4

Hoch: 0xD9

Jetzt erwarten wir, dass Ihr Code gut läuft!

Ich habe all diese Dinge getan. Aber das Problem ist immer noch ungelöst.
Würden Sie ein Programm wie dieses ausführen und sehen, was passiert: DDRB=0x01; PORTB=0x02; Während (1) : PORTB.0 = PINB.1; und befestigen Sie einen Taster an B.1 und eine LED-Serie mit 220R an B.0. Sehen Sie, ob es funktioniert oder nicht.
Ja, es funktioniert sehr gut.
@musefian Dann geht es hauptsächlich um das Takten und vielleicht um Ihre Verzögerungsfunktion. Probieren Sie einige interne Teile Ihrer MCU aus, z. B. Timer / Zähler, und prüfen Sie, ob die ausgegebene PWM-Welle am Timer-Ausgang so ist, wie Sie sie konfigurieren, oder nicht. Machen Sie zB einen 1Hz-Ausgang und testen Sie ihn auf einfachste Weise mit einer LED.