Creé un programa simple para ponerlo en un chip ATMega328P ( Hoja de datos ). Escribí mi primer programa en el estudio ATMEL que quería usar para hacer parpadear un LED a una velocidad de 0,5 Hz con un consumo de energía extremadamente bajo. Aquí está mi código:
/*
* 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);
}
}
Lo que espero que este código le haga a este microcontrolador es activar el registro 4 de PORTD durante 1 segundo y luego apagarlo durante un segundo.
Actualmente, el PortD4 no sufrirá ningún cambio de voltaje y permanecerá conectado a tierra mientras el dispositivo esté alimentado.
¡Cualquier explicación de esto sería apreciada!
Para este caso, estoy usando la mini placa Arduino Pro para la creación de prototipos.
El pin 4 del Pro mini está conectado al ánodo común de un LED RGB, y el pin G del LED está conectado desde una resistencia de 510 ohmios a GND. He probado el cableado con un arduino que funciona, y el LED incluso se enciende a 3,3 voltios con bastante intensidad.
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);
}
}
El problema es cómo "establece" el puerto, está utilizando, ==
que es un operador de comparación, no una asignación. Intente simplemente usar =
.
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
}
}
Es posible que también deba establecer la dirección del puerto en alguna parte. Haría esto configurando el DDRD
to be 0b00001000
, que debería configurar el pin 4 del puerto D en una salida.
PORTD
directamente, mostré la forma más fácil, pero también puede hacer un poco de manipulación, comoPORTD &= ~(1 << 4)
PORTD = PORTD | 0b00001000;
+=
, ++
, -=
, --
, etc. Es solo abreviatura, se compila de la misma manera. Personalmente me resulta más fácil de leer.Tres problemas:
#define F_CPU 8000000UL
en tu caso.DDRD = 0b00010000
PORTD4 no es cómo accede a ese pin de puerto. Usaría PORTD, de manera similar a como demostré el registro DDRD anterior. Personalmente, reescribiría tu superloop a:
while (1)
{
PORTD ^= 0b00010000;
_delay_ms(1000);
}
Al final, lo único que estaba mal con el código eran las correcciones, pero el principal problema canónico de esta situación era una placa arduino defectuosa. un simple reemplazo solucionó el problema.
Ron Beyer
tuskiomi
usuario253751
PORTD4 == 1; //CHECK IF pin 13 of the micro to high
. No establece el pin 13.Tobias Madel
Lundin
tuskiomi
Lundin