@Tekeli,
Ich hab Dich !!!!
schau
BREQ exit ; Ein ja bedeutet, dass wir am Ende sind -> Ende
Du meintest sicher ende , oder?
Der Asuro läuft Amok guck, wo Du ihn hingeschickt hast, nachdem er 0 gefunden hat
Druckbare Version
@Tekeli,
Ich hab Dich !!!!
schau
BREQ exit ; Ein ja bedeutet, dass wir am Ende sind -> Ende
Du meintest sicher ende , oder?
Der Asuro läuft Amok guck, wo Du ihn hingeschickt hast, nachdem er 0 gefunden hat
an Euch beide,
Wenn alle Töne durch sind, sollte Der Timer 0 abgeschaltet werden, sonst spielt er den letzten ton ja weiter, wie das geht, kriegt Ihr sicher selber raus.
So, da bin ich wieder, musste erstmal mein Gehirn durchlüften, habe den ganzen Tag in der Bude rumgehockt! ;o) *couchpotato*
Ich lese mir jetzt die beiden Codes durch bzw. versuche es sie durchzulesen!
Wie ist jetzt eigentlich der Stand?
Tekeli's Programm funktioniert jetzt, oder?
Was ist mit Thomas Programm?
Ja den ganzen Tag in der Bude, das ist hart,
ich hatte als alternative am Feuerwehrfest in unserem Dorf teilzunehmen, dann
wäre ich jetzt aber paar Euros ärmer, und der Kopf wäre auch nicht mehr so ganz klar
:twisted:
Der Stand ist jetzt so, daß Tekeli seinen Asuro wohl ziemlich abstürzen liess,Zitat:
Wie ist jetzt eigentlich der Stand?
aber so wie es aussieht ist es eine Kleingkeit.
Und Thomas sollte sein Programm etwas aufräumen denke ich,
Oh, das ist nicht gut!Zitat:
Der Stand ist jetzt so, daß Tekeli seinen Asuro wohl ziemlich abstürzen liess, aber so wie es aussieht ist es eine Kleingkeit.
Wie tief ist er denn gefallen? *kleiner dummer scherz*
Das denke ich auch, denn ich steige da nicht mehr durch! *lol*Zitat:
Und Thomas sollte sein Programm etwas aufräumen denke ich,
Siehst Du die Programme eigentlich nur so durch, oder lässt Du sie im Simulator durchlaufen?
So, da bin ich wieder, ich werd jetzt mal die Punkte von Sebastian durchgehen.
Florian, ich bin eine arme Sau.
Wie Du weißt habe ich nur Linux auf meiner Kiste UND AVRStudio will sich nicht dazu
überreden lassen unter Linux zu funktionieren.
Selbst mit wine, dem Windows Übersetzer sag ich mal nicht.
Und für Linux gibt es keine brauchbaren Simulatoren.
Ich hab hier avr_simulator, das Programm hat aber jedemenge Bugs, der Author hat wohl kein Bock mehr drauf, er antwortet auf keine Posts auf sourceforge, naja und ich
bin nicht gut genug um es selber zu verbessern.
Es gibt da noch den gdb, aber den kann ich auch nicht dazu überreden, mit .hex Dateien
zu arbeiten, habe mal ein Thread auf www.mikrocontroller.net geöffnet, aber selbst da
weißt keiner einen Rat, und das soll schon was heißen....
Also Zeile für Zeile durchlesen, und schauen was passiert.
Aber ich klage nicht, es geht auch ohne.
Ich weiß nimmer weiter. Hab nun erstmal Punke verbessert (wenn man das so nennen darf), die du mir gesagt hast:
Es kommt nichts gescheites bei raus. Er spielt irgendwie die Töne ab, aber immer noch nicht im 1 Sekundenabstand. Außerdem ist da noch ein Ton drinne, der da nicht reinsoll. :(Code:;Programm
;CDurTonleiter rauf und runter spielen
.include "m8def.inc"
.def tmp = r16 ;Mein Universallregister
.def zaehlerSek = r17 ;Mein Zählregister
.def tonwert = r19 ;aktueller Wert für den Ton
.def lpm_reg = r0 ;Mein lpm-Register
.equ Summer = PB2 ;Summer an B.2
.equ time0 = 256-255 ;Timer0 für die Tonleiter
.equ time2 = 256-90 ;Damit wird der Timer2 vorgeladen, für die Sekunde
.equ daten_laenge = 3 ;Anzahl der Werte
.org 0x000
rjmp reset ;Interruptvektor "reset:"
.org OVF2addr
rjmp pruefSek ;Interruptvektor "pruefSek:"
.org OVF0addr
rjmp timerSummer ;Interruptvektor "timerSummer:"
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
;Timer Register für Ton 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 ;Hier wird der Timer vorgeladen
out TCNT0, tmp
;Timer Register für Sekunde 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, (1<<TOIE0) | (1<<TOIE2);Hier werden Interrupts nach Timer0 Überlauf eingeschaltet
out TIMSK, tmp ;Register TIMSK ist dafür zuständig
;Z-Register mit daten1 füllen
ldi ZH, HIGH(tonleiter1 * 2)
ldi ZL, LOW(tonleiter1 * 2)
ldi zaehlerSek, 0b00000000 ;ZählerSek auf 0 setzen
sbi DDRB, Summer ;B.2 als Ausgang
sbi PORTB, Summer ;B.2 auf HIGH stellen
sei ;Interrupts zulassen
;Die Hauptschleife
main:
cpi zaehlerSek, 0b00010100 ;wenn ZählerSek != 40 ist
brne main ;dann immer wieder zu "main:" springen
;Wenn eine Sekunde um ist, dann springe hier rein
;und setze zaehlerSek wieder zurück auf 0 und
;lade den nächsten Ton
pruefTonleiter:
clr zaehlerSek ;Zähler auf 0 setzen
rjmp ladeTon ;nächsten Ton laden
rjmp main ;sonst wieder zurück zu "main:"
;Wird aufgerufen, wenn Timer2 überläuft (Timer für Sekunde)
;Hier wird das Zählregister für den Timer um 1 erhöht und der
;Timer neu geladen
pruefSek:
push tmp ;tmp sichern
in tmp, SREG ;SREG sichern
push tmp
inc zaehlerSek ;ZählerSek um 1 erhöhen
ldi tmp, time2 ;Hier wird der Timer vorgeladen
out TCNT2, tmp
pop tmp ;SREG wiederholen
out SREG, tmp
pop tmp ;tmp wiederholen
reti ;wieder dahin, wo du hergekommen bist
;Wenn 1 Sekunde vorbei ist und es noch einen Ton gibt,
;der noch nicht geladen ist dann springe hier hin und
;lade den nächsten Wert von der Datenbank "tonleiter"
ladeton:
lpm ;Daten von tonleiter1: holen
mov tonwert, lpm_reg ;erstes Byte in tmp verschieben
adiw ZL,1 ;Z um 1 erhöhen, nächstes Byte
ldi tmp, LOW ((tonleiter1 * 2) + daten_laenge) ;vergleiche LOW-Byte
cp ZL, tmp
ldi tmp, HIGH ((tonleiter1 * 2) + daten_laenge) ;vergleiche HIGH-Byte
cpc ZH, tmp
breq endeTon ;springe zu "endeTon:", wenn letztes Byte ausgelesen
rjmp main ;wieder zurück zur "main:"
;Wenn alle Töne geladen sind, dann wird das Register "zaehlerTon"
;auf 255 gesetzt
endeTon:
cpi zaehlerSek, 0b00010100 ;wenn ZählerSek = 40 ist
breq TonAus ;springe zu Tonaus
rjmp main ;wieder zurück zu "main:"
TonAus:
sbiw ZL,1 ;Z um 1 erniedrigen
ldi tmp, 0 ;Timer mit 0 laden, damit er nicht mehr abspielt
out TCNT0, tmp
rjmp main ;wieder zurück zu "main:"
;Wird aufgerufen, wenn Timer0 überläuft (Timer für Ton)
;Hier wird geprüft, ob an B.2 HIGH oder LOW anliegt
;und dementsprechend umgesetzt
timerSummer:
push tmp ;tmp sichern
in tmp, SREG ;SREG sichern
push tmp
sbis PINB, Summer ;überspringe, wenn B.2 = 1 ist
rjmp timerSummer1 ;wenn B.2 = 0 ist, dann spring zu "umschalten1:"
cbi PORTB, Summer ;wenn B.2 = 1 ist, dann B.2 auf 0 setzen
rjmp timerSummer2 ;zu "timerSummer2:" springen
timerSummer1:
sbi PORTB, Summer ;wenn B.2 = 0 ist, dann auf 1 setzen
;Hier wird Timer0 mit dem aktuellen Tonwert vorgeladen
timerSummer2:
out TCNT0, tonwert ;Timer dementsprechen vorladen
rjmp timerSummer4 ;zu "timerSummer4:" springen
timerSummer4:
pop tmp ;SREG wiederholen
out SREG, tmp
pop tmp ;tmp wiederholen
reti
;Das sind die Werte, womit der Timer0 (Tonleiter-Timer) vorgeladen wird
tonleiter1:
.db 256-117, 256-16, 256-2, 0 ;Werte zum Vorladen des Timers für die Töne
;c', a' und c''