Forum: Mikrocontroller und Digitale Elektronik Flöte mit AT90S2313


von Stefan Otto (Gast)


Angehängte Dateien:

Lesenswert?

Ich will mit einem AVR ne Art elektronische Flöte bauen.
Hab 8 Taster an je einen Eingang des B-Ports gehängt. Damit sind die
Töne quasi bestimmte binäre Zahlen. Jetzt springe ich je nach Zahl in
eine Tabelle und lade dann die dementsprechenden Daten in einen Zähler,
der das mit dem Ton erzeugen übernimmt.

Meine Frage, kann ich das auch einfacher/edler programmieren?

Sourcecode siehe Anhang

Wäre für hilfe/Tips sehr dankbar!
MFG

von Joachim Schäfer (Gast)


Lesenswert?

Ich sehe da mehrere Möglichkeiten das zu verändern:

- Aus dem von PINB eingelesenen Wert den jeweils zu benutzenden Wert
für die Zählregister automatisch (mit einer Formel) berechnen, also
komplett auf die Sprungtabelle verzichten - Wäre natürlich am
elegantesten.

- Nur EINE Tabelle benutzen, in die jedoch nicht gesprungen, verzweigt
etc. wird, sondern die lediglich für jeden möglichen Wert von PINB die
entsprechende Belegung der Zählregister enthält, also ungefähr so:
in ZL, PINB
add ZL, LOW(Tabelle)
ldi ZH, HIGH(Tabelle)
lsl ZL
rol ZH ; Z enthält nun die Adresse des PINB-ten Wortes ab Label
"Tabelle"
lpm R18, Z+ ; R18 mit dem High-byte
lpm R19, Z ; und R19 mit dem Low-byte laden
rjmp OSZI1 ; und ab nach OSZI1
...
Tabelle:
.dw 0x10FF
.dw 0x07FF
.dw 0x06AA

- Falls wirklich nur die in Deinem Code angegebenen Werte für die
Zählregister verwendet werden (mit der Eigenheit dass high und low
nibble von R19 stets gleich sind, also z.b 0x44, 0xAA, 0xFF und R18
stets einen Wert kleiner gleich 0x10 hat) so wäre die kürzeste Lösung
vermutlich ungefähr so etwas:

; Lade R19 mit einem gepackten Wert der späteren Zählregister R18/R19,
je nachdem welches Bit von PINB gesetzt ist
sbis PINB, 0 ; IO-Port PB0 auf low? (= Schalter gedrückt)
ldi R19, (0x07FF - 0x100) >> 4 ; Wenn ja, lade R19 mit ((0x07FF -
0x100) >> 4) = 0x6F
sbis PINB, 1
ldi R19, (0x10FF - 0x400) >> 4
sbis PINB, 2
ldi R19, (0x06AA - 0x400) >> 4
...
sbis PINB, 7
ldi R19, (0x07FF - 0x400) >> 4
; Alle Pins abgefragt -> Aus gepacktem Wert in R19 das Zählregisterpaar
R18/R19 berechnen
; (Beispiel für R19 = 0x6F)
mov R18, R19 ; R18 = 0x6F
swap R18 ; R18 = 0xF6
andi R18, 0x0F ; R18 = 0x06
inc R18 ; R18 = 0x07
andi R19, 0x0F ; R19 = 0x0F
mov R17, R19 ; R17 = 0x0F
swap R19 ; R19 = 0xF0
or R19, R17 ; R19 = 0xFF
; R18 = 0x07 / R19 = 0xFF
rjmp OSZI1

von Stefan (Gast)


Lesenswert?

Danke für Deine Tips!

Werd sie baldmöglichst umsetzen!

von Alexandre Terentiev (Gast)


Lesenswert?

Und nicht vergessen: das untere Daumenloch kann nich nur komplett,
sondern auch zum Teil geschlossen/geöffnet werden, also kein normales
Knopf...

;-)

von Stefan (Gast)


Lesenswert?

Danke für den Hinweis!
;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.