Muss das nicht normalerweise von 255 abgezogen werden? *irgendwie klappts heute mit meiner Rechenleistung nicht mehr*.equ time0 = 256-255 ;Timer0 für die Tonleiter
.equ time2 = 256-90 ;Damit wird der Timer2 vorgeladen, für die Sekunde
Wie programmierst Du dann deine Programme?
Du armer Programmierer! *lol*
Ich finde den Simulator sehr hilfreich, aber hauptsächlich bei großen, vielverzweigten Programmen!
Normalerweise habe ich bei der Größe der Codes, wie hier, keine Probleme, aber irgendwie will mein Gehirn nicht! ;o)
Muss das nicht normalerweise von 255 abgezogen werden? *irgendwie klappts heute mit meiner Rechenleistung nicht mehr*.equ time0 = 256-255 ;Timer0 für die Tonleiter
.equ time2 = 256-90 ;Damit wird der Timer2 vorgeladen, für die Sekunde
Thomas, jetzt ganz langsam,
Du hast ein chaos im Deinem Programm, da blikt wirklich kein Mensch meh durch....
z.B. hier:
pruefTonleiter:
clr zaehlerSek ;Zähler auf 0 setzen
rjmp ladeTon ;nächsten Ton laden
rjmp main ;sonst wieder zurück zu "main:"
wozu springst Du nach ladeTon,könnte das nicht direkt drunter ?
und rjmp main
Da kommt er wohl nie hin , oder ?
oder das :
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:"
wozu Zl -1 ?
bist Du Dir sicher daß 0 den Timer wirklich abschaltet?
@Florian, wie gesagt, ich klage nicht, es gibt andere Wege Programme wirksam zu debuggen!
Und es gibt echt geile Editoren , z.B. Emacs geht in der Konsole, und ist das Schweizer Taschenmesser unter den Editoren.
Von Seite 5:
Zitat von SprinterSB
Nein, 256 ist schon richtig, der Sprinter hat das irgendwo 10 Seiten zurück mal gesagt,
es geht sich ja um den Punkt, wo der Timer überläuft, und nicht, wo er
seinen höchsten Wert erreicht hat.
Edit: Danke Thomas, sehr aufmerksam
SorryZitat von izaseba
Ja, hast recht, hab ich grad verbessert. Aber ich denk, die Hauptsache ist doch erstmal dass es funktioniert und dann kann man an der Übersicht arbeiten, oder?pruefTonleiter:
clr zaehlerSek ;Zähler auf 0 setzen
rjmp ladeTon ;nächsten Ton laden
rjmp main ;sonst wieder zurück zu "main:"
wozu springst Du nach ladeTon,könnte das nicht direkt drunter ?
und rjmp main
Da kommt er wohl nie hin , oder ?
In C++ hatte ich nie Probleme mit der Übersicht, versteh ich nicht...
Das ZL-1 hab ich gemacht, damit er beim nächsten mal keinen Müll mehr einliest, sondern immer wieder die 0 aus der DB tonleiter.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:"
wozu Zl -1 ?
bist Du Dir sicher daß 0 den Timer wirklich abschaltet?
Und das 0 den Timer abschaltet, dacht ich, jo, denn was soll er denn noch hochzählen, wenn ich den Timer mit 256-256 vorlade? Hmm...
[edit]
Das hier stoppt den Timer.
Datenblatt Seite 70 hilft.Code:ldi tmp, 0b00000000 ;Timer stoppen out TCCR0, tmp
Hier nochmal der ganze Code, habs mal auf 2 Sekunden geändert, aber der spielt total verrückt
Weiß echt nicht, was ich da noch machen sollCode:;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, 0b01010000 ;wenn ZählerSek != 80 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 ;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, 0b01010000 ;wenn ZählerSek = 80 ist breq TonAus ;springe zu Tonaus rjmp main ;wieder zurück zu "main:" TonAus: ldi tmp, (1<<CS02) ;Timer stoppen out TCCR0, tmp rjmp main ;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 ;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''![]()
Ich habe Dir gesagt, Du darfst nicht in Kategorien der Hochsprachen denken.In C++ hatte ich nie Probleme mit der Übersicht, versteh ich nicht...
Wieso wieder Traurig,Sorry Sad
Es war nicht böse gemeint, sondern die springerei hin und her trägt nicht gerade der Übersicht bei.
Hmmmm, ich glaube eher weniger, wer rührt schon ein funktionierendes Programm an?Ja, hast recht, hab ich grad verbessert. Aber ich denk, die Hauptsache ist doch erstmal dass es funktioniert und dann kann man an der Übersicht arbeiten, oder?
P.S. Warst Du das mit dem Edit:
Ja, das war ich, aber ich hab den Code geändert, aber beides stoppt leider nicht den Timer.
Ich weiß ja, dass du es nicht böse meinst, aber man ist nunmal traurig bzw. mehr enttäuscht, wenn man einfach nicht mehr weiß, was man verkehrt macht und es trotzdem nicht funktioniert und dann hat man doch die Angst, dass man es nimmer zum laufen bringt.
Das habe ich vor 10 Seiten schonmal angesprochen, das ist sehr gut!wie sag ichs meinem avr.pdf
Das ist dann aber schon die zweite Version, die erste Version ist auch sehr interessant!
Lesezeichen