Tiny402 Clock Prescaler deaktivieren mit CCP in ASM

OP #7354014
Lesenswert?

Ich brauche hier mal Input. Ich möchte den Prescaler der clock des Tiny402 deaktivieren. Ich weiß dass ich im Register CLKCTRL_MCLKCTRLB das letzte Bit dafür auf 0 setzen muss (DB Seite 83) und vorher im CCP (Configuration Change Protection) den Wert 0xD8 reinschreiben muss (DB Seite 57). Das scheint aber nicht zu funktionieren ... Microchip Studio Simulator liest den Wert für CLKCTRL_MCLKCTRLB immer mit 0x11 aus (letzte Zeile im Code in r16), d.h. der Prescaler ist noch auf 0x8 und teilt daher durch 6 was 3.33 MHz Takt ergibt. Ich will aber 20 MHz. Wo liegt der Fehler? Danke schonmal.

1
ldi r16, 0x00
2
ldi r17, 0xD8
3
sts CPU_CCP, r17
4
sts CLKCTRL_MCLKCTRLB, r16 
5
lds r16, CLKCTRL_MCLKCTRLB
Gast #7354097
Lesenswert?

Bernhard S. schrieb:

c-hater schrieb:

Falsches include verwendet. Beim Tiny402 ist das auf Adresse 1.

Das war falsch. CLKCTRL_MCLKCTRLB ist tatsächlich auf 0x61. Da verwirrt dieses Scheiß-neue Datenblatt mit "Offset: 1". Da ist offensichtlich der Offset auf die Basisadresse von CLKCTRL gemeint.

Also: CLKCTRL_MCLKCTRLB ist MMIO, aber CPU_CCP ist wirklich nicht MMIO.

Ist denn das tn402def nicht richtig? Ich habe das nicht selbst geschrieben sondern das kam mit dem Microchip Studio mit.

Wenn du es auch nicht geschriebn hast, hättest du es doch LESEN können. Und dann hättest du dir deine Fragen einfach selbst beantworten können.

#7354099
Lesenswert?

Die Include-Datei ist eher richtig. Ich kann nur empfehle das Dattenblatt zu lesen, Abschnitt Speicher für den Anfang.

"The I/O address range from 0x00 to 0x3F can be accessed in a single cycle using IN and OUT instructions. The extended I/O memory space from 0x0040 - 0x0FFF can be accessed by the LD/LDS/LDD and ST/STS/STD instructions, transferring data between the 32 general purpose working registers and the I/O memory space."

Für CCP ist also OUT zu benutzen, für CLKCTRL - STS, da laut Include: CPU_CCP = 0x0034 ; Configuration Change Protection CLKCTRL_MCLKCTRLA = 0x0060 ; MCLK Control A

Gast #7354167
Lesenswert?

Also ich habe keine Tiny zur Hand und kann uU. nicht weiterhelfen, dasmit out und sts ist ganz sicher richtig, baer wie hast du denn überhaupt auf 3,33 MHz umgeschaltet? Lt. Datenblatt:"After any Reset, CLK_MAIN is provided by the 16/20 MHz Oscillator (OSC20M) and with a prescaler division factor of 6. Since the actual frequency of the OSC20M is determined by the Frequency Select bits (FREQSEL) of the Oscillator Configuration fuse (FUSE.OSCCFG), these frequencies are possible after Reset:" 16 MHz 2.66 MHz 20 MHz 3.3 MHz

Also ist beim CLK_PER von 3,3 MHz der CLK_MAIN bei 20 MHz.

OP #7354189
Lesenswert?

Atos schrieb:

Also ist beim CLK_PER von 3,3 MHz der CLK_MAIN bei 20 MHz.

Genau! Die Clock habe ich auf 20 MHz in den Fuses gestellt, da hat man die Wahl zwischen 16 und 20 MHz. Und der Main Clock Prescaler steht halt in der Default Einstellung bei PDIV=0x08 also Teilung durch 6 was 3.33 MHz Takt entspricht. Damit läuft mein ganzes Programm auf 3.33 MHz, was ich auch an der Hardware sehe, der tatsächliche Tiny402 schaltet beispielsweise einen Portpin für 300 ns auf High anstelle der 50 ns die man bei 20 MHz erwarten würde. Der CLKCTRL_MCLKCTRLB wird im Simulator auch immer mit 0x11 zurückgelesen, was Prescaler=6 und Prescaler Enable PEN=1 entspricht. Simulator und physikalische Hardware sind da konsistent soweit ich das sehe. Frage ist wie ändere ich CLKCTRL_MCLKCTRLB, habe ich irgendwas übersehen.

Edit: Das Oscillator Lock Bit in den Fuses ist nicht gesetzt

#7354296
Lesenswert?

Sequence for Write Operation to Configuration Change Protected I/O Registers: In order to write to registers protected by CCP, these steps are required:

  1. The software writes the signature that enables change of protected I/O registers to the CCP bit field in the CPU.CCP register.
  2. Within four instructions, the software must write the appropriate data to the protected register. Most protected registers also contain a write enable/change enable/lock bit. This bit must be written to '1' in the same operation as the data are written.

Main Clock Lock: This provides protection for the CLKCTRL.MCLKCTRLA and CLKCTRL.MCLKCTRLB registers and calibration settings for the main clock source from unintentional modification by software.

Beitrag #7354302 wurde von einem Moderator gelöscht.
OP #7354387
Lesenswert?

Norbert T. schrieb:

Main Clock Lock:

Danke, das war es!!! Ich hatte das ignoriert weil ich dachte das sei bereits mit der OSCLOCK in den Fuses ausgeschaltet, denn da steht

"At Reset, the LOCKEN bit is loaded based on the OSCLOCK bit in FUSE.OSCCFG"

Mit den zwei Befehlen vor dem Beschreiben der CLKCTRL_MCLKCTRLB

1
ldi r16, 0x00
2
sts CLKCTRL_MCLKLOCK, r16

funktioniert es jetzt. Dankeschön!!!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren