www.mikrocontroller.net

Forum: Projekte & Code Taster + LED am selben Draht (4*)


Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anbei mal das Programm dafür (ATtiny13).

Damit trotz der LED-Schwellspannung high erkannt wird, werden die Pins 
nicht digital eingelesen, sondern über den Komparator mit 1,1V 
verglichen.
Der Komparator benötigt einige Zyklen Zeit nach dem Umschalten des 
Eingangsmultiplexers.
Ein Problem war, wie sag ichs meinem Compiler, daß er diese Delays nicht 
wegoptimiert.
Der GCC ist da ja ziemlich eigensinnig:

Kurze Funktionen sollte man immer als static definieren, da sie sonst 
doppelt Code erzeugen

Delayloops müssen mindestens 7* ausgeführt werden, sonst werden sie 
entrollt.

Wegoptimieren von Delayfunktionen oder Delayloops kann man durch eine 
leere Assemblerinstruktion verhindern (es muß kein NOP drinsein).

Ich denke mal, ich hab den GCC jetzt einigermaßen im Griff.


Das Entprellen macht meine Standardfunktion (diesmal als Polling-Version 
statt Interrupt).


Peter

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und hier der Schaltplan.


Peter

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter Dannegger (peda)

>Ein Problem war, wie sag ichs meinem Compiler, daß er diese Delays nicht
>wegoptimiert.
>Der GCC ist da ja ziemlich eigensinnig:

???

Was ist mit _delay_ms() und _delay_us() aus delay.h? Damit hatte ich 
bisher keinerlei Probleme.

Man muss das Fahrrad nicht immer neu erfinden, vor allem wenn nur ein 
Achteck rauskommt. ;-)

MfG
Falk

P.S. Dass der Analogkomparator einen MUX hat wusste ich noch nicht. Den 
gibts aber nicht bei allen AVRs, oder?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:

> Was ist mit _delay_ms() und _delay_us() aus delay.h? Damit hatte ich
> bisher keinerlei Probleme.

Der MUX+Komparator brauchen nur 3-4 Zyklen zum Einschwingen, da wollte 
ich nicht ein unnötig langes delay_us nehmen. Ein CALL+RET (7 Zyklen) 
reicht aus.

Das 10ms-Delay könnte man mit der Bibliotheksfunktion machen.


> P.S. Dass der Analogkomparator einen MUX hat wusste ich noch nicht. Den
> gibts aber nicht bei allen AVRs, oder?

Hatter auch nicht, er nimmt einfach den MUX des ADC.

Ist aber schon lange möglich (alle ATmega/ATtiny mit SRAM und ADC).


Peter

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Peter Dannegger (peda)

>Der MUX+Komparator brauchen nur 3-4 Zyklen zum Einschwingen, da wollte
>ich nicht ein unnötig langes delay_us nehmen. Ein CALL+RET (7 Zyklen)
>reicht aus.

Perfektionist ;-). Aber AFAIK kann _delay_us() auch Verzögerungen 
kleiner 1us erzeugen, da die Funktion (welche ein Makro ist) mit 
Floatwerten gefüttert wird! Und selbst wenn man _delay_us(1) scheibt, 
ist die "Performance" noch durchaus akzeptabel ;-). Zumal man ehr viel 
länger warten muss, wenn ein langes Kabel dranhängt. Mit den internen 
Pull-Ups (30..50K) und 50m Kabel (2..5nF) sind da fix ein paar 
Mikrosekunden zusammen.

MfG
Falk

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:

> Zumal man ehr viel
> länger warten muss, wenn ein langes Kabel dranhängt. Mit den internen
> Pull-Ups (30..50K) und 50m Kabel (2..5nF) sind da fix ein paar
> Mikrosekunden zusammen.


Da ist einmal die Verzögerung am Anfang (7*3=21 Zyklen), die kann man 
bei längerer Leitung erhöhen.

Die weiteren Verzögerungen von 7 Zyklen dienen nur für die interne 
Umschaltung des MUX, sind also leitungsunabhängig.

Bei langen Leitungen und noch mehreren Tasks, kann es sich lohnen, einen 
Timerinterrupt aufzusetzten, der dann die Aufladezeit ohne 
Rechenzeitverlust erzeugt.


Peter


P.S.:
Man kann natürlich auch die Bibliotheks-Delays nehmen.
Hab das Programm und die Testschaltung mal eben schnell am Abend 
zusammengeschustert, muß also nicht optimal sein.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter Dannegger (peda)

>Man kann natürlich auch die Bibliotheks-Delays nehmen.
>Hab das Programm und die Testschaltung mal eben schnell am Abend
>zusammengeschustert, muß also nicht optimal sein.

Für die Codesammlung sollte es schon bissel hübsch sein. Ist ja auch ne 
Visitenkarte von dir. ;-)

MFG
Falk

Autor: Falk Brunner (falk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Soo, hier mal die etwas aufgeräumte und standardisierte Version.

MfG
Falk

Autor: W. Bl (wb1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Ich verstehe nicht, warum Led und Taster parallel liegen.
Wäre es nicht günstiger, Vorwiderstand, LED und Taster in Reihe zu 
legen?
Wenn du dann kurzzeitig den Ausgang zum Eingang machst, kannst du doch 
den Pegel direckt einlesen.
Zwar würde dann bei betätigtem Taster die Led leuchten, aber in deiner 
Schaltung hast du ja auch eine Helligkeitsschwankung wenn der Taster 
betätigt ist
MfG
wb1

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
W. Bl wrote:
> Hallo
> Ich verstehe nicht, warum Led und Taster parallel liegen.
> Wäre es nicht günstiger, Vorwiderstand, LED und Taster in Reihe zu
> legen?

Ich verstehe nicht, wie das funktionieren soll, mal das mal auf.


> Zwar würde dann bei betätigtem Taster die Led leuchten, aber in deiner
> Schaltung hast du ja auch eine Helligkeitsschwankung wenn der Taster
> betätigt ist

Das Auge ist logarithmisch, rechne mal nach wie klein die 
Stromschwankung ist beim Drücken der Taste. Ich konnte jedenfalls keinen 
Unterschied sehen.


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:
> Soo, hier mal die etwas aufgeräumte und standardisierte Version.

Ich freue mich, daß Dir das Programm so gut gefällt.
Mindestens einer hat es also verstanden.

Ich hab mal 4,7nF zu den LEDs parallel geschaltet, bei 50µs für das 
erste Delay lief es wieder stabil. Bei ~100pF/m entspricht das also etwa 
47m.

Für hohe Zuverlässsigkeit sollte man externe Pullups (z.B. 33k) 
einsetzen.


Peter

Autor: Marius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Der MUX+Komparator brauchen nur 3-4 Zyklen zum Einschwingen, da wollte
>ich nicht ein unnötig langes delay_us nehmen. Ein CALL+RET (7 Zyklen)
>reicht aus.

Warum nicht einfach per ASM ein paar NOPs einfügen?

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.