Forum: Mikrocontroller und Digitale Elektronik ATtiny1614 CPU Takt Problem


von Mr. AVR (Gast)


Lesenswert?

Hallo,

ich versuche aktuell die neuen Attiny1614 in Betrieb zu nehmen.

Ich habe 5V am Chip, Fuses in Standard-Einstellungen (20MHz RC, kein 
OSCLOCK). Ich habe ein Programm, besser gesagt "nichts". Es ist einfach 
nur:

#define F_CPU 20000000UL

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


int main(void)
{
   while(1)
   {
      PORTA.OUTTGL = (1<<PIN6_bp);
      _delay_ms(1000);
      wdt_reset();
   }
}



Die LED sollte jetzt jede sek einmal aufblinken (0,5 Hz blinken).
Ich habe hier einen ermittelten Takt von ca. 5 Mhz. Wie geht das?! Was 
mache ich falsch?!

von Mr. AVR (Gast)


Lesenswert?

Ich habe das Problem so halb gefunden. Da scheint wohl ein Prescaler 
nach dem Reset noch aktiv zu sein. Aktuell finde ich das Register zwar 
noch nicht womit ich den auf 1 schalte, aber irgendwie ist das 
schwachsinnig.

von Jim M. (turboj)


Lesenswert?

Mach mal den Wert bei _delay_ms() kleiner, IIRC kann das überlaufen.

Ich sehe kein Setzen des Pinmode auf "Ausgang", aber mit nur dem weak 
Pullup käme man doch eigentlich nicht bis auf 5 MHz hoch...?

von Mr. AVR (Gast)


Lesenswert?

Das ist auf Ausgang gesetzt, klar.
Habe ich vergessen anzugeben.

Ich habe schon versucht mit 100ms, dann habe ich ca. 1 sek.


Das muss irgendwas mit den Clockregistern sein, ich verstehe nur nicht, 
welche ich setzen muss.

von Mr. AVR (Gast)


Lesenswert?

CPU_CCP = 0xD8;
  CLKCTRL_MCLKCTRLA = CLKCTRL_CLKSEL_OSC20M_gc;
  CPU_CCP = 0xD8;
  CLKCTRL_MCLKCTRLB = 0x1;


Damit habe ich, so wie ich das sehe, 10Mhz. Jetzt mal eine Frage: Wie 
bekomme ich 20 Mhz?! Nach dem DB ist der kleinste Prescaler 2. ?!?!

von c-hater (Gast)


Lesenswert?

Mr. AVR schrieb im Beitrag #5384620:
> CPU_CCP = 0xD8;
>   CLKCTRL_MCLKCTRLA = CLKCTRL_CLKSEL_OSC20M_gc;
>   CPU_CCP = 0xD8;
>   CLKCTRL_MCLKCTRLB = 0x1;
>
>
> Damit habe ich, so wie ich das sehe, 10Mhz. Jetzt mal eine Frage: Wie
> bekomme ich 20 Mhz?! Nach dem DB ist der kleinste Prescaler 2. ?!?!

OMG

Lies' endlich das verdammte DB!

Da steht zu MCLKCTRLB:

> Bit 0 – PEN: Prescaler Enable
> This bit must be written '1' to enable the prescaler. When enabled, the
> division ratio is selected by the
> PDIV bit field.
> When this bit is written to '0', the Main Clock will pass through undivided
> (CLK_PER=CLK_MAIN),
> regardless of the value of PDIV.

von Mr. AVR (Gast)


Angehängte Dateien:

Lesenswert?

Anbei das DB. Auf Seite 61 sieht man den MUX, ich habe OSC20M gewählt, 
danach kommt der Prescaler-Block mit 1,2,4,8 usw. Okay. Dort steht auch, 
nach dem Reset hat man 3,33 Mhz (das kam ca. hin).

Dann ab Seite 66 MCLKCTRLA = 0 (siehe Post vorher), ich habe OSC20M 
gewählt.
Auf Seite 67 MCLKCTRLB, kleinster Prescaler nach PDIV ist 2.

Wenn PEN = 0, kein Prescaler (Prescaler = 1) ist aktiv, wenn man die 
Prescaler nutzen möchte von PDIV, PEN muss auf 1 gesetzt werden.

Hier sieht man, nach dem Reset der Wert ist 0x11 (17), also PEN und 
Prescaler 6 aktiv.


Nun habe ich 20 Mhz int. RC. War für mich etwas verwirrend. Ich 
denke/hoffe vll. kann der Thread jmd. hilfreich sein, sind ja noch recht 
neu die Teile.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.