Ach shit, sry :cry:
*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.
Druckbare Version
Ach shit, sry :cry:
*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:Zitat:
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 bist
Ich 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!!!
:lol:
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!Zitat:
Mir fehlt einfach noch die Routine, in Assembler zu programmieren
\:D/
Habs nu hinbekommen. Also die "Teilaufgabe". Es piept und die LED blinkt im Sekundentakt:
Nu werd ich erstmal was essen :)Code:.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 wunderbar :) Und 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?Zitat:
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* :D
Nun hab ich nen Polizeitauto *freu wie ein kleines Kind* \:D/ *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