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
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.
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.