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!
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. ...
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.
>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
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.
Also ich würde wenns sooo knapp ist echt auf ASM umsteigen... In C hilft nur programmieren und dann lss File analysieren.
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. ...
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
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)
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
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 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. ...
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.
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
>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
> 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. ...
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!
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
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.