PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 16 MHz beim ATmega168 und Bascom einstellen ?



Klingon77
05.03.2009, 01:00
hi,

nun habe ich es doch getan...

...eine kleine Platine gefräst für meinen ATmega 168.

Teile aufgelötet und getestet; der Micro wurde sofort erkannt \:D/
(ISP parallel Adapter von Robotik-Hardware)


Dann wollte ich das Ganze in Bascom (Vers. 1.11.9.1) auf den 16 MHz Quarz umstellen.

Leider konnte ich bei dem entsprechenden FuseBit keine 16 MHz Einstellung finden.

Lediglich "8-" MHz konnte ich finden; das hat aber nicht funktioniert.

Durch einige Tests mit einer blinkenden LED fand ich heraus, daß mein schöner schneller 168er mit 1 MHz läuft :cry:


Es gab noch eine Einstellung: "interner 8 MHz Resonator"; die hat aber auch keine Änderung bewirkt...
Der Mikro lief weiterhin auf 1 MHz.

Im Datenblatt habe ich im Kapitel:
7.1 Low Power Crystal Oscillator
7.4 Full Swing Crystal Oscillator
gelesen.
Ich verwende einen kleinen 4mm breiten und ca. 10mm langen Quarz.
Keinen rechteckigen und größeren Resonator, welcher ein Rechtecksignal ausgibt.

Welcher ist nun der richtige?
Ich nehme mal an: 7.1 Low Power Crystal Oscillator?
Dann müsste ich entsprechend des Datenblattes auf Seite 30 (Figure 7-2)
die Einstellung: CKSEL3..1 = 111 wählen?


Mein Englisch ist leider nicht so besonders...
In die Datenblätter muß ich mich erst noch einlesen.


liebe Grüße,

Klingon77

Sauerbruch
05.03.2009, 08:07
Moin Klingon!

Low Power Crystal und Full Swing Crystal funktionieren beide mit einem externen Quarz. Der Unterschied ist nur der, dass bei "Full Swing" am Ausgang XTAL2 ein 5V-Rechtecksignal anliegt, falls man den Takt noch anderswo braucht. Bei Low Power ist das nicht der Fall - spart Strom.

Funktionieren müssten mit einem externen Quarz beide Varianten.

Oft entsteht zum Them FuseBits ziemliche Verwirrung dadurch, dass "1" im Datenblatt bedeutet, dass das Bit gelöscht ist - und "0" steht für ein gesetztes Bit. Vielleicht wär´s sonst auch zu einfach... [-(

Ansonsten ist beim Mega168 im Auslieferungszustand das FuseBit CKDIV8 gesetzt (d.h. auf "0"), wodurch der gewählte Takt auf 1/8 runtergeteilt wird. Deshalb läuft das Ding auch auf 1MHz, wenn Du den internen 8MHz-Oszillator wählst.

Ein schönes Tool zum virtuellen rumspielen mit Fuses gibt´s übrigens hier:
http://www.engbedded.com/fusecalc/

Gruß,

Daniel

oberallgeier
05.03.2009, 09:28
Hallo Klingon77,

Glückwunsch zu Deinem Controllerplatinen-Fortschritt. Irgendwie ist gerade eine Seuche ausgebrochen - Fusebitsgrippe oder so. Vor ein paar Tagen hatte ich in diesem Thread (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=429255#429255) ein Musterbeispiel für (m)einen m168 mit 20 MHz gegeben, dasselbe kann natürlich auch für Deinen 16 MHz-Quarz gelten - laut Datenblatt für alle mit mehr als 8 MHz - siehe Doc 2545M–AVR–09/07, Seite 36. Im Fusebitcalculator steht dann Frequency 8.0- MHz ( --- das sollte eher heissen 8.0+ ... jedenfalls würden wir das beim Klettern so schreiben, gell *ggggg*).

...............http://oberallgeier.ob.funpic.de/mega168_ponyprog.jpg

Das Beispiel ist für PonyProg - ich weiß nicht, welches Flashprogramm Du verwendest, da Du ja Bascom hast. Diese "0" und "1" - Konfusions beim Bitsetzen verwirrt viele, daher bin ich eher für Bildchen der Art wie es oben ist. Ansonsten hatte ja Sauerbruch schon praktisch alles Notwendige gesagt. Vielleicht hier noch einmal der Fusebitcalculator, (http://www.engbedded.com/cgi-bin/fc.cgi?P_PREV=ATmega168&P=ATmega168&V_LOW=EE&V_HIGH=DF&V_EXTENDED=FF&M_LOW_0x3F=0x2E&M_HIGH_0x07=0x07&M_HIGH_0x20=0x00&M_EXTENDED_0x06=0x06&B_SPIEN=P&B_CKSEL0=P&O_BITS=Apply+fuse+bits) bei dem ich für Dich die Fuses für Deine Erfordernisse eingestellt habe - auch der Brownoutlevel ist wie im Ponyprog-Beispielbild auf 1,8 V eingestellt. Ich denke, Brownoutdetektion wirst Du vermutlich vorerst sowieso nicht nutzen, dann könntest Du auch bei BODLEVEL0 "das Häkchen entfernen" <=> dann ist Brownoutdetektion disabled.

Viel Erfolg

Nachtrag: Fehlerhafte(n) Link(s) korrigiert

Vitis
05.03.2009, 15:55
könnte es sich auch um einen 644P handeln?
So einer nervt mich nämlich gerade rum.

Klingon77
05.03.2009, 18:19
hi alle,

fragen sie hier; da werden sie geholfen \:D/ \:D/

Mal Dank für die rasche Hilfe!


Es ist nicht so, daß ich das Datenblatt nicht bemüht hätte.
Leider ist halt mein Englisch (Fachenglisch) nicht so gut; gebe mir aber Mühe!
Ich bin mir dann nicht immer sicher ob ich alles richtig verstehe.
Bei normalen Basic-Befehlen oder anderen Dingen ist das nicht so dramatisch.
Wenn ich aber den ATmega so verbiege daß er nur noch mit einem externen "Schrittmacher" läuft habe ich verloren.


Ich glaube die wichtigsten Punkte sind die "CKSEL = 111".

Wenn mich nicht alles täuscht habe ich diese Einstellung schon mal versucht.
Ein "1 Hz Blinken" lief dann anders und ich hatte den Eindruck der 168er war mit 2 MHz getaktet.

Da war ich dann komplett verwirrt...


Mit Der Aussage von Sauerbruch:

"Ansonsten ist beim Mega168 im Auslieferungszustand das FuseBit CKDIV8 gesetzt (d.h. auf "0"), wodurch der gewählte Takt auf 1/8 runtergeteilt wird."

kann ich mir das nun erklären.


Nun werde ich nochmals das Datenblatt bemühen und weitere Versuche anstellen.
Bin "voll der Hoffnung" daß wir zusammen die kleine Hürde nehmen können.
Evtl. finde ich nächste Woche noch ein wenig Zeit daran zu arbeiten.
Wochenende habe ich leider Tagdienst...

lieben Dank für eure Hilfe und die gut dargestellten Einstellungsbeispiele :mrgreen:


Wenn das Ganze mal so läuft, wie ich es möchte (im richtigen Takt) mache ich auch ein paar Foto´s und schreibe was im LED-Thread dazu.


liebe Grüße,

Ralf

oberallgeier
05.03.2009, 18:39
Puhhhhh - Klingon77,

ich hatte mich oben auf den falschen Link bezogen - habs aber korrigiert. Bitte um Entschuldigung

Sauerbruch
06.03.2009, 09:45
Wenn ich aber den ATmega so verbiege daß er nur noch mit einem externen "Schrittmacher" läuft habe ich verloren

Na ja - ganz so schlimm wäre das ja nicht. Irgendwann passiert sowas mal - aber das Problem lässt sich mit einem simplen Rechteckgenerator lösen. Die Frequenz ist abolut unkritisch (muss nur ca. 4mal so hoch sein wie die am Programmer eingestellte ISP-Frequenz). Mit ein paar Krümeln aus der Bastelkiste (z.B. NE555, 40106 o.ä.) kann man sowas auf ein paar Quadratzentimeter Lochrasterplatine zusammenlöten. Und damit lässt sich jeder Chip wieder zum Leben erwecken, der über die Clock-Fuses kaltgestellt wurde =P~

oberallgeier
06.03.2009, 09:56
Hallo alle, hi Sauerbruch,

im Pannenfall hatte ich schon mit Erfolg einen 36 kHz-Takt von einem Controller auf den XTAL1 des Pannencontrollers gelegt - und die Panne durch Setzen geeigneter Fuses behoben. Das entsprechende Vorgehen steht in den Docs i.A. unter "External Clock".

Klingon77
06.03.2009, 13:32
hi alle,

frohe Kunde; der "Kleine" funzt dank eurer Hilfe wie er soll :mrgreen:
Die LED blinkte bei eingestelltem 16MHz Takt schön im Sekundenrhythus.

Hier die Fusebit´s; evtl. kann es nochmal jemand gebrauchen...

http://klingon77.roboterbastler.de//ZZZ%20Roboternetz%20Forum-Bilder/Fusebits-01.jpg


Fusebit "C" habe ich ausgeschaltet...

http://klingon77.roboterbastler.de//ZZZ%20Roboternetz%20Forum-Bilder/Fusebits-02.jpg

... und den entsprechenden Quarz (mit langer Einschwingzeit) eingeschaltet.




Dann "wagte" ich mich an die PWM.

Mit Hilfe des Buches von Roland Walter, einigen Beschreibungen aus dem Forum und dem WIKI des Forums, sowie ein wenig Überlegen brachte ich dann eine ein- und ausfadende LED zustande \:D/


Nun habe ich die PWM-Grundlagen schon durchgelesen.
Leider ist noch nicht alles sofort aus dem Kopf abrufbar.

Lange Rede, kurzer Sinn:
Es "funzt"; im Groben weiß ich auch warum aber die Details muß ich mir noch erarbeiten.



$regfile = "m168def.dat" 'ATmega 168 Definition
$crystal = 16000000 'Ext. Quarz 16 Mhz

Ddrd.7 = 1 'Pin PD7 als Ausgang definieren



On Timer0 Ontimer 'Interruptroutine für Timer0
Dim Helligkeit As Byte
Dim Lauf As Byte 'Schleifenvariable
Config Timer0 = Timer , Prescale = 64
Enable Timer0 'Timer0 Overflow Interrupt ein
Enable Interrupts 'Interrupts global einschalten



Do
For Lauf = 2 To 254
Helligkeit = Lauf
Waitms 2
Next Lauf

For Lauf = 254 To 2 Step -1
Helligkeit = Lauf
Waitms 2
Next Lauf

Loop


Ontimer:
If Portd.7 = 1 Then Timer0 = 256 - Helligkeit Else Timer0 = Helligkeit
Toggle Portd.7 'LED umschalten
Return

END

Nächste Woche finde ich hoffentlich mal ein wenig Zeit ein paar Fotos zu machen und einen kleinen "Bericht" in meinem LED-Thread darüber zu schreiben.



Nochmals Dank für eure Hilfe :idea: :mrgreen:


liebe Grüße,

Klingon77