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


von Eduard S. (edisinger)


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

von Spess53 (Gast)


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

von guest (Gast)


Lesenswert?

und wofür steht "uebergabe" ?

von Purzel H. (hacky)


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.

von Spess53 (Gast)


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

von Floh (Gast)


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

von Peter D. (peda)


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

von guest (Gast)


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.

von Spess53 (Gast)


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

von guest (Gast)


Lesenswert?

woher wissen wir, wo "uebergabe" her kommt?

von Spess53 (Gast)


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

von guest (Gast)


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

von guest (Gast)


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.

von Spess53 (Gast)


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

von Eduard S. (edisinger)


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

von Spess53 (Gast)


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

von Eduard S. (edisinger)


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

von Spess53 (Gast)


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

von Peter R. (gelb)


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

von Spess53 (Gast)


Lesenswert?

Hi

Du kannst dir das ganze Vergleichen auch komplett ersparen
1
                      in r16,PinB
2
                      andi r16,$0F
3
4
                      clr r17
5
                      ldi ZL, Low(action_list<<1) ;Zeiger auf
6
                      ldi ZH,High(action_list<<1) ;action_list
7
8
                      add ZL,r16
9
                      adc ZH,r17                ; Offset addieren
10
                      lpm r16,Z                 ; action-Nummer holen
11
                      dec r16                   ; um bei 0 anzufangen
12
13
                      ldi ZL, Low(action_jmp)   ; Adresse
14
                      ldi ZH,High(action_jmp)   ; Sprungtabelle
15
                      add ZL,r16                ; aktion-Nummer
16
                      adc ZH,r17                ; addieren
17
                      icall
18
                      ....                      ; hier gehts weiter
19
20
action_list:          .db 6,1,2,5,3,3,3,3,4,4,4,4,5,7,5,5
21
;                                                   ^     fehlt bei dir
22
23
action_jmp:           rjmp action1
24
                      rjmp action2
25
                      rjmp action3
26
                      rjmp action4
27
                      rjmp action5
28
                      rjmp action6
29
                      rjmp action7
30
31
32
action1:              ret                      ; da muss der Code
33
action2:              ret                      ; für deine Aktionen
34
action3:              ret                      ; hin
35
action4:              ret
36
action5:              ret
37
action6:              ret
38
action7:              ret

MfG Spess

von Eduard S. (edisinger)


Angehängte Dateien:

Lesenswert?

Hallo

das ganze Programm im Anhang.
hoffe es hilft weiter.

mfg
edi

von Spess53 (Gast)


Lesenswert?

Hi


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

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

MfG Spess

von Eduard S. (edisinger)


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
>

von Eduard S. (edisinger)


Lesenswert?

Spess53 schrieb:
> Hi
>
>
>>in     M1, pinb
>>com    m1
>>mov    uebergabe,m1
>>clr     m1
>
> Wozu der Umweg über M1?
>
>
1
> in     uebergabe, pinb
2
> com    uebergabe
3
> andi            uebergabe,$0F ; nur deine Tasten
4
5
6
> 
7
>
>
> 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

von Spess53 (Gast)


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

von Sascha W. (sascha_w)


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

von Eduard S. (edisinger)


Angehängte Dateien:

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

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.