Forum: Mikrocontroller und Digitale Elektronik pin abfragen,einfache frage zu tutorial


von leif (Gast)


Lesenswert?

hallo,

hier schreibt einer so aufgeregt wie kurz vor dem jahreswechsel!


folgendes funktioniert nicht, wie ich es mir vorstelle:


.include "tn2313def.inc"      ;Definitionsdatei einbinden


         ldi r16, 0b00011000 ; 3, 4 als ausgang, rest eingang.
         out DDRB, r16      ;(portart bestimmen)

         ldi r16, 0b11111111 ; 3, 4 einschalten, rest pull-ups
aktivieren
         out PORTB, r16



loop:    sbic PINB, 6        ;"skip if bit cleared", nächsten Befehl
überspringen,
                             ;wenn Bit 0 im IO-Register PIND =0 (Taste
0 gedrückt)
         rjmp loop           ;Sprung zu "loop:" -> Endlosschleife

         cbi PORTB, 4        ;Bit 3 im IO-Register PORTB auf 0 setzen
-> grüne LED aus

ende:    rjmp ende           ;Endlosschleife



was passiert?
die led geht sofort aus (bzw. 'gar nicht erst an', avrisp abziehen
oder spannung aus/ein), ohne, daß ich den besagten knopf gedrückt
hätte.

meine beiden taster sind an 5 und 6, der pull-up ist aktiv (zumindest
messe ich etwas um 5V) und die pins werden durch die taster jeweils
erfolgreich gegen masse geschaltet.

wenn es also (?) kein hardware-problem ist, wo mache ich den denkfehler
im programm?

schonmal danke,

leif

von leif (Gast)


Lesenswert?

ah moment, es könnte sich erledigt haben..

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

@leif

schön daß du da drüber gesprochen hast und wir dir helfen konnten g

von leif (Gast)


Lesenswert?

[fortsetzung von
http://www.mikrocontroller.net/forum/read-1-234032.html#new]

Hi Bolle, vielen Dank für die Erklärung! Als Gegenleistung werde ich
mich ab jetzt bemühen, hin und wieder mal die Shift-Taste einzusetzen.

Hier erstmal der aktuelle Code (wie oben, nur nach Deinen Anweisungen
initialisiert):


.include "tn2313def.inc"      ;Definitionsdatei einbinden

        ldi r16, 0b11111111 ;wert ins Arbeitsregister r16 laden
         out PORTB, r16       ;Inhalt von r16 ins IO-Register DDRB
ausgeben (pull-ups einschalten, bzw wert ausgeben)

         ldi r16, 0b00011000 ;wert in r16 laden
         out DDRB, r16      ;r16 ins IO-Register PORTB ausgeben
(portart bestimmen)



loop:    sbic PINB, 6        ;"skip if bit cleared", nächsten Befehl
überspringen,
                             ;wenn Bit 0 im IO-Register PIND =0 (Taste
0 gedrückt)
         rjmp loop           ;Sprung zu "loop:" -> Endlosschleife

         cbi PORTB, 4        ;Bit 3 im IO-Register PORTB auf 0 setzen
-> rote LED aus

ende:    rjmp ende           ;Endlosschleife


Und diesmal wir die rote LED ausgeschaltet.

"leif steckt nochmal eben den AVRISP drauf, um zu checken, ob dann
wirklich beide LEDs leuchten, wie sein Gedächtnis aus unbekanntem Grund
einwendet. leif zieht den AVRISP ab, und, und SIE BLEIBEN AN! bis leif
den knopf drückt."

freu


Aber ich wollte noch was fragen, und .. zwar hat sich das gerade auch
geklärt. Wenn beim Einschalten alls Inputs sind, macht es auch nichts,
wenn ich alles (auch meine geplanten Ausgänge) logisch 1 setze.

Vielen Dank!

von leif (Gast)


Lesenswert?

Ihr seid wirklich hilfsbereit!
Es ist echt erstaunlich, wieviel Freude eine kleine LED macht, wenn man
sie per Knopfdruck ausschalten kann :-)

von Michael (Gast)


Lesenswert?

Hi,
vielen Dank an Bolle. Hat mir viel Schreibarbeit abgenommen und ich
könnts nicht besser erklären!

Vielleicht noch mein Beispiel warum mir das ins Auge gestochen ist. Ich
hab, als ich mit den AVRs angefangen hab auch einfach das Tutorial
abgetippt. Damals hab ich eine Phasenanschnittsteuerung für einen Motor
gebaut und mich immer gewundert warum der Motor beim Einschalten kurz
zuckt. Da ist genau das aufgetreten was Bolle erklärt hat. Der Ausgang
an welchem der Triac hing hatte kurz den falschen Zustand und hat den
Triac gezündet.

Ich wollte eigentlich keine große Diskusion losbrechen. Ist mir nur so
aufgefallen...

Gruß,
Michael

von Bolle (Gast)


Lesenswert?

Zwei Sachen könnte man noch ergänzen:

1. Es wäre sogar möglich, daß der Übergangszustand länger als nur einen
Maschinentakt anhält, nämlich dann, wenn just nach der Abarbeitung der
ersten Zeile und vor Abarbeitung der zweiten irgendein vermaledeiter
Interrupt auftritt.  Um dies zu unterbinden, müßte man die
Angelegenheit strengstensgenommen also sogar als critical section
behandeln, und die beiden Zeilen in "cli - sei" einschließen.

2. Für den Fall, daß der (wie gesagt i. a. unkritische)
Übergangszustand "Input mit aktiviertem Pullup" auf die
angeschlossene Peripherie doch unerwünschte Auswirkungen hat, gibt es
z. B. beim ATMega8 ein spezielles Konfigurationsbit, über das alle
Pullups an allen Ports zwangsdeaktiviert werden können ("PUD"-Bit im
"SFIOR"-I/O-Register).  Näheres dazu siehe Data Sheet zum ATMega8,
Seite 51.

von Uwe O. (schwede)


Angehängte Dateien:

Lesenswert?

Hallo...
ich hoffe ich bin hier richtig, da ich ein änliches Problem habe. Ich
verwende das STK500 und für den Anfang habe ich ein kleines Programm
geschrieben in dem ich eine 7-Segm-Anzeige betreibe. Sie soll "0"
anzeigen und solange ich eine Taste drücke soll die entsprechende Zahl
von 1..8 leuchten. Der Kontroller sollte folgendes machen:
wenn ich z.B. am Ausgang PortB 0b00000001 ausgebe, dann sind die
Pins1..7 = 0 also 0V und Pin0 = 1 also 5V. Die Spannung kommt aber nur
auf max. 1,2V (ohne angeschlossene LED), was bedeutet, bei 5V sollten
die LED's ausgehen da ich aber nur ca. 1V habe werden sie nur ein
klein wenig dunkler - bei genauem Hinsehen.

Kann mir jemand einen Tipp geben oder weiss vielleicht sogar, warum der
Kontroller an den Ausgangspins nicht volle 5V erreicht?
Falls es von Interesse sein sollte, ich hab das Programm angehangen.

Gruss Uwe

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.