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
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
Und nicht vergessen: das untere Daumenloch kann nich nur komplett, sondern auch zum Teil geschlossen/geöffnet werden, also kein normales Knopf... ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.