Forum: Mikrocontroller und Digitale Elektronik noch wach? internen pull-up einschalten, assembler, tiny2313


von leif (Gast)


Lesenswert?

hallo,

er [der erste avr-versuch] hat strom und qualmt nicht!
und das einschalten von 2 leds funktioniert auch.
ich bin fast begeistert!

jetzt möchte ich vor dem schlafengehen noch kurz mal einen oder zwei
taster ins spiel bringen, die an PB5 und 6 gegen masse gehen.

mein 'programm' sieht so aus:



.include "tn2313def.inc"      ;Definitionsdatei einbinden


         ldi r16, 0b00011000       ;0xFF ins Arbeitsregister r16 laden
         out DDRB, r16       ;Inhalt von r16 ins IO-Register DDRB
ausgeben

         ldi r16, 0b00011000 ;0b11111100 in r16 laden
         out PORTB, r16      ;r16 ins IO-Register PORTB ausgeben

ende:    rjmp ende           ;Sprung zur Marke "ende"



vielleicht hat ja jemand lust, mir noch zu zeigen, wie ich bei
tastendruck die LEDs umschalte (eine an, die andere aus. taste->
tauschen)

das wäre nett und ich könnte gut träumen!

leif

von Winfried (Gast)


Lesenswert?

- im Handbuch schauen, wie du ddrb/portb so konfigurierst, dass ein
Pullup eingeschaltet ist und die Pins Eingänge.
- Tasten muss man immer entprellen, einfachst geht das so: Wenn Taster
als gedrückt erkannt, 10ms warten (kleine Zeitschleife), nochmal
schauen, ob immer noch gedrückt und wenn ja, dann war es tatsächlich
ein Tastendruck. Losgelassen ist ein Taster, wenn er als losgelassen
erkannt wird und 10 ms später ebenfalls nochmal.

Träume süß...

von Michael (Gast)


Lesenswert?

Kleiner Tipp am Rande:
Erst den gewünschten Zustand am PORT einstellen und dann erst die
Portart wählen.

Also so:
...
ldi r16, 0b00011000 ;0b11111100 in r16 laden
out PORTB, r16      ;r16 ins IO-Register PORTB ausgeben

ldi r16, 0b00011000       ;0xFF ins Arbeitsregister r16 laden
out DDRB, r16             ;Inhalt von r16 ins IO-Register DDRB

Hat mich mal ein paar Tage Fehlersuche gekostet. Wenn mans anderstrum
macht, treten unerwünschte Effekte beim Einschalten auf.

Gruß,
Michael

von leif (Gast)


Lesenswert?

danke, ich hab mich kurz vor zwei in den sleep-mode versetzt! aber nach
dem frühstück geht's dann endlich weiter! -l

von leif (Gast)


Lesenswert?

so, jetzt ist auch der rest wach.

das mit den pull-ups hab ich jetzt auch im datenblatt gefunden:

If PORTxn is written logic one when the pin is configured as an input
pin, the pull-up
resistor is activated. To switch the pull-up resistor off, PORTxn has
to be written logic
zero or the pin has to be configured as an output pin. The port pins
are tri-stated when
reset condition becomes active, even if no clocks are running.


Deswegen eine Frage an

michael:

kannst du das noch ein bisschen erläutern? eigentlich muss man doch
erst die portart wählen, und dann schreiben, sonst ließe sich in meinem
fall doch der pull-up nicht einschalten?
Und im tutorial wird's auch so gemacht.

so, leider habe ich den schaltplan nicht meinem footprint angepasst,
meine taster sind leider kurzgeschlossen..argh! das werde ich jetzt
ändern, und dann auf c umsteigen.

danke nochmal, und bis später ;-)

von leif (Gast)


Lesenswert?

ich hatte die werte vertauscht - und mit umgelöteten tastern kann ich
jetzt auch messen, daß die pins hochgezogen werden. danke!
leider wird eine LED trotzdem sofort ausgeschaltet, aber dafür mache
ich jetzt einen neuen thread auf..

von Bolle (Gast)


Lesenswert?

>eigentlich muss man doch
>erst die portart wählen, und dann schreiben, sonst ließe sich in
meinem
>fall doch der pull-up nicht einschalten?

Mach Dir keine Sorgen um den Pull-up.  Der verhält sich ganz blöd: er
ist einfach immer dann eingeschaltet, wenn DDXn=0 und PORTXn=1. Ob Du
den Port gemäß "PORTX setzen, DDRX setzen" oder in der umgekehren
Reihenfolge "DDRX setzen, PORTX setzen" konfigurierst, ist dem Pullup
egal.

Warum man Ports in der Reihenfolge "PORTX setzen, DDRX setzen"
konfigurieren sollte, hat folgenden Grund.

Angenommen, es sei DDXn=0 und PORTXn=0.  Das ist der Anfangszustand
direkt nach dem Einschalten des µC.  Der Portpin Xn ist hochohmiger
Input.  Du willst ihn jedoch auf "Ausgang High" schalten, wozu Du
DDXn=1 und PORTXn=1 erreichen mußt. Wenn Du das nun so machst...

------------------------
DDXn auf 1 setzen
PORTXn auf 1 setzen
------------------------

...dann tritt für einen Maschinenzyklus der Zustand DDXn=1 und PORTXn=0
auf (nämlich für den Zeitraum, in dem der µC die erste der obigen beiden
Zeilen abgearbeitet hat, aber noch nicht die zweite), d. h. der Port
treibt für einen winzigen Augenblick ein "Low" auf den Ausgang!  Das
kann je nach Gegebenheiten durchaus zu unerwünschten Effekten führen
(es muß ja nicht unbedingt nur eine doofe LED an dem Port hängen - es
könne z. B. auch ein Highspeed-CMOS-Zähler sein, der danach u. U. den
Zählerstand 1 erreicht hat!).

Machst Du es dagegen so...

------------------------
PORTXn auf 1 setzen
DDXn auf 1 setzen
------------------------

...dann schaltest Du mit der ersten Zeile lediglich den Pullup ein, was
Deine an dem Pin angeschlossene Peripherie nicht kümmert (dazu muß sie
natürlich so ausgelegt sein, daß der Pullup nicht ausreicht, um sie zu
treiben; sprich, ihr Eingangswiderstand muß viel kleiner sein als der
Pullup; dies ist jedoch praktisch immer von Haus aus der Fall, weil der
Pullup recht hochohmig ist). Bei dieser Reihenfolge tritt der kritische
Zustand "Pin ist Low-Output" nicht auf.

>Und im tutorial wird's auch so gemacht.

Dann sollte mal jemand das Tutorial um die obigen Erklärungen ergänzen
bzw. korrigieren.

von leif (Gast)


Lesenswert?

Das war's! Leifs Abenteuer fortgesetzt unter
http://www.mikrocontroller.net/forum/read-1-234244.html#new

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.