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.
>> ergibt>> Error Operand 1 out of range: 0x61>> also das scheint nicht zu funktionieren?
Falsches include verwendet. Beim Tiny402 ist das auf Adresse 1.
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?
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.
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
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
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.
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
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.
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