Forum: Mikrocontroller und Digitale Elektronik IRSND mit 1MHz


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von flux (Gast)


Angehängte Dateien:
  • IST (588 Bytes, 111 Downloads)
  • SOLL (588 Bytes, 111 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich baue gerade einen IR-Transmitter mit einem ATmega328P auf.
Dieser soll natürlich möglichst stromsparend arbeiten, da er mit 
Batterien betrieben wird.
Nun habe ich es bereits geschafft, einen Sleep-Modus zu integrieren, der 
auch ziemlich gut wirkt (nur 0.11µA Verbrauch).
Während des Sendens ist der Verbrauch allerdings mit 2mA recht hoch.
Ich hatte deswegen auch schon den 128kHz Oszillator aktiviert, was zu 
einer deutlichen Verbesserung geführt hat. Leider kommt IRSND nicht 
damit klar.
Schuld daran ist die Berechnung für die 38kHz-Modulation:
128000/38000/2-1=0.6 -> 0
Nun habe ich dann 1MHz wieder aktiviert.
Jetzt passt alles und alle Timer können entsprechend eingestellt werden.
Nur: die Impulslängen stimmen irgendwie nicht.
So müsste es aussehen (von fertiger NEC-Fernbedienung):
siehe SOLL
Und so sieht es mit 1MHz aus:
siehe IST

Mit 8MHz funktioniert es jedoch einwandfrei und die Impulslängen 
stimmen.
Ich nutze einen 10kHz-Interrupt für irsnd_ISR() und habe das auch 
entsprechend eingestellt.
1
  /* init IRSND timer */
2
  TCCR1B = (1 << WGM12) | (1 << CS10);
3
  OCR1A = (F_CPU / F_INTERRUPTS) - 1;
4
  TIMSK1 = (1 << OCIE1A);

von Klaus R. (klaus2)


Bewertung
0 lesenswert
nicht lesenswert
Das hält doch trotzdem ewig...zumal die IR Led ein vielfaches zieht! 
Wozu also der überflüssige Aufwand?

Klaus.

von flux (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> Das hält doch trotzdem ewig...zumal die IR Led ein vielfaches
> zieht!
> Wozu also der überflüssige Aufwand?
>
> Klaus.

Die IR-LED zieht natürlich mehr, aber eben nur sehr kurz und 
impulsweise.
Und außerdem wüsste ich gerne auch, woran das liegt. Weil ich kann 
eigentlich nichts im IRSND-Code entdecken, das das verursachen könnte.

von Klaus R. (klaus2)


Bewertung
0 lesenswert
nicht lesenswert
...ach du meinst irsnd zieht immer 2mA auch im sleep oder wie? Das kann 
nicht sein, nutze ich mit 5uA. Vermute eher dein uc schläft nicht 
sauber...

Klaus.

von Joachim B. (jar)


Bewertung
0 lesenswert
nicht lesenswert
flux schrieb:
> Nun habe ich dann 1MHz wieder aktiviert.
> Jetzt passt alles und alle Timer können entsprechend eingestellt werden.
> Nur: die Impulslängen stimmen irgendwie nicht.
> So müsste es aussehen (von fertiger NEC-Fernbedienung):
> siehe SOLL
> Und so sieht es mit 1MHz aus:
> siehe IST

frage den Autor: frank (ukw) Moderator hier per mail PN an
https://www.mikrocontroller.net/articles/IRMP

: Bearbeitet durch User
von c-hater (Gast)


Bewertung
0 lesenswert
nicht lesenswert
flux schrieb:

> Und außerdem wüsste ich gerne auch, woran das liegt. Weil ich kann
> eigentlich nichts im IRSND-Code entdecken, das das verursachen könnte.

Es gibt zwei Möglichkeiten: der Timer gibt's nicht her oder der Code ist 
schlicht zu langsam. Ich tippe stark auf letzteres.

Überlege doch mal: wenn der Systemtakt 128kHz ist und die ISR mit einer 
Interruptrate von 10kHz ausgeführt wird, bleiben für jede ISR nur exakt 
12,8 Takte. Das reicht für einen minimalen Interrupt-Rahmen (8 Takte) 
zum Sichern und Wiederherstellen eines einzigen Registers (4 Takte). Es 
reicht schon nicht mehr dazu, das Statusregister zu sichern und 
wiederherzustellen und Luft für irgendeinen Nutzcode bleibt natürlich 
gar keine...

Bei 1MHz sieht das schon deutlich besser aus, da hast du dann 100 Takte 
pro ISR. Aber: C ist tierisch ineffizient in ISRs, es würde mich kein 
bissel wundern, wenn auch diese 100 Takte nicht genügen für den Code von 
irsnd. Letzte Sicherheit liefert das Assemblerlisting der ISR, da kannst 
du die benötigten Takte zählen. Wenn es mehr als 97 sind, kann die Sache 
nicht funktionieren.

Asm rules! Damit kann man ganz sicher einen universellen IR-Sender bei 
1Mhz realisieren. Wenn man nur einen ganz speziellen umsetzen möchte, 
kann man mit dem Takt auch noch deutlich weiter runtergehen, muss ihn 
dann aber möglichst "passend" wählen, idealerweise ein ganzzahliges 
Vielfaches sowohl der Modulationsfrequenz als auch der Trägerfrequenz.

von flux (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Moment...
Mir ist gerade aufgefallen, dass SOLL und IST gleich sind.
Das liegt daran, dass ich den gerade auf 8MHz laufen habe.
Ich liefere gleich einmal richtige Ergebnisse.

von flux (Gast)


Angehängte Dateien:
  • IST (655 Bytes, 105 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Gestern war die Abweichung irgendwie größer, trotzdem hier einmal mit 
1MHz. Gestern hatte ich z.B. beim ersten HIGH noch 12000. Jetzt mit 9500 
wird es zwar manchmal erkannt, aber doch recht unzuverlässig.

Es stimmt aber tatsächlich, dass es daran liegen kann, dass die Zeit für 
den µC nicht ausreicht, um die ISR ordentlich auszuführen. Aber dann 
dürften doch gar keine Ergebnisse oder zumindest nicht so sinnvolle nur 
ein wenig verlängerte Ergebnisse herauskommen, oder?

von flux (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Zum Stromverbrauch noch:
ich habe jetzt noch einmal nachgemessen. Irgendwie habe ich es heute 
nicht mit Zahlen.
FREQ: Active/Sleep
1MHz: 0.5mA/12µA
8MHz: 2mA/20µA
Irgendwie hatte ich den Sleepverbrauch deutlich geringer in Erinnerung. 
Aber ich denke, dass da die Selbstentladung der Batterien vermutlich 
höher ist.
Dann werde ich nun einfach 8MHz nehmen und den höheren Stromverbrauch in 
Kauf nehmen.

von flux (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich weiß jetzt (glaube ich), warum es gestern schlimmer war.
Da habe ich nicht die Option -flto (wie im Wiki empfohlen) genutzt.
Das legt nahe, dass bei 1MHz die ISR tatsächlich zu oft aufgerufen wird 
und deswegen die Impulse nicht ordentlich erzeugen kann.
Es bleibt jetzt dann wohl bei den 8MHz, danke euch.

von Frank M. (ukw) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
flux schrieb:
> Da habe ich nicht die Option -flto (wie im Wiki empfohlen) genutzt.

Ja, diese Option optimiert unter anderem den externen Funktionsaufruf in 
der ISR weg, so dass da nicht noch einmal alle Register gesichert werden 
müssen.

> Das legt nahe, dass bei 1MHz die ISR tatsächlich zu oft aufgerufen wird

Ja, dem ist so.

> und deswegen die Impulse nicht ordentlich erzeugen kann.

Deshalb steht im IRMP-Artikel auch:

  "der Prozessor sollte also zumindest mit 8 MHz laufen."

Leider wurde von mir diese Bemerkung nicht in den IRSND-Artikel mit 
übernommen, als die Dokumentation wegen ihrer Länge auf zwei Artikel 
(IRMP und IRSND) aufgeteilt wurde.

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]
  • [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.