Hallo zusammen Nach längerer uC Abstinenz versuche ich mich an Atmel's AVR uC einzuarbeiten. Dazu habe ich einen STK500 mit einem ATMEGA8515L erstanden. Ich schrieb ein Programm, welches beim Eingang der PORTD verzweigt. Das Register r16 liest den Port D ein, das Register r17 wird mit dem Wert geladen, bei welchem anschliessend verzweigt werden soll. Um die Verzweigung zu bewerkstelligen wendete ich den Befehl cpse r16, r17 an. Somit sollte wenn r16 und r17 gleich sind, der nachfolgende Befehl (=verzweigung mit rjmp), ausgelassen werden. Auf dem AVR Studio Simulator funktioniert es wie gewünscht, nur der Prozessor geht immer auf den nachfolgenden Befehl, egal ob die Register r16 und r17 gleich sind oder nicht. Kann jemand den Fehler sehen? Bin ich da auf die beschaltung der Ports hereingefallen? Vielen Dank für Eure Hilfe! .include "8515def.inc"; //includes the 8515 .org 0x000 ldi r16, 0xFF //Register r16 mit 255 laden out DDRB, r16 //und Port B als Output switchen ldi r16, 0x00 //Register r16 mit 0 laden out DDRD, r16 //und Port D als Input switchen ldi r17, 0b00000001 //in Register R17 den Wert von 1 laden loop: in r16, PIND //Schalterstellung in Register r16 einlesen cpse r16, r17 //Wenn Schalterstellung gleich r17 dann ... rjmp einzelnled //... diese Zeile ueberspringen ldi r16, 0x00 // das Register 16 mit 255 laden out PORTB, r16 //und Port B mit 255 (alle an) anschalten rjmp loop //Wiederholen einzelnled: ldi r16, 0xFF out PORTB, r16 //Alle LED loeschen ldi r16, PIND out PORTB, r16 rjmp loop
Stellt die Hardware sicher, dass Bit 1 bis 7 von Port D allesamt gesichert auf 0 liegen? Offene Eingänge sind keine 0.
Andreas P. schrieb: > Auf dem AVR Studio Simulator funktioniert es wie gewünscht, nur > der Prozessor geht immer auf den nachfolgenden Befehl, egal ob > die Register r16 und r17 gleich sind oder nicht. Der Simulator hat ja keine Hardware angeschlossen. Im richtigen Leben mußt Du aber alle 8 IO-Pins enstprechend anschließen, damit sie den gewünschten Pegel haben, also entweder an GND oder VCC. Das kann auch über (interne/externe) Widerstände geschehen (Pullup/Pulldown). Interessiert Dich aber nur ein Pin, ist es Unsinn, alle 8 zu vergleichen. Peter
Danke für die Tipps! In der Anleitung vom STK500 steht's eigentlich geschrieben: Wenn keine Taste gedrückt wird, ist der Eingang mittels Pull-Up Widerstand auf 5Vcc hochgezogen, d.H. log. 1. Bei Tastendruck fällt der Port Eingang auf 0. Somit muss der Port umgekehrt rum abgefragt werden.
Andreas P. schrieb: > Danke für die Tipps! > In der Anleitung vom STK500 steht's eigentlich geschrieben: > Wenn keine Taste gedrückt wird, ist der Eingang mittels > Pull-Up Widerstand auf 5Vcc hochgezogen, d.H. log. 1. > Bei Tastendruck fällt der Port Eingang auf 0. > Somit muss der Port umgekehrt rum abgefragt werden. Es ist trotzdem nicht unbedingt schlau sich darauf zu verlassen, dass die anderen Bits einen gesicherten Wert haben. Denn die Erfahrung zeigt, dass Programme im Lauf der Zeit erweitert werden, und das was momentan noch ein ungenutzter Pin ist, kann in ein paar Wochen zu einem zusätzlichen Ausgang oder Eingang mutieren. Dann funktioniert Code, der vor der Änderung noch geklappt hat, sporadisch nicht mehr und man sucht sich einen Wolf nach derartigen 'impliziten Annahmen' ab.
Das hier
1 | ldi r16, 0x00 // das Register 16 mit 255 laden |
2 | out PORTB, r16 //und Port B mit 255 (alle an) anschalten |
ist übrigens ein Musterbeispiel dafür, wie Kommentare nicht aussehen sollen. Das hier r16 mit einem Wert geladen wird, steht auch im Code selber. Das brauch ich nicht zu kommentieren. Und natürlich ist dir der Fehler passiert, dass du den Code geändert und auf den Kommentar vergessen hast. Somit stimmen Code und Kommentar nicht mehr zusammen. ALs Faustregel: Kommentiere nicht das 'Wie'. Das steht im Code. Kommentiere das 'Warum'. An dieser Stelle willst du alle LED am Port B einschalten. Das gehört in den Kommentar (was du ja auch richtigerweise gemacht hast). Das du diesen Zweck dadurch erreichst, dass du 0x00 über den Umweg über r16 an Port B ausgibst, brauchst du nicht zu kommentieren, denn das steht im Code. Und im schlimmsten Fall stimmen dann Code und Kommentar, wie bei dir, nicht mehr überein.
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.