avr attiny84: retraso incorrecto

3

Soy bastante nuevo en la programación avr. Estoy enfrentando un problema extraño que no puedo resolver hasta ahora.

He escrito un código simple:

#include <avr/io.h>
#include <util/delay.h>

int main(void) {

    DDRA = 0XFF;

    for (;;){
        PORTA = 0xFF;
        _delay_ms(1000);
        PORTA = 0x00;
        _delay_ms(1000);
    }

    return 0x00;
}

Estoy configurando la F_CPU (el valor utilizado por _delay_ms ()) a través del Makefile que estoy usando para compilar y cargar el código:

DEVICE     = attiny84
CLOCK      = 20000000
PROGRAMMER = -c usbasp -P /dev/tty.usb* -b 19200 
OBJECTS    = main.o dallas_one_wire.o
FUSES      = -U lfuse:w:0x62:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m


######################################################################
######################################################################

# Tune the lines below only if you know what you are doing:

AVRDUDE = avrdude $(PROGRAMMER) -p $(DEVICE)
COMPILE = avr-g++ -Wall -Os -DF_CPU=$(CLOCK) -mmcu=$(DEVICE)

# symbolic targets:
all:    main.hex

.c.o:
    $(COMPILE) -c $< -o $@

.S.o:
    $(COMPILE) -x assembler-with-cpp -c $< -o $@
# "-x assembler-with-cpp" should not be necessary since this is the default
# file type for the .S (with capital S) extension. However, upper case
# characters are not always preserved on Windows. To ensure WinAVR
# compatibility define the file type manually.

.c.s:
    $(COMPILE) -S $< -o $@

flash:  all
    $(AVRDUDE) -U flash:w:main.hex:i

fuse:
    $(AVRDUDE) $(FUSES)

install: flash fuse

# if you use a bootloader, change the command below appropriately:
load: all
    bootloadHID main.hex

clean:
    rm -f main.hex main.elf $(OBJECTS)

# file targets:
main.elf: $(OBJECTS)
    $(COMPILE) -o main.elf $(OBJECTS)

main.hex: main.elf
    rm -f main.hex
    avr-objcopy -j .text -j .data -O ihex main.elf main.hex
# If you have an EEPROM section, you must also create a hex file for the
# EEPROM and add it to the "flash" target.

# Targets for code debugging and analysis:
disasm: main.elf
    avr-objdump -d main.elf

cpp:
    $(COMPILE) -E main.c

Con respecto a la hoja de datos de attiny84 , debe funcionar a 20Mhz a menos de 5 voltios.

Lamentablemente, el led no parpadea a una velocidad de 1 por segundo, pero en realidad es un poco más de 10 segundos.

Al ajustar el valor F_CPU, he alcanzado la velocidad de parpadeo de 1 segundo al usar F_CPU = 1000000 (1Mhz)

¿Eso significa que el attiny84 está ejecutando un 1Mhz o estoy equivocado en otra parte?

    
pregunta Kami

2 respuestas

5

Supuesto: está conduciendo el ATTiny84 con su reloj RC interno.

Para que el ATTiny84 funcione a 20 MHz, el microcontrolador deberá contar con un reloj externo de 20 MHz, que generalmente se logra con un cristal o resonador de 20.0 MHz y dos capacitores de carga. De la hoja de datos :

Además,deberáconfigurarlosfusiblesdeformaadecuadaparaqueelmicrocontroladorutiliceunosciladorexternoenlugardelinterno.

Puedecalcularlosbitsdeconfiguracióndefusiblequenecesitaparaelcristalexterno,seleccionandoelAVRespecífico aquí . Información adicional útil en esta respuesta a una pregunta relacionada en este sitio.

    
respondido por el Anindo Ghosh
2

El ATtiny se está ejecutando a (aproximadamente) 1MHz.

De la hoja de datos :

6.2.6 Fuente de reloj predeterminada

El dispositivo se envía con CKSEL="0010", SUT="10" y CKDIV8 programado. Por lo tanto, la configuración de la fuente de reloj predeterminada es el Oscilador interno que se ejecuta a 8,0 MHz con el tiempo de inicio más largo y un ajuste inicial del reloj del sistema de 8, que da como resultado un reloj del sistema de 1,0 MHz . Esta configuración predeterminada garantiza que todos los usuarios puedan realizar la configuración de fuente de reloj deseada utilizando un sistema o programador de alto voltaje.

El Capítulo 6.2 explica cómo funciona la selección de reloj para este ATtiny, pero tenga cuidado, al seleccionar una frecuencia de reloj demasiado lenta (por ejemplo, 128 kHz) puede evitar que reprograme el dispositivo a menos que use un programador de "alto voltaje". Los fusibles utilizan lógica negativa, lea el capítulo cuidadosamente antes de programarlos.

La Tabla 19-5 explica que 'Fuse Low Byte' tiene un valor predeterminado de 0x62, donde bit7 es 0, pero indica que el reloj de 8MHz está dividido por 8. (por lo tanto, lógica negativa).

Muchas aplicaciones funcionan perfectamente bien en el reloj inferior, lo que tiene la ventaja de un menor consumo de energía. Depende totalmente de su aplicación si realmente necesita un reloj más alto o no. Solo establece F_CPU en el valor aplicable. F_CPU informa al compilador sobre qué tan rápido es el reloj del controlador, no establece el reloj del controlador.

    
respondido por el jippie

Lea otras preguntas en las etiquetas