Hallo, folgende Frage. Ich plane einen ATmega mit 16MHz laufen zu lassen. Aller 10 ms wird ein Interrupt durch einen Nulldurchgang ausgelöst und durch einen Timer ein Phasenanschnitt erzeugt. Danach soll noch ein Baustein via I2C ausgelesen werden (bzw. in der Zeit in der der Timer den Phasenanschnitt macht) und ein Wert auf ein OLED geschrieben werden. Denke das ist Zeitlich auch alles kein Problem. Sollte das Display in den 10ms noch nicht fertig beschrieben sein, dann ist es nicht schlimm wenn es länger dauert zum beschreiben, da ja Phasenanschnitt und I2C auslesen beim Interrupt Nulldurchgang durchgeführt werden. Es wird auch nicht sinnvoll sein aller 10 ms etwas neues auf ein Display zu schreiben! Nun aber die eigentliche Frage. Neben der ganzen Sache soll mit einer maximalen Frequenz von 4 kHz ein Sensor eingelesen werden (Drehzahl). Das soll auch als Interrupt passieren und nur eine Variable hochzählen, welche beim Nulldurchgang ausgewertet wird und genullt wird. Kann es passieren, dass ich mich durch diesen Interrupt meine MCU ausbremse oder sind 4 kHz parallel gar kein Problem? Grüße Peter
Hallo Peter, in eine ISR macht man nur das notwendigste. So den Timer setzen und ein Signal/ Event an das Hauptprogramm senden. Dort kann man in aller Ruhe i2c bedienen und auch langsame Ausgaben machen. Eine i2c Kommunikation kann man nicht unterbrechen, also schön alles der Reihe nach - per I2C Queue.
Peter schrieb: > passieren, dass ich mich durch diesen Interrupt meine MCU ausbremse oder > sind 4 kHz parallel gar kein Problem? Kein Problem!
Peter schrieb: > Kann es passieren, dass ich mich durch diesen Interrupt meine MCU > ausbremse oder sind 4 kHz parallel gar kein Problem? Wenn du die 4kHz auf einen Zähler gibst, merkt die MCU nichtmal, dass da 4kHz vorhanden sind. Falls du allerdings mit 4kHz einen Interrupt auslösen möchtest, darfst du nicht beliebig viel Zirkus in die ISR packen.
In der ISR mit den 4 kHz wird wie gesagt nur eine Variable um eins erhöht. Den einen Baustein kann ich statt mit I2C auch mit SPI auslesen. Gibt mir das Vorteile? Der Baustein muss zwingend aller 10 ms (also beim Nulldurchgang) auslesen werden. Darum wollte ich das direkt in der ISR mit machen.
Der absolute Verbrauch an Rechenzeit ist wohl weniger ein Problem. Allerdings erhöht, bei gleicher oder höherer Priorität, der zweite Interrupt den Jitter des ersten Interrupts. Auf einer MCU mit festen Interruptprioritäten sortierst Du also am besten die externen Interruptquellen nach gewünschter Priorität. Bei MCU mit einstellbarer Interruptpriorität kannst Du das auch per Firmware machen. Die Antwort auf Deine nächste Frage liefert das Datenblatt der uns unbekannten MCU und Dein Datenblatt.
Peter schrieb: > In der ISR mit den 4 kHz wird wie gesagt nur eine Variable um eins > erhöht. > Den einen Baustein kann ich statt mit I2C auch mit SPI auslesen. Gibt > mir das Vorteile? Der Baustein muss zwingend aller 10 ms (also beim > Nulldurchgang) auslesen werden. Darum wollte ich das direkt in der ISR > mit machen. Theoretisch ja, praktisch aber wohl kaum. Wie groß ist das Datenpaket, daß du per I2C austauschst?
> In der ISR mit den 4 kHz wird wie gesagt nur eine Variable um eins erhöht.
Timer/Counter mit 'External clock source on Tn pin'?
Peter schrieb: > In der ISR mit den 4 kHz wird wie gesagt nur eine Variable um eins > erhöht. Warum brauchst du dafür einen Interrupt? Einen Wert um eins erhöhen, kann ein Zähler genauso gut.
Peter schrieb: > Es werden 16- Bit übertragen mit einem Atmega 2560 In dem Fall wäre SPI mehr als 30% schneller bei gleicher Taktrate.
Marcus H. schrieb: > Die Antwort auf Deine nächste Frage liefert das Datenblatt der uns > unbekannten MCU und Dein Datenblatt. Siehe Betreff: > Atmega durch Interrupt Ausbremsen
Christian H. schrieb: > Marcus H. schrieb: >> Die Antwort auf Deine nächste Frage liefert das Datenblatt der uns >> unbekannten MCU und Dein Datenblatt. > > Siehe Betreff: >> Atmega durch Interrupt Ausbremsen Danke, ich korrigiere: sollte Datenblatt der unbekannten MCU und Schaltplan heißen.
An dem Interruptpin ist ein Sensor angeschlossen der Ttl Signale liefert. Diese Pulse werden ausgewertet
Hab gerade das mit dem Zähler/Counter gelesen. Das heist an einen externen Pin der zu einem Counter gehört den Sensor anschließen. Unabhängig vom Programm zählt dieser einfach hoch und ich kann das Register auslesen und Nullen wann ich will?
Kannst auch beim Erreichen eines von dir bestimmten Zählerstands einen Interrupt auslösen lassen.
Dann wäre das ja die perfekte Lösung :) dem Counter ist doch bestimmt auch egal ob SPI oder I2C gerade was machen oder?
Peter schrieb: > Unabhängig vom Programm zählt dieser einfach hoch und ich kann das > Register auslesen und Nullen wann ich will? Lass den Zähler doch ganz in Ruhe vor sich hin zählen und pfusche ihm nicht dazwischen. Sonst kann es passieren, dass Pulse verloren gehen. Merke dir einfach den vorherigen Zählerstand und rechne die Differenz aus.
Heiner schrieb im Beitrag #4558264:
> noob
Sehe ich nicht so. Er ist doch lernwillig.
Heiner schrieb im Beitrag #4558315: > The D. schrieb: >> Er ist doch lernwillig. > > Hab ich irgendwo was anderes behaupted? > Tip: lesen lernen :) Tip: verständlich ausdrücken! In ganzen Sätzen schreiben. Bezug nehmen. Es versteht dich sonst keiner.
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.