Will über einen D/A Wandler einen Sinuston ausgeben. Gibt es hier irgendwo eine Tabelle wo die Werte schon berechnetsind, so dass ich mir die Werte direkt in den Code kopieren kann??
Sowas kloppt man sich schnell in einer PC Programmiersprache zusammen, und copy/pastet sie dann in den source code.
Hi! Hab dir mit EXCEL mal schnell eine erstellt. Meine Kristallkugel sagte mir aber, dass du als Amplitude 777 wolltest und genau 11 Schritte pro Periode wolltest. 0 420 706 769 587 218 -219 -588 -770 -707 -421 0 Gruß Christian
uii ist ja nett von dir. Wie machst du das in EXCEL ? Ist jetzt so das Ding mit dem Fisch und der Angel
Der Aufwand bei der Tabelle ist nicht das Berechnen der werte, sondern deren formatierung. die Einen wollen .DB 00 01 .... mit 16 Werten pro Zeile, die Anderen wollen das Null bei 128, usw. Ohne PC Programmiersprache sollte der Poster mal ueber denn Sinn des ganzen nachdenken... Meines Erachtens laeuft ohne PC Programmiersprache gar nichts.
na an der Formatiering soll es dann nicht scheitern. Wäre ja schon toll, wenn ich die Werte Irgendwie hin bekomme. Soll schon Null bei der negativen Spitze sein und 255 für die Positine Spitze.
Ingo Laabs wrote: > uii ist ja nett von dir. Wie machst du das in EXCEL ? > Ist jetzt so das Ding mit dem Fisch und der Angel Ha, ganz normale Sin-Berechnungen, also f(x) = â * sin (2*Pi*x - b) + c â ist die Amplitude b ist die Phasenverschiebung c ist der "Offset"-Wert In EXCEL dann halt die Formel dafür; ggf. noch mit GANZZAHL(x) auf eine ganze Zahl bringen. Für x setzt du halt n/d ein. (n € N; d ist die Schrittanzahl pro Periode) Gruß Christian EDIT: ZU deinem vorherigen Post: Wenn du mir jetzt noch sagt, wie viele Schritte du brauchst, dann mach ich dir das auch.
Das ist doch ne Scherzfrage. Oder willst du allen ernstens Behaupten, eine Programm schreiben zu wollen, was Sinuswerte über einen DA-Wandler ausgibt, aber paar popelige Sinuswerte (z.Not mitn TR) kannst du nicht errechnen???
@lippy es gibt sie und es wird sie immer geben, die Menschen mir ihrer Arroganz. Ich glaube soch Kommentare brauch hier KEINER. Von daher halte dich hier bitte mit deinen Kommentaren raus. danke
Qsinusgeek danke, das ist genau was ich brauche. Kann sich blödkommetarlippy mal ein Beispiel dran nehmen
Hier hast du ein ECXEL-Arbeitsblatt. Nach deinen Wünschen abändern. * wer Fehler findet darf sie behalten! ;)
> Qsinusgeek Aha, Kuh-Sinus... Oder Kuh-sine? Wir sind doch nicht etwa verwandt? ;-) > danke, das ist genau was ich brauche. Nix zu danken, hättest Du aber mit ein paar Zeilen QBASIC (lag jedem MS-DOOF und fast jedem WINDOOF bei) auch selbst machen können. Oder mit fast jeder anderen Programmiersprache für PC, je nachdem, womit Du aufgewachsen bist. Alternativ hättest Du mal in die Codesammlung schaun können, da ist dieses Include auch zu finden. > Kann sich blödkommetarlippy Der Ausdruck gefällt mir nicht, das hat er nicht verdient. Matthias Lipinsky gehört zu Denen, die oft und gern helfen und über ein fundiertes Grundwissen verfügen. > mal ein Beispiel dran nehmen Beweise uns, dass er unrecht hat, zeige uns (hier in diesem Thread) Deinen (hoffentlich selbstgeschriebenen) Quelltext. Anderenfalls könnte man vermuten, dass er mit seiner Aussage richtig lag. ~
Warum berechnest du die Sinustabelle nicht eben nach dem Einschalten und legst sie im Speicher ab? Oder ist es schon zu eng für die math.h?
Ums schmerzlos zu machen, hiermit kannst du dir selber deine Tabelle basteln oder eine diskrete Wertetabelle Anlegen.
1 | #include <stdio.h> |
2 | #include <stdlib.h> |
3 | #include <math.h> |
4 | |
5 | #define ANZAHL 100
|
6 | #define AMPLITUDE 128
|
7 | #define OFFSET 1
|
8 | |
9 | float sinustabelle[ANZAHL]; |
10 | |
11 | int main(void){ |
12 | int i; |
13 | for (i=0; i<ANZAHL; i++) sinustabelle[i]=AMPLITUDE*(sin(i*2*M_PI/ANZAHL)+OFFSET); |
14 | for (i=0; i<ANZAHL; i++) printf("%f\n", sinustabelle[i]); |
15 | return 0; |
16 | }
|
Steckt natürlich eine kleine Gemeinheit drin wenn der Winkel 90° beträgt ist der Wert 256 und läuft in einer 8 Bit Variablen über, darum hier als Float...
es ist auch nicht notwendig eine ganze sinusperiode als tabelle abzuspeichern, die werte von 0..90°, also eine viertel periode reichen vollkommen aus, der rest wird durch spiegelung erzeugt.
@sinusgeek werde ich machen sofern er dann fertig ist. Ich meinte damit nur, dass einige Leute hier nicht so überheblich sein sollen, und andere die noch nicht soweit sind schlichtweg als doof hinstellen. Jeder hier hat wohl mal klein angefangen.Mit Sicherheit auch lippy. Und wenn er das notwendige Gedankengut besitzt, könnte er es ja zur Verfügung stellen auch wenn es aus seiner sicht banale Probleme sind. Er wird mit Sicherheit auch einen Schwachpunkt haben...vielleicht kann er ja keinen Weihnachtsbraten machen...gell
Hauptsache der Fragesteller erklärt NICHT genau was er haben möchte und ist grob genug. Alles Obama oder was? Die für Dein Problem notwendige Bildung sollte Dir in der Schule beigebracht worden sein, die Programmiersprache C ist auch völlig ausreichend um Dein Problem zu klären. Dein eigentliches Problem ist das Du zwar die große Klappe, aber nichts dahinter hast. Gruß, Holm
Frank Schlaefendorf wrote: > es ist auch nicht notwendig eine ganze sinusperiode als tabelle > abzuspeichern, die werte von 0..90°, also eine viertel periode reichen > vollkommen aus, der rest wird durch spiegelung erzeugt. Natürlich nicht, nur hab ich den Verdacht das sich der Threadersteller damit nur schwerer tun würde. Abgesehen davon funktioniert das nicht vernünftig wenn, aus welchen Gründen auch immer, die Anzahl der Abtastwerte kein Vielfaches von 4 sein sollen. Aber prinzipiell hast du Recht.
und genau das dahinter möchte ich mir hier erarbeiten..auch wenn es einfache Fragen sind..und wenn sich einer hier auf den Schlips getreten fühlte, so möchte ich mich dafür entschuldigen. Werde aber nicht darum kommen weiterhin einfache Fragen zu stellen.
holm wrote: > Hauptsache der Fragesteller erklärt NICHT genau was er haben möchte und > ist grob genug. Alles Obama oder was? Die für Dein Problem notwendige > Bildung sollte Dir in der Schule beigebracht worden sein, die > Programmiersprache C > ist auch völlig ausreichend um Dein Problem zu klären. > Dein eigentliches Problem ist das Du zwar die große Klappe, aber nichts > dahinter hast. > > Gruß, > > Holm Beitrag "Re: Fototransistor aus BC547" und folgender
Ingo Laabs wrote: > und genau das dahinter möchte ich mir hier erarbeiten..auch wenn es > einfache Fragen sind..und wenn sich einer hier auf den Schlips getreten > fühlte, so möchte ich mich dafür entschuldigen. Werde aber nicht darum > kommen weiterhin einfache Fragen zu stellen. Nein, nicht du mußt dich hier entschuldigen, sondern derjenige, der noch nicht einmal die Grundregeln zivilisierten miteinanders einzuhalten bereit ist und gar nicht zu ahnen scheint was er alles nicht weiß. Und zwar er bei dir und nicht umgekehrt.
So, mein Programm sieht nun so aus und es funktioniert(auch wenn es für den ein oder anderen Profi hier ein wenig wackelig aussieht) Die Beschaltung möchte ich hier euch ersparen (R2R mit nem OP hinter) Kann mich halt über Kleinigkeiten freuen :-) Für Verbesserungen und Anregungen bin ich immer dankbar .include"tn26def.inc" .def zaehler = r17 .def temp = r16 main: ldi temp,(RAMEND) out SP,temp ldi temp,0xff out DDRA,temp anfang: ldi ZL,LOW (sinustabelle*2) ldi ZH,HIGH (sinustabelle*2) holen: lpm mov temp,r0 sbci zaehler,255 brcc anfang out PORTA,temp adiw ZL,1 rjmp holen sinustabelle: .db $80,$83,$86,$89,$8C,$8F,$92,$95; 0-7 .db $98,$9B,$9E,$A1,$A4,$A7,$AA,$AD; 8-15 .db $B0,$B3,$B6,$B9,$BB,$BE,$C1,$C3; 16-23 .db $C6,$C9,$CB,$CE,$D0,$D3,$D5,$D7; 24-31 .db $D9,$DC,$DE,$E0,$E2,$E4,$E6,$E7; 32-39 .db $E9,$EB,$ED,$EE,$F0,$F1,$F2,$F4; 40-47 .db $F5,$F6,$F7,$F8,$F9,$FA,$FB,$FC; 48-55 .db $FC,$FD,$FD,$FE,$FE,$FE,$FE,$FF; 56-63 .db $FF,$FF,$FE,$FE,$FE,$FE,$FD,$FD; 64-71 .db $FC,$FC,$FB,$FA,$F9,$F8,$F7,$F6; 72-79 .db $F5,$F4,$F2,$F1,$F0,$EE,$ED,$EB; 80-87 .db $E9,$E7,$E6,$E4,$E2,$E0,$DE,$DC; 88-95 .db $D9,$D7,$D5,$D3,$D0,$CE,$CB,$C9; 96-103 .db $C6,$C3,$C1,$BE,$BB,$B9,$B6,$B3; 104-111 .db $B0,$AD,$AA,$A7,$A4,$A1,$9E,$9B; 112-119 .db $98,$95,$92,$8F,$8C,$89,$86,$83; 120-127 .db $80,$7C,$79,$76,$73,$70,$6D,$6A; 128-135 .db $67,$64,$61,$5E,$5B,$58,$55,$52; 136-143 .db $4F,$4C,$49,$46,$44,$41,$3E,$3C; 144-151 .db $39,$36,$34,$31,$2F,$2C,$2A,$28; 152-159 .db $26,$23,$21,$1F,$1D,$1B,$19,$18; 160-167 .db $16,$14,$12,$11,$0F,$0E,$0D,$0B; 168-175 .db $0A,$09,$08,$07,$06,$05,$04,$03; 176-183 .db $03,$02,$02,$01,$01,$01,$01,$00; 184-191 .db $00,$00,$01,$01,$01,$01,$02,$02; 192-199 .db $03,$03,$04,$05,$06,$07,$08,$09; 200-207 .db $0A,$0B,$0D,$0E,$0F,$11,$12,$14; 208-215 .db $16,$18,$19,$1B,$1D,$1F,$21,$23; 216-223 .db $26,$28,$2A,$2C,$2F,$31,$34,$36; 224-231 .db $39,$3C,$3E,$41,$44,$46,$49,$4C; 232-239 .db $4F,$52,$55,$58,$5B,$5E,$61,$64; 240-247 .db $67,$6A,$6D,$70,$73,$76,$79,$7C; 248-255
> Jeder hier hat wohl mal klein angefangen.Mit Sicherheit auch lippy. Das ist wohl wahr. Die meisten davon, mit Sicherheit auch Lippy, haben sich ihr Wissen aber durch intensives Selbststudium und eigene Experimente, also durch eigene Arbeit angeeignet und nicht unüberlegt in Foren zusammengefragt. Nein, ich mache Dir keinen Vorwurf, dass Du gefragt hast. Ich finde Deine abwertenden Sprüche aber unangemessen. > Und wenn er das notwendige Gedankengut besitzt, könnte er es ja > zur Verfügung stellen auch wenn es aus seiner sicht banale Probleme > sind. Das macht er ja auch. Allerdings erwartet er dabei, dass der Hilfesuchende auch selbst etwas dafür tut. Der Umgang mit Winkelfunktionen (bzw. das Erstellen einer Sinustabelle) sollte eigentlich als Schulwissen bekannt sein, das relativiert die Notwendigkeit Deiner Frage. ~
@Winfried: ich werde Dich als Sozial kompetente Person irgendwie bookmarken, kann ja sein, das man so Jemanden mal braucht, wenn auch gerade jetzt nicht... Gruß, Holm
wie ich schon sagte, eine viertel periode abzuspeichern reichts auch aus. wenn du dir mal eine volle sinusschwingung aufzeichnest und die zeitachse in 4 gleiche teile einteilst (den sogenannten quadranten), dann stellst du fest, dass im ersten und zweiten quadranten die selben sinuswerte angenommen werden, nur in umgekehrter reihenfolge. in deiner tabelle ist das zu sehen, der startwert ist 0x80 und er steigt bis 0xFF an, ab dem 64sten byte wiederholen sich alle werte wieder, bis zum 128sten byte, da bist du wieder bei 0x80H angekommen. ab da geht die sinusfunktion in den negativen bereich und wenn du dir deine zeichnung anschaust, dann siehst du, das die sinuswelle dort genauso aussieht wie im positiven bereich, man nimmt die selben werte und muss nur das vorzeichen ändern. in deinem fall geht es in der tabelle einfach mit den invertierten werten weiter (also ein xor mit 0xff). deine ganze tabelle muss also nur bis zum 64sten bit reichen, alle anderen werte ergeben sich automatisch. du kannst natürlich die größe der tabelle so belassen, dann kannst du die sinusfunktion 4mal feiner abstufen, dann ist die qualität des ausgangssignals besser.
Hi
>Für Verbesserungen und Anregungen bin ich immer dankbar
1. lpm
mov temp,r0
lässt sich durch 'lpm temp' ersetzen.
2. Dein Register 'zaehler' wird nie auf Null gesetzt und auch nirgens
incrementiert.
3. sbci zaehler,255
brcc anfang
kannst du ersetzen:
inc zaehler
brcs anfang
Das Carry-Flag wird bei Überlauf gesetzt un 'zaehler' wird Null.
MfG Spess
2. Dein Register 'zaehler' wird nie auf Null gesetzt und auch nirgens incrementiert. 3. sbci zaehler,255 brcc anfang wieso funktioniert es dann? erhöht sbic nicht zaehler und zieht die 255 dann ab so dass ich mit brcc einen vergleich machen kann?
o.t. holm wrote: > @Winfried: ich werde Dich als Sozial kompetente Person irgendwie > bookmarken, > kann ja sein, das man so Jemanden mal braucht, wenn auch gerade jetzt > nicht... > > Gruß, > > Holm ja tu das ;-) darfst jederzeit posten, wennn ich es rechtzeitig bemerke, so helfe ich auch dir gern und unabhängig davon, ob ich deine Frage oder dein Benehmen als angemessen erachte, nach bestem Gewissen. MfG Winne
Hi >erhöht sbic nicht zaehler und zieht die 255 dann ab >so dass ich mit brcc einen vergleich machen kann? SBCI - Subtract Immediate with Carry Operation: (i)Rd ← Rd - K - C Dein Konstrukt erhöht zwar den Zähler, ist aber durch das undefinierte C-Flag fehlerträchtig. In deinem Programm mag das funktionieren. Ist aber irgendwie 'Von hinten durch die Brust ins Auge'. MfG Spess
@spess53 > sbci zaehler,255 > brcc anfang > kannst du ersetzen: > inc zaehler > brcs anfang > Das Carry-Flag wird bei Überlauf gesetzt un 'zaehler' wird Null. > lpm > mov temp,r0 > lässt sich durch 'lpm temp' ersetzen. Carry wird bei mir nicht gesetzt und bei lpm temp meckert das AVR Studio warum ?? habe es durch inc zaehler breq anfang ersetzt
Ingo Laabs schrob: > Carry wird bei mir nicht gesetzt > und bei lpm temp > meckert das AVR Studio > warum ?? Weil a) Carry durch INC nicht gesetzt wird. und b) nicht jeder AVR ein LPM Rn kennt. Kleine AVR kennen nur LPM mit implitizem R0, das von manchen Assemblern erlaubt wird hinzutexten, obwohl es dann redundant ist. > habe es durch > > inc zaehler > breq anfang > > ersetzt Das geht, Z-Flag wird durch INC gesetzt
> inc zaehler > brcs anfang war ja nicht meine idee..habe mich nur gewundert warum c nicht gesetzt wird
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.