Forum: Mikrocontroller und Digitale Elektronik Anfänger, ASM, Taster toggel Port


von Name Blond (Gast)


Lesenswert?

Hallo,
ich versuche einen einzelnen PinB jedes mal wenn ein Taster an PortD 
betätigt wurde ein bzw. aus zu schalten.
Beim Testen im AvrStudio5 läuft alles wie geplant (vorausgesetzt der 
PinD 4 wird manuell bedient).
Am ATMega168 wird an PB1 jedoch 2,5V angezeigt.
Meine Überlegung ging dahin das PB1 evtl. in schneller Folge 1|0 
geschaltet wird, was bedeuten würde das der Taster\PortD4 nach dem 
ersten Aufruf aktiv bleibt ?
1
include "m168def.inc"
2
3
 ldi  r16, 0xFF
4
 out  DDRB, r16      ;PortB Ausgang
5
6
 ldi  r16, 0x00 
7
 out  DDRD, r16      ;PortD Eingang
8
9
 ldi  r16, 0xFF
10
 out  PORTB, r16     ;PortB 0 (alle aus)
11
12
 sbi  PORTD, 4       ;PortD 4 auf eins, Interner Pullup aktiviert ?
13
14
 loop:  
15
 
16
    sbic PinD, 4     ; Naechsten Befehl ueberspringen wenn PinD4=0
17
                
18
    sbi PinB, 1      ; Bit PinB 1 toggeln ?
19
20
    rjmp loop        ; Endlosschleife in Loop

Danke im Voraus für eure Mühe.

von tom (Gast)


Lesenswert?

Zum toggeln fehlen noch ein paar Befehle, aber
wenn Du ein Pin setzen möchtest, dann über PORTB und nich über PINB.

PINx  : zum eingeben
PORTx : zum ausgeben

Mit "sbi PORTB, 1" wirds wohl klappen.

von Jürgen W. (juergen_w) Benutzerseite


Lesenswert?

> Mit "sbi PORTB, 1" wirds wohl klappen.

Glaub nicht, weil

> ldi  r16, 0xFF
>  out  PORTB, r16     ;PortB 0 (alle aus)


der komplette PortB schon auf 1 ist.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jürgen W. schrieb:
> der komplette PortB schon auf 1 ist.
Da hilft es nichts, wenn der Kommentar was anderes behauptet...
>>  out  PORTB, r16     ;PortB 0 (alle aus)

von Name Blond (Gast)


Lesenswert?

Nun ja, ich hatte gelesen das bei moderneren Microcontrollern eben ein 
Port getoggelt werden kann in dem man den entsprechenden Pin direkt 
manipuliert (ihn auf 1 setzt).

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Doch, das mit PINB sollte eigentlich gehen, da man durch schreiben auf 
PINX.n PORTX.n toggelt... Aber dein Port toggelt solange du den Taster 
gedrückt hast wie wild hin und her. Du musst den Taster entprellen und 
auf jeden Tastendruck nur ein Mal reagieren. Das macht man mit Flags. 
Schau mal hier im Wiki nach.

Gruß
Jonathan

von Uwe (Gast)


Lesenswert?

DAs kommt auf den Mikrocontroller drauf an und nicht ob er modern ist.
Datenblatt lesen !!! 
http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf
UND MIT LESEN IST DURCHARBEITEN UND NACHVOLLZIEHEN GEMEINT
beim lesen kann man fragen stellen.

von Mikki M. (mmerten)


Lesenswert?

Ist doch alles richtig.
Solange PORTD,BIT4 L ist wird bei jedem Durchlauf BIT1 auf PORTB 
invertiert.
Als Ein-/Aus-Taster fehlt da dann allerdings Entprellmechanismus.

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Z.B. so:

r16.0 = Dein Flag, ob bereits gedrückt wurde

Loop:

SBRC r16, 0
RJMP Toggle_ende

SBIS PIND, 4
RJMP Toggle_ende
SBI PINB, 1
SBR r16, &B00000001

Toggle_ende:
SBIS PIND, 4
CBR r16, &B00000001

RJMP Loop

So wird bei jedem Drücken nur ein Mal getoggelt.

(Ungetestet und ohne Entprellung)


Gruß
Jonathan

von Jürgen W. (juergen_w) Benutzerseite


Lesenswert?

>>Toggling the pin
>>Writing a logic one to PINxn toggles the value of PORTxn, independent on
>>the value of DDRxn.
>>Note that the SBI instruction can be used to toggle one single bit in a
>>port.

Wieder was gelernt.

von Name Blond (Gast)


Lesenswert?

Ja Uwe, ich habe das Datenblatt gelesen (s.73) aber wenig verstanden da 
ich wirklich ein Anfänger bin. Ob der 168 diese Funktion bietet war aber 
auch nicht die Frage.
Ich werde mich nun erstmal mit Entprellung und Flags beschäftigen und 
danke euch für die zahlreichen Antworten sowie den kompakten Code.

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.