mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik cpse funktioniert nicht auf Controller


Autor: Andreas P. (andipan)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hc Zimmerer (mizch)
Datum:

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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas P. schrieb:

>   ldi r16, PIND
>   out PORTB, r16

???

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas P. (andipan)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier
  ldi r16, 0x00  // das Register 16 mit 255 laden
  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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.