mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik "cpi" Befehl funktioniert am Simulator aber live nicht


Autor: Eduard Singer (edisinger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte einen Microcontroller für ein Projekt Programmieren.

bin ziemlich neu auf dem Gebiet.
hab mir ein kleines Programm zusammengestellt,
wo 4 Eingänge ausgelesen werden und dann als uebergabe ausgewertet 
werden soll.
Soweit so gut, es funktioniert im Simulator ohne Fehler, nur nach dem 
Brennen und Test life geht nichts.
Scheint an diesen Zeilen zu scheitern.

Für Hilfe wäre ich sehr Dankbar.


;++++++++++++übergabe wird auf nicht erlaubt geprüft+++++++++++

cpi  uebergabe,3
breq  nichterlaubt;sprung wird nur ausgeführt wenn Werte gleich sind
cpi  uebergabe,12
brsh  nichterlaubt  ;sprung wird nur ausgeführt wenn Werte gleich oder 
;höher sind

;+++++++++++übergabe wird auf time ab und totmann wenden geprüf
cpi   uebergabe,1
breq  timeab  ;sprung wird nur ausgeführt wenn Werte gleich

;+++++++++++übergabe wird auf time auf geprüft++++++++++++

cpi   uebergabe,2
breq  timeauf  ;sprung wird nur ausgeführt wenn Werte gleich

;+++++++++++übergabe wird auf totmann auf geprüft+++++++++++

cpi   uebergabe,4
breq  totmannauf  ;sprung wird nur ausgeführt wenn Werte gleich
cpi   uebergabe,5
breq  totmannauf  ;sprung wird nur ausgeführt wenn Werte gleich
cpi   uebergabe,6
breq  totmannauf  ;sprung wird nur ausgeführt wenn Werte gleich
cpi   uebergabe,7
breq  totmannauf  ;sprung wird nur ausgeführt wenn Werte gleich

;+++++++++++übergabe wird auf totmann ab geprüft+++++

cpi   uebergabe,8
breq  totmannab  ;sprung wird nur ausgeführt wenn Werte gleich
cpi   uebergabe,9
breq  totmannab  ;sprung wird nur ausgeführt wenn Werte gleich
cpi   uebergabe,10
breq  totmannab  ;sprung wird nur ausgeführt wenn Werte gleich
cpi   uebergabe,11
breq  totmannab  ;sprung wird nur ausgeführt wenn Werte gleich

;+++++++++++übergabe wird auf null geprüft++++++++++++++

cpi   uebergabe,0
breq  nullstellung  ;sprung wird nur ausgeführt wenn Werte gleich

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>...wo 4 Eingänge ausgelesen werden und dann als uebergabe ausgewertet
>werden soll.

Und was hängt an diesen Eingängen?

MfG Spess

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wofür steht "uebergabe" ?

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich nehm mal an, es handelt sich um einem AVR. Soweit ich mich recht 
erinnere, geht cpi nur mit Registern 16-31. nicht mit den Registern 
0-15, und auch nicht mit Variablen. Kann mich aber irren.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Soweit ich mich recht erinnere, geht cpi nur mit Registern 16-31.
>nicht mit den Registern 0-15, und auch nicht mit Variablen.

Stimmt. Aber solche Fehler meckert der Assembler an.

MfG Spess

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A...aha Soooo. schrieb:
> Ich nehm mal an, es handelt sich um einem AVR. Soweit ich mich recht
> erinnere, geht cpi nur mit Registern 16-31. nicht mit den Registern
> 0-15, und auch nicht mit Variablen. Kann mich aber irren.

stimmt so.
Allerdings gibt der Assembler dann ja eine Fehlermeldung aus, da die 
Operanden nicht passen.

Wärs möglich den Code mal komplett als Anhang hier zu posten?
Weil in diesen paar Zeilen sind nur die Sprünge angegeben, nicht die 
Sprungziele und auch nicht, wie du die Eingaben auf die "übergabe" 
speicherst.
:-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tasten einzulesen und einen ganzen Port zu vergleichen, ist gelinde 
gesagt äußerst unklug.

Es interessiert Dich doch nur ein einziger Pin. Also darfst Du auch nur 
diesen einen testen, die andern müssen als egal angesehen werden.

Sobald Dein Programm nur etwas größer wird, wirst Du nicht mehr wissen, 
was die anderen 7 Pins für einen Zustand haben. Sie können z.B. 
PWM-Ausgänge sein.


Peter

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bewundere den blinden Glauben an den Assembler.
Ich hatte schon Atmel-AVR-Assembler, die erkannten
nicht einmal doppelte Labels.

Oder probiert auf einem AT90USB162 mal
lds  r16,GPIOR2
oder
sts  GPIOR2,r16

Das meckert der Assembler auch nicht an, aber die
Nebeneffekte sind beeindruckend.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Oder probiert auf einem AT90USB162 mal
>lds  r16,GPIOR2
>oder
>sts  GPIOR2,r16

>Das meckert der Assembler auch nicht an, aber die
>Nebeneffekte sind beeindruckend.

Warum sollte es das anmeckern? Da ist erst mal kein Fehler drin. Woher 
soll der Assembler wissen, das du ihm eine falsch Adresse angibst?

MfG Spess

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
woher wissen wir, wo "uebergabe" her kommt?

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>woher wissen wir, wo "uebergabe" her kommt?

Vielleicht sollte man das hier ruhen lassen, bis sich der TO mal wieder 
meldet.

MfG Spess

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Warum sollte es das anmeckern? Da ist erst mal kein Fehler drin. Woher
> soll der Assembler wissen, das du ihm eine falsch Adresse angibst?


Vielleicht weil
GPIOR2 > 0x003F
und
.equ  IOEND  = 0x00ff
in dem defines-include den problematischen Bereich
klar definiert?

Diese Falle führt zu sehr unangenehmen Überraschungen,
die nicht nur mit falsch eingelesen Werten zu tun haben.
Der Programmzähler läuft irr...

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sollte natürlich heißen
GPIOR2 <= 0x003F

lds r16,GPIOR2
sts GPIOR2,r16
kann/könnte der Assembler leicht abfangen
oder wenigstens mit einem warning versehen.

Tut er aber nicht.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>GPIOR2 > 0x003F
>und
>.equ  IOEND  = 0x00ff

lds und sts haben nichts mit IO zu tun.

GPIOR2 hat zwei Adressen.  0x2B wenn mit in/out darauf zugegriffen wird 
und
0x4B für den Zugriff mit lds/sts. Im Includefile steht:

.equ  GPIOR2  = 0x2b

Das ist die IO-Adresse.

Also produziert ein lds/sts auf GPIOR2 einen Zugriff auf PortD 
(IO-Adresse $2B)

Verständlich?

MfG Spess

Autor: Eduard Singer (edisinger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute

ersteinmal herzlichen Dank für die vielen Antworten.
find ich echt toll.
Stelle fest habe noch recht viel zu lernen.

Spess53 schrieb:
Und was hängt an diesen Eingängen?
Hier sind vier entprellte Taster asngeschlossen, aktiv high

guest schrieb:
> und wofür steht "uebergabe" ?

die Eingänge werden in einer Interruproutine abgefragt und in uebergabe 
gespeichert.  .def   uebergabe  = r20

A...aha Soooo. schrieb:
> Ich nehm mal an, es handelt sich um einem AVR. Soweit ich mich recht
> erinnere, geht cpi nur mit Registern 16-31. nicht mit den Registern
> 0-15, und auch nicht mit Variablen. Kann mich aber irren

es handelt sich um einen ATtiny 2313,
Register ist ja r20." Auch nicht mit Variablen", wie meinst du das?
es wird ja Register mit einer Konstanten verglichen.

Peter Dannegger schrieb:
> Tasten einzulesen und einen ganzen Port zu vergleichen, ist gelinde
> gesagt äußerst unklug.

Ich weiß schon das hier noch jede Menge Kinderkrankheiten vorhanden 
sind.
Ist ja auch mein erster Versuch, bin auf jeden Fall dankbar für jede 
Hilfe bzw Vorschläge für Änderungen.
Einen ganzen Port zu vergleichen ist sicher nicht gut, wie du schreibst,
aber es ist mein Startprojekt, und da genügend Hardware vorhanden ist, 
wollte ich mich noch nicht mit den einzelen Pins beim einlesen 
herumschlagen.
Weiters ist ja auch wichtig das verschiedene Schleifen angesprungen 
werden wenn zwei oder mehr Taster zugleich gedrückt werden.

zum testen hab ich mal die Vergleichsroutine umgeschrieben.
sbrs    uebergabe,0
rjmp    timeab

oder

sbrs    uebergabe,1
rjmp    timeauf
rjmp    nullstellung

und  wenn ich es teste funktionierts auch am Chip.
Muß wohl meine Abfrage komplett umschreiben, nur auf vier Pins, und nur 
die Bits abfragen und auswerten.
Wäre erst Lernziel Nummer 2 gewesen.
Intressiret mich aber trotzdem warum die CPI Variante nicht 
funktioniert, bzw wo der Fehler ist.


nochmal Dank für die raschen Antworten mit denen ich eigentlich nicht 
gerechnetet hatte
mfg  edi

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Muß wohl meine Abfrage komplett umschreiben, nur auf vier Pins, und nur
>die Bits abfragen und auswerten.

Soll das heissen, du liest den ganzen Port in 'uebergabe' ein und 
verarbeitest das weiter?

Wenn ja, dann maskiere die Bits einfach aus:

in uebergabe,Pinx
andi uebergabe,0b00001111  ; Pin0...3
....

dann enthält 'uebergabe' nur noch deine Taster.

MfG Spess

Autor: Eduard Singer (edisinger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Spess53 schrieb:
> in uebergabe,Pinx
> andi uebergabe,0b00001111  ; Pin0...3
> ....
>
> dann enthält 'uebergabe' nur noch deine Taster.

stimmt schon, muß dann aber erst die Tasterstellung vergleichen um die 
richtige Aktion folgen zu lassen.

folgendes Problem:
Taster eins ein    Aktion1               uebergabe 0b00000001
Tster  zwei ein    Akt.2                 uebergabe 0b00000010
Taster drei ein    Akt.3                 uebergabe 0b00000100
Taster vier ein    Akt.4                 uebergabe 0b00001000
Taster eins und zwei ein  Akt.5          uebergabe 0b00000011
Taster eins und drei ein  Akt.3          uebergabe 0b00000101
Taster eins und vier ein  Akt.4          uebergabe 0b00001001
Taster zwei und drei ein  Akt.3          uebergabe 0b00000110
Taster zwei und vier ein  Akt.4          uebergabe 0b00001010
Taster drei und vier ein  Akt.5          uebergabe 0b00001100
Taster eins, zwei und drei ein   Akt.3   uebergabe 0b00000111
Taster eins, zwei und vier ein   Akt.4   uebergabe 0b00001011
Taster zwei, drei und vier ein   Akt.5   uebergabe 0b00001110
alle vier Taster ein             Akt.5   uebergabe 0b00001111
kein Taster ein                  Akt.6   uebergabe 0b00000000

ich vergleiche mit cpi funktioniert am Simulator einwandfrei nur ab Chip 
nicht.
mfg
edi

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>ich vergleiche mit cpi funktioniert am Simulator einwandfrei nur ab Chip
>nicht.

'cpi' funktioniert im Controller genauso. Dein Fehler steckt im dem 
Programmteil, den du nicht gezeigt hast. Stell mal dein komplettes 
Programm im Anhang rein.

MfG Spess

Autor: Peter Roth (gelb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du gehst in der Tabelle davon aus, dass eine gedrückte Taste eine 1 
liefert.

Wie ist es denn in deiner Hardware realisiert? Meistens schalten die 
Tasten einen Pullup gegen Masse, das wäre dann gerade anders herum.

Grüße, Peter

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Du kannst dir das ganze Vergleichen auch komplett ersparen
                      in r16,PinB
                      andi r16,$0F

                      clr r17
                      ldi ZL, Low(action_list<<1) ;Zeiger auf
                      ldi ZH,High(action_list<<1) ;action_list

                      add ZL,r16
                      adc ZH,r17                ; Offset addieren
                      lpm r16,Z                 ; action-Nummer holen
                      dec r16                   ; um bei 0 anzufangen

                      ldi ZL, Low(action_jmp)   ; Adresse
                      ldi ZH,High(action_jmp)   ; Sprungtabelle
                      add ZL,r16                ; aktion-Nummer
                      adc ZH,r17                ; addieren
                      icall
                      ....                      ; hier gehts weiter

action_list:          .db 6,1,2,5,3,3,3,3,4,4,4,4,5,7,5,5
;                                                   ^     fehlt bei dir

action_jmp:           rjmp action1
                      rjmp action2
                      rjmp action3
                      rjmp action4
                      rjmp action5
                      rjmp action6
                      rjmp action7


action1:              ret                      ; da muss der Code
action2:              ret                      ; für deine Aktionen
action3:              ret                      ; hin
action4:              ret
action5:              ret
action6:              ret
action7:              ret

MfG Spess

Autor: Eduard Singer (edisinger)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

das ganze Programm im Anhang.
hoffe es hilft weiter.

mfg
edi

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi


>in     M1, pinb
>com    m1
>mov    uebergabe,m1
>clr     m1

Wozu der Umweg über M1?
in     uebergabe, pinb
com    uebergabe
andi            uebergabe,$0F ; nur deine Tasten


MfG Spess

Autor: Eduard Singer (edisinger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo
tolle Anregung,noch zu hoch für mich, werd mich mal kräftig reinknien.
funktioniert das auch suf dem ATtiny2313?
mfg
Edi

Spess53 schrieb:
> Hi
>
> Du kannst dir das ganze Vergleichen auch komplett ersparen
>

Autor: Eduard Singer (edisinger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Spess53 schrieb:
> Hi
>
>
>>in     M1, pinb
>>com    m1
>>mov    uebergabe,m1
>>clr     m1
>
> Wozu der Umweg über M1?
>
>
> in     uebergabe, pinb
> com    uebergabe
> andi            uebergabe,$0F ; nur deine Tasten


> 
> 
>
> MfG Spess

Hallo
OK ist klar
der Umwweg ist am Anfang entstanden
kann mann weglassen.
das mit andi ist auch klar
hab dann nur mehr 16 Möglichkeiten
die verglichen werden müssen um eine Aktion zu setzen.

Also mit cpi oder deine andere Variante
muss mich noch einmal ordenlich reinhauen.
mfg
Edi

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>tolle Anregung,noch zu hoch für mich, werd mich mal kräftig reinknien.

Ist eigentlich relativ einfach: In der .db Direktive steht zu jeder 
Tastenkombination die zugehörige Aktionsnummer. Z wird mit dem 
Tabellenanfang geladen und die Tastennummer addiert. Mit lpm wird dann 
die zugehörige Aktions-Nummer geholt. Im nächsten Schritt wird aus der 
Aktions-Nummer der Offset in der Sprungtabelle errechnet. 'icall' macht 
einen 'call' auf die Adresse in Z, der über die Sprungtabelle zu deiner 
Aktions-Routine führt.

>funktioniert das auch suf dem ATtiny2313?

Ja.

MfG Spess

Autor: Sascha Weber (sascha_w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eduard Singer schrieb:
> ich vergleiche mit cpi funktioniert am Simulator einwandfrei nur ab Chip
> nicht.

kann es sein, das dein Problem ist, das im wirklichen leben die Taster 
NIE 100% zur gleichen Zeit ein Signal liefern, du im Simulator aber die 
Eingänge beliebig setzen kannst, ohne das das Programm läuft.
Auf dem Controller wird dann aus LINKS+OBEN z.B. LINKS und danach 
LINKS+OBEN.

Sascha

Autor: Eduard Singer (edisinger)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute

Vielen Dank für die vielen Antworten und Vorschläge, besonders an Spess 
für die Idee mit der Actionlist,
Hab das Programmerl umgeschrieben wie du vorgeschlagen hast.

Es funktioniert am Simulator UND am Controller!!!

Ich stells als Anhang rein, vielleicht gibts ein paar 
Verbesserungsvorschläge.

Also nochmal Dank an alle und Spess

mfg
edi

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.