Forum: Mikrocontroller und Digitale Elektronik Array mit Sinustabelle laden


von Michael (Gast)


Lesenswert?

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.

von ...HanneS... (Gast)


Lesenswert?

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...  ;-) ]

von Michael (Gast)


Lesenswert?

Hmm, das ist mir ehrlich gesagt zu kompliziert. Mir wuerde es reichen
wenn mir einer sagt wie ich Ein Array mit beliebigen Werten
initialisiere.

von Michael (Gast)


Lesenswert?

Unter Bascom natuerlich

von Simon Küppers (Gast)


Lesenswert?

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. :-)

von Simon Küppers (Gast)


Lesenswert?

Achso, die Funktion führt man natürlich am besten aufm Rechner aus, und
lässt sich die passenden Array Werte (mit passender Auflösung)
ausgeben.

von Michael (Gast)


Lesenswert?

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?

von JürgenR (Gast)


Lesenswert?

Schau mal in der BASCOM-Hilfe unter DATA und READ.

von Andi (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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

von Andi (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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

von ---- (Gast)


Lesenswert?

> Autor: JürgenR
> Datum: 02.04.2005 11:30
> Schau mal in der BASCOM-Hilfe unter DATA und READ.
Das schon befolgt?

----, (QuadDash).

von Andi (Gast)


Lesenswert?

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?

von André K. (Gast)


Lesenswert?

Schau dir einfach die Befehle Data (wie schon genannt) und Lookup an.
Damit wirds einfacher als mit Restore.

MfG

von Simon Küppers (Gast)


Lesenswert?

Ich glaub er sucht sowas:

Array(1) = 123
Array(2) = 254
Array(3) = 152
.
.
Array(100) = 43

etc... ?

(Nur Beispielwerte)

von Andi (Gast)


Lesenswert?

@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

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.