Guten Tag,
ich versuche nun schon seit gestern den Timer1 des ATtiny 25 im
asynchronen Modus mit 64Mhz zu betreiben. Durch das Datenblatt werde ich
nicht schlauer. Im Datenblatt steht, dass PCKE in PLLCSR gesetzt sein
muss, aber das habe ich ja.
Muss ich eventuell etwas an den Fusebits ändern? - momentan betreibe ich
den ATtiny mit internen 8Mhz-
Es wäre echt klasse, wenn mir hier jemand einen entscheidenden Tipp
geben kann.
Meine Timerinitialisierung:
Jürgen schrieb:> Im Datenblatt steht, dass PCKE in PLLCSR gesetzt sein> muss, aber das habe ich ja.
Da steht aber noch mehr. Wie ich schon im anderen Thread (warum
überhaupt ein neuer?) sagte, du musst anfangen genauer zu lesen. Nur
einen flüchtigen Blick rein werfen reicht nun mal einfach nicht.
In der Beschreibung zu PCKE steht z.B. auch:
1
This bit can be set only if PLLE bit is set. It is safe to set this
2
bit only when the PLL is locked i.e the PLOCK bit is 1. The bit PCKE can
3
only be set, if the PLL has been enabled earlier.
Daraus ergibt sich eine einzuhaltende Folge von 3 Schritten.
Welche sind das?
Ich hab einen enuen Thread aufgemacht, da sich mein Problem nun
eingrenzen lies und ich dachte, dass es mit der genauernen Überschrift
überischtlicher wird.
Mit den 3 Schritten müsste der code so aussehen?:
1
// Timer 1 konfigurieren: Clock = PCK
2
TCCR1|=(1<<CS10);
3
4
//asynchronen Modus aktivieren (64Mhz)
5
PLLCSR|=(1<<PLOCK);
6
PLLCSR|=(1<<PLLE);
7
PLLCSR|=(1<<PCKE);
8
9
//Overflow Interrupt Timer 1 aktivieren
10
TIMSK|=(1<<TOIE1);
Leider scheint irgend etwas immer noch nicht zu stimmen? - Mein Programm
funktioniert zumindest noch nicht wie es soll...
Danke für deine Geduld mit mir ;) - ich hab an einer völlig falschen
Stelle im Datenblatt gesucht.
Und weiterhin machst du den Fehler nur flüchtig zu lesen.
Oder macht das Englisch dir Probleme?
Die drei Schritte sind:
1) PLL aktivieren
2) Warten bis PLL eingerastet
3) PCKE setzen
Jürgen schrieb:> Falls ich das warten dadurch realisiere, dass ich das PLOCK bit setze
PLOCK ist Read-Only, das kannst du nicht selber setzen. Das wird von der
Hardware gesetzt.
1
•Bit 0 - PLOCK: PLL Lock Detector
2
When the PLOCK bit is set, the PLL is locked to the reference clock.
3
The PLOCK bit should be ignored during initial PLL lock-in sequence
4
when PLL frequency overshoots and undershoots, before reaching steady
5
state. The steady state is obtained within 100 µs. After PLL lock-in
6
it is recommended to check the PLOCK bit before enabling PCK for
7
Timer/Counter1.
PLOCK gibt also an, ob die PLL eingerastet ist, oder nicht. Allerdings
soll man dieses Bit in der ersten Startphase der PLL ignorieren. Diese
erste Startphase dauert 100µs. Daraus ergibt sich, dass dies
> Wie realisiere ich denn das warten bis PLL einrastet ?
wiederum aus zwei Schritten besteht:
1) 100µs warten
2) warten bis PLOCK 1 ist
avion23 schrieb:> Mein Code:
Genau. Da versucht man ihn dazu zu bringen es so weit wie möglich selber
herauszufinden, nur damit dann doch wieder jemand vorbeikommt und ihm
eine vorgekaute Fertiglösung hinspuckt.
Vielen Dank !
Nun bin ich auf jedenfall schon um einiges klüger.
Allerdings tut mein Programm immer noch nciht was es soll - Es soll eine
rote LED immer heller faden.
Wwäre toll, wenn ihr nochmal über meinen gesamten Programmcode schauen
könntet:
Stefan Ernst schrieb:> Genau. Da versucht man ihn dazu zu bringen es so weit wie möglich selber> herauszufinden, nur damit dann doch wieder jemand vorbeikommt und ihm> eine vorgekaute Fertiglösung hinspuckt.
Oh Sorry. Ich habe den Thread nicht gelesen, ich habe nur gesehen, dass
jemand ein Problem hat und wollte helfen.
@ jürgen
Du musst das leider selbst mache. Ich würde so vorgehen:
- testen ob pwm funktioniert mit 10, 100, 250 als werte
- überprüfen ob ISR aufgerufen wird, und wie oft, z.B. über led togglen.
und dann erst deinen Code.
Übrigens hilft es funktionierenden code in funktionen zu packen.
Sobald ich den Timer 1 nicht im asynchronen Modus mit 64 Mhz betreibe
sondern mit 8Mhz(interner Takt ohne Prescaler) funktioniert der code
einwandfrei, die LED flackert nur sehr stark, da ja meine PWM Frequenz
nur 8Mhz / 256(8bit-Timer1) /1024(Variable"timer") /1(Prescaler)= 30,5
Hz beträgt.
Wenn ich es nun aber schaffe den Timer 1 mit 64 Mhz zu betreiben reicht
die Frequenz und es sollte nciht mehr flackern?
Leider leuchtet die LED nun anscheinend durchgehend(volle Helligkeit)
und die ISR scheint nicht aufgerufen zu werden. (Dies habe ich getestet
indem ich in der ISR eine andere LED angeschaltet habe.)
Hier die Version meines funktionierenden codes(mit flackernder LED):
Da ich ja nur die Frequenz von Timer 1 ändere (und nicht die von Timer
0!) verstehe ich nciht, warum es nciht Funktioniert, wenn doch nun die
Timerinitialisierung richtig seien sollte.
Grüße
Jürgen
- clkdiv 8 fuse deaktiviert? default ist an, dann werden aus deinen 8MHz
1MHz
- avr entkoppelt mit ~100nF Keramik?
- Versorgungsspannung 5V?
- _delay_us(100) mal auf _delay_ms(1) stellen und testen.
- nicht 64 mhz sondern 32mhz verwenden. da gibt's ein bit mit dem du auf
den slow modus umschalten kannst o.ä.
- clkdiv 8 fuse ist deaktiviert
- _delay auf 1ms bringt nichts
- 32Mhz eingestellt, also das LSM bit gesetzt und es geht
- Habe den Attiny nicht mit einem Kondensator entkoppelt und würde mir
dies auch gerne sparen - könnte ich damit denn die 64 Mhz fahren? - wie
wird der Kondesnator angeschlossen?
Danke nochmal!
Jürgen schrieb:> - 32Mhz eingestellt, also das LSM bit gesetzt und es geht
D.h. Problem ist im Prinzip gelöst? Ursache dafür kann sein:
- zu niedrige Versorgungsspannung. Takt gegen Spannung steht im
Datenblatt. Ab wann schafft er denn die PLL mit 64MHz?
- kein Kondensator. Wie das geht steht in einer application note von
atmel, im rn-wissen wiki sehr anschaulich und überall sonst im internet
- Die Versorgungsspannung beträgt 5Volt (über 7805)
- Die 64 Mhz sollte er laut Datenblatt ab 2,7 Volt schaffen glaube ich
Bis jetzt hab ich es noch nciht geschafft, dass es mit 64Mhz geht.
Ich werde mich nun noch über den Kondensator schlau lesen.
<Nekrophilie>
Es ist mit Sicherheit der Kondensator gewesen. Das habe ich
herausgefunden, weil bei mir der 100nF nicht richtig verlötet war. Ohne
die 100nF resetet er oder stürzt mitten im Programm ab. Alles nicht
reproduzierbar und sehr frustrierend.
</Nekrophilie>