www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Flöte mit AT90S2313


Autor: Stefan Otto (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Joachim Schäfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für Deine Tips!

Werd sie baldmöglichst umsetzen!

Autor: Alexandre Terentiev (Gast)
Datum:

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

;-)

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Hinweis!
;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.