Forum: Mikrocontroller und Digitale Elektronik AVR-Assembler - gleichzeitig I/O am PortB


von Heiko H. (vienet)


Lesenswert?

Hallo zusammen - ich habe hier eine Denkblockade vom feinsten :-)

Vielleicht kann mir jemand auf die Sprünge helfen.

Ich komme aus dem 8051-Lager und will nun endlich komplett auf
AVR umsteigen (habe aber leider ein paar Jahre nichts mehr gemacht, habe 
also einiges aufzuarbeiten..) AVRStudio läuft, STK500 ebenfalls, die 
ersten Tests mit der RS232 waren erfolgreich etc. pp.

NUR ... Folgendes ist mein Problem:

Beim 8051 konnte ich die I/O Ports direkt abfragen/beschreiben, das ging
fix und ohne viel Aufwand.

Bei den AVR's (aktuell habe ich ein paar 2313 hier) muss nun gesagt 
werden, wer Eingang/Ausgang ist, dann wird das Bit geschrieben bzw. kann 
abgefragt werden.

Alle Beispiele die ich finde beziehen sich auf Eingang PortD - Ausgang 
PortB.

Ich möchte PortD aber für andere Dinge freihalten.

PortB - 0 - Taster (schaltet PortB 2)
PortB - 1 - Taster (schaltet PortB 3)
PortB - 2 - LED
PortB - 3 - LED

Wie bringe ich es nun fertig nur die Taster abzufragen und die LED's zu 
bedienen? Alle anderen Ports an B sollen nicht berührt werden.

Die Lösung wird einfach sein.- aber ich komm nicht drauf ..grml..

Danke und Gruß, Heiko

von Peter II (Gast)


Lesenswert?


von MWS (Gast)


Lesenswert?

Ausgangspins für Ports im IO-Bereich SBI/CBI, Eingangspins SBIS/SBIC.
Sonst Port/Pin entsprechend maskieren, dann geht auch alles andere.

von Karl H. (kbuchegg)


Lesenswert?

Heiko Haedicke schrieb:

> Die Lösung wird einfach sein.- aber ich komm nicht drauf ..grml..
>

AVR-Tutorial

von Heiko H. (vienet)


Angehängte Dateien:

Lesenswert?

Danke für die Tipps !!!

Das Tutorial ist klasse, habe schon einiges gelesen.

Habe es mal mit "Ausgangspins für Ports im IO-Bereich SBI/CBI, 
Eingangspins SBIS/SBIC" versucht.

Die direkte Bitmanipulation ind der Form war mir bisher nicht bewusst.
Bin nun mal wieder auf PortD und PortB ausgewichen um das mit dem
STK500 zu testen. Soweit ok, aber da stimmt noch was nicht.

Wenn ich einen der Taster gedrückt halte kommt ein Rechtecksignal am 
entprechenden LED Pin raus (wie geht das denn - ich setzte den LED Port 
doch nirgendwo mehr zurück) und der Zustand nach loslassen des Tasters 
ist nicht fix. Laut Programm sollte beim einmaligen Tasten eines Tasters 
die LED doch angehen und anbleiben ...

Gruß, Heiko.

von Stefan E. (sternst)


Lesenswert?

Heiko Haedicke schrieb:
> Wenn ich einen der Taster gedrückt halte kommt ein Rechtecksignal am
> entprechenden LED Pin raus (wie geht das denn - ich setzte den LED Port
> doch nirgendwo mehr zurück)
1
sbi pinb,pinb0   ; LED 0 an
Schlage im Datenblatt nach, was ein Schreiben in das PIN-Register 
bewirkt. (kleiner Hinweis: eigentlich möchtest du hier das PORT-Register 
verwenden)

von Heiko H. (vienet)


Lesenswert?

sbi portb,pinb0 ; LED 0 an

DAANKE! :-)

von Rolf H. (flash01)


Lesenswert?

Hallo Heiko,
ich habe mir mal Deinen Quelltext "ASM.txt" angeschaut und daraus
einige Fehler erkannt.
Diese beseitigt und was Brauchbares daraus gemacht.
In der ersten Anwendung werden nur zwei Leds hintereinander 
eingeschaltet,
mehr geschieht dann nicht.
In der zweiten Anwendung werden bei drücken von zwei Tasten
entsprechende Leds Ein- und Ausgeschaltet.
Ich möchte aber erst den Moderator fragen, ob ich die Quelltexte
einstellen soll oder nicht.
Denn gerade Anfänger sollen sich über das Tutorial einarbeiten.
Also ich warte erst mal...wie die Meinung ist.

Grüße

Rolf

von Heiko H. (vienet)


Lesenswert?

Hallo Rolf,

Fehlerkorrektur ist immer gut, gerade die Fehler die man am Anfang macht 
schleppt man immer weiter mit sich und irgendwann werden sie sich 
rächen.

Ich weiss nicht warum ich mit der Art der Ein/Ausgabe bei den AVR's so 
auf Kriegsfuß stehe - die direkte Bitmanipulation meine ich hier 
insbesonders.

Und ja, das Tutorial ist klasse und lohnt sich auf jeden Fall.

Bzgl. Posten oder nicht - besser ist es doch wenn Du es postet, solange 
dieser Thread hier zur Verfügung steht - nicht das der Ein oder Andere 
meinen Fehlerhaften Quelltext findet und meine Fehler 
weiterverarbeitet..

Schöne Ostertgüße, Heiko.

von F. F. (foldi)


Lesenswert?

Rolf H. schrieb:

> Ich möchte aber erst den Moderator fragen, ob ich die Quelltexte
> einstellen soll oder nicht.
> Denn gerade Anfänger sollen sich über das Tutorial einarbeiten.
> Also ich warte erst mal...wie die Meinung ist.


"Stell ein den Scheiß!"

Das Tutorial ist klasse! Wenn man einfach so Beispiele kopieren kann 
(davon kann es gar nicht genug geben) die für genau den µC geschrieben 
sind und mit denen rum probieren kann, sie ändern kann, dann hilft das 
oft (mir z.B.) ungemein weiter.

Außerdem, du musst gar keinen Fragen!
Und jeder kann doch selbst entscheiden, ob er nur "abschreibt" oder 
selbst was macht.
Wir sind hier weder in der Schule noch muss ich hier "Papa" fragen.

"Hau raus!"

von Rolf H. (flash01)


Lesenswert?

ok, also dann mal los!
Kritik kann ich vertragen, sollte was aus meinen Ausführungen nicht
richtig sein.
Was fällt mir im Einzelnen auf:
1. den Programmbeginn gestalte ich anders, denn der Tiny muß ja erst mal
wissen, was ich mit den Registern "DDRB bzw. DDRD" vorhab. Erst
dann beginnt das setzen oder löschen der Pins.
D.h. unter ;Vorbereitung wird  erst mal alles dem Tiny vorgegeben
was in Frage kommen soll. (Interrupt, PWM usw.)

2. sbis ist nicht richtig, wenn Du wie in Deinem Text PIND0 auf LOW
ziehen willst. Also sbic...ok!
3. led2an:
sbi pinb,pinb0 muß lauten sbi  PORTB,PB0 ;denn DDRB ist auf OUTPUT
Das Gleiche mit led3an
Hier mein erster Quelltext, um die Leds nur zum leuchten zu bringen.
Die Hardware: Tastesw1 an PIND,PD0, Tastesw2 an PIND,PD1 beide gegen
GND geschaltet / rote Led an PORTB,PB0 / grüne Led an PORTB,PB1
; Projekt-Name: Projekt01                      Datum: 30.03.2013

; Datei: Tiny2313-test01.asm

; AVR: Tiny2313-20PU

  .INCLUDE   "tn2313def.inc"   ; Deklaration für Tiny2313

  rjmp    reset             ; Reseteinsprung

   reset:

;Vorbereitung PORTB und PIND
  ldi     r16,(1<<PB0) | (1<<PB1)
  out     DDRB,r16         ; PB0 + PB1=Output

  clr     r16              ; alle Pins in r16=Low
  out     DDRD,r16         ; Datenricht. PD0-PD6=Input

  ldi     r16,0x7F         ; 0b0111.1111
  out     PORTD,r16        ; PD0 bis PD6=PULLUP

  clr     r16              ; beide LEDs zu Beginn AUS
  out     PORTB,r16


loop:

tastesw1:
  sbic   PIND,PD0
  rjmp   tastesw1
  rcall  ledrotein

tastesw2:
  sbic   PIND,PD1
  rjmp   tastesw2
  rcall  ledgnein
  rjmp   loop

ledrotein:                 ; rote LED an PB0=EIN
  sbi   PORTB,PB0
  ret

ledgnein:                  ; grüne LED an PB1=EIN
  sbi   PORTB,PB1
  ret

.EXIT

Aber was bringt das Ganze, die beiden Leds leuchten und mehr nicht,
über Reset sind sie wieder dunkel.
Zweiter Quelltext, wo jetzt wechselhaft die Leds über die beiden
Tasten hell und dunkel geschaltet werden.
Dazu verwende ich gern Unterprogramme mit rcall

Grüße

Rolf

von Rolf H. (flash01)


Lesenswert?

Sorry, hier ist der zweite Quelltext!

;Vorbereitung PORTB und PIND
  ldi     r16,(1<<PB0) | (1<<PB1)
  out     DDRB,r16         ; PB0 + PB1=Output

  clr     r16              ; alle Pins in r16=Low
  out     DDRD,r16         ; Datenricht. PD0-PD6=Input

  ldi     r16,0x7F         ; 0b0111.1111
  out     PORTD,r16        ; PD0 bis PD6=PULLUP

  clr     r16              ; beide LEDs zu Beginn AUS
  out     PORTB,r16


loop:

tastesw1:
  sbic   PIND,PD0          ;sbic Tastenabfrage auf LOW
  rjmp   tastesw1
  rcall  ledrotein

tastesw2:
  sbic   PIND,PD1
  rjmp   tastesw2
  rcall  ledgnein
  rjmp   loop

ledrotein:
  sbi   PORTB,PB0          ; rote LED an PB0=EIN
  cbi   PORTB,PB1          ; grüne LED an PB1=AUS
  ret

ledgnein:
  sbi   PORTB,PB1          ; grüne LED an PB1=EIN
  cbi   PORTB,PB0          ; rote LED an PB0=AUS
  ret

.EXIT

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.