Forum: Mikrocontroller und Digitale Elektronik Fragen zu einem ganz kleinen Anfängerprogramm


von Bastian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
hätte da mal zwei Fragen zu dem anhängenden Programm.
1. Warum muss ich kein Stackpointer initialisieren?
   Habe das Programm schon getest und es funktioniert.

2. Sobalt ich Pin 1 von Port D drücke schaltet sich schon der Port B
   komplett ein. Aber leider leichten auch einige Leds, die an Port
   D hängen. Sie leuchten auch nicht voll sondern vielleicht nur
   halb so hell. Wie kann das denn sein? Port D habe ich doch als
   Eingang definiert.

von thkais (Gast)


Lesenswert?

1. Weil Du den Stack nicht benutzt. Der Stack wird von
Interrupt-Aufrufen, Unterprogramm-Aufrufen und den Stack-Operationen
(Push, Pop) verwendet (habe ich etwas vergessen?).
2. Weil Du Pull-Up Widerstände (nicht wie fälschlicherweise im Programm
angegeben Pull-Down) am PortD eingeschaltet hast. Dadurch fließt ein
geringer Strom, der eben ausreicht, um die LEDs zum Glimmen zu bringen.

von Bastian (Gast)


Lesenswert?

Hy thkais,
also das mit dem Stack leuchtet mir schon ein.
Aber wenn ich 00hex ausgebe schalte ich doch auch die Pull-Down ein.
Sonst würde das Programm doch nicht funktionieren. Schalte nämlich über
die Schalter "High".
Dadurch kann doch eigentlich gar keine Spannung an der Eingängen
zustande kommen. Außerdem leuchten die LEDs total ungleichmäßig.

von Bastian (Gast)


Lesenswert?

Habe das Programm mal abgeändert.
Kehre jetzt nicht nach dem Sprung mit dem Befehl ret zurück, sonder
springe einfach mit rjmp zu dem einlesen des Port D zurück. Jetzt
leuchte die LEDs der Eingänge nicht mehr mit auf.
Erklären kann ich mir das aber nicht.

von Jens Renner (Gast)


Lesenswert?

RET solltest Du auch nur verwenden, wenn Du mit CALL/RCALL/ICALL ins
Unterprogramm verzweigst.
Ansonsten ist es auch kein echtes Unterprogramm, btw.

von bukongahelas (Gast)


Lesenswert?

Falle bei 16 Bit Schreiboperationen (Stackpointer!):
Beim Schreiben erst HiByte und dann LoByte schreiben,
beim Lesen erst LoByte und dann HiByte lesen.
Der AVRSTUDIO Simulator zeigts aber korrekt an,auch wenn
falsche Reihenfolge.Steht zwar im Manual,kostete mich
aber Tage wegen unerklärlicher Fehler.
Uli

von Peter D. (peda)


Lesenswert?

@Uli,

nein, der Stackpointer ist gerade nicht betroffen.

Es sind nur die 16Bit-Timer und ADC Register, da diese ja durch
Hardware während des Auslesens geändert werden könnten.


Peter

von bukongahelas (Gast)


Lesenswert?

Peter:Dank für Korrektur,aber:

Hab das vor Jahren mit dem STK200 und 8515 probiert und hatte
das Problem (StackPointer).
Hast bestimmt recht,aber wieso sollte ich mich an einen Fehler
vor 4 Jahren so intensiv erinnern ?
Programm lief,als ich die Reihenfolge änderte,sonst nicht.
Dachte,es sei der Fehler,wer weiß?
Müßte jetzt nochmals experimentieren,um recht zu haben,is mir
aber egal.
Andersrum:Hat es negative Effekte,wenn man HiByte,LoByte
schreibt und LoByte,Hibyte bei Registerpaar liest?
Dann mach ich es immer so (Faustregel).
Mag es eben gern einfach.
Uli

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.