mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Array mit Sinustabelle laden


Autor: Michael (Gast)
Datum:

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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...  ;-) ]

Autor: Michael (Gast)
Datum:

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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unter Bascom natuerlich

Autor: Simon Küppers (Gast)
Datum:

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

Autor: Simon Küppers (Gast)
Datum:

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

Autor: Michael (Gast)
Datum:

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

Autor: JürgenR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal in der BASCOM-Hilfe unter DATA und READ.

Autor: Andi (Gast)
Datum:

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

Autor: Michael (Gast)
Datum:

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

Autor: Andi (Gast)
Datum:

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

Autor: Michael (Gast)
Datum:

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

Autor: ---- (Gast)
Datum:

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

----, (QuadDash).

Autor: Andi (Gast)
Datum:

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

Autor: André K. (Gast)
Datum:

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

MfG

Autor: Simon Küppers (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaub er sucht sowas:

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

etc... ?

(Nur Beispielwerte)

Autor: Andi (Gast)
Datum:

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

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.