Forum: Mikrocontroller und Digitale Elektronik Attiny 13 Clock Problem


von Christoph Fuggersberger (Gast)


Lesenswert?

Hallo Leute,
Ich hab mir ein paar Attiny 13 zugelegt, die ich mit dem Arduino UNO wie 
in einer Anleitung programmieren will.
Programmieren funktioniert soweit auch, es kommen keine Fehlermeldungen 
und LED ein und aus funktioniert soweit auch.
Wenn es aber um delay,micros etc. Geht, tut er nicht was er machen soll.
Lade ich zb. Das Arduino "Blink" Beispiel hoch, leuchtet die LED nur, 
und blinkt nicht.
AnalogWrite,millis und delay funktionieren einfach nicht, daher denke 
ich, dass es ein Problem mit dem internen 9,6Mhz Oszillator bzw mit dem 
timer gibt.
Was mache ich falsch?
Liegt es am timer?
Vielleicht kann mir ja jemand helfen,
Mfg Christoph

Hier die Verwendete Anleitung:

http://m.instructables.com/id/Programming-an-ATTiny13A-using-Arduino-servo-int/

von Nil (nilsnilss)


Lesenswert?

Sicher, dass du die Fuses richtig gesetzt hast? Ein neuer Attiny13 ist 
(denke ich, weil fast immer so) wahrscheinlich mit 1MHz getaktet


Edit: Hab mir grade das Datenblatt angeschaut, der kommt ja schon mit 
9,6MHz.
Hast du diese Frequenz irgendwo in deinem Code erwähnt? Der Compiler 
kann das nämlich nicht erraten.

: Bearbeitet durch User
von Christoph Fuggersberger (Gast)


Lesenswert?

Die Frequenz solltr in der Board Datei für den Attiny 13 erwähnt sein, 
somit sollte der Compiler das wissen.

Ich habe Die Delay Zeiten im Code auch schon von 1ms bis 1000000 ms 
durchprobiert, und es tur sich nichts

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Nils Friess schrieb:
> Sicher, dass du die Fuses richtig gesetzt hast? Ein neuer Attiny13 ist
> (denke ich, weil fast immer so) wahrscheinlich mit 1MHz getaktet
>
> Edit: Hab mir grade das Datenblatt angeschaut, der kommt ja schon mit
> 9,6MHz.
> Hast du diese Frequenz irgendwo in deinem Code erwähnt? Der Compiler
> kann das nämlich nicht erraten.

Normalerweise ist im Auslieferungszustand die DIV8-Fuse programmiert, 
das heißt, der Takt läuft mit 1,2 MHz.

von Peter R. (pnu)


Lesenswert?

Vielleicht liegts auch daran: der attiny13 hat nur 1K Programmspeicher.

Schau mal nach, wieviel Code an .hex file aus dem Arduino-sketch erzeugt 
werden.

Das bisschen Kilobyte des Attiny13 wird bei der speicherfressenden 
Programmiersprache eines Arduino (C oder so ähnlich) in Nullkommamix 
überschritten.

Den Attiny13 sollte man nur per Assembler programmieren.

Eigentlich sollte ja die Programmierumgebung des Arduino melden, dass 2 
oder 3 kByte nicht in den Attiny13 passen.

von Nil (nilsnilss)


Lesenswert?

Ich kann mir nicht vorstellen, dass bei einem einfachen 
LED-Blink-Programm schon 1 KByte voll sein sollen, selbst mit der 
komischen Arduino-Bibliothek. Ich hab hier auch nen Attiny mit 1KByte 
Flash und programmiere ausschließlich in C.

von Nil (nilsnilss)


Lesenswert?

Zeig uns doch einfach mal deinen Code, vielleicht findet sich der Fehler 
ja dort irgendwo.

von Christoph Fuggersberger (Gast)


Lesenswert?

Also laut Arduino IDE Hat der Code nichtmal die Hälfte des verfügbaren 
Speichers.
Dass Assembler Speicher sparender ist weiß ich, nur lernen wir in der 
Schule seit 2 Jahren C und erst seit einem halben Jahr programmieren wir 
via AVR Studio den Atmega 16.
Assembler haben wir nur kurz gemacht, deshalb ist es für mit Arduino 
einfach leichter.
Wie kann ich die Fuses bzw. den Takt auf 9,6Mhz umstellen?
Ich denke nicht dass es am Code liegt, da die Codes die ich probiert 
habe auf einem Atmega328p tadellos laufen.
Delay sollte ja unabhängig vom Chip funktionieren und bei jeder 
Taktfrequenz gleich lange für eine Millisekunde brauchen.
Ausser der Prozessortakt stimmt nicht.

Wo wir schon bei assemblee etc. waren, kann mir jemand leicht 
verständliche Literatur zum Erlernen von AVR programmieren empfehlen?
Also um alles von Grund auf richtig zu verstehen.

von Markus (Gast)


Lesenswert?

Christoph Fuggersberger schrieb:
> Wie kann ich die Fuses bzw. den Takt auf 9,6Mhz umstellen?
> Ich denke nicht dass es am Code liegt, da die Codes die ich probiert
> habe auf einem Atmega328p tadellos laufen.

In der Arduino IDE unter Tools/Board den Attiny mit der "richtigen" 
Frequenz wählen. Danach Tools/Bootloader installieren wählen, damit 
sollte alles gesetzt sein.
Welche Board-Datei hast du genau? (Link)

von Nil (nilsnilss)


Lesenswert?

Christoph Fuggersberger schrieb:

> Wo wir schon bei assemblee etc. waren, kann mir jemand leicht
> verständliche Literatur zum Erlernen von AVR programmieren empfehlen?
> Also um alles von Grund auf richtig zu verstehen.
Ich kann dir das AVR-GCC-Tutorial hier auf Mikrocontroller.net 
empfehlen. Gibt auch ein AVR-Tutorial für Assembler, darin werden auch 
ganz grundlegende Dinge erklärt.

von Christoph Fuggersberger (Gast)


Lesenswert?

Also in der IDE habe ich "Attiny13 @ 9,6Mhz" eingestellt, das sollte 
also passn.
Wenn ich den bootloader installiere blinkt die LED am UNO nur kurz und 
dann steht sofort "Bootloader wurde installiert".
Innerhalb von einer halben Sekunde.
Codes uploaden mit "Arduino as ISP" funktioniert aber normal und dauert 
seine Zeit.
Das ist mein Board:

http://www.amazon.de/gp/aw/d/B00G576SXU/ref=mp_s_a_1_sc_2?qid=1399439212&sr=8-2-spell&pi=AC_SX110_SY165_QL70

Danke für die Empfehlung, werde mir das gleich mal anschaun.

von F. F. (foldi)


Lesenswert?

Markus Weber schrieb:
>
> Normalerweise ist im Auslieferungszustand die DIV8-Fuse programmiert,
> das heißt, der Takt läuft mit 1,2 MHz.

Der Einzige der hier den Tiny kennt.
Markus, jedenfalls haben alle Tiny13, die ich von dir beziehe, den 
Vorteiler.

von F. F. (foldi)


Lesenswert?

Noch ein kleiner Tipp, jetzt höre ich mich schon an wie mein lieber 
Freund cyblord, steige schnell um auf C und verschwende keine Zeit mehr 
mit der Arduino Sprache.
Mit C bist du dann völlig unabhängig.
Es ist eine tolles Erlebnis, wenn du den selben Code, nach Anpassung der 
Pins, in einen anderen uC lädst und er tut genau das gleiche.
Ab da an willst du kein Arduino mehr.

von Markus (Gast)


Lesenswert?

Vielleicht hilft das hier noch etwas weiter:
http://playground.boxtec.ch/doku.php/arduino/attiny

von Paul Baumann (Gast)


Lesenswert?

Foldi schrob:
>Es ist eine tolles Erlebnis, wenn du den selben Code, nach Anpassung der
>Pins, in einen anderen uC lädst und er tut genau das gleiche.

Ein noch tolleres Erlebnis ist, wenn der gleiche Code dann etwas völlig
Anderes tut, man den ganzen Rotz in die Ecke wirft und von Neuem 
anfängt.
;-)
mfG Paul

von Dennis K. (scarfaceno1)


Lesenswert?

Hatte bis jetzt beim Umstieg von einem Controller auf einen anderen mit 
dem "selben" Code immer "Glück".

Natürlich müssen hier und da ein paar Ports und Register angepasst 
werden, aber im großen und ganzen eine feine Sache "dieses C".

:-P

von Christoph Fuggersberger (Gast)


Lesenswert?

Also ich werde einfach mal versuchn in C zu programmieren.
Kann ich das Arduino board als hardware für AVR Studio etc. Verwenden?
Und wie krieg ich einen Assembler bzw. C Code auf den attiny?

von Dennis K. (scarfaceno1)


Lesenswert?

Im Atmel Studio kann man mit Plugins die Arduino Kits als Boards 
reinholen.

Dann kennt das Atmel Studio die schonmal.

Wie programmierst du denn jetzt?
Bei den Arduinos ist der Programmer mit auf dem Board glaube ich.
(Habe selbst keins, nur einzelne AVRs).

vielleicht erkennt das Atmel Studio den Programmer mit dem Arduino Kit?

von Karl H. (kbuchegg)


Lesenswert?

> Also in der IDE habe ich "Attiny13 @ 9,6Mhz" eingestellt, das sollte also passn.

Nö, passt nicht.
Solange du nicht an den Fuses rumgespielt hast, laufen alle von Atmel 
gelieferten Prozessoren (sofern sie über einen internen Takt verfügen) 
mit einer Taktfrequenz von rund 1Mhz.

In deinem Fall sind es dann eben 1.2Mhz, weil der interne 9.6Mhz noch 
durch die CKDIV8 Fuse durch 8 geteilt wird. Aber grundsätzlich liegt die 
Taktfrequenz bei fabrikneuen AVR-Prozessoren immer in der Gegend von 
1Mhz.

: Bearbeitet durch User
von Simpel (Gast)


Lesenswert?

Egal wie die CKDIV8-Fuse gesetzt ist... wenn du in deinen 
Initialisierungscode am Anfang diese Sequenz

CLKPR = 10000000
CLKPR = 00000000

einbaust, hast du die 9,6 MHz zur Verfügung. Der obere Wert setzt das 
CKPCE-Flag, der untere enthält in den 4 Lower-Bits den codierten 
Teilerfaktor. "0"  bedeutet Teiler = 1 (Also keine Teilung).

Dort wo jetzt die 0000 steht, kannst du andere Werte einsetzen, um ein 
gewünschtes Prescaler-Setup und damit den Systemtakt einzustellen. Siehe 
Datenblatt S. 32/33.

Die CKDIV8-Fuse selbst wird dadurch nicht verändert.

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.