Hi zusammen,
möchte mit einem ATtiny13A ein Funksignal verschicken.
Das erste Problem ist schonmal, da passiert garnichts :D
am Ausgangsport wird auf jeden fall das Signal abgegeben, weiss nur
nicht ob das korrekt passiert.
Empfangen kann es auf jeden fall nicht werden.
Was mir aufgefallen ist, dass wenn ich ein einfaches Sketch schreibe,
bei der im 1 Sekunden-Takt ein Port (an der eine LED hängt) beschaltet
werden soll, die 1 Sekunde in wirklichkeit ca. 5 Sekunden sind.
Weiss jemand, woran das liegen kann?
Im Sketch selber leg ich die Frequenz auf 9600000 (sprich 9,6 Mhz).
Sonst habe ich keine Änderungen angegeben, zum Lieferungzustand.
Muss ich da vllt was an den Fuses drehen, bzw. an der Frequenz?
Denke mir, dass es vllt damit zusammen hängt, da das RF-Signal ja in dem
Fall auch mit falschen Zeiten verschickt wird?!
Gruß
Marc
Dazu muss ich noch sagen, dass ich den Chip mit Bascom beschrieben habe,
per HEX.
Benutzt habe ich die Befehle Wait,Waitms und Waitus.
bringen aber alle falsche Realzeiten am Ende raus :)
Wenn du an den Fuses nichts verändert hast sind die 9,6 Mhz falsch.
Divide clock by 8 internally; [CKDIV8=0] ist bestimmt an.
Aber ohne Code bzw Schaltplan kann dir wohl kaum jemand helfen.
Marc schrieb:> naja, sah ungefähr so aus:
Na dann sieht ja auch ungefähr alles richtig aus und es müsste
funktionieren. Wie du allerdings auf 9,6 MHz Takt kommst wissen wir
damit immer noch nicht, genausowenig wissen wir, ob CKDIV8 nun gesetzt
oder gelöscht ist.
> Im Sketch selber
Wir schreiben Programme und keine Sketche.
> leg ich die Frequenz auf 9600000 (sprich 9,6 Mhz).
Das interessiert aber deinen Tiny nicht. Im Programm kannst du
hinschreiben was immer du willst. Gut, es wäre vernünftig, wenn die
Angabe mit der Realität übereinstimmen würde, aber prinzipiell ist das
sowohl dem Tiny als auch Bascom egal, ob die von dir angegebenen Zahl
mit der Realität übereinstimmen oder nicht.
> Sonst habe ich keine Änderungen angegeben, zum Lieferungzustand.
Damit läuft dein Tiny mehr oder weniger auf 1Mhz. Denn das ist der
Auslieferungszustand
> Muss ich da vllt was an den Fuses drehen, bzw. an der Frequenz?
Ja, du musst an den Fuses drehen. Dort stellst du dem Tiny an, wie er
getaktet wird. Und Bascom informierst du darüber mittels der $crystal
Angabe.
Würde mich mal interessieren was du von Funk für eine Ahnung hast, du
machst mir irgendwie den Eindruck das du noch ein Anfänger bist ?
Der Hintergrund ist das man mit solchen Basteleien ganz schön Ärger
bekommen kann.
Karl Heinz Buchegger schrieb:>> Sonst habe ich keine Änderungen angegeben, zum Lieferungzustand.>>>> Damit läuft dein Tiny mehr oder weniger auf 1Mhz. Denn das ist der>> Auslieferungszustand
Lese aus dem Datenblatt zum Attiny13A folgendes:
The device is shipped with CKSEL = “10”, SUT = “10”, and CKDIV8
programmed. The default
clock source setting is therefore the Internal RC Oscillator running at
9.6 MHz with longest startup
time and an initial system clock prescaling of 8. This default setting
ensures that all users can
make their desired clock source setting using an In-System or
High-voltage Programmer.
Also doch 9,6Mhz?
Muss ich dann vllt doch so schreiben?
Marc schrieb:> Karl Heinz Buchegger schrieb:>>> Sonst habe ich keine Änderungen angegeben, zum Lieferungzustand.>>>>>>>> Damit läuft dein Tiny mehr oder weniger auf 1Mhz. Denn das ist der>>>> Auslieferungszustand>> Lese aus dem Datenblatt zum Attiny13A folgendes:>> The device is shipped with CKSEL = “10”, SUT = “10”, and CKDIV8
******
> programmed. The default
***********
> clock source setting is therefore the Internal RC Oscillator running at> 9.6 MHz with longest startup> time and an initial system clock prescaling of 8.
*************************************
Welchen Teil von
"und diese 9.6Mhz werden noch durch 8 dividiert"
verstehst du nicht?
DIV8 schrieb:> Würde mich mal interessieren was du von Funk für eine Ahnung hast, du>> machst mir irgendwie den Eindruck das du noch ein Anfänger bist ?>>>> Der Hintergrund ist das man mit solchen Basteleien ganz schön Ärger>> bekommen kann.
Sagen wir es mal so, mit dem ATmega328p und Arduino war es deutlich
einfacher, da es fertige Libs dafür gab :D
Da funktioniert auch alles prima und Fuses zum setzten gabs da auch
nicht, nur den 16Mhz Oszi.
Der Attiny ist mir allerdings noch fremd, das stimmt :D
Marc schrieb:> Sagen wir es mal so, mit dem ATmega328p und Arduino war es deutlich> einfacher, da es fertige Libs dafür gab :D
Das ist halt der Unterschied zwischen
Ich kauf im Bauhaus einen fertigen Auto-Anhänger und hänge den an die
von der Werkstatt eingebaute Anhängerkupplung, indem ich den Normstecker
in die Normdose stecke.
und
Ich schweiß meine Anhängerkupplung selbst ran und verkabel auch die
Anhängerbuchse selber.
Ich sag nicht, das ersteres schlecht ist. Wenn dieser Weg zum Ziel
führt, dann ist es ja gut.
Wenn du aber selbst Autoanhänger bauen willst, dann musst du dich mit
deutlich mehr Kleinkram rumschlagen.
Stimm ich zu, aber um zu lernen brauch man erst die Informationen, und
nach denen Frage ich hier, ne ;)
Mit dem 328p hab ich schon viel rumprobiert, geht ja auch recht einfach.
Da ich aber nun etwas mehr in die uC-Tiefe gehen möchte, und für eine
simple "Sendersignal" mir der 328p zu "teuer", zu groß und zu "viel
Strom" verbraucht, dacht ich mir ich versuchs mal mit dem kleinen Tiny
;)
Marc schrieb:> Stimm ich zu, aber um zu lernen brauch man erst die Informationen, und> nach denen Frage ich hier, ne ;)>> Mit dem 328p hab ich schon viel rumprobiert, geht ja auch recht einfach.>> Da ich aber nun etwas mehr in die uC-Tiefe gehen möchte, und für eine> simple "Sendersignal" mir der 328p zu "teuer", zu groß und zu "viel> Strom" verbraucht, dacht ich mir ich versuchs mal mit dem kleinen Tiny> ;)
Klappts denn jetzt wenn du als Frequenz 1,2 MHz angibst?
Um das nochmal deutlich zu sagen, du kannst die Freuquenz über diese
Angabe in deinem Programm NICHT ändern.
Karl Heinz Buchegger schrieb:>> Im Sketch selber>> Wir schreiben Programme und keine Sketche.>
Da brauchst du dich jetzt gar nicht drüber zu ereifern. So wie hier im
Forum (mit der freundlichen Hilfe der Moderatoren) BASCOM und noch
schlimmer Arduino gehypt und abgefeiert und natürlich voll unterstützt
wird, ist das doch nur eine natürlich Folge dass bald alles nur noch in
Deppensprache bezeichnet wird.
Inzwischen sind wir soweit dass ein BASCOM Programm bereits "in die
Tiefe gehen" ist und der werte TE in Bascom noch nichtmal die berühmte
LED im Sekundentakt blinken lassen kann. Schon daran scheitert es. Aber
das hindert ihn nicht daran mit einer fertigen lib bereits gott weiß was
gemacht zu haben. Ich finde das pervers, aber natürlich bin ich nur
neidisch auf soviel Erfolg.
gruß cyblord
Marc schrieb:> Stimm ich zu, aber um zu lernen brauch man erst die Informationen, und> nach denen Frage ich hier, ne ;)
Ist schon ok.
Mir geht es darum, dass du nicht hergehen kannst und sagen kannst: mit
einem Arduino ist das alles so einfach.
Malen nach Zahlen hat nun mal mit dem was ein Picasso gemacht hat recht
wenig zu tun.
> Mit dem 328p hab ich schon viel rumprobiert, geht ja auch recht einfach.
Diese Sache ist bei den hier interessierenden AVR-µC überall gleich.
Auf deinem Arduino hat dir halt jemand anderer die Arbeit des
Fuse-Umstellens bereits abgenommen. Aber das Prinzip ist dasselbe -
irgendwer muss mal an die Fuses ran.
Alle AVR werden so ausgeliefert, dass sie mit ca. 1Mhz laufen.
(bei dir eben mit 1.2Mhz)
Eumel schrieb:> Marc schrieb:>>> Stimm ich zu, aber um zu lernen brauch man erst die Informationen, und>>> nach denen Frage ich hier, ne ;)>>>>>> Mit dem 328p hab ich schon viel rumprobiert, geht ja auch recht einfach.>>>>>> Da ich aber nun etwas mehr in die uC-Tiefe gehen möchte, und für eine>>> simple "Sendersignal" mir der 328p zu "teuer", zu groß und zu "viel>>> Strom" verbraucht, dacht ich mir ich versuchs mal mit dem kleinen Tiny>>> ;)>>>> Klappts denn jetzt wenn du als Frequenz 1,2 MHz angibst?>>>> Um das nochmal deutlich zu sagen, du kannst die Freuquenz über diese>> Angabe in deinem Programm NICHT ändern.
Kann ich erst sagen, sobald ich fertig mit der Arbeit bin :)
Dass man die Frequenz im Programm nicht ändern kann ist mir klar, aber
denke anhand von der Angabe wird Bascom das Programm compilieren?!
Sprich, setzte ich von 9,6Mht auf z.B. 1,2Mhz dann passt er das alles
an, so dass die Timing stimmen, oder liege ich jetzt total daneben? :)
Marc schrieb:> Dass man die Frequenz im Programm nicht ändern kann ist mir klar, aber> denke anhand von der Angabe wird Bascom das Programm compilieren?!>> Sprich, setzte ich von 9,6Mht auf z.B. 1,2Mhz dann passt er das alles> an, so dass die Timing stimmen, oder liege ich jetzt total daneben? :)
Wie oft noch?
Die Taktoptionen werden mit den Fuses eingestellt und die werden direkt
über einen ISP-Programmer gesetzt und haben mit dem Programm welches du
in den Controller lädst nichts zu tun. Es passiert nicht alles im Leben
auf magische Art und Weise von selbst und allein.
gruß cyblord
Marc schrieb:> Dass man die Frequenz im Programm nicht ändern kann ist mir klar, aber> denke anhand von der Angabe wird Bascom das Programm compilieren?!
Das hilft dir aber nichts.
Den bei deinem Tiny kannst du per Programm die Taktfrequenz nicht
ändern!
Die Fuses haben (auf deinem Tiny) erst mal nichts mit dem Programm zu
tun!
> Sprich, setzte ich von 9,6Mht auf z.B. 1,2Mhz dann passt er das alles> an, so dass die Timing stimmen, oder liege ich jetzt total daneben? :)
Du stellst im BASCOM die $crystal Angabe auf 1200000.
Denn das ist (wenn du an den Fuses nicht gespielt hast) die Einstellung
mit der der Tiny real arbeitet.
Man kann den Tiny auch auf einer anderen Taktfrequenz arbeiten lassen.
Dazu muss man die Fuses umstellen und auch BASCOM mitteilen, mit welcher
Frequenz der Tiny arbeitet. Aber die $crystal Angabe ist eine reine
Information für BASCOM, damit der Compiler zb ausrechnen kann, wieviele
Schleifenwiederholungen er in Auftrag geben muss, damit ein Wait(1) dann
auch tatsächlich 1 Sekunde ergibt.
cyblord ---- schrieb:> Marc schrieb:>>>>> Dass man die Frequenz im Programm nicht ändern kann ist mir klar, aber>>> denke anhand von der Angabe wird Bascom das Programm compilieren?!>>>>>> Sprich, setzte ich von 9,6Mht auf z.B. 1,2Mhz dann passt er das alles>>> an, so dass die Timing stimmen, oder liege ich jetzt total daneben? :)>>>> Wie oft noch?>> Die Taktoptionen werden mit den Fuses eingestellt und die werden direkt>> über einen ISP-Programmer gesetzt und haben mit dem Programm welches du>> in den Controller lädst nichts zu tun. Es passiert nicht alles im Leben>> auf magische Art und Weise von selbst du allein.>>>> gruß cyblord
Na dann versteh ich aber die Angabe im Programm selber nicht.... dann
brauch man se ja nicht :D
Das wiederum würde heissen wenn ich "waitms = 1000" ausführe, es bei
jeder eingestellten Taktfrequenz (unabhängig von der Angabe im Program,
unter $crystal) gleich sein müsste.
Das wiederrum wäre dann schonmal nicht die Lösung für mein eigentliches
Problem, dass mein Tiny, wenn ich eben die 1000ms warten will.... daraus
5000ms macht.
Karl Heinz Buchegger schrieb:> Du stellst im BASCOM die $crystal Angabe auf 120000.>> Denn das ist (wenn du an den Fuses nicht gespielt hast) die Einstellung>> mit der der Tiny real arbeitet.>> Man kann den Tiny auch auf einer anderen Taktfrequenz arbeiten lassen.>> Dazu muss man die Fuses umstellen und auch BASCOM mitteilen, mit welcher>> Frequenz der Tiny arbeitet. Aber die $crystal Angabe ist eine reine>> Information für BASCOM, damit der Compiler zb ausrechnen kann, wieviele>> Schleifenwiederholungen er in Auftrag geben muss, damit ein Wait(1) dann>> auch tatsächlich 1 Sekunde ergibt.
Na endlich .... :) Genau das habe ich doch gemeint g (siehe einen
Beitrag drüber)
Super, dann werde ich das doch gleich mal probieren, sobald ich wieder
daheim bin ;)
Marc schrieb:> Na dann versteh ich aber die Angabe im Programm selber nicht.... dann> brauch man se ja nicht :D
Wenn ich dir eine Uhr mit einem tickenden Zeiger in die Hand drücke,
woher weißt du, wieviele Ticks du zählen musst, damit du genau 1 Stunde
wartest?
Was ist wenn das Uhrwerk, das ich dir gebe, fehlerhaft ist, und nur 50
mal in der Minute tickt?
Was ist, wenn das Uhrwerk zu schnell geht, und der Zeiger 90 mal in der
Minute vorrückt.
Solange du mit 60 Sekundenticks in der Minute rechnest und nicht
berücksichtigst, dass das Uhrwerk, das ich dir gegeben habe anders
funktioniert, wird deine angestrebte 1 Stunde nie stimmen.
Da ich aber weiß, wie schnell das Uhrwerk das ich dir gegeben habe,
wirklich tickt, teile ich dir das mit, und mit dieser Information kannst
du wiederrum arbeiten um die 1 Stunde ohne Fehler hinzukriegen. Lüge ich
dich aber an, und sag dir, der Sekundenzeiger tickt 428 mal in der
Minute, dann wirst du viel früher als nach 1 Stunde "Fertig mit Warten"
rufen!
Marc schrieb:> Das wiederum würde heissen wenn ich "waitms = 1000" ausführe, es bei> jeder eingestellten Taktfrequenz (unabhängig von der Angabe im Program,> unter $crystal) gleich sein müsste.
Nein.
So ein Tiny ist ja kein David Copperfield.
Woher soll der denn wissen, wie lange 1 Sekunde ist?
Seine einzige 'Uhr' ist die Taktfrequenz mit der er betrieben wird. Und
um zu wissen, wie oft er diesen Takt zählen muss, damit 1 Sekunde vorbei
ist, muss er die Information haben, wie schnell der Taktgeber schwingt.
Ist doch ganz einfach. Du setzt da die ganze Zeit etwas vorraus, was in
der Relaität nicht so ist.
Karl Heinz Buchegger schrieb:> Nein.>> So ein Tiny ist ja kein David Copperfield.>> Woher soll der denn wissen, wie lange 1 Sekunde ist?>>>> Seine einzige 'Uhr' ist die Taktfrequenz mit der er betrieben wird. Und>> um zu wissen, wie oft er diesen Takt zählen muss, damit 1 Sekunde vorbei>> ist, muss er die Information haben, wie schnell der Taktgeber schwingt.>>>> Ist doch ganz einfach. Du setzt da die ganze Zeit etwas vorraus, was in>> der Relaität nicht so ist.
Ja sorry, habe mich von cyblord etwas durcheinander bringen lassen :)
cyblord schrieb:> Wie oft noch?> Die Taktoptionen werden mit den Fuses eingestellt und die werden direkt> über einen ISP-Programmer gesetzt und haben mit dem Programm welches du> in den Controller lädst nichts zu tun. Es passiert nicht alles im Leben> auf magische Art und Weise von selbst und allein.>> gruß cyblord
Die Taktoption hat in dem Fall soweit etwas mit dem Programm zu tun, da
danach comiliert wird.
Stimmt also die §Crystal-Angabe im Programm nicht, stimmen die Timings
im Ablauf nicht.
Ich denke das Problem mit der Zeitversetzung wird womit behoben sein,
dem steht wohl nichts mehr im weg (hoffen wir mal :D).
Aber ob das auch das Problem mit meinem Funksender löst, wird sich
zeigen g
Super, vielen Dank :)
Schreibe auf jeden Fall noch, obs den gewünschten Erfolg gebracht hat
oder nicht.
Marc schrieb:> Ja sorry, habe mich von cyblord etwas durcheinander bringen lassen :)
Du kannst mich.
Ich kann nichts dafür wenn du nicht verstehst was ich schreibe.
Ich bin raus.
Marc schrieb:> Dass man die Frequenz im Programm nicht ändern kann ist mir klar, aber> denke anhand von der Angabe wird Bascom das Programm compilieren?!
Hallo Marc,
vielleicht ist das bei den vielen hilfreichen Tipps hier im Thread
missverständlich rübergekommen. Auf die Gefahr hin, dich nun noch mehr
zu verwirren: die Taktfrequenz lässt sich auch im Programm einstellen.
Loslaufen wird der ATtiny13A immer mit dem Takt, der über die Fuses
vorgegeben ist (z.B. 9,6 MHz oder 1,2 MHz), aber du kannst den Takt
gleich zu Anfang im Programm auf einen ganz anderen Wert abändern. Neben
den üblichen Teilungsfaktoren von 1 und 8 hast du zusätzlich auch 2, 4,
16, 32, 64, 128 und 256 zur Verfügung, so dass du zwischen 37,5 kHz und
9,6 MHz viele Frequenzen wählen kannst.
Zum Ändern benutzt du das Register CLKPS. Es muss in einer ganz
bestimmten Art beschrieben werden. Beispiel:
1
ldi r16,(1<<CLKPCE)
2
out CLKPR,r16
3
ldi r16,0b00001000 ; CPU-Prescaler 256
4
out CLKPR,r16
Falls du zum Beispiel unabhängig von den der CKDIV8-Fuse immer 9,6 MHz
Takt haben willst, muss das hier ganz vorne in dein Programm:
1
ldi r16,(1<<CLKPCE)
2
out CLKPR,r16
3
ldi r16,0b00000000 ; CPU-Prescaler 1
4
out CLKPR,r16
Genaueres findest du im Datenblatt des ATtiny13A im Kapitel 6.4.2 "CLKPR
– Clock Prescale Register". Das Datenblatt solltest du übrigens
unbedingt lesen, man kann es nicht oft genug sagen. :-)
Markus
Markus Weber schrieb:> Hallo Marc,>>> Zum Ändern benutzt du das Register CLKPS. Es muss in einer ganz>> bestimmten Art beschrieben werden. Beispiel:>> ldi r16,(1<<CLKPCE)>> out CLKPR,r16>> ldi r16,0b00001000 ; CPU-Prescaler 256>> out CLKPR,r16>>>> Falls du zum Beispiel unabhängig von den der CKDIV8-Fuse immer 9,6 MHz>> Takt haben willst, muss das hier ganz vorne in dein Programm:>> ldi r16,(1<<CLKPCE)>> out CLKPR,r16>> ldi r16,0b00000000 ; CPU-Prescaler 1>> out CLKPR,r16>>>> Genaueres findest du im Datenblatt des ATtiny13A im Kapitel 6.4.2 "CLKPR>> – Clock Prescale Register". Das Datenblatt solltest du übrigens>> unbedingt lesen, man kann es nicht oft genug sagen. :-)>>>> Markus
Hi Markus,
das nenn ich mal Support :) Bei deinem Online-Shop hab ich die ATtinys
nämlich bestellt ;)
Danke für den Tipp.
Geht das nur als Assambler, oder auch mit Bascom?
Marc schrieb:> Geht das nur als Assambler, oder auch mit Bascom?
Was ist denn hier wieder für einer unterwegs? Zitate doppelt so lang wie
im Original. Keinen Bock das selber auszuprobieren. Auch in BASCOM geht
Inline AssEmbler und das auch noch sehr einfach. Sicher ist die nächste
Frage: Wie mach ich das?
Klinke schrieb:> Marc schrieb:>>> Geht das nur als Assambler, oder auch mit Bascom?>>>> Was ist denn hier wieder für einer unterwegs? Zitate doppelt so lang wie>> im Original. Keinen Bock das selber auszuprobieren. Auch in BASCOM geht>> Inline AssEmbler und das auch noch sehr einfach. Sicher ist die nächste>> Frage: Wie mach ich das?
Das Niveu der Leute sinkt scheints auch immer niedriger hier.
Beschäfftigt man sich mal einen Tag mit einer anderen Sprache wie
Arduino und hat fragen dazu..... schon wird man dumm angemacht.
Ja wir wissens, ihr seit super intelligent und habt bestimmt bei der
Geburt schon in die Gebärmutter programmiert :D
Echt lachhaft sowas.
Wenn ihr Anfänger nicht unterstützen wollt (und wohl auch nicht könnt),
dann schreibt einfach nicht und investiert die Zeit in eure Freizeit....
falls ihr das überhaupt könnt.
Wie schon oben geschrieben bin ich derzeit nicht zu Hause (da es auch
noch Leute gibt die Geld verdienen und manch einem sein Unterhalt zahlen
müssen hier mal niemand anschaut)
Und bevor ich dazu komme, das selber zu probieren, kann man sich
zumindest mal die Informationen zusammen tragen.
Tut mir leid das ich sowas schreibe, aber so langsam geht mir das
kindische getue echt auf deen Nerv.
Marc schrieb:> Und bevor ich dazu komme, das selber zu probieren, kann man sich> zumindest mal die Informationen zusammen tragen.
Machst du ja nicht, das willst du andere machen lassen.
wo denn? sag ich... schreib mir das Programm?
Hab ich geschrieben wir ich im Bascom assembly anwenden kann?
Dann würde ich hier nochmal genau alles lesen!
Also das Abändern von $Crystal hat das Problem mit der Zeit behoben ;)
Funk geht leider immer noch nicht so wie es soll.... aber werde
weiterhin probieren ;)
Danke an die Personen, die hilfreiche Beiträge geleistet haben.... und
das in der kurzen Zeit, top.