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
Geht doch wunderbar. Wenn du z.B bei PIND ein Bit setzt, dann kommt bei PORTB und PINB auch das Bit.
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)
Oops Ein Mega8. Da sollte das auch gehen, wenn ich es richtig verstanden habe. Gruss Oops
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."
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.