Forum: Mikrocontroller und Digitale Elektronik cpse funktioniert nicht auf Controller


von Andreas P. (andipan)


Lesenswert?

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

von Hc Z. (mizch)


Lesenswert?

Stellt die Hardware sicher, dass Bit 1 bis 7 von Port D allesamt 
gesichert auf 0 liegen?  Offene Eingänge sind keine 0.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Andreas P. schrieb:

>   ldi r16, PIND
>   out PORTB, r16

???

von Peter D. (peda)


Lesenswert?

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

von Andreas P. (andipan)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.