Forum: Mikrocontroller und Digitale Elektronik Prescaler funktioniert nicht in einem vorgegeben Programm


von Tzu Y. (tzu)


Lesenswert?

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

von Wilhelm F. (Gast)


Lesenswert?

@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!

von Tzu Y. (tzu)


Lesenswert?

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

von Otto (Gast)


Lesenswert?

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

von Georg (Gast)


Lesenswert?

>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.

von spess53 (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Tzu Y. (tzu)


Lesenswert?

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!^^

von Otto (Gast)


Lesenswert?

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

von Gastofatz (Gast)


Lesenswert?

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".

von Otto (Gast)


Lesenswert?

naja - das hat er ja so gemacht......

von Gastofatz (Gast)


Lesenswert?

Joa ne, jetzt wo Du's sagst :-)

von Gastofatz (Gast)


Lesenswert?

>Nun hat das Programm einen Prescale eingebaut allerdings funktioniert es
>mit diesem nicht.

Was heißt das genau?

von Tzu Y. (tzu)


Lesenswert?

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

von Tzu Y. (tzu)


Lesenswert?

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

von Gastofatz (Gast)


Lesenswert?

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.

von avr (Gast)


Lesenswert?

@Tzu Ying

Für Assembler gibt es auch hier viel Hilfreiches:

http://www.avr-asm-tutorial.net/avr_de/index.html

avr

von Gastofatz (Gast)


Lesenswert?

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.

von Hc Z. (mizch)


Lesenswert?

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.

von Otto (Gast)


Lesenswert?

Was ich immer wieder toll finde, ist wenn in solchen Lernbausätzen die 
angegebenen Schaltungen bzw. Programme nicht funktionieren......

von Gastofatz (Gast)


Lesenswert?

>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!!

von Hc Z. (mizch)


Lesenswert?

Im Datenblatt des Tiny26 finde ich nichts davon.  Es dürfte 1/2 Jahr alt 
sein.  Dort steht, dass SP auf 0 initialisiert wird.

von Stefan E. (sternst)


Lesenswert?

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.

von Hc Z. (mizch)


Lesenswert?

Äm, ich ging davon aus, dass der TE einen Tiny26 verwendet, keine Ahnung 
warum.  Deshalb bezog ich mich darauf.

von Stefan E. (sternst)


Lesenswert?

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".

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Georg (Gast)


Lesenswert?

>Im Originalcode ist Warten nur ca. 15ms lang

Bei 12MHz. Wahrscheinlich benutzt er eine viel geringere Systemfrequenz.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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 :)

von Tzu Y. (tzu)


Lesenswert?

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
Noch kein Account? Hier anmelden.