USB ASP con Atmega 328p no puede parpadear un simple LED parpadeando

1

Quería parpadear un led cada 1s conectado con el pin PORTB0 del microprocesador Atmega 328p. He usado el programador USBASP. La conexión USBASP con 328p es así: MOSI-17 MISO-18 SCK-19 RESET-1 GND-8 VCC-7 He usado un LM7805 para alimentar el microprocesador de la batería de 9 V, he usado dos condensadores de 1uF en el puerto de entrada y salida del LM7805. Quería implementar este código:  

LoquedeberíacambiarelLEDenportb0encada1s.

Peromiledcomienzaabrillarduranteunos5segundosdespuésdequeelmicroprocesadorsehayaquemadoysiguebrillando,nosedetieneenningúnmomentodespuésdeeso.

laventanadesalidadeatmelstudio7muestraesto:

avrdude.exe:warning:cannotsetsckperiod.pleasecheckforusbaspfirmwareupdate.avrdude.exe:AVRdeviceinitializedandreadytoacceptinstructionsReading|##################################################|100%0.00savrdude.exe:Devicesignature=0x1e950favrdude.exe:NOTE:FLASHmemoryhasbeenspecified,anerasecyclewillbeperformedTodisablethisfeature,specifythe-Doption.avrdude.exe:erasingchipavrdude.exe:warning:cannotsetsckperiod.pleasecheckforusbaspfirmwareupdate.avrdude.exe:readinginputfile"C:\Users\Rony\Documents\Atmel Studio.0st avr progst avr prog\Debugst avr prog.hex"
avrdude.exe: writing flash (196 bytes):

Writing | ################################################## | 100% 0.14s

avrdude.exe: 196 bytes of flash written
avrdude.exe: verifying flash memory against C:\Users\Rony\Documents\Atmel Studio.0st avr progst avr prog\Debugst avr prog.hex:
avrdude.exe: load data flash data from input file C:\Users\Rony\Documents\Atmel Studio.0st avr progst avr prog\Debugst avr prog.hex:
avrdude.exe: input file C:\Users\Rony\Documents\Atmel Studio.0st avr progst avr prog\Debugst avr prog.hex contains 196 bytes
avrdude.exe: reading on-chip flash data:

Reading | ################################################## | 100% 0.10s

avrdude.exe: verifying ...
avrdude.exe: 196 bytes of flash verified

avrdude.exe: safemode: Fuses OK

avrdude.exe done.  Thank you.

¿CUÁL ES EL PROBLEMA?

También he usado un reloj externo de 16 mhz, pero aún muestra el mismo resultado.

Uno de mis amigos me dijo que en Windows 10 tengo que apagar la firma del dispositivo. He apagado la firma del dispositivo y, cuando intenté actualizar el controlador nuevamente, muestra que mi controlador ya está actualizado, por lo que no lo hago. tomar un nuevo controlador.

    
pregunta Zarzisur

3 respuestas

0

Tu código está funcionando bien. Creo que el problema está en el software de programación; deberá actualizar el firmware del programador si se trata de un USBASP antiguo y hecho en casa.

Además, si simplemente está intentando crear un indicador luminoso LED, no es necesario utilizar una frecuencia de reloj adicional. Eliminar

#define F_CPU 1000000UL

Y vuelva a intentarlo, o puede probar con otras herramientas de actualización.

    
respondido por el Aneesh P K
0

Su código se ve bien, sin embargo, tengo algunas sugerencias:

Al escribir salidas, use PORTB0 istead of PINB0, hace que el código sea más comprensible. Sin embargo, esto no debería hacer una diferencia en la funcionalidad.

Compruebe los fusibles. Mencionó que probó con un cristal externo, pero ¿recordó escribir LOW.SUT_CKSEL en un cristal externo de 16Mhz? También recuerda el CKDIV8 que divide la velocidad del reloj por 8.

Asegúrate de haber recordado compilar el código antes de subir.

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
    DDRB |= (1<<PORTB0);
    PORTB &= ~(1<<PORTB0);
    while (1) 
    {
        _delay_ms(1000);
        PORTB ^= (1<<PORTB0);
    }
}
    
respondido por el cutdact
-1

La salida que ha mostrado indica que su código ha sido transmitido a la ATMega correctamente para que esa parte sea buena.

Estoy un poco confundido por el XOR que estás haciendo para parpadear el led. Prueba esta muestra que definitivamente funciona y es solo ligeramente diferente. Entonces, al menos sabrá que tiene un buen código de trabajo y podemos ir desde allí.

Aquí hay una versión mucho más simple de LED parpadeante que puedes probar:

// ------- Preamble -------- //
#include <avr/io.h>                        /* Defines pins, ports, etc */
#include <util/delay.h>                     /* Functions to waste time */


int main(void) {

  // -------- Inits --------- //
  DDRB |= 0b00000001;            /* Data Direction Register B:
                                   writing a one to the bit
                                   enables output. */

  // ------ Event loop ------ //
  while (1) {

    PORTB = 0b00000001;          /* Turn on first LED bit/pin in PORTB */
    _delay_ms(1000);                                           /* wait */

    PORTB = 0b00000000;          /* Turn off all B pins, including LED */
    _delay_ms(1000);                                           /* wait */

  }                                                  /* End event loop */
  return 0;                            /* This line is never reached */
}

Esto es del fantástico libro, Make: AVR Programming de Elliot Williams .

Puede obtener el código (y todas las muestras de código de ese libro) en su sitio github: enlace

EDITAR: confirmar que se ejecuta el código de OP

He recreado el código del OP en TinkerCad con un Arduino UNO y ese código debería ejecutarse sin cambios.
Puede ver el código del OP que se ejecuta en TinkerCad yendo a: NOTA SOBRE TINKERCAD

Debes iniciar sesión en tinkercad o te dará una página solicitada que ha caducado. Eso no es un muy buen error. El enlace no ha caducado realmente.

Por lo tanto, el código real es, de hecho, correcto. En este punto, se desconoce por qué no se ejecutó el código para el OP.

NOTA :

Verá que el LED está conectado a D8 en el Uno. Esto se debe a que la DDRB está vinculada a los pines 8-13 en la UNO. Esto se explica en: enlace

    
respondido por el raddevus

Lea otras preguntas en las etiquetas