Forum: Mikrocontroller und Digitale Elektronik AVR: Fast-PWM (BAM) in SW für >= 8 Kanäle


von Peter D. (peda)


Lesenswert?

Ich mach mal einen neuen Thread auf, weil der alte Titel überhaupt nicht 
zu dem interessanten Thema paßt. Er würde in der Versenkung verschwinden 
und niemand würde ihn je wiederfinden.


Original:
Beitrag "Re: AVR Assembler-Frage"

der alte Hanns schrieb:
> arbeite mit einem entsprechenden AVR-Studio, das aber
> meckerte, dass '.org' in einem macro nicht zulässig sei.

Also beim alten AVR-Studio 4.18 mit Assembler2 geht es. Sonst hätte ich 
das Macro ja nicht geschrieben.


Beitrag "Re: AVR Assembler-Frage"
Die Sam-BAM ist wirklich sehr ausgefeilt, mit meinen Schnellschüssen 
nicht zu vergleichen.
Darf man die benutzen?

Das Problem mit der überschüssigen Bitzeit ist elegant gelöst.
Die Schleife für Bit 4..7 muß ich mal durch den Simulator jagen. So 
trocken im Code lesen, ist mir das zu komplex.
Mein Geradeaus-Code braucht mehr Flash, aber die PWM wird ja nicht der 
Codefresser sein.

Das Sync wird an 2 Stellen aufgerufen, aber nach exakt der gleichen 
Zyklenzahl.
Man darf die Latenzzeit auch nicht zu lang machen, damit alles noch in 
die 256 Zyklen paßt. Für nen weiteren Interrupthandler wird die Luft 
ziemlich knapp.
Ich denke auch nicht, daß ein Lichteffektgerät weitere Interrupts 
braucht. Tasten, I2C, UART kann man bequem pollen.

Für PWM >8Bit habe ich mir überlegt, den Timer T1 zu benutzen. Man hat 
dann 2 Interrupthandler, OCR1A für Bit 0..7 und OCR1B für die höheren 
Bits.
Ist zwar mehr Code, aber man kann bequem die Startzeiten getrennt 
einstellen und muß beim Zyklenzählen nicht auf Gleichheit achten.

: Bearbeitet durch User
von Sam .. (sam1994)


Lesenswert?

Peter Dannegger schrieb:
> Die Sam-BAM ist wirklich sehr ausgefeilt, mit meinen Schnellschüssen
> nicht zu vergleichen.
> Darf man die benutzen?
Ja klar, dafür hab ich sie hochgeladen

> Man darf die Latenzzeit auch nicht zu lang machen, damit alles noch in
> die 256 Zyklen paßt. Für nen weiteren Interrupthandler wird die Luft
> ziemlich knapp.

256 Zyklen sollten eigentlich reichen. Wenn man längere Interrupts 
benutzen möchte kann man diese im Interrupt wieder freigeben.

> Für PWM >8Bit habe ich mir überlegt, den Timer T1 zu benutzen. Man hat
> dann 2 Interrupthandler, OCR1A für Bit 0..7 und OCR1B für die höheren
> Bits.
> Ist zwar mehr Code, aber man kann bequem die Startzeiten getrennt
> einstellen und muß beim Zyklenzählen nicht auf Gleichheit achten.

Ein 16bit Timer macht das ganze natürlich viel komfortabler. Manche 
kleinen Avrs haben aber keine.

Den Code kann man natürlich noch ein wenig auf Geschwindigkeit 
optimieren. Insgesamt gewinnt man aber damit nur wenig: Die 
CPU-Belastung liegt je nach Auslösung bei wenigen Prozent.

Peter Dannegger schrieb:
> Das Sync wird an 2 Stellen aufgerufen, aber nach exakt der gleichen
> Zyklenzahl.

Fast. Bei bam_step ist es ein Takt mehr. Man muss aber nicht zwingend 
darauf achten, dass die Aufrufe zur gleichen Zeit erfolgen. Solange die 
CYCLES_TO_SYNC Definition richtig eingestellt ist, wird beim früheren 
Aufruf entsprechend länger verzögert. Die Definition muss dann die 
maximalen Takte bis zum Aufruf enthalten.

: Bearbeitet durch User
von der alte Hanns (Gast)


Lesenswert?

an Sam
In Ihrem Programm sehe ich als Zeitbasis
> TIMER0_OVF_vect:
, kein CTC. Wie bekommen Sie Danneggers ursprünglichen Fehler in Griff, 
dass die größte Zeitscheibe ein Takt zu lang ist?

an Peter Dannegger
>> meckerte, dass '.org' in einem macro nicht zulässig sei.
> Also beim alten AVR-Studio 4.18 mit Assembler2 geht es.
Wie bringe ich dem 4.18 bei, sich die bookmarks (F2) zu merken?

von der alte Hanns (Gast)


Lesenswert?

an Sam
Die Frage hat sich erledigt, ich war noch zu sehr im Hardware-Denken 
verhaftet.

von Peter D. (peda)


Lesenswert?


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.