Zitat Zitat von pweyrich Beitrag anzeigen
Das einfache Blink-Programm läuft auf dem µC, aber die erwarteten Zeiten stimmen nicht, anstatt 8s braucht die Hauptschleife 8x solange.
Hallo,
klingt danach, als wenn die CKDIV8 fuse programmed ist. Die teilt den Takt im Prescaler noch durch 8. Also Fuse Bit unprogrammen oder:

Im CLKPR Register kann man die, von der Fuse gesetzten CLKPS0 und CLKPS1 Bits wieder löschen. Allerdings muß man erst das CLKPCE Bit setzen. Hast Du schon richtig gemacht. Aber es fehlt das Löschen der CLKPCE Bits innerhalb von vier Taktzyklen nach setzen des CLKPCE Bits. Also einfach nochmal das gleiche "CLKPR = 0b10000000;" hinterher

Code:
#include <avr/io.h>
#include <stdint.h>
// #define F_CPU 2000000UL // <- damit komm ich auf die 8s
#include <util/delay.h>

int main(){
    CLKSEL0 |= (1 << EXTE);   // CKSEL0.EXTE = 1; // Enable_external_clock();
    while ( (CLKSTA & (1 << EXTON)) == 0 ){} // while (CLKSTA.EXTON != 1);    // while (!External_clock_ready()); 
    CLKSEL0 |= (1 << CLKS);   // CLKSEL0.CLKS = 1;    //  Select_external_clock(); 
    CLKPR = 0b10000000;  // Unterschiedliche Einstellungen des Prescalers wirken sich nicht aus.
    CLKPR = 0b10000000;    
    uint8_t aPLLCSR = PLLE;
    aPLLCSR |= PLLP0;  // Damit sollten die 16MHz halbiert werden-
    PLLCSR |= aPLLCSR;    // PLLCSR.PLLE = 1; // Enable_pll(); 
    CLKSEL0 &= ~(1 << RCE);   // CLKSEL0.RCE = 0; // Disable_RC_clock(); 
    while ( (PLLCSR & (1 << PLOCK)) == 0){}   // while (PLLCSR.PLOCK != 1);   // while (!Pll_ready()); 
    USBCON &= ~(1 << FRZCLK); // USBCON.FRZCLK = 0;   // Usb_unfreeze_clock(); 
    
    DDRB=1;
    while(1) {
        for (uint8_t i=0; i<5; i++){ // 5x1s -> 5s
            PORTB=0;
            _delay_ms(500);
            PORTB=1;
            _delay_ms(500);
        }
        for (uint8_t i=0; i<30; i++){ // 30x 0,1s -> 3s
            PORTB=0;
            _delay_ms(50);
            PORTB=1;
            _delay_ms(50);
        }
    } // Insgesamt 8s, aber es dauert ca. 64s
}
Auszug aus Datenblatt 7799E–AVR–09/2012 zum CLKPR Register im ATmega32U2:
• Bit 7 – CLKPCE: Clock Prescaler Change Enable
The CLKPCE bit must be written to logic one to enable change of the CLKPS bits. The CLKPCE
bit is only updated when the other bits in CLKPR are simultaneously written to zero. CLKPCE is
cleared by hardware four cycles after it is written or when CLKPS bits are written. Rewriting the
CLKPCE bit within this time-out period does neither extend the time-out period, nor clear the
CLKPCE bit.

Gruß
Searcher