Schönen Guten Abend erstmal, ich habe folgendes Programm (2Led die abwechselnd Blinken)aus dem Franzis AVR lern Kid für den Tiny13 vorliegen. (Nicht von mir programmiert) Nun hat das Programm einen Prescale eingebaut allerdings funktioniert es mit diesem nicht. Wenn ich die 6 Zeilen des ";Speed Divider Set" herausnehme funktioniert das Abwechselnde Blinken der LED´s und sobald der Prascaler drinne ist sollte doch die Schaltung nur noch halb so schnell laufen (jedenfalls nach Tiny Datenblatt) oder nicht? Ich entschuldige mich falls ich noch eventuel keine Fachwörter benutzen kann, ich bin noch nicht so lange dabei Hier der Code: --------------------------------------------------------------------- ;Blink2.asm Blinker mit Unterprogramm .include "tn13def.inc" .def a = r16 ;Speed Divider Set cli ldi a, 0b10000000 out CLKPR, a ldi a, 0b00000001 out CLKPR, a sei rjmp Anfang Anfang: ldi r16,0x18 ;PB4 und PB4 out ddrb,r16 ;Datenrichtung Schleife: ldi r16,8 ;8 = 0x08 out portb,r16 ;PB3 = 1, PB4 = 0 rcall Warten ;Unterprogrammaufruf ldi r16,16 ;16 = 0x10 out portb,r16 ;PB3 = 0, PB4 = 1 rcall Warten ;Unterprogrammaufruf rjmp Schleife Warten: Ldi r16,20 Warten1: ;äußere Schleife Ldi r17,250 Warten2: ;innere Schleife dec r17 brne Warten2 dec r16 brne Warten1 ret ;Rücksprung ------------------------------------------------------------------------ --- Ich bin ein wenig verwirt da dieses Programm ohne den Prescaler im Heft abgedruckt ist. Aber mit Prescaler auf der CD ? Kann das denn so gehen? Mit freundlichem Gruß TZU
@Tzu Ying: >Ich entschuldige mich falls ich noch eventuel keine Fachwörter >benutzen kann, ich bin noch nicht so lange dabei Keine Panik, deine Grammatik und Rechtschreibung sind sehr viel besser als bei vielen meiner eigener Landsleute. >Ich bin ein wenig verwirt da dieses Programm ohne den Prescaler >im Heft abgedruckt ist. Aber mit Prescaler auf der CD ? Kann das >denn so gehen? >sobald der Prascaler drinne ist sollte doch die Schaltung nur noch >halb so schnell laufen (jedenfalls nach Tiny Datenblatt) oder nicht? So ähnlich verstehe ich das alleine von den Begriffen. Sorry, ich kenne deine Hard- und Software nicht im Detail, und kann mich nicht so schnell einarbeiten. Hast du auf der CD etwas anderes? Dann versuche doch das!
Hi Wilhelm, also habe dieses Paket: http://www.franzis.de/elektronik/lernpakete-elektronik/lernpaket-mikrocontroller AT Tiny13 in Assembler programmiert. Also mein Ziel ist es ein Programm zu schrieben das mit einem veringerten Takt leuft also vermute ich brauche ich so ein Prescale leider arbeite ich mich grad sehr langsam nur hinein. Für mich stellt sich nur die Frage ob man das so wie es in dem Programm oben steht überhaupt machen kann also das Global der Code mit einer geringeren Taktrate leuft. Also bzw wie ich das Programm oben zum laufen bekommen mit einem veringeren Takt wie wohl durch den Prescaler probiert.... Also generell wüsste ich gerne ob man diese Zeile.....: ------------------------------------------ ;Speed Divider Set cli ldi a, 0b10000000 out CLKPR, a ldi a, 0b00000001 out CLKPR, a sei ----------------------------------------- ....generell vor jedes Programm schreiben kann und dieses leuft dann dadurch langsamer ab? Oder geht das so auf jedenfall nicht? Gruß TZU
Grundsätzlich hat der Prescaler in dem von Dir geposteten Programm keine direkte Auswirkung auf die Blinkfrequenz - lies bitte: http://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer Otto
>Grundsätzlich hat der Prescaler in dem von Dir geposteten Programm keine >direkte Auswirkung auf die Blinkfrequenz Der Prescaler beeinflußt den CPU-Takt. Schau mal ins DB.
Hi >Grundsätzlich hat der Prescaler in dem von Dir geposteten Programm keine >direkte Auswirkung auf die Blinkfrequenz - lies bitte: Ersten benutzt er keinen Timer und zweitens ist deine Aussage falsch. Lies bitte : Datenblatt. >....generell vor jedes Programm schreiben kann und dieses leuft dann >dadurch langsamer ab? Nein, nicht vor dein Programm. Am Anfang deines Programms liegt immer die Sprungtabelle für die Interrupts. Für den ATTiny13 sieht das vollständig etwa so aus:
1 | rjmp RESET ; Reset |
2 | rjmp EXT_INT0 ; IRQ0 Request |
3 | rjmp PC_INT0 ; External nterrupt0 |
4 | rjmp TIM0_OVF ; Timer0 Overflow |
5 | rjmp EE_RDY ; EEPROM Ready |
6 | rjmp ANA_COMP ; Analog Comparator |
7 | rjmp TIM0_COMPA ; Timer CompareA |
8 | rjmp TIM0_COMPB ; Timer CompareB |
9 | rjmp WDT ; Watchdog Time-out |
10 | rjmp ADC_COMP ; ADC Conversion Complete |
11 | |
12 | RESET: |
Dein Programmteil kannst du frühestens ab 'RESET:' einfügen. MfG Spess
spess53 schrieb:
> Dein Programmteil kannst du frühestens ab 'RESET:' einfügen.
Grundsätzlich hast du schon recht.
Aber da er keine Interrupts benutzt, sollte das in seinem speziellen
Fall egal sein.
Muss man eigentlich beim Tiny13 den Stackpointer setzen?
Ansosnten: keine Ahnung, was da los sein könnte. Da werden wir wohl auf
den Tiny Spezialisten Hannes warten müssen.
Hi >Grundsätzlich hast du schon recht. >Aber da er keine Interrupts benutzt, sollte das in seinem speziellen >Fall egal sein. Es kann ja sein, das er über minimalistische Beispielprogramme herauskommt. >Muss man eigentlich beim Tiny13 den Stackpointer setzen? Wenn man keine Unterprogramme oder Interrupts benutzt, nicht. Ansonsten wäre es empfehlenswert. MfG Spess
Hi, okay danke für eure Posts leider kann ich noch nicht viel mehr als die kleinen simplen Programmen ich bin momentarn ehrlich gesagt noch ziemlich überfordert mit: Datenblatt & Tutorials besser gesagt mit diesen Timer funktionen und Interups hänge da schon leider mehre Tage und komm nur sehr langsam vorran. Ist das normal? Oder sollte man das recht schnell checken? ICH BLEIB DRAN!^^
Hi, das dauert sicher ein paar Wochen - im Datenblatt finde ich keinen Hinweis, weshalb Dein Code nicht funktioniert - tatsächlich sollte sich die Taktfrequenz halbieren. Allerdings solltest Du die Vektoren (Sprungtabelle siehe Post von "spess53") einfügen, sonst gibt es Ärger, sobald Du einen Interrupt verwendest. Otto
Um das CLKPR-Register erfolgreich mit einem neuen Prescale-Wert zu beschreiben, muss man zuerst das CLKPCE-Bit (Clock Prescaler Change Enable) setzen, sonst bleibt ein "out" auf dieses Register wirkungslos. Während der nächsten vier Taktzyklen ist das CLKPR-Register dann beschreibbar. Danach wird das CLKPCE-Bit von der Hardware wieder gelöscht. Diese Prozedur soll das Register vor unbeabsichtigten Änderungen schützen. Beim Disablen des Watchdogs ist es genau dasselbe. Siehe Datenblatt unter "System Clock Prescaler".
>Nun hat das Programm einen Prescale eingebaut allerdings funktioniert es >mit diesem nicht. Was heißt das genau?
Guten morgen alle zusammen, @Gastofatz also das beudeutet das die LEDs nicht anfangen zu leuchten wenn das oben geschriebene Programm so in den Tiny übertragen wird aber AVR Studio bringt auch keine Fehlermeldung beim Compilieren. Allerdings sobald ich die Zeilen des Prescaler herausnehme blinken die Leds wie im Programm programmiert recht schnell. Und wenn ich es im Datenblatt richtig lese dann sollte es ein eingesteller Divisior von 2 haben (richtig?) also müsste ich die LED ja noch deutlich blinken sehen oder ist das ein trugschluss ? Hoffe ich verstehst nicht falsch jetzt oben weil einer auf meinte das es so garnicht die Blinkfrequenz benifllussen kann. werde troztdem mal wenn ich nachher wieder Windows Rechner bin diese Vector Tabelle einfügen. Georg schrieb: > Der Prescaler beeinflußt den CPU-Takt. Schau mal ins DB. also das habe ich jetzt gedeutet das es geht hoffe das ist kein Missverständnis aber ich werde mir auch weiter Tutorials veruschen zu verinnerlichen. um besser durchzusteigen und euch noch besser folgen zu können. Gruß TZU
Danke auch schon mal an alle, habe grade echt viel gelernt und das Tutorial für timer habe ich schon wesentlich besser verstanden (-: DANKE DANKE DANKE Gruß TZU
Hallo Tzu, >also das beudeutet das die LEDs nicht anfangen zu leuchten wenn das oben >geschriebene Programm so in den Tiny übertragen wird aber AVR Studio >bringt auch keine Fehlermeldung beim Compilieren. ich habe es gerade mit Deinem Code sowohl im Simulator als auch real (ATtiny13V-10PU auf STK500) ausprobiert und bei mir funktioniert es. Die Blinkfrequenz verlangsamt und beschleunigt sich je nach CLKPR-Wert wie ich es erwarte. >Allerdings sobald ich die Zeilen des Prescaler herausnehme blinken die >Leds wie im Programm programmiert recht schnell. Der Auslieferungszustand beim ATtiny13 ist "interner rc oszillator mit 9.6 Mhz + CLKDIV8 Fuse programmiert" --> Systemclock FOSC = 1.2 MHz. Wenn CLKPR nicht verändert wird, flimmern die LEDs damit vor sich hin. >Und wenn ich es im Datenblatt richtig lese >dann sollte es ein eingesteller Divisior von 2 haben (richtig?) also >müsste ich die LED ja noch deutlich blinken sehen Kommt drauf an, ob die CLKDIV8 Fuse programmiert ist oder nicht. Divisor über CLKPR auf 2 und CLKDIV8 programmiert --> Vervierfachung von FOSC. Divisor über CLKPR auf 2 und CLKDIV8 unprogrammiert --> Halbierung von FOSC. Das liegt daran, dass unmittelbar nach einem Reset von der Hardware das CLKPR-Register nach der Fuse-Einstellung geladen wird, mit entweder 0000 oder 0011. >Hoffe ich verstehst nicht falsch jetzt oben weil einer auf meinte das es >so garnicht die Blinkfrequenz benifllussen kann. Es beeinflusst die Blinkfrequenz. Die CLKPR-Einstellung wirkt sich auf die Taktfrequenz der CPU und die aller I/O-Module aus. NICHT beeinflusst wird dagegen der 128 kHz-Watchdog-Oszillator. >werde troztdem mal wenn ich nachher wieder Windows Rechner bin diese >Vector Tabelle einfügen. Das schadet nichts, wird aber den Fehler nicht beheben. > Georg schrieb: > Der Prescaler beeinflußt den CPU-Takt. Schau mal ins DB. So ist es. Warum Dein Programm nicht funktioniert ist mir momentan ehrlich gesagt unbegreiflich.
@Tzu Ying Für Assembler gibt es auch hier viel Hilfreiches: http://www.avr-asm-tutorial.net/avr_de/index.html avr
Lass mal die Suche in diesem Forum laufen mit "CLKPR" als Stichwort. Es gibt ein paar Beiträge dazu, in denen auch andere von sonderbaren Problemen betreffend CLKPR-Register berichten. Solange es nicht unbedingt nötig ist, würde ich die Finger von dem Ding lassen.
Ich weiß nicht, was an CLKPR Besonderes sein soll und kenne keine ernstzunehmenden Probleme damit. Ich weiß aber, dass ein Programm, das Subroutinen aufruft, ohne SP je zu intialisieren, nach anderer Aktion schreit als ausgerechnet - wenn es nicht gehen will - an CLKPR rumzuunken.
Was ich immer wieder toll finde, ist wenn in solchen Lernbausätzen die angegebenen Schaltungen bzw. Programme nicht funktionieren......
>Ich weiß aber, dass ein Programm, das Subroutinen aufruft, ohne SP je zu >intialisieren Bei den neueren AVRs ist das nicht mehr nötig, weils die Hardware schon macht. Datenblatt ATtiny13: "This Stack space in the data SRAM is automaticall defined to the last address in SRAM during power on reset." Natürlich auch im Simulator entsprechend. Sonst würde das Originalprogramm bei mir auch garantiert nicht laufen (sowohl simuliert als auch auf einem realen ATtiny13), sondern beim ersten "ret" abstürzen. >...wenn in solchen Lernbausätzen die >angegebenen Schaltungen bzw. Programme nicht funktionieren...... LOL, aber echt!!
Im Datenblatt des Tiny26 finde ich nichts davon. Es dürfte 1/2 Jahr alt sein. Dort steht, dass SP auf 0 initialisiert wird.
Hc Zimmerer schrieb: > Im Datenblatt des Tiny26 finde ich nichts davon. Es dürfte 1/2 Jahr alt > sein. Genau, deswegen ist er auf der AVR-Website auch unter "Mature Devices" gelistet. Oder ist der "/" in "1/2" nur ein Tippfehler? PS: Beim Tiny13 wird definitiv der SP von der Hardware initialisiert.
Äm, ich ging davon aus, dass der TE einen Tiny26 verwendet, keine Ahnung warum. Deshalb bezog ich mich darauf.
Ach, ich kapiere erst jetzt, dass das "1/2 Jahr alt" wohl auf das Datenblatt bezogen war. Sorry. Ich hatte deinen Post verstanden als Antwort auf das "Bei den neueren AVRs ist das nicht mehr nötig". So nach dem Motto "der Tiny26 ist erst 1/2 Jahr alt, und bei dem ist das nicht so".
Die Frage von Tzu Ying zum Clock Prescale Register CLKPR hat mich neugierig gemacht. Diesen Teil im Datenblatt hatte ich bisher "überlesen" :) Deshalb habe ich den Code im AVR Simulator (uraltes AVR Studio 4.12 SP2) und auf dem Pollin Funk-AVR-Evaluationsboard mit Attiny2313 @ 12 MHz nachgestellt. Im Simulator zeigt der Codeteil Speed Divider Set keine Funktion, auf der Hardware aber schon. Wer das selbst nachvollziehen mag: http://www.mikrocontroller.net/articles/Pollin_Funk-AVR-Evaluationsboard#.22Scotty.2C_Handbremse.21.22 @ Tzu Ying Im Originalcode ist Warten nur ca. 15ms lang (Ausgemessen mit der Stopwatch im AVR Studio Simulator) Möglicherweise sieht man den Unterschied zwischen 15ms und 2*15ms Blinkwechsel zu schlecht. Ich habe die Wartefunktion auf 150ms verlängert und das sieht man sehr gut.
>Im Originalcode ist Warten nur ca. 15ms lang
Bei 12MHz. Wahrscheinlich benutzt er eine viel geringere Systemfrequenz.
Wahrscheinlich. Ich hatte deshalb den Originalcode bei 1 MHz simuliert und die Stoppuhr zeigte damit 15ms. Für meine 12 MHz Variante habe ich eine weitere 10*12=120-Schritt Schleife um den Originalcode gebaut. 12 skaliert 12 MHz auf 1 MHz und 10 verlängert 15ms auf 150ms. Ich habe jetzt auch eine 15ms Version geflasht (alleräusserste Schleife 12x statt 120x). Den Unterschied im Flimmern sieht man - sauschnelles hektisches Flimmern gegen schnelles Flackern :)
Sooooooo... ALso ich hab heute wie verückt Assembler gelernt glaub kann ich mittlerweile besser als Englisch^^ Ne aber im erst ab echt viel mir heute angeschaut und Tutorials gelesen. Konnte leider nicht Feststellen woran das nun lag aber ich hab heute ein Programm geschrieben mit einem Timeruinterupt und damit kam ich sehr weit dank den Links und den Tipps also vielen dank für die Anstrengungen hat mit alles sehr geholfen im Gesammten. Achja bei mir war ohne diesen Prescaler einstellungen das Blinken gut zu sehen, kann auch sein das ich die schleife ein wenig verändert habe. Bei disem Bausatz wird man auch ein bischen dummgehalten muss ich sagen also das mit den Fuses wird überhaupt nicht angesprochen das wird einfach mit überspielt. Aber trotzdem kann ich das Franzis Paket sehr empfehlen (-:
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.