Hi,
habe jetzt endlich, nach tausend verwirrenden und wenigen hilfreichen
Seiten endlich die PWM am laufen.
Ich möchte nun aber ein Sinussignal ausgeben, also brauch ich eine
Sinustabelle. Die, dachte ich, lade ich in ein Array und dann iim
folgenden Code in das PWM Compare Register:
For c=1 to 30
Compare1a= array(c)
waitms 10
Next
Blöderweise finde ich aber nirgendwo etwas darüber wie ich ein Array
mit den Sinuswerten lade ohne für jeden Wert eine extra Zuweisung zu
schreiben zu müssen.
array = 1 , 2 , 3 , 4 , 5 ... scheint irgendwie nicht zu gehen. Muss
ich Klammer setzen? Kann ich einfach einen Zeilenumbruch einfügen?
Danke!
Der prinzipielle PWM Code ist in Bascom übrigens (falls jemand auch mal
Probleme beim Einstieg in die PWM hat):
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B
Pwm = Clear Up , Prescale = 1
'8 bit PWM, 2 PWM Signale
Compare1a = A
'lädt den Wert A als gewünschten Byte Wert der Spannung in das Compare
'Register. Eigentlich sollte es nun gehen.
Naja, ich habe es da eher mit ASM. Und wenn ich mal spezielle
Flash-Tabellen brauche, dann lasse ich mir die von einem VB-Prog
errechnen und als ASM-Code in eine Datei schreiben, die man dann leicht
includen kann.
... [4 oder 6 Zeilen, je nach Zählweise... ;-) ]
Also:
Die standard Sin Fkt. ist f(x) = sin(x)
ist x = 1/2 pi (1,57..), dann ist f(x) = 1
bei x = pi (3,14..) ist f(x) = 0
bei x = pi + 1/2pi = 3/4 pi (4,7..) ist f(x) = -1
Jetz stellst du die Funktion erstmal auf den richtigen Y-Bereich um:
f(x) = (127.5*sin(x))+127.5
guck: http://www.walterzorn.de/grapher/grapher.htm
du siehst, Der Graph liegt:
x = 1/2pi bei 255
x = pi bei 127.5
x = 3/4pi bei 0
Den Rest kannste ja mal selber probieren. :-)
Narf! Ich weiss wie ich an Sinuswerte komme, aber ich habe keine Ahnung
wie ich sie unter Bascom in ein Array abspeichere.
Geht:
a, a= 1 , 2 , 3...
b, a=(1,2,3...)
c, a=[1,2,3,...]
? Nicht? Was dann?
Ist doch ganz einfach:
Dim Array(100) As Byte 'Array mit 100 Bytes definieren.
Dim N As Byte 'Als Schleifenzähler und Zugriffsnummer.
For N = 1 To 100 'Array füllen.
Array(n) = N 'Array(N) = N.
Next 'Nächstes Array-Byte.
Dieses Beispiel definiert ein Array mit 100 Bytes und füllt es einfach
nur mit dem Schleifenzähler N (Array(1)=1; Array(100)=100).
Deine Sinus-Berechnungen setzt Du einfach in die Schleife ein und gehst
Byte für Byte im Array durch.
MfG
Andi
Oha, so würde es ja gehen. Aber soll das etwa heißen es gibt in bascom
keine Methode ein Array direkt mit bestimmten Werten zu
initialisieren????? Ich mein in C geht das ja super einfach...
Micha
Was passiert wohl in der For...Next-Schleife?
Da wird das Array gefüllt.
Lass das mal im Simulator laufen, klick oben auf das blaue, große M
(Memory) und beobachte das SRAM.
Die Zeile mit "Array(n) = N" ersetzt Du mit Deine
Sinus-Berechnungen:
Sinus=......
Array(N)=Sinus
MfG
Andi
Klar, die For Next Schleife nimmt mir das ab. Aber ich will den Sinus
nicht berechnen, ich will Werte verwenden die ich vorher berechnet
habe, was weiß ich, etwas ganz ausgefallenes, etc...
In C geht doch:
Array = { 1, 4, 3, 7}
oder? Geht präzise das Selbe mit etwas anderer Syntax in Bascom? Das
ist alles was ich wissen will.
Danke für den Tip mit der Schleife, den kann ich bestimmt irgendwann
mal gut gebrauchen!
Micha
Klar geht das mit Data!
Allerdings ist der Zugriff auf eine bestimmte Stelle etwas komplexer
als in einem DIM-Feld:
Dim N As Byte
Dim Pwm_nr As Byte
Dim Pwm_wert As Byte
Pwm_nr = 8 'Den 8. Wert aus dem Data-Bereich lesen.
Restore Sin_tab 'Pointer auf Anfang der Tabelle.
For N = 1 To Pwm_nr 'N-mal um auf die richtige Stelle zu kommen.
Read Pwm_wert
Next
Sin_tab:
Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ,
16 , 17 , 18 , 19 , 20
Alternativ kann man den Data-Bereich in der Schleife in ein Array wie
weiter oben im SRAM kopieren und dann mit "Pwm_wert=Array(Pwm_nr)"
darauf zugreifen.
MfG
Andi
PS: Wenn das in C so einfach geht wieso machst Du das dann nicht in C?
@Simon: Wenn ein Array im SRAM füllen dann schon lieber in einer
Schleife vom DATA-Bereich (Flash) in das Array (SRAM).
Das mit Lookup ist schon richtig.
Einfach so:
N = Lookup(Nr,Sin_tab)
Sin_tab:
Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ,
16 , 17 , 18 , 19 , 20
setzt N mit dem X-Ten Wert in Nr aus dem Feld ab Sin_tab.
MfG
Andi