[Assembler] High-/Low-Byte berechnen (16Bit-Timer Interrupt)

fanste

Erfahrenes Mitglied
Hi,

ich sitze hier gerade an einer kleinen Herrausforderung, die ich einfach nicht gelöst bekomme. Gleich zu Beginn: Es sind keine Hausaufgaben, ich mache das nur für mich. Just4Fun ;)

Dann zum Problem:
Es geht darum, mit der Platine (Chip: Atmel AT89C51ED2-IM) Töne zu erzeugen. Die normale Tonleiter ist kein Problem (C'=264Hz bis H'=495Hz). Da ich aber nicht alle möglichen Töne direkt im Programm verankern will, habe ich mir überlegt, dass ganze über eine Extra "Variable" zu lösen, welche mir die Tonhöhe (= Oktave) angibt. Für Jede Oktave, die höher ist, halbiert sich die Schwingungszeit und die Frequenz verdoppelt sich - und umgekehrt (Das mal zur Theorie^^)

Da ich hier jedoch nur eine 8bit Platine habe, also maximal Werte von 0-255 verarbeiten kann, weiß ich nun nicht, wie ich diese Schwingungszeiten Umrechnen kann.

Die Zeiten von C' - H' liegen als High-Byte und Low-Byte vor (im Code). Habe ich nun C', dann beträgt die Schwingungszeit 1894 µs . Da der Timer aufwärtszählt, muss ich diese Zahl von 65536 (16Bit) abziehen, damit der Timer im richtigen Moment auslöst. Daraus ergeben sich dann folgende Werte:
Code:
Schwingungszeit:
Dez: 1894
Hex: 766
High: 07 (= 7)
Low: 66 (= 102)
 
Timer-Werte:
Dez: 63642
Hex: F89A
High: F8 (= 248)
Low: 9A (= 154)

Bei C'' wäre die Schwingungszeit 947 µs. Die dazugehörigen Werte:
Code:
Schwingungszeit:
Dez: 947
Hex: 3B3
High: 03 (= 3)
Low: B3 (= 179)
 
Timer-Werte:
Dez: 64589
Hex: fc4d
High: FC (= 252)
Low: 4D (= 77)

Ich hab nun keinen Plan, wie ich das Umrechnen kann, damit da am Ende die passenden Werte rauskommen. C' hab ich und C'' (C''', etc) brauch ich. Und wie gesagt: ich habe nur 8Bit, leider keine 16Bit, sonst wäre es n bisschen leichter^^ (ich muss bei 8Bit mit diesen geteilten Werten rechnen. Erst die Schwingung berechnen und dann den Timerwert, geht leider nicht (bzw ich weiß nicht wie))
Ich habe auch keine Befehle für größer/kleiner Operationen gefunden. dann hätte ich auch eine Idee, wie ich das machen könnte.

Ich hoffe, ihr habt da Ideen, wie man an die Sache rangehen kann. Google wollte mir irgendwie nicht helfen (oder ich verwende nur die falschen Stichwörter)

Danke schonmal
 
Zuletzt bearbeitet:
Ok, habs geschafft, dass umzurechnen. War eigentlich ganz einfach.

Code:
High:
   x = (255-HIGH)/2
   high = x + HIGH

Low:
   Wenn x vorhin ungerade (also ',5') war:
     low = LOW / 2
   Ansonsten
     low = ((255-LOW)/2)+LOW

Es funktioniert aus irgendeinem Grund nur nicht, sprich es kommen die falschen Töne raus (Die Zahlen stimmen jedoch)

Ich glaube, dass die Interrupt-Routine einfach nur zu lange braucht. Muss mal schauen, wie ich da noch mit reinrechne.
 

Neue Beiträge

Zurück