mikrocontroller.net

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


Autor: Leo B. (luigi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Leo B. (luigi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Leo B. (luigi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Leo B. (luigi)
Datum:

Bewertung
0 lesenswert
nicht 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/...
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)

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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/...

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

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Leo B. (luigi)
Datum:

Bewertung
0 lesenswert
nicht 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/...
>
> 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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-...


Peter

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>nein nein. innerhalb des interrupts wird nur in das TCNT0 Register sowie
>in OCR0A geschrieben.

Also etwa so etwas:
ISR(TIM0_COMPA_vect)
{
  TCNT0 = tcnt;
  OCR0A = ocr;
}

Der aktuelle avr-gcc macht daraus:
ISR(TIM0_COMPA_vect)
{
  44:  1f 92         push  r1
  46:  0f 92         push  r0
  48:  0f b6         in  r0, 0x3f  ; 63
  4a:  0f 92         push  r0
  4c:  11 24         eor  r1, r1
  4e:  8f 93         push  r24
  TCNT0 = tcnt;
  50:  80 91 61 00   lds  r24, 0x0061
  54:  82 bf         out  0x32, r24  ; 50
  OCR0A = ocr;
  56:  80 91 60 00   lds  r24, 0x0060
  5a:  86 bf         out  0x36, r24  ; 54
}
  5c:  8f 91         pop  r24
  5e:  0f 90         pop  r0
  60:  0f be         out  0x3f, r0  ; 63
  62:  0f 90         pop  r0
  64:  1f 90         pop  r1
  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.
TIM0_COMPA_vect:
push  r24         ; 2 cycles 
lds  r24, 0x0061 ; 2 cycles
out  0x32, r24   ; 1 cycle
lds  r24, 0x0060 ; 2 cycles
out  0x36, r24   ; 1 cycle
pop  r24         ; 2 cycles
  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

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Leo B. (luigi)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sollte gehen.

...

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hans Wurst,

es sollte gehen, jedenfalls sagt mein ICC sowas:
//ICC-AVR application builder : 29.04.2009 22:06:21
// Target : T13
// Crystal: 9.6000Mhz

#include <iot13v.h>
#include <macros.h>

//Signal bit definitions
#define  PWM_OUT  1  //PB1

void port_init(void)
{
 PORTB = 0x00;
 DDRB  = 0x02;
}

//TIMER0 initialize - prescale:1
// WGM: Fast PWM (TOP=OCR0)
// desired value: 200KHz
// actual value: 200,000KHz (0,0%)
void timer0_init(void)
{
 TCCR0B = 0x00; //stop
 OCR0A = 0x30;  //  <- dein Topwert
 OCR0B = 0x10;  //  <- dein PWM-Wert
 TCNT0 = 0xD0; //set count
 TCCR0A = 0x33; 
 TCCR0B = 0x09; //start timer
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 timer0_init();

 MCUCR = 0x00;
 TIMSK0 = 0x00; //timer interrupt sources
 GIMSK = 0x00; //interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

//
void main(void)
{
 init_devices();
 //insert your functional code here...
}


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


gruß (auch) hans

Autor: Leo B. (luigi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Juhu ich danke euch!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.