LED blinken mit M16 in C

Gast #445210
Lesenswert?
• ▲
▼
Hallo!

Ich habe folgendes, mir total unverständliches Problem:

Ich möchte eine einfache Blinkfunktion mit einem AVR (ATMEGA16) 
realiseren. Die Blink zeiten sollen gleich groß sein (50/50 also) und 
über einen Timer (Timer 0) in C (GCC) gemacht werden.

So einfach sich das auch anhöhrt, es will einfach nicht hinhauen. 
Jedesmal wenn ich während der Laufzeit die Blinkfreuenz verändere, kommt 
es vor (nicht immer) dass die LED komplett aus oder komplet ein bleibt.

Ich habe zwar bei eineigen Programmteilen (zb Tasterabfrage) den 
Interrupt ausgeschaltet, nutzte aber alles nichts.

Unglaublich, seit fünf Stunden sitz ich nun bei diesem Problem, und habe 
keine Ahnung wo es fehlt! Ich hänge mein C-File an, auf dass ein anderer 
schlauer ist als ich.


Wenn jemand vielleicht eine gute Idee oder einen Lösungsvorschlag parat 
hat, wäre ich ihm sehr dankbar.

Vielen Dank und schöne Grüße

puzter philipp
#445218
Lesenswert?
• ▲
▼
Hallo Philipp

Ueberleg dir mal was passiert wenn:

takt==45
wert==50

und nun drueckt jemand die Taste "minus".

takt ist dann immer noch 45, wert aber 40, und die Bedingung

... else if (takt==wert)  //Blinken, LED ein ...

wird erst nach ueberlaufen von takt erfuellt werden.

Versuchs mal mit ... else if (takt>=wert) ...

MfG
#445219
Lesenswert?
• ▲
▼
> kommt es vor (nicht immer) dass die LED komplett aus oder
> komplet ein bleibt.

Stell dir vor, takt hat zufällig gerade den Wert 69 und
wert sei 70. Jetzt kommt das störende Glied in jedem Computer,
der Benutzer und verringert wert von 70 auf 60. takt wechselt
mit dem nächsten Overflow von 69 auf 70, ist also schon
größer als die (jetzt neue) Obergrenze von 60. Also
setzt nichts und niemand den takt zurück und der gute Timer
hat ne Menge zu tun, bis er ca. 65500 Overflows ausgelöst
hat, bis takt (durch den den Überlauf des int) endlich wieder
in den Bereich um die 60 zurückkommt.

Daher:  Nicht fordern, dass takt unbedingt exakt gleich wert
sein muss. takt kann (durch Benutzermanipulation an wert)
ganz leicht größer als wert werden.
Gast #445294
Lesenswert?
• ▲
▼
BTW: Dein Betreff ist sehr irreführend. Ein "M16" ist ein Controller von 
Renesas, der mit dem ATMega16 nichts zu tun hat. Wenn Du wirklich 
hilfreiche Hilfe haben möchtest, solltest Du Dir die Zeit nehmen und im 
Betreff auch mindestens "Mega16" schreiben. Dann weiß auch jeder was 
gemeint ist.
Gast #445454
Lesenswert?
• ▲
▼
Super! Danke! Hab es eben probiert, funkt nun tadellos! An das hatte ich 
nun wirklich nicht gedacht, aber klar, jetz nach dieser Erklärung.

Nun hauts hin!

Das mit dem Betreff tut mir leid, wusste nicht dass es etwas mit dem 
Namen M16 schon gibt. und in der eile gestern aben habe ich den MEGA16 
halt einfach mit M16 abgekürzt.

Schöne Grüße und vielen Dank!

philipp

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.