An sich im RMorg unter DDS Heimsenderlein schon veröffentlicht, aber nur als NF-Modulationssignal. Habe es jetzt umgebaut auf 2 Kanäle mit 90° Phasenunterschied. Code im Anhang, da oft Fragen zu PWM im Forum auftauchen. Kann auch für sehr niedrige Frequenzen verwendet werden. Mit tiny13 realisiert, weil es so Spass macht incl. Assembler.
Rudi D. schrieb: > An sich im RMorg unter DDS Heimsenderlein schon veröffentlicht, aber nur > als NF-Modulationssignal. Wo wird da was moduliert? Da werden nur zwei konstante SIN/COS Signale ausgegeben. > Habe es jetzt umgebaut auf 2 Kanäle mit 90° Phasenunterschied. Was für eine Leistung . . . > Code im Anhang, da oft Fragen zu PWM im Forum auftauchen. Soso, und dein Beitrag erklärt irgendwas? > Kann auch für > sehr niedrige Frequenzen verwendet werden. Ach ne?
Rudi D. schrieb: > Ich bedauere Sie. mit Sie ist der Leser gemeint, sonst wäre es klein geschrieben. Ich habe auch nur sehr bedingt verstanden, um was es geht. Kannst Du bitte eine Zusammenfassung schreiben, damit man nicht erst das .asm analysieren muß?
Armselige Aufgabe, großspurig dahergelabert, erbärmlich umgesetzt...
Hi, ldi A, 0b0011_1100 ;schalte die Pullups ein geht das ohne Fehlermeldung? Ich probiers gleich einmal aus. Da sind noch mehr "Befehle" drin, die mir "komisch" vorkommen. Assembly complete no errors no warnings. Na denn... ciao gustav
:
Bearbeitet durch User
Falk hat nicht ganz unrecht, das ist ziemlich trivialer Kram. OK für erste Schritte, aber kein Vorzeigeprojekt. Hier der gesamte Code nach C übersetzt:
1 | const uint8_t sin[256] = { ... }; |
2 | const uint8_t cos[256] = { ... }; |
3 | |
4 | main() |
5 | {
|
6 | uint8_t i = 0; |
7 | |
8 | CLKPR = 128; |
9 | CLKPR = 1; |
10 | |
11 | DDRB = 3; |
12 | PORTB = 0x3c; |
13 | OCR0A = 128; |
14 | TCCR0A = 0xf3; |
15 | TCCR0B = 1; |
16 | |
17 | for (;;) { |
18 | OCR0A = sin[i]; |
19 | OCR0B = cos[i]; |
20 | i++; |
21 | busyloop(10); |
22 | }
|
23 | }
|
Also wenn schon in C dann kann mans auch richtig machen und etwas Funktionalität hinzufügen (2 unabhängige Frequenzen, die 2. eben als COS):
1 | #include <avr/io.h> |
2 | #include <avr/pgmspace.h> |
3 | #include <stdint.h> |
4 | |
5 | #define F_CPU 9600000UL // Quarz mit 9.600.000 MHz
|
6 | #define TIMERRELOAD 256 // Nachladewert des Timers 0-255
|
7 | #define AUFLOESUNG 65536 // 16-Bit Counter 0-65535
|
8 | |
9 | #define AUSGABEFREQUENZ_A 10 // in Hz
|
10 | #define AUSGABEFREQUENZ_B 10 // in Hz
|
11 | #define OFFSET_A ((F_CPU/2 + AUSGABEFREQUENZ_A * TIMERRELOAD * AUFLOESUNG) / F_CPU)
|
12 | #define OFFSET_B ((F_CPU/2 + AUSGABEFREQUENZ_B * TIMERRELOAD * AUFLOESUNG) / F_CPU)
|
13 | |
14 | const uint8_t sinustabelle[256] PROGMEM = {127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124}; |
15 | |
16 | union {uint16_t u16; uint8_t u8[2];} counterA; // 0 ist Low Byte, 1 ist High Byte |
17 | union {uint16_t u16; uint8_t u8[2];} counterB; // 0 ist Low Byte, 1 ist High Byte |
18 | |
19 | int main(void) { |
20 | |
21 | // Kalibrieren des Internen RC OSC (wenns interessiert)
|
22 | OSCCAL = 0x86; |
23 | |
24 | // Clear OC0A & OC0B on Compare Match, Fast PWM Mode 3, no prescaler (1)
|
25 | TCCR0A = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM01) | (1 << WGM00); |
26 | TCCR0B = (1 << CS00); |
27 | |
28 | // PB0 (OC0A) und PB1 (OC0B) als Ausgang
|
29 | DDRB = (1 << PB0) | (1 << PB0); |
30 | |
31 | while(1) { |
32 | |
33 | if ( TIFR0 & (1 << OCF0A) ) { |
34 | |
35 | // Timer0 Output Compare Flag A löschen
|
36 | TIFR0 = (1 << OCF0A); |
37 | |
38 | OCR0A = pgm_read_byte( &sinustabelle[ counterA.u8[1] ] ); |
39 | counterA.u16 += OFFSET_A; |
40 | |
41 | };
|
42 | |
43 | if ( TIFR0 & (1 << OCF0B) ) { |
44 | |
45 | // Timer0 Output Compare Flag A löschen
|
46 | TIFR0 = (1 << OCF0B); |
47 | |
48 | OCR0B = pgm_read_byte( &sinustabelle[ counterB.u8[1] + 64 ] ); |
49 | counterB.u16 += OFFSET_B; |
50 | |
51 | };
|
52 | |
53 | }
|
54 | |
55 | return 0; |
56 | |
57 | }
|
Und das war jetzt ne knappe Stunde...
:
Bearbeitet durch User
foobar schrieb: > Hier der gesamte Code nach C übersetzt: > > const uint8_t sin[256] = { ... }; > const uint8_t cos[256] = { ... }; Da hat wohl jemand in der Schule nicht aufgepasst. Ein "+64" an passender Stelle hätte es auch getan ;-)
Wolfgang schrieb: > foobar schrieb: >> Hier der gesamte Code nach C übersetzt: >> >> const uint8_t sin[256] = { ... }; >> const uint8_t cos[256] = { ... }; > > Da hat wohl jemand in der Schule nicht aufgepasst. > > Ein "+64" an passender Stelle hätte es auch getan ;-) Aber Dank Assembler (im Original des TO) hat man doch so viel FLASh eingespart, daß man die Tabelle doppelt anlegen kann. Ist sicherer wegen der Redundanz. ;-)
Ein sprechender Dateiname. Rudi D. schrieb: > theta_wellen.asm (6,86 KB, 79 Downloads) https://www.spektrum.de/lexikon/neurowissenschaft/theta-wellen/12919 > Bei sehr alten Menschen und bei Patienten mit einer Demenz kann die > Ruheaktivität wieder durch Theta-Wellen gekennzeichnet sein. Hmmm.
Karl B. schrieb: > Hi, > ldi A, 0b0011_1100 ;schalte die Pullups ein > geht das ohne Fehlermeldung? > Ich probiers gleich einmal aus. > > Da sind noch mehr "Befehle" drin, die mir "komisch" vorkommen. > Assembly complete no errors no warnings. > Na ja, die nächste Zeile muss man auch lesen. Natürlich no errors. Sagt ein wenig über dich aus. An sich zur Motivation.: sucht man im Forum über PWM, so sieht man eine lange Liste. Das Listing Ist für jene Fragesteller gedacht. Nicht für euch Experten, die das ratz fatz in kürzester Zeit auch erledigen. Ihr hättet auch die Chance gehabt. ROFL
Wolfgang schrieb: > foobar schrieb: > Hier der gesamte Code nach C übersetzt: > > const uint8_t sin[256] = { ... }; > const uint8_t cos[256] = { ... }; > > Da hat wohl jemand in der Schule nicht aufgepasst. > Ein "+64" an passender Stelle hätte es auch getan ;-) An sich ja, aber dann geht es mit Inc ZL nicht mehr
Rulixa schrieb: > An sich ja, aber dann geht es mit Inc ZL nicht mehr Und das ist warum wichtig? Ja, ist ja toll das du entdeckt hast das wenn man die Daten an einer Bytegrenze aligned nur noch das lowbyte durchgehen muss, aber ansonsten?!? Wozu soll das Ganze denn gut sein, ist doch eh reichlich Zeit...
Moin, Wenns mal etwas pressiert und der Platz nur fuer eine Tabelle reicht, rat' ich zu einem: subi zl, 192 um zwischen sin/cos "umzuschalten"; gefolgt von einem subi zl, 63 um wieder zurueckzuschalten und zu inkrementieren... Gruss WK
Rulixa schrieb: > Na ja, die nächste Zeile muss man auch lesen. > Natürlich no errors. > Sagt ein wenig über dich aus. Hi, die relevanten Zeilen würden bei mir so aussehen. Tut mir leid. ciao gustav
:
Bearbeitet durch User
Dergute W. schrieb: > Moin, > > Wenns mal etwas pressiert und der Platz nur fuer eine Tabelle reicht, > rat' ich zu einem: > > subi zl, 192 > > um zwischen sin/cos "umzuschalten"; gefolgt von einem > > subi zl, 63 als auch Carl D. und Wolfgang: Ich hatte überlegt mit einer Tabelle auszukommen um die 90° Phasenverschiebung der beiden Ausgänge zu bedienen. Es erfordert , wie geschrieben etwas mehr Rechnerei. Da war eine 2. Tabelle, Platz ist ja genug da, einfacher. Auch die Tabelle um 90° zu erweitern und 2 Marken zu setzen. Aber dann gibt es wieder das Problem dass ZH incrementiert für die cos Tabelle und so wieder etwas Rechnerei nötig ist. EURE Kommentare sind o.k. Zu den anderen guten Tips.: 1.sin (i) geht sich wohl in einem tiny13 nicht aus. Überhaupt wird das Programm in C im tiny 13 kaum Platz haben. 2. Zwei Frequenzen ist bei gewünschtem 90° Phasenunterschied nicht zielführend. 3. etc... Na ja, ihr habt euch eben ausgetobt. Müsst wohl viel Stress haben den ihr loswerden wolltet. IMHO weird.
Rudi D. schrieb: > Ich hatte überlegt mit einer Tabelle auszukommen um die 90° > Phasenverschiebung der beiden Ausgänge zu bedienen. Es erfordert , wie > geschrieben etwas mehr Rechnerei. Da war eine 2. Tabelle, Platz ist ja > genug da, einfacher. Quark, eine Konstante (64) auf den Index zu rechnen ist nicht wirklich arbeit und auch nicht komplex. > Auch die Tabelle um 90° zu erweitern und 2 Marken zu setzen. Aber dann > gibt es wieder das Problem dass ZH incrementiert für die cos Tabelle und > so wieder etwas Rechnerei nötig ist. Das wäre dann nur Unsinn. > 1.sin (i) geht sich wohl in einem tiny13 nicht aus. Überhaupt wird das > Programm in C im tiny 13 kaum Platz haben. Wieder Quark, der hat mehr als genug Flash dafür, selbst das C Programm von mir etwas weiter oben belegt nicht mal die Hälfte. > 2. Zwei Frequenzen ist bei gewünschtem 90° Phasenunterschied nicht > zielführend. Wenn die 2. Frequenz der ersten entspricht ist das überhaupt kein Problem, hindert ja niemanden daran F1 = F2 zu setzen... > 3. etc... Bislang hast du überhaupt nix substantielles geliefert...
Tim T. schrieb: > Armselige Aufgabe, großspurig dahergelabert, erbärmlich umgesetzt... Tim T. schrieb: > Quark Tim T. schrieb: > Das wäre dann nur Unsinn. Tim T. schrieb: > Wieder Quark Tim T. schrieb: > Bislang hast du überhaupt nix substantielles geliefert... Machst du jetzt einen auf mini F.B.? Lass gefälligst meinen Namen aus dem Spiel.
Tim T. schrieb: > Rudi D. schrieb: >> Ich hatte überlegt mit einer Tabelle auszukommen um die 90° >> Phasenverschiebung der beiden Ausgänge zu bedienen. Es erfordert , wie >> geschrieben etwas mehr Rechnerei. Da war eine 2. Tabelle, Platz ist ja >> genug da, einfacher. > > Quark, eine Konstante (64) auf den Index zu rechnen ist nicht wirklich > arbeit und auch nicht komplex. Komplex ist es sicher nicht, erfordert aber mehr als nur 64 für den cos zu addieren. Aber kannst ja selbst draufkommen. Sie und Falk IMHO fachlich o.k. Menschlich nicht.
:
Bearbeitet durch User
Beitrag #5762170 wurde von einem Moderator gelöscht.
Rudi D. schrieb: > Tim T. schrieb: >> Quark, eine Konstante (64) auf den Index zu rechnen ist nicht wirklich >> arbeit und auch nicht komplex. > > Komplex ist es sicher nicht, erfordert aber mehr als nur 64 für den cos > zu addieren. Aber kannst ja selbst draufkommen. Ja klar...
1 | LDI COS,64 |
2 | LDI SIN,63 |
3 | |
4 | LDI ZH,HIGH(SINTABELLE*2); |
5 | LDI ZL,LOW(SINTABELLE*2); |
6 | |
7 | Schleife: |
8 | |
9 | ;Sinuswert aus Tabelle |
10 | LPM SCRATCH_REG,Z |
11 | |
12 | ;Wert ausgeben an OC0A (PB0) |
13 | OUT OCR0A,SCRATCH_REG |
14 | |
15 | ;Jetzt den zugehörigen COS Index setzen |
16 | ADD ZL,COS |
17 | |
18 | ;Cosinuswert aus Tabelle |
19 | LPM SCRATCH_REG,Z |
20 | |
21 | ;Wert ausgeben an OC0B (PB1) |
22 | OUT OCR0B,SCRATCH_REG |
23 | |
24 | ;Wieder zurück zum SIN, aber eine Stelle weiter |
25 | SUB ZL,SIN |
26 | |
27 | ;Warteschleifenwert |
28 | LDI SCRATCH_REG,10 |
29 | |
30 | Delay: |
31 | |
32 | DEC SCRATCH_REG |
33 | BRNE Delay |
34 | RJMP Schleife |
35 | |
36 | ;in Summe auch 42 |
37 | |
38 | .ORG 0x80 |
39 | |
40 | SINTABELLE: |
41 | .DB ... |
> > Sie und Falk IMHO fachlich o.k. Menschlich nicht. Und ich kann bei dir weder zum einen oder anderen eine positive Aussage treffen.
:
Bearbeitet durch User
Beitrag #5762261 wurde von einem Moderator gelöscht.
Rudi D. schrieb: > 1.sin (i) geht sich wohl in einem tiny13 nicht aus. Überhaupt wird das > Programm in C im tiny 13 kaum Platz haben. Schon wieder falsch. Siehe Anhang. Natürlich ist der Tabellenzugriff in C nicht so optimiert wie in ASM, aber das spielt hier keine Rolle, denn es sind 256 Take pro Durchlauf verfügbar. Nicht mal 50% auf nem kleinen ATting13, not bad für "olles C".
1 | AVR Memory Usage |
2 | ---------------- |
3 | Device: attiny13a |
4 | |
5 | Program: 376 bytes (36.7% Full) |
6 | (.text + .data + .bootloader) |
7 | |
8 | Data: 0 bytes (0.0% Full) |
9 | (.data + .bss + .noinit) |
10 | |
11 | |
12 | Build succeeded with 0 Warnings... |
Tim T. schrieb: > Rudi D. schrieb: >> Tim T. schrieb: >>> Quark, eine Konstante (64) auf den Index zu rechnen ist nicht wirklich >>> arbeit und auch nicht komplex. >> >> Komplex ist es sicher nicht, erfordert aber mehr als nur 64 für den cos >> zu addieren. Aber kannst ja selbst draufkommen. > > Ja klar...LDI COS,64 > LDI SIN,63 > Dergute W. löste es noch kompakter. Danke. Ansonst siehe Kommentar von SoIstEs. Ich mach jetzt Schluss.
Falk B. schrieb: > > Nicht mal 50% auf nem kleinen ATting13, not bad für "olles C". > Fachlich ist ja alles o.k.
Rudi D. schrieb: > Habe es jetzt umgebaut auf 2 Kanäle mit 90° Phasenunterschied. Aber wo stellt man denn die Frequenz ein? Es wäre sicher sinnvoll gewesen, entweder noch ein Poti einzubinden mit ADC oder zwei Taster.
Hallo, @ Falk: eine Frage Wozu dient der Sleepmode wenn der µC permanent Frequenzen erzeugen soll? Zudem würde ich Fast PWM Mode vermeiden, wegen Glitches mit Compare 0. Wenn es Frequenzmäßig passt versuche ich immer den Fast Mode zuvermeiden.
Veit D. schrieb: > Hallo, > > @ Falk: eine Frage > > Wozu dient der Sleepmode wenn der µC permanent Frequenzen erzeugen soll? Zum Strom sparen. Ist aber nur Spielerei. > Zudem würde ich Fast PWM Mode vermeiden, wegen Glitches mit Compare 0. Nix Glitch, nur halt kein Dauer-LOW oder Dauer-HIGH. Braucht man hier auch nicht. > Wenn es Frequenzmäßig passt versuche ich immer den Fast Mode > zuvermeiden. Ist unsinnig.
Hallo, warum keine Glitches? Mit den sieben Nullen in der Tabelle erzeugt man doch sieben Glitches. Oder nicht? grübel kopfkratz ... Wegen Sleepmode nochmal. Steuerst du damit nicht auch das Timing mittels Overflow ISR für die nächste Compare Zuweisung? Sonst würde die Hauptschleife ohne zeitlichen Bezug ständig die Compare Register aktualisieren, wenn man vom 8 Bit schieben mal absieht.
Veit D. schrieb: > Hallo, > > warum keine Glitches? Weißt du überhaupt, was ein Glitch ist? > Mit den sieben Nullen in der Tabelle erzeugt man > doch sieben Glitches. Oder nicht? grübel kopfkratz ... Oder nicht. Man erhält nicht Dauer-LOW, sondern halt minimal Pulsbreite von 1/256. So what. Wen das stört, der kann die Tabelle auch neu berechnen und das Minimum auf 1 legen, nicht 0. Das vermindert nur die Amplitude minimal. > Wegen Sleepmode nochmal. Steuerst du damit nicht auch das Timing mittels > Overflow ISR für die nächste Compare Zuweisung? Ja. Einschlafen, Wecken durch ISR, einmal die Hauptschleife abarbeiten, wieder von vorn. > Sonst würde die > Hauptschleife ohne zeitlichen Bezug ständig die Compare Register > aktualisieren, wenn man vom 8 Bit schieben mal absieht. Genau.
Hallo, okay, Sleepmode ist geklärt. Glitch ist ein Nadelimpuls, ein Bug im Timer, den man eigentlich nicht haben möchte, man will ja Null haben, also aus. Aber gut, der Nadelimpuls mag hier keine Rolle spielen, ich würde ihn dennoch vermeiden wenn ich kann ... :-)
Veit D. schrieb: > Hallo, > > okay, Sleepmode ist geklärt. > > Glitch ist ein Nadelimpuls, ein Bug im Timer, den man eigentlich nicht > haben möchte, Zum 3. Mal. NEIN! Es ist KEIN BUG, KEIN GLITCH sondern eine Einschränkung des Wertebereichs. Lies mal, was ein Glitch ist.
Hallo, für mich ist das ein Glitch, ein eigentlich ungewollter Nadelimpuls genauso wie es im Artikellink steht. Zudem steht es im µC Manual als "Narrow Spike" bezeichnet. Ne, da haben wir diesmal verschiedene Ansichten. :-)
Matthias S. schrieb: > Rudi D. schrieb: >> Habe es jetzt umgebaut auf 2 Kanäle mit 90° Phasenunterschied. > > Aber wo stellt man denn die Frequenz ein? Es wäre sicher sinnvoll > gewesen, entweder noch ein Poti einzubinden mit ADC oder zwei Taster. Danke für das Interesse. Im listing ist ein delay zu sehen als auch eine Feineinstellung mit dem nop das dort steht. Wenn man das alles gerne einstellbar hätte ist mindestens ein t2313 mit Display und Drehgeber zu planen. Siehe http://www.elektronik-labor.de/AVR/DDSGenerator.htm Code von mir ist dabei. Wenn man breitbandig 90° braucht, dann würde ich dort auch einen 3. t2313 als cos-DDS planen. Man könnte es aber auch für z.B. Drehzahlregelung für Motoren verwenden, wenn man eine 2. und ggfs. 3. Phase hinzufügt. Das Projekt mit dem tiny13 ist ja sehr begrenzt nutzbar. Kommentare es sei anders viel besser oder sonstiges bitte zu unterlassen. z.B. ratz fatz mit ARM STM etc.
Rudi D. schrieb: > Wenn man das alles gerne einstellbar hätte ist mindestens ein t2313 mit > Display und Drehgeber zu planen. Siehe Und wieder absoluter Unsinn, der Tiny13A hat noch locker Platz um nen Poti am ADC zwischendurch abzufragen und die Frequenz entsprechend anzupassen. > Wenn man breitbandig 90° braucht, dann würde ich dort auch einen 3. > t2313 > als cos-DDS planen. Man könnte es aber auch für z.B. Drehzahlregelung > für Motoren verwenden, wenn man eine 2. und ggfs. 3. Phase hinzufügt. Warum, der Tiny13A macht das locker mit. > Das Projekt mit dem tiny13 ist ja sehr begrenzt nutzbar. An welcher Stelle genau? > Kommentare es sei anders viel besser oder sonstiges bitte zu > unterlassen. Aber besser programmiert ist ok, oder?
:
Bearbeitet durch User
Karl B. schrieb: > Hi, > die relevanten Zeilen würden bei mir so aussehen. Hallo, mit AVRA: advanced AVR macro assembler Version 1.3.0 Build 1 (8 May 2010) und https://github.com/DarkSector/AVR/blob/master/asm/include/tn4313def.inc erhalte ich die Fehlermeldung: LED_Lauflicht.asm(96) : Error : adiw can only use registers R24, R26, R28 or R30 LED_Lauflicht.asm(115) : Error : adiw can only use registers R24, R26, R28 or R30 LED_Lauflicht.asm(133) : Error : adiw can only use registers R24, R26, R28 or R30 LED_Lauflicht.asm(152) : Error : adiw can only use registers R24, R26, R28 or R30 Assembly aborted with 4 errors and 0 warnings. Sollte wohl
1 | adiw ZH:ZL, 1 ; anstatt |
2 | adiw ZL:ZH, 1 ; lauten |
Assembly complete with no errors.
Rudi D. schrieb: > Wenn man das alles gerne einstellbar hätte ist mindestens ein t2313 mit > Display und Drehgeber zu planen. Nö. Du könntest ein Poti am ADC benutzen, und z.B. in Stufen einstellen, also 50Hz, 100Hz, 150 Hz, usw. Da kommt man noch nicht durcheinander und die ganze Kiste ist schon mal wesentlich flexibler. Denkbar wäre auch ein Preset im EEPROM, das nach einem Reset immer als erstes startet und dann mit dem Poti überstimmt werden kann. Oder man macht sich einen Tongeneraotr für die 12 Töne einer Oktave, oder, oder... Das ist selbst für den Tiny13 überhaupt kein Problem. Ich habe mit Tiny45 auch schon Wechselrichter gebaut, die man mit Poti in Frequenz und Spannung regeln kann und an den PWM Ausgängen eine H-Brücke antreiben. Man hat immerhin 5 Ports, die man ruhig auch nutzen kann.
:
Bearbeitet durch User
Tim T. schrieb: >>Rudi schrieb: >> Sie und Falk IMHO fachlich o.k. Menschlich nicht. > > Und ich kann bei dir weder zum einen oder anderen eine positive Aussage > treffen. Klartext: Von der Größe der aufgerissenen Schnauze her erinnerst Du an den Nutzer "Tim Thaler". Das war auch so ein Schmierlappen und die Nicknamen ähneln sich fatal!
Veit D. schrieb: > für mich ist das ein Glitch Wir sind hier nicht bei gutefrage.net. Ein Glitch ist klar definiert. Was es für dich ist, interessiert kein Schwein.
Alexander S. schrieb: > Karl B. schrieb: >> Hi, >> die relevanten Zeilen würden bei mir so aussehen. > > Hallo, > > mit AVRA: advanced AVR macro assembler Version 1.3.0 Build 1 (8 May > 2010) > und > https://github.com/DarkSector/AVR/blob/master/asm/include/tn4313def.inc > erhalte ich die Fehlermeldung: Hi, bei Atmel Studio 4. 18 ist's bei mir fehlerfrei. Und Prog läuft auch wie es soll. Assembly complete, 0 errors. 0 warnings ATtiny4313 memory use summary [bytes]: Segment Begin End Code Data Used Size Use% [.cseg] 0x000000 0x00029a 356 298 654 4096 16.0% [.dseg] 0x000060 0x000064 0 4 4 256 1.6% [.eseg] 0x000000 0x000000 0 0 0 256 0.0% Assembly complete, 0 errors. 0 warnings Alexander S. schrieb: > Sollte wohladiw ZH:ZL, 1 ; anstatt > adiw ZL:ZH, 1 ; lauten wieso? wenn oben ldi ZL, LOW(leds0*2) ;Adresse des Strings0 in den ldi ZH, HIGH(leds0*2) ;Z-Pointer laden dann unten adiw in derselben Reihenfolge. Also erst low dann high. OK. Im Instruction set steht es anders herum. yep. Beim 4313 geht es schon mit dem Z+ Postincrement. Spart man sich also. ciao gustav
Matthias S. schrieb: > > Nö. Du könntest ein Poti am ADC benutzen, und z.B. in Stufen einstellen, > also 50Hz, 100Hz, 150 Hz, usw. Ja natürlich, wenn man das Display nicht braucht.
Rudi D. schrieb: > Ja natürlich, wenn man das Display nicht braucht. Braucht man ja auch nicht. Da reicht eine einfache Skala am Poti. Ich habe auf die Art und Weise auch mal einen nicht mehr erhältlichen Programmumschalter am Microverb von Alesis ersetzt. Poti und ADC liefern dann eben nur 16 Stufen, mit denen ich die 4 Datenleitungen am Microverb gesetzt habe. Aber ich glaube, das es nicht viel Sinn hat, dir das auseinanderzusetzen, weil dir die Vorstellungskraft fehlt.
Matthias S. schrieb: > Aber ich glaube, das es nicht viel Sinn hat, dir das > auseinanderzusetzen, weil dir die Vorstellungskraft fehlt. Interessante Ansicht! Na gut.
Falk B. schrieb: > Veit D. schrieb: >> Hallo, >> >> okay, Sleepmode ist geklärt. >> >> Glitch ist ein Nadelimpuls, ein Bug im Timer, den man eigentlich nicht >> haben möchte, > > Zum 3. Mal. NEIN! Es ist KEIN BUG, KEIN GLITCH sondern eine > Einschränkung des Wertebereichs. > > Lies mal, was ein Glitch ist. Hallo, habe mich mit dem narrow spike wie im Manual beschrieben nochmal beschäftigt. Vom Begriff her habe ich narrow spike mit Clitch gleichgesetzt. Clitch ist wirklich das wofür ich es halte und den narrow spike fälschlicherweise auch dafür gehalten habe. Den narrow spike habe ich mit Oszi und anderen Compare Werten angeschaut und behaupte jetzt das der Begriff narrow spike (Nadelimpuls) irgendwie irreführend ist. Weil das ist kein "störender" Nadelimpuls in dem Sinne, sondern wie Falk schon schrieb, genau ein Eintel Pulsweite von X, in dem Bsp. hier 1/256. Habe ich auch rechnerisch ermittelt, stimmt überein. Bedeutet der Anteil der Pulsweite ist immer Comparewert + 1. Der Fastmode kann damit nicht 0,0% Pulsweite erzeugen. Wenn man mit "Tricks" bei 0 den Ausgang abschaltet und erst mit 1 PWM machen lässt, verliert man demzufolge immer den den ersten Pulsweitenanteil von X bzw. überspringt diesen. Interessant. So genau hatte ich das noch nicht betrachtet. Das war nun der Grund dafür. Es hat immer irgendwas Gutes. Spätestens nach der 3. Beschwerde. :-)
Hi >Bedeutet der Anteil >der Pulsweite ist immer Comparewert + 1. Der Fastmode kann damit nicht >0,0% Pulsweite erzeugen. Wenn man mit "Tricks" bei 0 den Ausgang >abschaltet und erst mit 1 PWM machen lässt, verliert man demzufolge >immer den den ersten Pulsweitenanteil von X bzw. überspringt diesen. Wenn man im "inverting mode" OCRn mit Top-Comparewert lädt kann man ohne Tricks das Ausgangssignal von 0 bis Top-1 laufen lassen. Es fehlt dann halt dann der letzte Timertakt. MfG Spess
spess53 schrieb: > Wenn man im "inverting mode" OCRn mit Top-Comparewert lädt kann man ohne > Tricks das Ausgangssignal von 0 bis Top-1 laufen lassen. Es fehlt dann > halt dann der letzte Timertakt. Ja, aber auch das ist ein arg alter Hut. Den Vogel hat Atmel aber bei einigen neueren AVRs abgeschossen! Beitrag "Re: Attiny85 Timer1 PWM: Keine Duty-Cycle-Formel (da nichtlinear?)"
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.