Forum: Mikrocontroller und Digitale Elektronik Tiny402 Clock Prescaler deaktivieren mit CCP in ASM


von Bernhard S. (gmb)


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

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Bernhard S. schrieb:

>
1
> ldi r16, 0x00
2
> ldi r17, 0xD8
3
> sts CPU_CCP, r17
4
> sts CLKCTRL_MCLKCTRLB, r16
5
> lds r16, CLKCTRL_MCLKCTRLB
6
>

Weder CPU_CCP noch CLKCTRL_MCLKCTRLB sind beim Tiny402 im MMIO-Space.

von Bernhard S. (gmb)


Lesenswert?

Okay ... kannst du mir etwas mehr dazu schreiben, welche Befehle nehme 
ich um auf die Register zugreifen zu können?

von Atos (Gast)


Lesenswert?

out

von Bernhard S. (gmb)


Lesenswert?

1
out CLKCTRL_MCLKCTRLB, r16

ergibt

Error Operand 1 out of range: 0x61

also das scheint nicht zu funktionieren?

von c-hater (Gast)


Lesenswert?

Bernhard S. schrieb:
>
1
out CLKCTRL_MCLKCTRLB, r16
>
> ergibt
>
> Error Operand 1 out of range: 0x61
>
> also das scheint nicht zu funktionieren?

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

von Bernhard S. (gmb)


Lesenswert?

c-hater schrieb:
> Falsches include verwendet. Beim Tiny402 ist das auf Adresse 1.

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

Wo bekommt man denn das richtige?

von c-hater (Gast)


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.

von Norbert T. (atos)


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

von Bernhard S. (gmb)


Lesenswert?

Norbert T. schrieb:
> Für CCP ist also OUT zu benutzen, für CLKCTRL - STS

Danke Norbert ... so langsamt ergibt es Sinn, allerdings versuche ich 
wie du schreibst
1
ldi r16, 0x00
2
ldi r17, 0xD8
3
out CPU_CCP, r17
4
sts CLKCTRL_MCLKCTRLB, r16

und der Takt steht immer noch bei 3.33 MHz

von Atos (Gast)


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.

von Bernhard S. (gmb)


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

: Bearbeitet durch User
von Norbert T. (atos)


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.
von Bernhard S. (gmb)


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!!!

von Atos (Gast)


Lesenswert?

Gern geschehen. Grüße. :)
Norbert

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.