Ich habe ein einfaches Programm erstellt, das auf einen ATMega328P-Chip ( Datenblatt ) gesetzt werden soll. Ich habe mein erstes Programm in ATMEL Studio geschrieben, mit dem ich eine LED mit einer Rate von 0,5 Hz bei extrem geringem Stromverbrauch blinken lassen wollte. Hier ist mein Code:
/*
* GccApplication1.c
*
* Created: 11/12/2017 8:56:49 PM
* Author : Brice
*/
#include <avr/io.h>
#include <util/delay.h>
#include <avr/power.h>
int main(void)
{
clock_prescale_set(clock_div_128); //set the clock to use the 8MHz internal clock divided by 128 for an internal frequency of 250KHz, consumes 0.4mA while not sleeping.
while (1)
{
PORTD4 == 1;//Set pin 13 of the micro to high.
_delay_ms(1000);
PORTD4 == 0;//Set pin 13 of the micro to low;
_delay_ms(1000);
}
}
Ich erwarte, dass dieser Code mit diesem Mikrocontroller PORTD-Register 4 für 1 Sekunde einschaltet und dann für eine Sekunde ausschaltet.
Derzeit hat der PortD4 keine Spannungsänderungen und bleibt geerdet, während das Gerät mit Strom versorgt wird.
Jede Erklärung dazu wäre willkommen!
In diesem Fall verwende ich das Arduino Pro Mini-Board für das Prototyping.
Pin 4 des Pro mini ist mit der gemeinsamen Anode einer RGB-LED verbunden, und der G-Pin der LED ist von einem 510-Ohm-Widerstand mit GND verbunden. Ich habe die Verkabelung mit einem funktionierenden Arduino getestet, und die LED leuchtet sogar bei 3,3 Volt ziemlich hell.
int main(void)
{
clock_prescale_set(clock_div_128); //set the clock to use the 8MHz internal clock divided by 128 for an internal frequency of 250KHz, consumes 0.4mA while not sleeping.
while (1)
{
PORTD4 == 1;//Set pin 13 of the micro to high.
_delay_ms(1000);
PORTD4 == 0;//Set pin 13 of the micro to low;
_delay_ms(1000);
}
}
Das Problem ist, wie Sie den Port "einstellen", den Sie verwenden, ==
der ein Vergleichsoperator ist, keine Zuweisung. Versuchen Sie es einfach mit =
.
void main()
{
DDRD = 0xFF; //PD as output
PORTD= 0x00; //keep all LEDs off
while(1)
{
PORTD &= 0b11110111; //turn LED off
_delay_ms(500); //wait for half second
PORTD |= 0b00001000; //turn LED on
_delay_ms(500); //wait for half second
}
}
Möglicherweise müssen Sie auch die Richtung des Ports irgendwo einstellen. Sie würden dies tun, indem Sie DDRD
to be 0b00001000
setzen, was Pin 4 von Port D auf einen Ausgang setzen sollte.
PORTD
direkt anschreiben, ich habe den einfachsten Weg gezeigt, aber Sie können auch ein bisschen manipulieren, wie zPORTD &= ~(1 << 4)
PORTD = PORTD | 0b00001000;
+=
, ++
, -=
, --
, usw. Es ist nur eine Kurzschrift, es wird zu demselben kompiliert. Ich persönlich finde es einfacher zu lesen.Drei Probleme:
#define F_CPU 8000000UL
in Ihrem Fall.DDRD = 0b00010000
Mit PORTD4 greifen Sie nicht auf diesen Port-Pin zu. Sie würden PORTD verwenden, ähnlich wie ich oben das DDRD-Register demonstriert habe. Persönlich würde ich Ihren Superloop umschreiben zu:
while (1)
{
PORTD ^= 0b00010000;
_delay_ms(1000);
}
Am Ende war das einzige, was am Code falsch war, die Korrekturen, aber das kanonische Hauptproblem dieser Situation war ein fehlerhaftes Arduino-Board. ein einfacher Austausch hat das Problem behoben.
Ron Beyer
Tuskiomi
Benutzer253751
PORTD4 == 1; //CHECK IF pin 13 of the micro to high
. Pin 13 wird nicht gesetzt.Tobias Mädel
Lundin
Tuskiomi
Lundin