Ach shit, sry![]()
*selbst ne Ohrfeige geb* So, nu bin ich wieder da. Also Ton kommt erstmal. Nun werd ich mal eine LED am anderen Pin mit einem weiteren Timer zum blinken bringen.
Ach shit, sry![]()
*selbst ne Ohrfeige geb* So, nu bin ich wieder da. Also Ton kommt erstmal. Nun werd ich mal eine LED am anderen Pin mit einem weiteren Timer zum blinken bringen.
schaue mal hier:sbis PINB, Summer ;überspringe, wenn B.2 = 0 ist
cbi PORTB, Summer ;wenn B.2 = 1 ist, dann auf 0 setzen
sbic PINB, Summer ;überspringe, wenn B.2 = 1 ist
sbi PORTB, Summer ;wenn B.2 = 0 ist, dann auf 1 setzen
ldi tmp, time0_1 ;Hier wird der Timer vorgeladen
out TCNT0, tmp
out SREG, statusreg ;SREG wiederholen
reti ;wieder zurück, wo du hergekommen bistIch finde das besser...Code:sbis PINB, Summer rjmp umschalten1 cbi PORTB,Summer rjmp umschalten2 umschalten1: sbi PORTB,Sumer umschalten2: ldi tmp, time0_1 out TCNT0, tmp out SREG, statusreg reti
Thomas, nicht weinen!
Du darfst Dich nicht unterdruck setzen!
Immer cool bleiben, und langsam,
keiner will hier in einer Woche einen Profi aus Dir machen!
Leute studieren um das zu verstehen, wir machen das nur, weil es uns
Spaß macht, und es soll auch so bleiben!!!
So, Nase Putzen und Tränen wegwischen!!!
![]()
Dein Code gefällt mir auch besser
Mir fehlt einfach noch die Routine, in Assembler zu programmieren. Also die ganze Logik dahinter, aber das kommt ja mit der Zeit dann.
Und die bekommst Du, nur wenn Du programmierst!Mir fehlt einfach noch die Routine, in Assembler zu programmieren
\/
Habs nu hinbekommen. Also die "Teilaufgabe". Es piept und die LED blinkt im Sekundentakt:
Nu werd ich erstmal was essenCode:.include "m8def.inc" .equ time0_1 = 256-2 ;Damit wird der Timer0 vorgeladen .equ time2 = 256-90 ;Damit wird der Timer2 vorgeladen .equ Summer = PB2 ;Summer an B.2 .equ LED = PB5 ;LED an B.5 .def tmp = r16 ;Mein Universallregister .def statusreg = r17 ;Mein Statusregister .def zaehlerLED = r18 ;Mein Zählregister .org 0x000 rjmp reset ;Interruptvektor "reset:" .org OVF2addr rjmp timerLED .org OVF0addr rjmp timerSummer ;Interruptvektor für Timer0 Überlauf, hier springt ;das Programm hin, wenn der Timer überläuft 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 sbi DDRB, LED ;B.5 als Ausgang sbi PORTB, Summer ;B.2 auf HIGH stellen sbi PORTB, LED ;B.5 auf HIGH stellen ldi zaehlerLED, 0b00000000 ;Zähler auf 0 setzen ;Timer Register werden belegt, hier Timer 0 ldi tmp, (1<<CS02) ;Prescaler ist 512 out TCCR0, tmp ;Register TCCR0 ist für den Prescaller zuständig ldi tmp, time0_1 ;Hier wird der Timer vorgeladen out TCNT0, tmp ;Timer Register werden belegt, hier Timer 2 ldi tmp, (1<<CS22) | (1<<CS21) | (1<<CS20) ;Prescaler ist 1024 out TCCR2, tmp ;Register TCRR2 ist für den Prescaller zuständig ldi tmp, time2 ;Hier wird der Timer vorgeladen out TCNT2, tmp ldi tmp, (1<<TOIE0) | (1<<TOIE2);Hier werden Interrupts nach Timer0 Überlauf eingeschaltet out TIMSK, tmp ;Register TIMSK ist dafür zuständig sei ;Interrupts zulassen loop: cpi zaehlerLED, 0b00101000 ;Wenn Zählerregister != 40 ist breq pruefLED ;dann zu "pruefLED:" springen rjmp loop ;immer wieder zu "loop:" springen pruefLED: clr zaehlerLED ;Zählerregister auf 0 setzen sbis PORTB, LED ;überspring, wenn B.5 = 1 ist rjmp umschaltenLED ;wenn B.5 = 0 ist, dann spring zu "umschaltenLED:" cbi PORTB, LED ;wenn B.5 = 1 ist, dann B.2 auf 0 setzen rjmp loop ;wieder zurück zu "loop:" umschaltenLED: sbi PORTB, LED ;wenn B.5 = 0 ist, dann auf 1 setzen rjmp loop ;wieder zurück zu "loop:" timerSummer: in statusreg, SREG ;SREG sichern sbis PINB, Summer ;überspringe, wenn B.2 = 1 ist rjmp umschaltenSummer1 ;wenn B.2 = 0 ist, dann spring zu "umschalten1:" cbi PORTB, Summer ;wenn B.2 = 1 ist, dann B.2 auf 0 setzen rjmp umschaltenSummer2 ;zu "umschalten2:" springen umschaltenSummer1: sbi PORTB, Summer ;wenn B.2 = 0 ist, dann auf 1 setzen umschaltenSummer2: ldi tmp, time0_1 ;Hier wird der Timer vorgeladen out TCNT0, tmp out SREG, statusreg ;SREG wiederholen reti ;wieder zurück, wo du hergekommen bist timerLED: in statusreg, SREG ;SREG sichern inc zaehlerLED ;Zählerregister um 1 erhöhen ldi tmp, time2 ;Hier wird der Timer2 vorgeladen out TCNT2, tmp out SREG, statusreg ;SREG wiederholen reti![]()
Herzlichen Glückwunsch!
Na bravo, es sieht sehr ordentlich aus viel besser hätte man das nicht machen können.
Jetzt hast Du 2 Timer die völlig unabhängig voneinander laufen, und vor allem 2 Interruptsroutinen!
Und Du warst schon fast fertig mit den Nerven.
Aber eins kannst Du mir glauben, es ging mir mal auch nicht besser.
Und vor allem siehst Du jetzt daß du den PB2 sehr schnell hin und her schalten mußt,
und nicht wie Du mal hattest PB2 auf 1 und fertig.
Jetzt gilt es die beiden Timer irgendwie miteinander zu Verknüpfen !
Da wir jetzt ganz kleine Schritte gehen wollen, benutzen wir die LED um zu schauen, ob Sekunde um ist oder nicht.
als erstes weise am Anfang die andere Frequenz zu, wie war das nochmal?
.equ Timer0_2 = 256 -4 ? kannst mich als faul bezeichnen, aber ich habe keine Lust jetzt nachzuschauen.
als nächstes gehst Du in Deine timerSummer Routine und zwar zum Label timerSummer2:
dort schauen wir erstmal nach ob die LED an ist:
So ich habe es nicht ausprobiert, es müßte aber gehen (hoffe ich)Code:sbis PORTB,LED rjmp timerSummer3 ;wenn aus gehen wir nach timerSummer3 ldi tmp, time0_1 ;Hier wird der Timer für 1KHZ geladen??? out TCNT0, tmp rjmp timerSummer4 timerSummer3: ldi tmp, time0_2 ;Hier wird der Timer für 4KHZ geladen??? out TCNT0, tmp timerSummer4: out SREG, statusreg ;SREG wiederholen reti
Einfach oder?
Ich hoffe, Du kannst nachvollziehen, warum wir gerade an dieser Stelle nachschauen,
ob die Sekunde um ist.
Probiere es so aus, ich bin selber gespannt.
Gruß Sebastian
Das funktioniert ja wunderbarUnd das beste, hab alles verstanden
Hab den Timer2 (für die LED) mal auf 0,5 Sekunden gestellt, nun hört sich das an wie eine Polizeisirene *gg*
Ich kann es mir denken. Denn bei timerSummer2 sind die letzten Schritte, bis der Timer vom Summer wieder von vorn anfängt zu zählen. Sonst wär es denk ich nicht genau synchron mit der LED, oder?Ich hoffe, Du kannst nachvollziehen, warum wir gerade an dieser Stelle nachschauen,
ob die Sekunde um ist.
Gruß
Thomas
[edit]
Irgendwie nerven die Töne meine Freundin *gg* Musste deshalb leider auf niedrigere Frequenzen umsteigen *gg*
Nun hab ich nen Polizeitauto *freu wie ein kleines Kind* \/ *g*
Nacht,
die Sierene habe ich jetzt auch hingekriegt.
Nun habe ich einen Polizei-Asuro![]()
Musste den Summer aber gegen GND anschliessen.
Anbei meine Version der Lösung.
Es macht echt Spaß mit dem Assembler zu programmieren!
Best wishes
Lesezeichen