Forum: Mikrocontroller und Digitale Elektronik Taster durch AVR ersetzen


von Luky S. (luky)


Lesenswert?

Ich möchte mir bei meinem Monitor das lästige Umschalten zwischen den 
Eingängen vereinfachen (ist tief in den Menüs versteckt) und habe daher 
versucht, einen ATmega48 (lag grad rum) so zu programmieren, das er die 
Taster incl. Pullups ersetzt. Die Platine mit den Schaltern habe ich 
dazu entfernt und die Kabel direkt an den Pin des AVRs gehängt. 
Funktioniert aber leider nicht so wie erwartet. Wen ich den Pin als 
Eingang mit Pullup konfiguriere kan ich durch verbinden des Pins mit 
Masse einen Schaltvorgang im Monitor auslösen, aber wenn ich den Pin als 
Ausgang konfiguriere und HIGH - LOW - HIGH ausgeben lasse reagiert der 
Monitor nicht drauf. Ich habe verschiedene Zeiten ausprobiert aber es 
passiert einfach nix... Leider ist mein Oszi PC-basiert und ich kann es 
nicht so einfach zum Monitor tragen oder umgekehrt. Ohne dranhängenden 
Monitor verhält sich der AVR korrekt.
Hat jemand eine Ahnung was ich falsch mache?
1
DDRD = (1 << DDD6);
2
PORTD |= (1<<PD6);
3
[...]
4
for (i=0; i<anz;i++) {
5
  PORTD &= ~(1<<PD6); //low
6
    delay_ms(TLOW);  
7
  PORTD |= (1<<PD6); //high
8
    delay_ms(THIGH);
9
}

von David (Gast)


Lesenswert?

bin vielleicht nicht der hellste, aber kapier wirklich nicht was du 
damit miteilen willst...

von Luky S. (luky)


Lesenswert?

Monitor hat normalerweise Taster und externe Pullups auf 3,3V.
Ich will nun das der AVR die Taster ersetzt und Tastenkombinationen 
eingibt. Also Taster + Pullups weg und angeschlossen. Avr schaltet pin 
als eingang mit internem Pullup -> läuft prima wen ich den Pin per Kabel 
auf GND ziehe.
Wen der AVR aber den Pin als Ausgang schaltet (normalweiese HIGH) und 
ihn dann für verschieden lange Zeiten auf LOW schaltet reagiert der 
Monitor nicht auf diesen simulierten Klick.

von Magnus Müller (Gast)


Lesenswert?

DDRD = (1 << DDD6);

Äh... sorry, aber was ist DDD6 ?!?

Schreib doch mal
1
DDRD = (1 << PD6);

Ausserdem: Welche Werte haben THIGH und TLOW? Dir ist bekannt, dass die 
Funktion "delay_ms" nur Werte von 0 bis 255 zulässt?

Gruß,
Magnetus

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

>>DDD6
= Data Direction (Port)D (Pin)6

Ansosnten mach das mal so:
Mach nen externen Pullup dran, Pullup am AVR aus.
Dann aknnst du schalten, indem du den Pin auf Ausgang schaltest = LOW 
und danach wieder auf Ausgang = HIGH.
Das simuliert einen Taster eher als ein aktiv PUSH/PULL

von Luky S. (luky)


Lesenswert?

Ich hab das Problem jetzt gelöst: Die Leitungen waren gemultiplext. Ein 
10k Vorwiderstand hat das Problem behoben. Mit dem Oszi hätte ich das 
gleich gesehen...
Danke für die Hilfe.

von Udo (Gast)


Lesenswert?

Hallo,

Magnus Müller schrieb:
> Dir ist bekannt, dass die
> Funktion "delay_ms" nur Werte von 0 bis 255 zulässt?


Sorry, aber das stimmt nicht mehr.

Auszug aus der Lib:

"When the user request delay which exceed the maximum possible one, 
_delay_ms() provides a decreased resolution functionality. In this mode 
_delay_ms() will work with a resolution of 1/10 ms, providing delays up 
to 6.5535 seconds (independent from CPU frequency). "

Gruß
Udo

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
Noch kein Account? Hier anmelden.