Hallo Leute,
ich bin gerade an einem Projekt, bei dem ich mit einem Atmega16 eine
Steuerung für ein LED-Board aufbaue.
Dabei ist es schon möglich über ein Menu eine entsprechende anzahl von
LED Feldern anzusteuern, diese werden bisher für eine entsprechende
Zeit, welche der Benutzer vorher über das Menu einstellt, eingeschalten.
Die entsprechende Zeit läuft als Countdown ab und wird auf dem Display
angezeigt.
Das ist der IST-Stand.
Ich möchte das Projekt gerne insofern erweitern, das die entsprechenden
Felder in der Helligkeit durch eine PWM gedimmt werden können. So das
man im Menu einen Helligkeitswert zwischen 0 und 100 auswählt und dann
die entsprechende LED mit z.B 50% leuchtet und aber trotzdem der
Countdown auf dem Display abläuft.
Nun meine Frage an euch.
Hat jemand in der Richtung schon einmal sowas gemacht oder kann mir
einen Tipp geben, wie die parallele Abarbeitung (PWM und Display)
handeln könnte!?
Ich freue mich über euer Know How.
Gruß Mik-X
Software-PWM in einen Interrupt quetschen.
Optimal wäre natürlich Assembler für den Interrupt.
Wenn der Interrupt dann nicht die ganze Prozessorzeit blockiert, wäre
auch noch Platz für eine MAIN :)
>Optimal wäre natürlich Assembler für den Interrupt.
Lächerlich. Ein schlechtes Assemblerprogramm
ist auch nicht schneller als das was der C Compiler
mit Optimierung rausholt. Wenn man ein bisschen
was drauf hat ist der Unterschied vieleicht 5%.
> Hat jemand in der Richtung schon einmal sowas gemacht oder kann mir> einen Tipp geben, wie die parallele Abarbeitung (PWM und Display)> handeln könnte!?
Sicher.
Ob per Interrupt oder beide nacheinander in der Hauptschleife ist
letztlich egal, so oder so muß der Prozessor die nötigen Instruktionen
abarbeiten, aber mehere Ereignisse quasi gleichzeitg zu beachten und zu
bearbeiten ist Standard bei der Microcontrollerprogrammierung, man macht
es eben schnell zeitverschachtelt.
Wenn jemand auf die Idee kommt, in solchen Jobs längere
warte-Zeitschleifen durchzuziehen oder auf Ereignisse zu warten, schon
verloren, längere Tätigkeiten müssen eben in kürzere Einzelaktionen
unterteilt werden.
holger schrieb:> Ein schlechtes Assemblerprogramm> ist auch nicht schneller als das was der C Compiler> mit Optimierung rausholt. Wenn man ein bisschen> was drauf hat ist der Unterschied vieleicht 5%.
Träum weiter.
holger schrieb:> Lächerlich. Ein schlechtes Assemblerprogramm> ist auch nicht schneller als das was der C Compiler> mit Optimierung rausholt.
Naja, normalerweise sind C-Compiler schon sehr gut, nur im Falle einer
ISR muss der Compiler, will er denn standardkonform sein, beispielsweise
alle Register sichern, da er nicht wissen kann, welche denn in der ISR
benötigt werden, etc.
Aber ich glaube nicht, dass es dem Vorposter um die Geschwindigkeit
ging, denn die ist bei der Anwendung egal, es geht ja nur um eine LED.
Der weitere Vorteil von Assembler ist natürlich dass es deutlich
einfacher geht.
Wie ich das im Anfangstext deute sind es scheinbar mehrere LED's.
Und Holger:
Assembler ziehe ich bei zeitkritischen Programmteilen C vor.
Wenn man dann dem C-Compiler noch beigebracht bekommt, daß er ein paar
Register nicht benutzt, spart man Push-REG/SFR-Pop.
>holger schrieb:>> Ein schlechtes Assemblerprogramm>> ist auch nicht schneller als das was der C Compiler>> mit Optimierung rausholt. Wenn man ein bisschen>> was drauf hat ist der Unterschied vieleicht 5%.>>Träum weiter.
Naja, wenn du meinst. Ich hab da so meine Erfahrungen.
>Naja, normalerweise sind C-Compiler schon sehr gut, nur im Falle einer>ISR muss der Compiler, will er denn standardkonform sein, beispielsweise>alle Register sichern, da er nicht wissen kann, welche denn in der ISR>benötigt werden, etc.
Nö, muss er nicht. Der weiss durchaus welche Register benutzt
werden. Wenn man so dumm ist eine Funktion in einem Interrupt
aufzurufen dann muss er natürlich alle Register sichern.
Das ist aber nicht immer so. Bei den schlappen ATMega vieleicht;)
Das gilt dann aber nicht konsequent für alle C Compiler.
Es kommt auf den Prozessor an den du benutzt. Ein Cortex M3
sichert seine Register in Hardware wenn ein Interrupt
aufgerufen wird. Der Compiler hat da überhaupt nichts mit zu tun.
Alles Ansichtssache.
Holger:
(Cortex-M3)
Stacking schön und gut, sind (8x 32bit-Speicherzyklen) x 2.
Der Fiq beim ARM7 war da schon mit seinen eigenen Shadow-Registern
schneller.
holger schrieb:> Nö, muss er nicht. Der weiss durchaus welche Register benutzt> werden. Wenn man so dumm ist eine Funktion in einem Interrupt> aufzurufen dann muss er natürlich alle Register sichern.> Das ist aber nicht immer so. Bei den schlappen ATMega vieleicht;)
Naja, es ist in C sehr schwierig festzustellen, ob Du eine Funktion
aufrufst oder nicht. Da es sehr viele Möglichkeiten gibt, das zu tun.
Eine der populären Möglichkeiten ist beispielsweise den Rücksprungzeiger
auf dem Stack zu überschreiben. Das ist für den Compiler sehr schwierig
zu detektieren.
ein schrieb:> holger schrieb:>> Ein schlechtes Assemblerprogramm>> ist auch nicht schneller als das was der C Compiler>> mit Optimierung rausholt. Wenn man ein bisschen>> was drauf hat ist der Unterschied vieleicht 5%.>> Träum weiter.#
Dann muss ich dir leider mitteilen, dass du erst mal C lernen solltest,
ehe du einem Anfänger nahelegst, dass er doch seine ISR aus
Geschwindigkeitsgründen lieber in Assembler schreiben soll.
Es gibt diese Fälle, wo es auf jeden Taktzyklus ankommt. Natürlich gibt
es sie. Wenn man ein PAL Signal erzeugen muss, dann ist jeder Takt
wichtig. Aber ansonsten spielt es keine Rolle, ob der Compiler mal da
und dort den einen oder anderen Takt liegen lässt. Mehr als 5 bis 10%
sind es so gut wie nie. Eher weniger als 5%.
Wenn es dann doch mal exzessiv mehr ist, dann liegt es meistens daran
(Erfahrung hier aus dem Forum), dass der Programmierer weniger drauf
hatte, als er ursprünglich dachte.
Hab' sowas ähnliches vor 3 Jahren mal auf dem Mega32 für 16
Lichtstromkreise eines Partykellers gemacht. Das sollte dann noch um
eine Lichtshow erweitert werden, dazu kam es aber nicht mehr. Es müsste
also auch in den Mega16 passen.
...
Hy Leute,
danke erstmal für die mehr oder wenig hilfreichen Kommentare.
Die angehängten Dateien sind nett gemeint, aber ich schreibe in C.
Trotzdem Respekt, das du da nen überblick drinne behältst, da hätte man
ja auch unterprogramme in die Main einbinden können.
Nochmal zu meinem Problem:
Nachdem alle Parameter:
- Anzahl der Anzusteuernden Ports (LEDs)
- Zeit, z.B. 10sek.
eingegeben sind, wird derzeit der/die entsprechenden PIN/s high und es
wird danach in die Routine "Countdown" gesprungen, welche dann die Zeit
runter zählt und auf dem Display ausgibt. Hier ein kleiner Auszug davon:
if (LED_Wert_1 == 1)
{
PORTD = 0x01;
fertig_1=Countdown(Zeit_Wert_1); break;
}
else if (LED_Wert_1 == 2)
{
PORTD = 0x03;
fertig_1=Countdown(Zeit_Wert_1); break;
Nachdem die Zeit abgelaufen ist und die Countdown beendet ist, wird
diese verlassen und der/die PIN/s zurückgesetzt.
Meine Frage nun wie kann ich die PWM eventuell in die nachfolgende
Countdown integrieren!? Kann man das in die Countdown mit rein machen?
char Countdown(int Zeit_Wert_2)
{
char str_8[1];
char str_9[2];
char Ende =0;
char Minuten_1 = Zeit_Wert_2/60;
char Minuten = Minuten_1;
char Sekunden_1 = Zeit_Wert_2-(Minuten*60);
char Sekunden = Sekunden_1;
char Tastenspeicher_8 = PINB;
while((Tastenspeicher_8 != 0x6F) && (Ende == 0))
{
Tastenspeicher_8 = PINB;
Sekunden = Sekunden-1;
if((Sekunden == 255) && (Minuten==0))
{
Sekunden=0;
Minuten =0;
Ende = 1;
PORTD=0x00;
sprintf(str_8,"%01d",Minuten); lcd_set_cursor (2, 0); lcd_write (str_8);
sprintf(str_9,"%02d",Sekunden); lcd_set_cursor (2, 5); lcd_write
(str_9);
_delay_ms(1000);
}
else if((Sekunden == 255) && (Minuten >=0))
{
Sekunden = 59;
Minuten = Minuten-1;
sprintf(str_8,"%01d",Minuten); lcd_set_cursor (2, 0); lcd_write (str_8);
sprintf(str_9,"%02d",Sekunden); lcd_set_cursor (2, 5); lcd_write
(str_9);
_delay_ms(1000);
}
else
{
Sekunden = Sekunden;
Minuten = Minuten;
sprintf(str_8,"%01d",Minuten); lcd_set_cursor (2, 0); lcd_write (str_8);
sprintf(str_9,"%02d",Sekunden); lcd_set_cursor (2, 5); lcd_write
(str_9);
_delay_ms(1000);
}
}
PORTD=0x00;
return Ende;
}
Ich freue mich auf eure Meinungen.
Mik-X schrieb:> Die angehängten Dateien sind nett gemeint, aber ich schreibe in C.
Die Hoffnung dabei war wohl, dass du beim Lesen, quasi als passiven
Wortschatz, über multilinguale Kompetenz verfügst ;-)
Mik-X schrieb:> _delay_ms(1000);
Wenn du deinen Prozessor im Hauptprogramm so blockierst, bleibt für PWM
eine Interruptsteuerung (was sowieso sinnvoll wäre) oder, falls die
Anzahl der Hardware-PWM-Kanäle vom ATmega16 reicht noch einfacher, die
direkt Steuerung durch die Hardware.
Wieviel LEDs mußt du denn ggf. steuern?
> _delay_ms(1000);> Ich freue mich auf eure Meinungen.
Es wurde bereits gesagt, daß Delay-Schleifen der vollkommen falsche
Ansatz sind, wenn man mehrere Jobs quasi gleichzeitg nebeneinander
erledigen will.
Der vollkommen falsche Ansatz.
holger schrieb:> Lächerlich. Ein schlechtes Assemblerprogramm> ist auch nicht schneller als das was der C Compiler> mit Optimierung rausholt. Wenn man ein bisschen> was drauf hat ist der Unterschied vieleicht 5%.
Und wieder ein sinnloser Kommentar. Daumen hoch!
>> _delay_ms(1000);>> Ich freue mich auf eure Meinungen.>Der vollkommen falsche Ansatz.
In der Tat. Für sowas nimmt einen Timer und Multitasking. Dann
hat man mehr als genug Rechenleistung für Soft-PWM.
Mik-X
_delay_ms(1000)
ist eine reine Softwareschleife in der der Prozessor verharrt.
ala for(int t=0;t<.....;t++){nop;.....}
Es gibt dann mehrere Möglichkeiten PWM auf die Art und Weise dann doch
noch nebenläufig zu betreiben:
1. man benutzt die 2 bis 6 PWM-Kanäle die per Hardware realisiert sind
oder
2. man unterbricht den Prozessor zyklisch und macht es mit ein paar
if-Befehlen (oder anders) auf SoftPWM-Basis.
Als Kommunikation zwischen ISR und Hauptprogramm bietet sich dann ein
Satz volatile-Variablen an.
SoftPWM heißt, ein paar (>1000 je nach Auflösung) mal pro Sekunde in
eine, durch einen Timer-Vergleich/Überlauf ausgelöste,
Unterbrechungsroutine anspringen,
einen globalen Zähler in der ISR (vornehmlich static) hochzählen,
mit den vorgegebenen LED-Einschalt-Zähler-Vergleichsvariablen
(volatile/zugreifbar durch Main) vergleichen und An- oder Ausschalten.
oder
Ein Bitfeld (16 bit und mehr) pro LED im Speicher halten, welches genau
bestimmt, wann eine LED anzusein hat und eine ISR die diese Bitfelder
Bit für Bit durch einen Zähler bestimmt absucht und das Bit an den Port
weiterleitet.
Mik-X schrieb:> danke erstmal für die mehr oder wenig hilfreichen Kommentare.>> Die angehängten Dateien sind nett gemeint, aber ich schreibe in C.
Hmmm, Du versuchst es...
Mit Warteschleifen (Delay) kommst Du da nicht weit.
Aber tröste Dich, mit C komme ich da auch nicht weit. ;-)
>> Trotzdem Respekt, das du da nen überblick drinne behältst,
Warum sollte ich da die Übersicht verlieren? Ist doch alles gut lesbar
und verständlich kommentiert. Und halbwegs strukturiert ist es auch.
Allerdings denke ich nicht in Schleifen, sondern in Zuständen. Anders
ist Multitasking nicht möglich. Das geht aber auch in C, ich kann es
allerdings nur in ASM. Ist aber nicht weiter schlimm, der AVR kann auch
kein C, somit gibt es weniger Missverständnisse zwischen mir und dem
AVR. ;-)
> da hätte man> ja auch unterprogramme in die Main einbinden können.
Muss ich das jetzt verstehen?
Die Mainloop enthält bedingte Sprünge, also Verzweigungen. Diese sind
ganz bewusst nicht als Unterprogramm (Rcall, Call) geschrieben sondern
als direkter Sprung (Rjmp, Jmp), damit nach der Rückkehr zur Mainloop
immer die obersten Jobs bevorzugt werden. Dies bewirkt eine Art
Priorität beim Abarbeiten der Jobs. Erst wenn keine unerledigten Jobs
mehr da sind, fällt die CPU in den Sleep, wo sie der nächste Interrupt
wieder weckt.
Willi schrieb:> Mik-X schrieb:>> Die angehängten Dateien sind nett gemeint, aber ich schreibe in C.> Die Hoffnung dabei war wohl, dass du beim Lesen, quasi als passiven> Wortschatz, über multilinguale Kompetenz verfügst ;-)
So in etwa. Und dabei muss man nichtmal ASM perfekt beherrschen, denn
die Kommentare ersetzen einen PAP. Man erfährt also schon anhand der
Kommentare die Struktur des Programms.
...
auch in C ist delay das blödeste was man anstellen kann wenn mann mehere
Prozesse quasiparallel bearbeiten will.
Alles was zeitbasiert ist gehört in eine Timer ISR welche mit dem
Timertakt des Grösten gemeinsamen Teilers aller benötigten Zeitbasen
läuft.
Diese werden dort je Kanal in static-integer(char)-sw-zählern
incrementiert, verglichen, zurückgesetzt und die ports entsprechend
gesetzt.
Bei PWM bietet sich an beim Schwellwert in% auszuschalten bei 100
zurückzusetzen auf 0 und wiedereinzuschalten.
Hat man mehere PWM Kanäle braucht man nur einen Zähler welchen man
durchlaufen lässt und kann für jeden Kanal einen Einschaltwert und einen
Ausschaltwert verwenden. So lassen sich in den Lastkreisen die
Schaltspikes klein halten.
Ob man das in C oder Assembler macht spielt eine untergeordnete Rolle.
Wichtig ist als ersters wird alles erledigt was 100% syncron sein muss
und immer zu erledigen ist. Bedingte Ausführungen erfolgen zum Schluß.
Beim 8Bit ATARI gab es eine VideoISR. An diese konnte eine Verlängerunng
angelinkt werden in der der User seine regelmäßigen Sachen
miterledigenlassen konnte. Normal zeigt der Vector auf ein Reti verbiegt
man ihn erfolgt der reti aus der Verlängerung.
Namaste
Winfried J. schrieb:> Beim 8Bit ATARI gab es eine VideoISR. An diese konnte eine Verlängerunng> angelinkt werden in der der User seine regelmäßigen Sachen> miterledigenlassen konnte.
Die gab's beim 8-Bit-Commodore auch. Und sie wurde auch benutzt.
...
Was mir geade noch einfällt die VideoISR nach jedem Vblank hat gleich
noch sämmtliche Schattenregister verwaltet.
Diese stellten ein Userinterinterface dar um Hardwarregister
anzusprechen welche im Bereich des Rom's addressiert sind oder in das
Speichermanagment oder Videomanagment eingriffen.
So sichert man das die Hardware und SW nicht wegen fehlerhaften Timings
abschmierte. Gleichzeitig konnte der User in aller Ruhe die schreibenden
Schattenregister bearbeiten und die lesenden auslesen. Während das BS
(die VideoISR) sich um die richtige Abfolge und das korrekte Timing beim
schreiben und lesen der HW register und der Speicherverwaltung kümmerte.
Sie stellte auch die Systemzeit welche in der Zeropage an der Adresse
0x12-0x14 jederzeit auslesbar war.
Namaste
Diese Funktionen wie "_delay_ms(1000)" gehören verboten.
Nur Ärger damit und keinerlei sinnvollen Nutzen.
1. stimmt die angegebene Zeit nie.
Schließlich werden ja Interrupts nicht rausgerechnet.
2. Ist der µC für andere sinnvolle Funktionen blockiert
Alternative :
HW Timer nutzen.
1. Macro erstellen das die 1000msec in die systembedingten Timertakte
umrechnet. (Abhängik der Timer configuration und SystemTakt)
2. Timer mit diesem Wert starten und Interrupt einschalten.
3. In der Interruptroutine die nächste Anweisung antriggern aber NICHT
im Interrupt ausführen. zb über ein Flag
Keine Ahnung, welche µC ihr hier für PWM so benutzt. Ich hätte ja
geglaubt, ein integriertes PWM-Peripheral sei heute Standard.
Selbst in meinen 15 Jahre alten 8051-Derivaten SAB80C517A habe ich eine
16-bit-PWM-Unit. Sie arbeitet, einmal initialisiert, völlig losgelöst
von der CPU. Nur bei Änderungen muß man noch mal z.B. ein
Compare-Register beschreiben. Damit kann man also dann alles andere
bedienen, ohne die PWM-Unit weiter zu berücksichtigen.
> Keine Ahnung, welche µC ihr hier für PWM so benutzt. Ich hätte ja> geglaubt, ein integriertes PWM-Peripheral sei heute Standard.
Joo ich wüsste auf Anhieb keinen µC ohne , bis auf minimalste Version
wie vielleciht die kleinen Tiny's.
ABER diese PWM zu nutzen bedeutet ja Datenblätter zu lesen. Timer zu
programmieren.
Und auf einmal vielleicht sogar zu denken.
Für viele ist das eindeutig zu viel Anspruch.
Guten Abend,
mir genügen die bei Atmega16 vorhandenn 4 PWM Ausgänge nicht, ich
benötige 8 PWM Kanäle.
Die Wartezeiten mit der Delayfunktion sind unkritisch. Jedoch
hinderlich. Werde Sie daher gegen eine Timerfunktion ersetzen.
Werde die Hinweise und Ratschläge beherzigen und ein wenig
experimentieren.
>Diese Funktionen wie "_delay_ms(1000)" gehören verboten.
Genau. Es sei denn 'delay' wird in einem RTOS so verwendet, dass es
nicht den Prozessor (mit bekloppten Schleifenbefehlen) blockiert.
> Ein Cortex M3 sichert seine Register in Hardware wenn ein Interrupt> aufgerufen wird.
Auch CM3 muss die Register auf den Stack legen, was Takte kostet.
Register-File wäre da viel schneller, aber das hat der CM3 nicht.
MCUA schrieb:> Auch CM3 muss die Register auf den Stack legen, was Takte kostet.> Register-File wäre da viel schneller, aber das hat der CM3 nicht.
Wenn eine Anwendung diese paar Takte benötigt ist sowieso was
Grundlegendes falsch gelaufen.
Entweder ist das Software Design sowas von Müll,...
Oder der µC ist vollkommen falsch ausgewählt worden.
Einen Wohnungsumzug macht man ja auch nicht mit einem Smart weil der
gerade da ist, sondern mit was größerem.
>Wenn eine Anwendung diese paar Takte benötigt ist sowieso was>Grundlegendes falsch gelaufen.
Von wegen.
Einige uCs brauchen dafür (um in den INT zu schalten) 4 Takte andere
100...
Eigentlich böte sich an die Register allesamt mit einem
Schattenregisterstapel zu versehen.
Jede INT schiebt dann den Registersatz komplett um eine Position nach
hinten und stellt einen neuen leeren Registersatzbereit um dann zur
Int_adresse zu springen.
Bei reti sollte dann alle aktuellen register mit den letzen Eintrag der
Schattenregiser beschrieben werden.
Das ist sicher in einem Takt zu erledigen.
Alternativ ließen sich alle Register durch einen Interuptcounter aus
einem Registerarray wählen.
Damit wären gar kein Registerkopieren mehr nötig.
Aber ich wette das wird längst so gemacht.
Namaste
> Damit wären gar kein registerkopieren mehr nötig.
Doch.
Wen du nämlich 2 geschachtelte Interrupts zulässt,
zulassen musst weil die Anwendung das so erfordert.
Das mit den zweiten Registersatz hatte schon der
ehrwürdige Z80.
Und auf universelleren Maschinen mit genug Registern
hat man einfach in der Interrupt-Routine andere
Register verwendet als im normalen Programm, schon
muß man die nicht mehr retten.
> ABER diese PWM zu nutzen bedeutet ja Datenblätter zu lesen.> Timer zu programmieren.
Oh Ralph, DIESE PWM zu verwenden bedeute vor allem,
alle <x> LED leider nur gleichhell leuchten lassen zu können,
weil man nämlich für <x> LED eigentlich <x> solcher
Hardware-PWMs bräuchte.
>Eigentlich böte sich an die Register allesamt mit einem>Schattenregisterstapel zu versehen.>Jede INT schiebt dann den Registersatz komplett um eine Position nach>hinten und stellt einen neuen leeren Registersatzbereit um dann zur>Int_adresse zu springen.>Bei reti sollte dann alle aktuellen register mit den letzen Eintrag der>Schattenregiser beschrieben werden.>Das ist sicher in einem Takt zu erledigen.
Kein Mensch macht einen Schattenregisterstapel!
Entweder man benutzt Schattenregister oder einen Stack.
Schattenregister kommen einem RegisterFile gleich, wobei die Frage immer
ist, wie viele Registersätze dort aufgenommen werden können. (1...?)
(Sparc-Prozessoren hatten sehr viele davon) Ein Registersatz-wechsel
geht sehr schnell, typ 1..2 Takte (im Vergleich zu zig Takten bei
verschicken auf den Stack).
Reicht das RegisterFile (mit >=1 Registersätzen) nicht aus, muss man
halt auf den Stack sichern, aber das dauert.
>Aber ich wette das wird längst so gemacht.
wie gesagt, total falsch.
MCUA schrieb:>>Wenn eine Anwendung diese paar Takte benötigt ist sowieso was>>Grundlegendes falsch gelaufen.> Von wegen.> Einige uCs brauchen dafür (um in den INT zu schalten) 4 Takte andere> 100...
Und wenn die IRQ's gerade gesperrt sind wegen..... dauert es noch
länger.
Und genau deshalb ist ein Design das auf Takte rechnen muss damit es
funktioniert grundsätzlcih Müll.
Soviel Luft muss bei der Auslegung der Hardware / Software mit
einkalkuliert werden.
Sonst wird das NIE ein stabiles System.
>Und wenn die IRQ's gerade gesperrt sind wegen..... dauert es noch>länger.>Und genau deshalb ist ein Design das auf Takte rechnen muss damit es>funktioniert grundsätzlcih Müll.
Schonmal was von Echtzeit-Anwendung gehört?
MCUA schrieb:> Schonmal was von Echtzeit-Anwendung gehört?
Ja klar.
Aber 1. geht es hier nicht um ein Real Time OS
Und 2. Wird ein Real Time OS niemals so aufegabut das es Takte zählen
muss um zu funktionieren. ==> Damit wäre es kein Real Time Os mehr.
Ralph schrieb:> Aber 1. geht es hier nicht um ein Real Time OS
Richtig!
Es geht lediglich darum, ob ein ATMega16 (das ist ein 8-Bit-AVR, kein
32-Bit Monster) neben der Software-PWM noch ein LCD ansteuern kann.
...
@ Hannes Lux (hannes)
>Es geht lediglich darum, ob ein ATMega16 (das ist ein 8-Bit-AVR, kein>32-Bit Monster) neben der Software-PWM noch ein LCD ansteuern kann.
Geht nicht ohne Hyperflux Coprozessor und Flüssigkühlung!
;-)
Aber 1. geht es hier nicht um ein Real Time OS
Doch. auch hier ist es Realtime. Denn die PWM ist Realtime-App (wen auch
recht langsam).
Aber, es gibt HardRealTime-Anwendungen, wo's natürlich auf Takte
ankommt, und da is nix mit IRQs sperren!
Manche uC's können das erfüllen, manche nicht.
(zB waren die ersten MIPS- u. PowerPC-uCs diesbezügl katastrophal)
@MCUA
Ruhig Blut du kochst ja schon vor Aufregung schalt mal den Takt zurück,
immer nur auf 160%durch die leere Main hasten erzeugt nur Verlustwärme.
der klug µC würde sich schlafen legen und auf den nächsten IRQ warten.
;-)
>Ruhig Blut du Kochst ja schon vor Aufregung ...
Deswegen? Nein.
>der klug µC würde sich schlafen legen und auf dn nächsten IRQ warten.
wenn das mal nicht zu lange dauert
MCUA schrieb:>>der klug µC würde sich schlafen legen und auf dn nächsten IRQ warten.> wenn das mal nicht zu lange dauert
Das ist eine PWM für LEDs, wir sprechen von Frequenzen im Bereich von
vielleicht 100 Hz. Das bedeutet, Du brachst vielleicht ein paar wenige
ISR-Aufrufe pro Millisekunde. Das ist nicht zeitkritisch, der µC braucht
nur (maximal) ein paar dutzend Taktzyklen um aufzuwachen.
Da könnte man den sogar mit internem 1MHz RC-Generator schlafen legen.
Aber für die Uhr empfielt sich natürlich ein Quartz. Wenn er außer der
Uhr und der PWM nichts zu tun hat, läuft er in der Tat mehr leer als er
arbeitet.
Namaste