ja, in TIMSK das Bit OCIE0 (Timer/Counter0 Output Compare Match Interrupt Enable) oder TOIE0 (Timer/Counter0 Overflow Interrupt Enable)Muss ich den Timer noch irgendwie anders initialisieren?
setzen.
Guten Tag, ich bin neu hier im Forum und neu mit dem Attiny 25 und bitte um Hilfe (und nachsicht)
Ich möchte den Timer 0 bentzen und wenn ich ihn mit
ldi mp,0x05 ; teiler 1024
out TCCR0B,mp
und port b aus ausgang setze
;port b setzen
ldi mp,0b11111111
out DDRB,mp
und dann mit
loop:
in mp,TCNT0
cpi mp,0
brnq loop
abfrage, dann bleibt er in dieser Schleife hängen, im Simulator und wohl auch im Cpip läuft der Timer nicht los.
Muss ich den Timer noch irgendwie anders initialisieren?
Vielen Dank schon mal im Voraus
ja, in TIMSK das Bit OCIE0 (Timer/Counter0 Output Compare Match Interrupt Enable) oder TOIE0 (Timer/Counter0 Overflow Interrupt Enable)Muss ich den Timer noch irgendwie anders initialisieren?
setzen.
Sorry, der Timer läuft das Proplem lag in der Auswertung
So blinkt schön vor sich hin
.NOLIST
.INCLUDE "c:/Atmel/tn25def.inc"
.LIST
.DEF mp = R16
.DEF z1 = R17
rjmp main
main:
ldi mp,0
ldi z1,0
;timer starten
ldi mp,0x05
out TCCR0B,mp
;port b setzen
ldi mp,0b11111111
out DDRB,mp
loop:
in mp,TCNT0
cpi mp,0
brne loop
loop2:
in mp,TCNT0
cpi mp,0
breq loop2
com z1
out PORTB,z1
rjmp loop
Warum ?ja, in TIMSK das Bit OCIE0 (Timer/Counter0 Output Compare Match Interrupt Enable) oder TOIE0 (Timer/Counter0 Overflow Interrupt Enable)
setzen.
Muß man immer ein Interrupt nutzen ?
Und wenn Du sowas schreibst, solltest Du noch dabei schreiben, daß man noch die Interrupts erlauben soll, einen Vektor schreiben muß, außerdem noch den Stackpointer usw.
Wie ich sehe willst Du PortB invertieren, mach das so:
Und zwar ohne InterruptCode:loop: in mp,TIFR sbrs mp,TOV0 rjmp loop ldi mp,(1<<TOV0) out TIFR,mp com z1 out PORTB,z1 rjmp loop
Schau im Dattenblatt, was TIFR und TOVO zu sagen haben und wenn Du das verstanden hast, kannst Du Dich mit der Interruptversion auseinander setzen.
Gruß Sebastian
Linus TorvaldSoftware is like s e x: its better when its free.
Vielen Dank für die Hinweise, ich bin mit meinem erstenVersuch ganz zufrieden, letzlich ist es ja nicht sinnvoll, die Timer im Polling Modus nur mit Zählen zu beschäftigen, meine nächste lektion sind die Interrupts
Herzlich
Klaus
Sag das nicht, manchmal ist es sinnvoller zu warten, als den Interrupt zuzulassenletzlich ist es ja nicht sinnvoll, die Timer im Polling Modus nur mit Zählen zu beschäftigen
Gruß Sebastian
Linus TorvaldSoftware is like s e x: its better when its free.
Hallo Sebastian, hier isnd meine Schularbeiten, war nicht leicht aber sehr interessant
loop:
in mp,TIFR ; holt interrupt Flag Register in mp
sbrs mp,TOV0 ; prüft ob TOV0 gesetzt ist
rjmp loop ; wenn ja überspringe den nächsten Befehl sonst loop
ldi mp,(1<<TOV0) ; setze TOV0 in mp auf 1 was TOV0 klärt
out TIFR,mp ; out in Interrupt flag reg
com z1
out PORTB,z1
rjmp loop
wenn ich das so nachrechne, komme ich mit dem Vorteiler 1024
auf eine Blinkfrequenz von 0,38 Hertz
Heißt das dass der Controller mit 1 Mhz die Befehle abarbeitet
0,3814 X 256 X 1024 = 1Mhz
Der Resonator hat 8 Mhz, geht es auch schneller als 1 Mhz?
Danke
Klaus
Hallo Klaus,
Ich weiß nicht...ldi mp,(1<<TOV0) ; setze TOV0 in mp auf 1 was TOV0 klärt
Hier wird TOV0 nicht 1 gesetzt, sondern durch schreiben einer 1 in TOVO (und Achtung, nur TOV0 sonst keinen anderen Bit) wird TOV0 gelöscht.
Schau mal auf meiner HP rein Da habe ich das alles (hoffentlich) verständlich beschrieben
Deine Rechnerei ist soweit richtig alle 262 mS wird PORTB umgeschaltet.
Was den Takt angeht, ja Tiny 25 wird mit 8MHz getaktet aber standardmäßig ist auch CLKDIV8 Fuse gesetzt, wo der Takt natürlich auf 1MHz runtergesetzt wird.
Arbeitest Du mit Studio?
Schau Dir dann die Fuses an CLKDIV8 müsste programmiert sein(Achtung
programmiert -> 0 unprogrammiert -> 1)
So ist es in der Hardware und im Studio bis 4.13.571 war es auch so (programmiert kein Häckchen unprogrammiert Häckchen).
In Studio 4.13.571 haben sie die Logik gedreht![]()
Alles was Du jetzt machst, machst Du auf eigene Verantwortung...
Fuses mit Read auslesen,
bei CLKDIV8 Häckchen machen, oder entfernen je nach Version(Sonst nichts ändern)
Fuses mit write schreiben.
Aber pass auf, je nachdem was Du sonst alles bei Fuses verstellst, kannst Dich ausperen und Dein µC läßt sich nicht mehr ansprechen.
So, was jetzt noch interessant ist, Du kannst Den Clockprescaller (genauso wie bei Timer) zwischen 1-256 verstellen .
\/
Das ist sehr praktisch bei Batteriebetrieb und vor allem, wenn man den Powerdownsleepmodus nicht nutzen kann.
Aber schau mal selbst im Dattenblatt nach Register CLKPR da wird alles erklärt.
Gruß Sebastian
Linus TorvaldSoftware is like s e x: its better when its free.
Hallo Sebastian,
vielen Dank, das mit der Clockrate lasse ich ersteinmal, mit 1 Mhz ist gut rechnen.
Ich war auf deiner HP und habe mich über die Beispiele gefreut. Habe das Interruptprogramm abgetippt und versucht die Register an den Tiny 25 anzupassen, leider ohne Erfolg, trotz intensiver Suche im Datenblatt
Kannst du mir die entsprechen Register nennen
.org OC2addr -- der 25 hat Timer 0 und 1, ich finde keinen Restevoektor hierfür (im Datenblatt S. 50)
OCR2 könnte OCR0A sein es gibt auch OCR0B
TCCR2 könnte TCCR0B sein (dort wir prescaler eingestellt
OCIE2 könnte OCIE0A sein dazu gibt es im Datenblatt keinen Hinweis auf den dazugehörenden Interruptvektor
Ich hoffe, du kannst nachvollziehen , wo ich hänge
so ganz für dummies ist deine Seite ja nicht - wenn man nicht nur abtippt sondern auch mitdenken will
Herzlich Klaus
Ja,ja, die Vektoren, die machen die Assemblerprogramme leider nicht 100% kompatibel
Es gibt aber eine einfache Abhilfe:
Man macht sich im Falle von tn25 die tn25def.inc Datei auf, sie liegt unter Atmel/Assembler2/Appnotes und scrollt ganz zum Ende.
Jetzt sieht man sowas:
Was einem auffält, es gibt für Timer 0 direkt 2 Compare Match Kanäle, die auch mit 2 verschiedenen Pins verbunden werden können PB0 und PB1.Code:; ***** INTERRUPT VECTORS ************************************************ .equ INT0addr = 0x0001 ; External Interrupt 0 .equ PCI0addr = 0x0002 ; Pin change Interrupt Request 0 .equ OC1Aaddr = 0x0003 ; Timer/Counter1 Compare Match 1A .equ OVF1addr = 0x0004 ; Timer/Counter1 Overflow .equ OVF0addr = 0x0005 ; Timer/Counter0 Overflow .equ ERDYaddr = 0x0006 ; EEPROM Ready .equ ACIaddr = 0x0007 ; Analog comparator .equ ADCCaddr = 0x0008 ; ADC Conversion ready .equ OC1Baddr = 0x0009 ; Timer/Counter1 Compare Match B .equ OC0Aaddr = 0x000a ; Timer/Counter0 Compare Match A .equ OC0Baddr = 0x000b ; Timer/Counter0 Compare Match B .equ WDTaddr = 0x000c ; Watchdog Time-out .equ USI_STARTaddr = 0x000d ; USI START .equ USI_OVFaddr = 0x000e ; USI Overflow .equ INT_VECTORS_SIZE = 15 ; size in words
Das ist aber für den Fall egal.
Du suchst Dir einfach einen aus und nimmst entweder den OC0Aaddr oder den OC0Baddr Vektor.
Dann aber anstatt von OCR2 OCR0A bzw. OCR0B und der Rest genauso
Du kannst es auch im Simulator durchspielen...
Tja, die Sache mit Dummies he,he
Ich wollte was einfaches schreiben,was jeder versteht, mit anderen Tutorials haben manche Leute Probleme, und wenn man versucht irgendwas auf eine lockere Weise zu übermitteln wird das eher verstanden.
Ob es mir gelungen ist weiß ich nicht so recht, dafür gibt es zu wenig Feedback, leider wollen immer weniger Leute was mit Assembler zu tun haben
Es soll ja nicht heißen, daß man nur noch Assembler macht, ich programmiere öfter auch in C, aber so ein Crashkurs von sag ich mal 2 Wochen würde sehr vielen Leuten gut tun...
Gruß Sebastian
P.S.
Wie ich sehe hast Du doch schon einiges selber rausgefunden![]()
Linus TorvaldSoftware is like s e x: its better when its free.
Lesezeichen