Forum: Mikrocontroller und Digitale Elektronik PWM mit ATtiny13 liefert SIN und COS


von Rudi D. (rulixa)


Angehängte Dateien:

Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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?

von Rudi D. (rulixa)


Lesenswert?

Eine typische Falk Antwort.
Ich bedauere Sie.

von Klaus Maus (Gast)


Lesenswert?

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ß?

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Armselige Aufgabe, großspurig dahergelabert, erbärmlich umgesetzt...

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Tim T. schrieb:
> dahergelabert

da bin ich bei dir, ohne context ... klippschule, bäh!


mt

von Karl B. (gustav)


Lesenswert?

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
von foobar (Gast)


Lesenswert?

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
}

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

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
von Wolfgang (Gast)


Lesenswert?

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

von Carl D. (jcw2)


Lesenswert?

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.

;-)

von MWS (Gast)


Lesenswert?

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.

von Rulixa (Gast)


Lesenswert?

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

von Rulixa (Gast)


Lesenswert?

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

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

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

von Dergute W. (derguteweka)


Lesenswert?

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

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

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
von Rudi D. (rulixa)


Lesenswert?

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.

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

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

von Quark (Gast)


Lesenswert?

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.

von Rudi D. (rulixa)


Lesenswert?

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.
von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

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.
von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

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

von Rudi D. (rulixa)


Lesenswert?

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.

von Rudi D. (rulixa)


Lesenswert?

Falk B. schrieb:

>
> Nicht mal 50% auf nem kleinen ATting13, not bad für "olles C".
>
Fachlich ist ja alles o.k.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Veit D. (devil-elec)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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.

von Veit D. (devil-elec)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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.

von Veit D. (devil-elec)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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.

von Veit D. (devil-elec)


Lesenswert?

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

von Rudi D. (rulixa)


Lesenswert?

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.

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

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
von Alexander S. (alesi)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von SiIstEs (Gast)


Lesenswert?

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!

von Thomas E. (thomase)


Lesenswert?

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.

von Karl B. (gustav)


Lesenswert?

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

von Rudi D. (rulixa)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Rudi D. (rulixa)


Lesenswert?

Matthias S. schrieb:

> Aber ich glaube, das es nicht viel Sinn hat, dir das
> auseinanderzusetzen, weil dir die Vorstellungskraft fehlt.

Interessante Ansicht! Na gut.

von Veit D. (devil-elec)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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
Noch kein Account? Hier anmelden.