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.
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.
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.
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.
RET solltest Du auch nur verwenden, wenn Du mit CALL/RCALL/ICALL ins Unterprogramm verzweigst. Ansonsten ist es auch kein echtes Unterprogramm, btw.
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
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.