Forum: Mikrocontroller und Digitale Elektronik Tiny13 uns der (very) fast PWM - Mode


von Leo B. (luigi)


Angehängte Dateien:

Lesenswert?

Servus,

Unwichtigeres Blabla:
Ich hab so ne kleine Anwendung, bei der ich den Tiny13V als 
Step-Down-Regler einsetzen möchte. Tiny13V deshalb da es meines Wissens 
keinen anderen Baustein gibt, der mir hier weiterhalfen kann. Vor allem 
wegen des geringen Platzangebotes von nur 1,1mm ( + 0,5mm Platine) in 
der Höhe. Die Fläche ist auch sehr begrenzt.
Der Baustein muss einerseits die Ausgangsspannung regeln, andererseits 
aber auch als Spannungsüberwachung und Ein-Ausschalte-FlipFlop dienen.
Und 2 Bausteine finden leider schon keinen Platz mehr auf der Platine. 
Alles in der Schaltung oben füllt die Platine zu 90% aus.

Zum Thema:
Ich möchte also den Tiny13V als Step-down-regler einsetzen (siehe 
Anhang).
Die Spule wird ungefähr 40uH haben, C3 und C4 je ca. 10uF.
Mehr Platz für größere Bauteile ist leider nicht. Daher ist eine relativ 
hohe Frequenz nötig. Da der Tiny13V nun aber als Timer/Counter 
Taktquelle nur max. 9,6MHz (interne Systemtaktquelle) erlaubt, hab ich 
mir überlegt, die On- bzw. Off-Zeit am Step-Down-Transitor auf ca. 25 
Takte (also 2,5us) zu beschränken (bedeutet min. 200kHz) und je nach 
Bedarf die Zeiten so zu verkürzen, dass das gewünschte Tastverhältnis 
rauskommt.
Ich hätte es softwaremäßig so gelöst, dass bei jedem 
Timer-Overflow-Interrupt der Zähler wieder auf einen bestimmten Wert 
gesetzt wird und somit die Zeit zum nöchsten Overflow verkürzt wird. Der 
Haken ist aber, dass ich dann schlimmstenfalls auf rund 25 Takte pro 
kompletten Zyklus komme, nämlich genau dann wenn Eingangs- und 
Ausgangsspannung annähernd gleich werden.
Meine Frage ist also ob diese 25 Takte noch ausreichen um nebenher noch 
Aufgaben wie die Spannungsüberwachung und zugehörige Berechnungen zu 
meistern, oder ob sich dann mein Winzling in einem Interrupt nach dem 
anderen fängt.

Wer weiß weiter oder hat gar Tips, Ratschläge oder Ideen?

Ich danke euch schonmal voraus!

von Hannes Lux (Gast)


Lesenswert?

Schau Dir mal den Tiny25 an, der hat eine PLL für Timer1, damit ist ohne 
Klimmzüge eine PWM-Frequenz (bei 8-Bit-PWM) von 250 kHz möglich. Da die 
PWM dann in Hardware erzeugt wird, hast Du alle Rechenzeit selbst zur 
Verfügung, brauchst halt nur den jeweils gewünschten Tastgrad in das 
OCR-Register zu schreiben.

...

von Leo B. (luigi)


Lesenswert?

Der Tiny 25 hat aber 2 probleme in meinem System:
1. Die 2,16mm Bauhöhe sind zu viel! Die 1,7mm vom Tiny 13 gehen mit 
ausschleifen und pressen gerade noch ins Gehäuse.
2. Den Tiny 13 hab ich schon hier rumliegen. Gut nich so schlimm, den 
kann man öfters brauchen, aber wie gesagt die Größe ist minimal aber 
äußerstes Limit!

Trotzdem Danke für den Tip.

Kann mir aber trotzallem jemand sagen wieviele Takte mindestens noch 
zwischen den Interrupts übrig bleiben? Ich habe ja keine großen 
Berechnungen zu tätigen... oder eher der kleine Tiny13
Ich programiere übrigends in C.
Assembler kann ich leider noch nicht. Kommt aber noch irgendwann nur 
bitte noch nicht für dieses Projekt.

von Oliver (Gast)


Lesenswert?

>Kann mir aber trotzallem jemand sagen wieviele Takte mindestens noch
>zwischen den Interrupts übrig bleiben?

Niemand ausser dir selber...

Ich verstehe deinen ersten Beitrag so, daß du alle 25 Takte eine ISR 
laufen lassen möchtest, die 25 Takte lang ist. Damit wäre der Prozessor 
voll ausgelastet, und deine Frage sinnlos.

Das Szenario ist zwar der worst-case, aber bei einer üblichen Anwendung 
"Batterie auf konstante Ausgangspannung" kann dieser worst-case am 
Lebensende der Batterie schon mal ziemlich lange anstehen.

Also muß die Frage anders lauten - aber wie?

Oliver

von Leo B. (luigi)


Lesenswert?

nein nein. innerhalb des interrupts wird nur in das TCNT0 Register sowie 
in OCR0A geschrieben.
Welche werte dort hineinkommen wird ausserhalb des Interrupts 
abgehandelt.

Frage genauer gestellt (sorry dass ich sie erst jetz so stelle):
Wie viele takte brauch der uC um in den Interrupt rein zu gehen, die 
werte aus 2 Globalen Variablen in die Register TCNT0 und OCR0A zu 
schreiben und wieder zurück ins normale Programm zu kommen?

Wieviele Takte dann zu den min. 25 (zum frühesten nächsten Interrupt) 
übrig bleiben kann ich mir ja dann eigentlich selbst ausrechnen und dann 
überlegen ob das für meine Anwendung ausreicht.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Also ich würde wenns sooo knapp ist echt auf ASM umsteigen...
In C hilft nur programmieren und dann lss File analysieren.

von Hannes Lux (Gast)


Lesenswert?

In ASM sind es bei Verwendung von Inklusiv-Registern 12 Takte, davon 10 
Takte für Aufruf des Interrupts und dessen Rücksprung und 2 Takte für 2 
Out-Befehle. Da Out keine Flags verändert, ist auch keine SREG-Sicherung 
nötig. Ich bezweifle allerdings, dass das die gesamte Arbeit der ISR 
ist, denn damit legst Du nur den nächsten Int-Termin fest und hast noch 
keinerlei Job erledigt.

...

von Peter D. (peda)


Lesenswert?

Hans Wurst wrote:
> Der Tiny 25 hat aber 2 probleme in meinem System:
> 1. Die 2,16mm Bauhöhe sind zu viel! Die 1,7mm vom Tiny 13 gehen mit
> ausschleifen und pressen gerade noch ins Gehäuse.

Also ich kann im Datenblatt keinen Unterschied entdecken.
Beide sind min/max mit 1,7/2,16mm angegeben.
Und als MU-Typ sind beide nur 0,7/0,8mm hoch.


Peter

von Leo B. (luigi)


Lesenswert?

Hannes Lux wrote:
> In ASM sind es bei Verwendung von Inklusiv-Registern 12 Takte, davon 10
> Takte für Aufruf des Interrupts und dessen Rücksprung und 2 Takte für 2
> Out-Befehle. Da Out keine Flags verändert, ist auch keine SREG-Sicherung
> nötig. Ich bezweifle allerdings, dass das die gesamte Arbeit der ISR
> ist, denn damit legst Du nur den nächsten Int-Termin fest und hast noch
> keinerlei Job erledigt.

Da gehts los: Was sind inklusiv-register?
warum flags sichern bzw. nicht sichern?
(abgesehen davon ist mir der Begriff "Flags" zwar bekannt, aber seine 
Bedeutung eher unbekannt. Bring ich aber in meiner gleich folgenden 
recherche sicher raus.)
und dann die Frage wie baginne ich überhaupt ein ASM-Programm? einfach 
mit dem 1. Befehl loslegen oder gibts da auch irgend welche defines, 
Header etc?

Peter Dannegger wrote:
> Hans Wurst wrote:
>> Der Tiny 25 hat aber 2 probleme in meinem System:
>> 1. Die 2,16mm Bauhöhe sind zu viel! Die 1,7mm vom Tiny 13 gehen mit
>> ausschleifen und pressen gerade noch ins Gehäuse.
>
> Also ich kann im Datenblatt keinen Unterschied entdecken.
> Beide sind min/max mit 1,7/2,16mm angegeben.
> Und als MU-Typ sind beide nur 0,7/0,8mm hoch.
>
>
> Peter

der ATtiny13V-10SSU it mit max. 1,75mm angegeben und hält diese gerade 
so ein. Siehe Datenblatt Seite 163.
 http://www.atmel.com/dyn/resources/prod_documents/doc2535.pdf
Und der MU-Typ ist für meine Selbst geätzten Platinen eher ungünstig, 
vor allem da ich mit keiner Leiterbahn unter den Chip rein oder raus 
komme. (so fein Ätzen kann ich noch nicht, kommt aber hoffentlich mit 
der Vollendung meines Laminator-Tunings)

von hans (Gast)


Lesenswert?

Denn Tiny25 gibt es auch als ATtiny25V-10SSU, d.h. im 8S1-Gehäuse.

Auch in Assembler kann man unterschiedlich schnelle Programmlösungen
schreiben, hier z.B. bei nur einem Interrupt ist es möglich die
Routine direkt auf die Adresse zu legen und auf den Sprungbefehl zu
verzichten.

Aber solche Sachen sind beim ersten Assemblerprogramm noch "außen vor".

Daher besser den Tiny25 besorgen und die Hardware-PWM nutzen.

gruß hans

von Peter D. (peda)


Lesenswert?

Hans Wurst wrote:
T
> der ATtiny13V-10SSU it mit max. 1,75mm angegeben und hält diese gerade
> so ein. Siehe Datenblatt Seite 163.
>  http://www.atmel.com/dyn/resources/prod_documents/doc2535.pdf

Dann schau mal Seite 212:
http://www.atmel.com/dyn/resources/prod_documents/2586S.pdf
Da steht genau das gleiche für den ATtiny25.

Bei jeder Bauform steht das gleiche bei ATtiny13/25.


Peter

von Hannes Lux (Gast)


Lesenswert?

> Da gehts los: Was sind inklusiv-register?

Das ist natürlich ein Vertipper (Verdenker), kommt wohl daher, wenn man 
mal schnell zwischendurch eine schnelle Antwort schreibt, schäm...
Es war Exklusiv-Register gemeint, also die Tatsache, dass man einige der 
32 Arbeitsregister exklusiv für diesen Zweck reserviert, also nicht 
anderweitig nutzt. Dadurch brauchen die Inhalte (Werte) nicht erst 
zeitraubend aus dem SRAM geholt zu werden. Mit anderen Worten: Man hält 
die Variablen in Registern statt im SRAM.

> warum flags sichern bzw. nicht sichern?

Wenn die ISR die Flags im SREG verändern kann (Operationen mit 
Flagbeeinflussung), dann kann sich das Hauptprogramm veralbern, falls de 
Interrupt exakt zwischen einer flagbeeinflussenden Operation und der 
darauf folgenden flagabhängigen Verzweigung zuschlägt. Im oben 
konstruierten Fall werden im Interrupt die Befehle RJMP, OUT und RETI 
ausgeführt, die allesamt keine Flags beeinflussen. Hier ist also keine 
Sicherung des SREGs erforderlich. Wäre in der ISR ein Vergleich, eine 
Operation (logisch oder rechnerisch) oder eine andere Flagbeeinflussung 
involviert, müsste auch noch das SREG wärend der ISR gesichert und 
danach wiederhergestellt werden. Dies kostet zusätzliche Takte.

...

von Leo B. (luigi)


Lesenswert?

Peter Dannegger wrote:
> Hans Wurst wrote:
> T
>> der ATtiny13V-10SSU it mit max. 1,75mm angegeben und hält diese gerade
>> so ein. Siehe Datenblatt Seite 163.
>>  http://www.atmel.com/dyn/resources/prod_documents/doc2535.pdf
>
> Dann schau mal Seite 212:
> http://www.atmel.com/dyn/resources/prod_documents/2586S.pdf
> Da steht genau das gleiche für den ATtiny25.
>
> Bei jeder Bauform steht das gleiche bei ATtiny13/25.
>
>
> Peter

Da hast du jetzt recht. Was hab ich dann wieder für ein Datenblatt 
gehabt wo nur die hälft drin stand... oder war ich etwa so blind?!

grr... und wieder einen so seltenen bestellen.
Die gibts doch immer nur bei DigiKey und da komm ich doch so schlecht 
ran!?

Hannes Lux wrote:
>> Da gehts los: Was sind inklusiv-register?
>
> Das ist natürlich ein Vertipper (Verdenker), kommt wohl daher, wenn man
> mal schnell zwischendurch eine schnelle Antwort schreibt, schäm...
> Es war Exklusiv-Register gemeint, also die Tatsache, dass man einige der
> 32 Arbeitsregister exklusiv für diesen Zweck reserviert, also nicht
> anderweitig nutzt. Dadurch brauchen die Inhalte (Werte) nicht erst
> zeitraubend aus dem SRAM geholt zu werden. Mit anderen Worten: Man hält
> die Variablen in Registern statt im SRAM.
>
>> warum flags sichern bzw. nicht sichern?
>
> Wenn die ISR die Flags im SREG verändern kann (Operationen mit
> Flagbeeinflussung), dann kann sich das Hauptprogramm veralbern, falls de
> Interrupt exakt zwischen einer flagbeeinflussenden Operation und der
> darauf folgenden flagabhängigen Verzweigung zuschlägt. Im oben
> konstruierten Fall werden im Interrupt die Befehle RJMP, OUT und RETI
> ausgeführt, die allesamt keine Flags beeinflussen. Hier ist also keine
> Sicherung des SREGs erforderlich. Wäre in der ISR ein Vergleich, eine
> Operation (logisch oder rechnerisch) oder eine andere Flagbeeinflussung
> involviert, müsste auch noch das SREG wärend der ISR gesichert und
> danach wiederhergestellt werden. Dies kostet zusätzliche Takte.
>
> ...

Danke für die ausfühliche Erklärung. Ich erinner mich waage an einen 
durch zufall vor sehr langer zeit besuchten Kurs, indem mit die 
Funktionsweise eines uC erklärt wurde. die "Position" von 
Arbeitsregistern und SRAM im Chip sind mir daher halbwegs geläufig, aber 
wie man sie verwendet?!... ich glaube das wird nichts. Zumindest nich in 
diesem Projekt. Ich würde es gerne machen, aber ich vermute dann wird 
das Projekt nich in absehbarer Zeit fertig.
Vor allem da ich ja dann auch die A/D-Wandler, den PWM, etc. alles in 
ASM programmieren muss. Das ist bestimmt nix für den Anfang. Lieber 
wieder mit der blinkenden LED anfangen^^ und mit nem Taster weiter 
machen...
Trotzdem Danke für deine/eure Mühen!

Mir kam da noch die Idee das ganze im AVR-simulator auf meinem Tiny13 zu 
Testen und wenns nichts wird, dann muss der Tiny25 irgendwo her.

von Peter D. (peda)


Lesenswert?

Hans Wurst wrote:

> grr... und wieder einen so seltenen bestellen.
> Die gibts doch immer nur bei DigiKey und da komm ich doch so schlecht
> ran!?

Bei Farnell sind 15 Stück da:

http://de.farnell.com/atmel/attiny25v-10ssu/8-bit-mcu-2k-fla-1-8-5-5v-soic8/dp/1636952


Peter

von Simon K. (simon) Benutzerseite


Lesenswert?


von Oliver (Gast)


Lesenswert?

>nein nein. innerhalb des interrupts wird nur in das TCNT0 Register sowie
>in OCR0A geschrieben.

Also etwa so etwas:
1
ISR(TIM0_COMPA_vect)
2
{
3
  TCNT0 = tcnt;
4
  OCR0A = ocr;
5
}

Der aktuelle avr-gcc macht daraus:
1
ISR(TIM0_COMPA_vect)
2
{
3
  44:  1f 92         push  r1
4
  46:  0f 92         push  r0
5
  48:  0f b6         in  r0, 0x3f  ; 63
6
  4a:  0f 92         push  r0
7
  4c:  11 24         eor  r1, r1
8
  4e:  8f 93         push  r24
9
  TCNT0 = tcnt;
10
  50:  80 91 61 00   lds  r24, 0x0061
11
  54:  82 bf         out  0x32, r24  ; 50
12
  OCR0A = ocr;
13
  56:  80 91 60 00   lds  r24, 0x0060
14
  5a:  86 bf         out  0x36, r24  ; 54
15
}
16
  5c:  8f 91         pop  r24
17
  5e:  0f 90         pop  r0
18
  60:  0f be         out  0x3f, r0  ; 63
19
  62:  0f 90         pop  r0
20
  64:  1f 90         pop  r1
21
  66:  18 95         reti

was trotz Optimierung mit -Os ziemlich ineffizient aussieht.

Die paar Befehle wirst du dann doch auch in Assembler hinkriegen. Am 
einfachsten nimmst den den Code vom gcc als Vorlage, und streichts alles 
raus, was nicht benötigt wird. Den Rest des Programms kannst du 
weiterhin in C schreiben. Schau in die Doku zur avr-libc, da steht drin, 
wie das zusammenpasst.
1
TIM0_COMPA_vect:
2
push  r24         ; 2 cycles 
3
lds  r24, 0x0061 ; 2 cycles
4
out  0x32, r24   ; 1 cycle
5
lds  r24, 0x0060 ; 2 cycles
6
out  0x36, r24   ; 1 cycle
7
pop  r24         ; 2 cycles
8
  reti          ; 4 cycles

Wenn ich mich nicht vertan haben, verändert keiner der Befehle das SREG, 
das braucht also nicht gesichert zu werden.

Insgesamt sind das 14 Takte, zuzüglich worst case 4 Takte für den 
Einsprung + 3 Takte Abarbeitung des gerade laufenden Befehls, ergibt 21 
Takte. Bleiben minimal gerade 3 Takte übrig. Da nach Rücksprung aus der 
ISR aber mindestens ein Befehl ausgeführt wird, und der nächste 
Einsprung dann auch wieder mindestens 4 Takte dauert, reichen 25 Takte 
Timerzyklus nicht aus.

Alle Angaben ohne Gewähr...

Oliver

von Hannes Lux (Gast)


Lesenswert?

> Mir kam da noch die Idee das ganze im AVR-simulator auf meinem Tiny13 zu
> Testen und wenns nichts wird, dann muss der Tiny25 irgendwo her.

Deshalb war ja mein erster Vorschlag der Hinweis auf den Tiny25.

ADC und PWM sind in ASM aber nicht komplizierter als in C.

...

von Leo B. (luigi)


Lesenswert?

Beim studieren der Mäglichkeiten im Tiny25 bin ich auf einen PWM-Mode 
gestoßen den der Tiny 13 ebenfalls beherrscht.
Im Datenblatt auf Seite 72, der Mode 7:
Fast PWM mit TOP = OCRA.
Das dürfte doch das Problem mit den Interrupts überflüssig machen.
Mit
OCR0A = 25;
OCR0B = 15;
kann ich ihm doch direkt sagen zähl bis 25 und setze den Ausgangspin bei 
15. also als Beispiel?!
und mir geht kein Takt für irgend welche Interrupt-routinen verloren?!

Oder hab ich jetz nen Gedankenfehler oder was falsch verstanden?

PS: ich brauch ja kein 8-bit pwm?! 10-20 Stufen sind vollkommen 
ausreichend!
Und ja der Tiny13 wär mir lieber weil ich ihn schon hier habe!

von Hannes Lux (Gast)


Lesenswert?

Das sollte gehen.

...

von hans (Gast)


Lesenswert?

Hallo Hans Wurst,

es sollte gehen, jedenfalls sagt mein ICC sowas:
1
//ICC-AVR application builder : 29.04.2009 22:06:21
2
// Target : T13
3
// Crystal: 9.6000Mhz
4
5
#include <iot13v.h>
6
#include <macros.h>
7
8
//Signal bit definitions
9
#define  PWM_OUT  1  //PB1
10
11
void port_init(void)
12
{
13
 PORTB = 0x00;
14
 DDRB  = 0x02;
15
}
16
17
//TIMER0 initialize - prescale:1
18
// WGM: Fast PWM (TOP=OCR0)
19
// desired value: 200KHz
20
// actual value: 200,000KHz (0,0%)
21
void timer0_init(void)
22
{
23
 TCCR0B = 0x00; //stop
24
 OCR0A = 0x30;  //  <- dein Topwert
25
 OCR0B = 0x10;  //  <- dein PWM-Wert
26
 TCNT0 = 0xD0; //set count
27
 TCCR0A = 0x33; 
28
 TCCR0B = 0x09; //start timer
29
}
30
31
//call this routine to initialize all peripherals
32
void init_devices(void)
33
{
34
 //stop errant interrupts until set up
35
 CLI(); //disable all interrupts
36
 port_init();
37
 timer0_init();
38
39
 MCUCR = 0x00;
40
 TIMSK0 = 0x00; //timer interrupt sources
41
 GIMSK = 0x00; //interrupt sources
42
 SEI(); //re-enable interrupts
43
 //all peripherals are now initialized
44
}
45
46
//
47
void main(void)
48
{
49
 init_devices();
50
 //insert your functional code here...
51
}

Bei 200 KHz ist dein TOP-Wert 0x30 = 48 Stufen, d.h. du kannst fein
regeln oder schneller werden.


gruß (auch) hans

von Leo B. (luigi)


Lesenswert?

Juhu ich danke euch!

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.