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... ;-) ]
Hmm, das ist mir ehrlich gesagt zu kompliziert. Mir wuerde es reichen wenn mir einer sagt wie ich Ein Array mit beliebigen Werten initialisiere.
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. :-)
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.
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
> Autor: JürgenR > Datum: 02.04.2005 11:30 > Schau mal in der BASCOM-Hilfe unter DATA und READ. Das schon befolgt? ----, (QuadDash).
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?
Schau dir einfach die Befehle Data (wie schon genannt) und Lookup an. Damit wirds einfacher als mit Restore. MfG
Ich glaub er sucht sowas: Array(1) = 123 Array(2) = 254 Array(3) = 152 . . Array(100) = 43 etc... ? (Nur Beispielwerte)
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.