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.
naja, sah ungefähr so aus:
1 | $regfile = "attiny13.dat" |
2 | $crystal = 9600000 |
3 | |
4 | |
5 | Config Portb.0 = Output |
6 | LED Alias Portb.0 |
7 | LED = 0 |
8 | |
9 | Do
|
10 | |
11 | set LED |
12 | wait 1 |
13 | reset LED |
14 | wait 2 |
15 | |
16 | Loop
|
hoffe das stimmt so ungefähr aus dem kopf :D
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?
1 | $crystal = 1200000 ' da 9,6Mhz/8 |
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.