Hmm..ich komm nicht klarIch kann doch nicht 2mal das Register TIMSK belegen, dann laufen die Timer doch falsch. Ich muss ja für Timer0 UND für Timer2 das Register TIMSK beschreiben, aber dann läuft ja alles falsch.
@Florian:
Bitte, bitte
Ich hör auf 'Georg' und 'Johann', aber Johann ist ok.
Vorerst wirst du mich eh nicht mehr ansprechen, denn ich bin ab morgen im Urlaub *freu*.
Disclaimer: none. Sue me.
Hmm..ich komm nicht klarIch kann doch nicht 2mal das Register TIMSK belegen, dann laufen die Timer doch falsch. Ich muss ja für Timer0 UND für Timer2 das Register TIMSK beschreiben, aber dann läuft ja alles falsch.
Hallo Johann!
Viel Spass im Urlaub! ;o)
Hallo Thomas!
Im Datenblatt findest Du eine Beschreibung der jeweiligen Timer!
Dort steht dann z.B. auf Seite70 das:
Axo, ok, jetzt versteh ich, wie die 1024 zustande kommen.
Und zum TIMSK: Überschreibt er das nicht? Also weiß der Controller von selbst, wo das hin soll?
Und was ich grad getestet hab. Ich hab das letzte Programm genommen, wo die LED im Sekundentakt blinkt. Hab anstelle von Timer0 den Timer2 genommen, sonst nichts geändert, und dann blinkt die LED nimmer im Sekundentakt, sondern schneller. Also es gibt dann wohl doch einen Unterschied zwischen Timer0 und Timer2.
Man ej, heut ist echt ein scheiß Tag, bekomm gar nichts hin...GEZ nervt, kein Geld und programmieren klappt heut auch nicht.
[edit]
Ahh, bei Timer2 muss der Prescaller anders gesetzt werden, da wolltet ihr mir wohl einen Streich spielen
Aber mit dem TIMSK ist immer noch ein wenig komisch.
Ok, TOIE0 = 0
und TOIE2 = 6
Also schreibt er ja wohl das richtige Bit auf 1. Aber trotzdem blinkt die LED nimmer, wenn ich den zweiten Timer auf TIMSK setze.
Hallo Thomas!
Könntest Du Dir wieder angewöhnen die Codes bzw. Codesegmente zu posten!? ;o)
Meine Güte, Du Armer, Du tust mir ja Leid! *schmunzel*Man ej, heut ist echt ein scheiß Tag, bekomm gar nichts hin... GEZ nervt, kein Geld und programmieren klappt heut auch nicht.
Ja, ja, die liebe GEZ! ;o)
Seit einer aus unserer Straße einen wegen Hausfriedensbruch angezeigt hat, kommt niemand mehr vorbei! *g* *ganz brav GEZ bezahl*
Kleiner Vorschlag!
Du versuchst mal Dir die Register im Datenblatt nzusehen, ich sage Dir die Seiten und Du sagst mir, wozu die ganzen Register gut sind, ok!? ;o)
Ohne diese register kann man das ganze nicht umsetzen, außer man heißt Sebastian, der bekommt das auch so nebenbei hin! *g*
Also ich post einfach mal den ganzen Code erstmal:
Hab zwar schon alles in Summer geändert, aber zum testen hab ich trotzdem erstmal noch an der LED angeschlossen. So, wie jetzt der Code ist, blinkt die LED gar nicht. Wenn ich allerdings das hier auskommentiere, dann gehts:Code:.include "m8def.inc" .equ time0_1 = 256-4 ;Damit wird der Timer0 vorgeladen - für 1KHz .equ time0_2 = 256-1 ;Damit wird der Timer0 vorgeladen - für 4KHz .equ time2 = 256-90 ;Damit wird der Timer2 vorgeladen .equ Summer = PB2 ;Summer an B.2 .def tmp = r16 ;Mein Universallregister .def statusreg = r17 ;Mein Statusregister .def zaehler = r18 ;Mein Zählregister .org 0x000 rjmp reset ;Interruptvektor "reset:" .org OVF2addr rjmp pruefZaehler ;Interruptvektor für Timer2 Überlauf, hier spring ;das Programm hin, wenn der Timer überläuft .org OVF0addr rjmp blabla reset: ;Stack einrichten ldi tmp, HIGH(RAMEND) ;HIGH-Byte der obersten RAM-Adresse out SPH, tmp ldi tmp, LOW(RAMEND) ;LOW-Byte der obersten #RAM-Adresse out SPL, tmp sbi DDRB, Summer ;B.2 als Ausgang cbi PORTB, Summer ;B.2 auf LOW stellen -> LED aus am Anfang ;Timer Register werden belegt, hier Timer 2 ldi tmp, (1<<CS22) | (1<<CS21) | (1<<CS20) ;Prescaler ist 1024 out TCCR2, tmp ;Register TCCR2 ist für den Prescaller zuständig ldi tmp, (1<<TOIE2) ;Hier werden Interrupts nach Timer2 Überlauf eingeschaltet out TIMSK, tmp ;Register TIMSK ist dafür zuständig ldi tmp, time2 ;Hier wird der Timer vorgeladen und zwar mit 255-90 out TCNT2, tmp ;Timer Register werden belegt, hier Timer0 ldi tmp, (1<<CS02) | (1<<CS00) ;Prescaler ist 1024 out TCCR0, tmp ;Register TCCR0 ist für den Prescaller zuständig ldi tmp, (1<<TOIE0) ;Hier werden Interrupts nach Timer0 Überlauf eingeschaltet out TIMSK, tmp ;Register TIMSK ist dafür zuständig ldi tmp, time0_1 ;Hier wird der Timer vorgeladen out TCNT0, tmp sei ;Interrupts zulassen loop: cpi zaehler, 0b00101000 ;Wenn Zählregister != 40 ist brne loop ;dann spring wieder zurück zu "loop:" zeitum: clr zaehler ;Zählregister auf 0 setzen sbic PINB, Summer ;überspringe, wenn B.2 = 0 ist (LED aus?) rjmp zeitum1 ;wenn B.2 = 1, dann spring zu "zeitum1:" zeitum0: sbi PORTB, Summer ;B.2 = 1 setzen -> LED an rjmp loop ;wieder zur loop springen zeitum1: cbi PORTB, Summer ;B.2 auf 0 setzen -> LED aus rjmp loop ;wieder zur loop springen pruefZaehler: in statusreg, SREG ;SREG sichern inc zaehler ;Zählregister um 1 erhöhen ldi tmp, time2 ;Hier wird der Timer vorgelaen und zwar mit 255-90 out TCNT2, tmp ;Er läuft 90 mal durch, bevor ein Interrupt auftritt out SREG, statusreg ;SREG wiederholen reti ;wieder zurück, wo du hergekommen bist blabla: in statusreg, SREG ldi tmp, time0_1 out TCNT0, tmp out SREG, statusreg reti
Und das will in mein kleine Köpfchen nicht reinCode:;Timer Register werden belegt, hier Timer0 ldi tmp, (1<<CS02) | (1<<CS00) ;Prescaler ist 1024 out TCCR0, tmp ;Register TCCR0 ist für den Prescaller zuständig ldi tmp, (1<<TOIE0) ;Hier werden Interrupts nach Timer0 Überlauf eingeschaltet out TIMSK, tmp ;Register TIMSK ist dafür zuständig ldi tmp, time0_1 ;Hier wird der Timer vorgeladen out TCNT0, tmp
Mit deinem Vorschlag bin ich zufrieden, aber ich bezweifle, dasses was bringt *g*
Gruß
Thomas
PS: Sorry, dass mein letzter Post so durcheinander war![]()
Hallo Thomas!
Sei nicht unglücklich, das Leben geht weiter, wohl oder übel auch mit GEZ! ;o)
Mir ist als erstes aufgefallen, dass Du zweimal das TIMSK mit ldi -> out füllst!
Somit überschriebst Du ja das erste Mal befüllen!
Probiers mal mit einmal ldi temp , (1 << TOIE0) | (1 << TOIE2) ; out TIMSK , temp ;
Ansonsten hat das keinen Sinn!
Ich hoffe Du hast verstanden, worum es geht!?
Kleine Aufgabe:
Wie könntest Du die beiden Bits trotzdem getrennt setzen?
Aaaaaaaaaaaaaaaaahhhhhhhhhhhhhhhhhhhhh schmarn!
Ich hasse diese Editierfunktion für Moderatoren! ;o)
Ich habe versucht noch etwas zu retten! (siehe unten)
Tschuldigung!
Florian (Moderator)
Huhu Florian! ;o)
... wenn man nicht weiß, wie man die Rechnung zahlen soll ...
Genau das war mein Problem.
Richtig?
ldi tmp, (1<<TOIE0)
out TIMSK, tep
ldi tmp (1<<TOIE2)
or TIMSK, tmp
Hi Thomas! ;o)
Scheint Dir ja schon wieder besser zu gehn! *freu*
Au, das ist natürlich mistig! :o( *s__t*wenn man nicht weiß, wie man die Rechnung zahlen soll
Na dann kanns ja weiter gehn! ;o)Genau das war mein Problem.
Tut mir Leid, aber selbst wenn ich die ganzen Fehler übersehe, funktioniert das nicht!ldi tmp, (1<<TOIE0)
out TIMSK, tep
ldi tmp (1<<TOIE2)
or TIMSK, tmp
TIMSK ist leider kein vergleichbares Register!
Nein! ;o)Richtig?
[ Auf diese and & Co. wollte ich garnicht zielen, schau mal in der Instruction Set Summary nach, da gibt es zwei schöne Befehle! ]
*edit*:
Nachdem ich Dir ausversehen Deinen Text gekillt habe, habe ich auch noch Mist erzählt, der Befehl funktioniert da ja nicht, da es außerhalb der Reichweite ist! *'tschuldigung*
Heute ist wohl auch nicht mein Tag! :o(
Mein schöner Beitrag? :P *g*
Meinst du vlt. den Befehl sbr? Aber wenn du sagst, dass TIMSK kein Register ist, dann wird sbr wohl auch falsch sein. sbi isses aber auch nicht. Hmm, andere Befehle kamen für mich auch nicht in Frage.
Aber wenn TIMSK ein vergleichbares Register wäre, würde es so mit "or" gehen, oder?
[edit]
Außerhalb welcher Reichweite?![]()
Lesezeichen