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
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?
@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
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.
>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
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)
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/
>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.
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.
>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."