Forum: Mikrocontroller und Digitale Elektronik Tutorial und Simulator, Frage zu DDRB


von Korbi (Gast)


Lesenswert?

Hallo!
Also, ich arbeite gerade das Tutorial durch und habe mir parallel dazu 
das AVR-Studio runtergeladen, um das ganze dann zu probieren.
Jetzt kam bei folgendem Quelllcode ein Problem:

.include "m8def.inc"

         ldi r16, 0xFF
         out DDRB, r16     ; Alle Pins am Port B durch Ausgabe von 0xFF 
ins
                           ; Richtungsregister DDRB als Ausgang 
konfigurieren
         ldi r16, 0x00
         out DDRD, r16     ; Alle Pins am Port D durch Ausgabe von 0x00 
ins
                           ; Richtungsregister DDRD als Eingang 
konfigurieren

         ldi r16, 0xFF     ; An allen Pins vom Port D die Pullup 
Widerstände
         out PORTD, r16    ; aktivieren. Dies geht deshalb durch eine 
Ausgabe
                           ; nach PORTD, da ja der Port auf Eingang 
gestellt ist.
loop:
         in r16, PIND      ; an Port D anliegende Werte (Taster) nach 
r16 einlesen
         out PORTB, r16    ; Inhalt von r16 an Port B ausgeben
         rjmp loop         ; Sprung zu "loop:" -> Endlosschleife

Port B ist der Ausgang, Port D der Eingang. Nun sollte doch jede 
Änderung, die ich im Debugger an "PORTD" vornehme, eine Änderung in 
"PIND" bewirken und dann irgendwann auf "PORTB" übergehen.
Allerdings funktioniert das mit dem Simulator nicht. Wenn ich allerdings 
alle DDRD auf 1 und alle DDRB auf 0 setze, die beiden quasi tausche, 
dann geht das so, wie's soll.
Mach ich was falsch oder macht der Simulator was falsch, weil im 
Tutorial und in der Dokumentation von Atmel steht, dass alle Bits, die 
in DDRx 1 sind, einen Ausgang beschreiben, im Simulator aber als Eingang 
arbeiten.

Vielen DAnk schonmal an alle, die mir helfen :-P
Korbi

von Martin (Gast)


Lesenswert?

Geht doch wunderbar. Wenn du z.B bei PIND ein Bit setzt, dann kommt bei 
PORTB und PINB auch das Bit.

von Martin (Gast)


Lesenswert?

Du musst halt PIND verändern, da PIND als Eingang steht.

von Korbi (Gast)


Lesenswert?

Ja, aber der Port B ist doch der Ausgang...vieleicht hab ich die 
Definition von Ausgang falsch verstanden:
Wenn ich DDRB auf 0xFF habe, sind alle Pins von B Ausgänge, das heißt 
doch dann, wenn ich PORTB auf 0xFF setze, dann sollte PINB 0x00 bleiben 
(weil ja alle Pins Ausgänge sind).
Analog dazu sollte Port D, wo ja DDRD auf 0x00 ist, nur aus Eingängen 
bestehen, wenn cih also PORTD auf 0xFF setze, sollte auch PIND 0xFF 
sein...
Oder verdreh cih da was?

von Oops (Gast)


Lesenswert?

@Korbi

Füge mal ein NOP zwischen dem schreiben von PORTD und dem neu einlesen 
von PIND ein. Welchen Prozessor verwendest Du?
Z.B. im Datenblatt vom 162 steht das es da eine systembedingte 
Verzögerung gibt. Ich vermute, das das bei allen Megas so sein wird.

Gruss
Oops

von Karl H. (kbuchegg)


Lesenswert?

Korbi wrote:
> Ja, aber der Port B ist doch der Ausgang...vieleicht hab ich die
> Definition von Ausgang falsch verstanden:
> Wenn ich DDRB auf 0xFF habe, sind alle Pins von B Ausgänge, das heißt
> doch dann, wenn ich PORTB auf 0xFF setze, dann sollte PINB 0x00 bleiben
> (weil ja alle Pins Ausgänge sind).

Nein das stimmt nicht. Im nächsten Taktzyklus übernimmt das PIN
Register dann die Werte vom PORT Register für Ausgangsbits.

> Analog dazu sollte Port D, wo ja DDRD auf 0x00 ist, nur aus Eingängen
> bestehen, wenn cih also PORTD auf 0xFF setze, sollte auch PIND 0xFF
> sein...

Auch das stimmt nicht. Wenn ein Port auf Ausgang geschaltet wird,
dann beeinflusst das PORT Register die zugehörigen Pullup Widerstände.

von AVRFan (Gast)


Lesenswert?

>Nun sollte doch jede
>Änderung, die ich im Debugger an "PORTD" vornehme, eine Änderung in
>"PIND" bewirken und dann irgendwann auf "PORTB" übergehen.

Nein, nicht wenn Port D als Input konfiguriert ist, was bei Dir der Fall 
ist.

Port D konfiguriert als Input (DDRD = 0x00)
--> Änderung an PORTD-Register schaltet Pullups ein und aus; keine 
Wirkung auf PIND!  Wenn im Simulator das Einlesen eines Pinzustandes 
simuliert werden soll, muss dazu PIND angeklickt werden!

Port D konfiguriert als Output (DDRD = 0xFF)
--> Änderung an PORTD-Register schaltet die Ausgangs-Treibertransistoren 
und wirkt sich damit "automatisch" auch auf PIND aus

von Korbi (Gast)


Lesenswert?

Okay, das klingt logisch...gibt es denn eine Möglichkeit, in dem 
AVR-Simulator einen gedrückten Taster zu simulieren? Oder brauch ich 
dafür ein Board á la STK500?

Danke trotzdem
Korbi (dem gerade ein Licht aufgegangen ist :-P)

von Oops (Gast)


Lesenswert?

Oops

Ein Mega8. Da sollte das auch gehen, wenn ich es richtig verstanden 
habe.

Gruss
Oops

von Karl H. (kbuchegg)


Lesenswert?

Korbi wrote:
> Okay, das klingt logisch...gibt es denn eine Möglichkeit, in dem
> AVR-Simulator einen gedrückten Taster zu simulieren?

Klicke einfach auf die PIN Register in der I/O View Anzeige.
Der Grundzustand dürfte wohl 1 sein, also ein gesetztes Häkchen.
Wenn du den 'Taster' gedrückt haben willst, dann nimmst du das
Häkchen im Pinregister wieder raus und gehst in deinem Programm
weiter.

Alternativ könntest du probieren, ob Hapsim noch mit dem neuesten
AVR-Studio zusammenarbeiten kann.
http://www.helmix.at/hapsim/

von AVRFan (Gast)


Lesenswert?

>eine Möglichkeit, in dem
>AVR-Simulator einen gedrückten Taster zu simulieren?

ja sicher.  Du kannst doch in Deinem Code PIND setzen und gesetzt lassen 
wie Du willst. Solange Port D als Input konfiguriert ist (DDRD = 0x00), 
behält PIND seinen Zustand.  Du kannst ihn nur von Hand ändern.

von Erik S. (erik_s)


Lesenswert?

Korbi wrote:
> ...gibt es denn eine Möglichkeit, in dem
> AVR-Simulator einen gedrückten Taster zu simulieren? Oder brauch ich
> dafür ein Board á la STK500?


Das geht, du musst nur die entsprechenden PIND.x per Mausklick 
umschalten.

von AVRFan (Gast)


Lesenswert?

>Du kannst doch in Deinem Code PIND setzen und gesetzt lassen
>wie Du willst.

Besser formuliert: "Du kannst doch im Simulator per Mausklick PIND 
setzen und gesetzt lassen wie Du willst."

von Oops (Gast)


Lesenswert?

Äh?
Was habe ich denn da falsch verstanden?

Gruss
Oops

von Oops (Gast)


Lesenswert?

Hat sich erledigt.

Gruss
Oops

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.