mikrocontroller.net

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


Autor: Korbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst halt PIND verändern, da PIND als Eingang steht.

Autor: Korbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Oops (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Korbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Oops (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oops

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

Gruss
Oops

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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/

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Erik S. (erik_s)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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."

Autor: Oops (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Äh?
Was habe ich denn da falsch verstanden?

Gruss
Oops

Autor: Oops (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sich erledigt.

Gruss
Oops

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.