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
- 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üß...
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
danke, ich hab mich kurz vor zwei in den sleep-mode versetzt! aber nach dem frühstück geht's dann endlich weiter! -l
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 ;-)
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..
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.