Forum: Mikrocontroller und Digitale Elektronik [ASM] AND von 2 Registern


von BaeumeKommunizierenElektromagnetisch (Gast)


Lesenswert?

Hallo zsm,

ich habe mir eine Routine fuer eine 4x4 Tasten Matrix geschrieben welche 
funktioniert und im Einsatz ist. Nun bin ich am Optimieren meiner Zeilen 
und habe keine Erklaerung dafuer warum ich den Befehl AND nicht so 
anwenden kann wie er gedacht ist.

Hier ein kleiner Auszug bei dem ich Reihe 1 auf High schalte und Spalte 
1 (Taste "1") abfrage ob sie gedrueckt worden ist, nach dieser Taste 
springe ich dann zur Abfrage Taste "2", "3", "A", .. naechste Reihe, 
etc:
1
; Bitmuster laden
2
lds  r1, 0b00000010  ; PORTB - PIN 1
3
lds  r2, 0b00000100  ; PORTB - PIN 2
4
lds  r3, 0b00001000  ; PORTB - PIN 3
5
lds  r4, 0b00000001  ; PORTC - PIN 0
6
; /Bitmuster laden Ende
7
8
Start_Scan:
9
sbi  PORTB, 0  ; Erste Reihe (1, 2, 3, A) auf high setzen  
10
nop
11
nop
12
nop
13
14
in  r19, PINB  ; Status vom Port einlesen
15
and  r19, r1    ; Nur wenn Taste auf High war, dann ist Bit 2 nun auch High
16
cpi  r19, 0b00000010      
17
brne  row1_ende  ; BRanche if Not Equal
18
rcall  delay5ms  ; kurz warten
19
      
20
in  r19, PINB  ; Nochmal Status einlesen      
21
and  r19, r1    ; gezieltes Bit auf High setzen      
22
cpi  r19, 0b00000010  ; War sie gedrueckt?
23
brne  row1_ende
24
25
ldi  r16, '1'  ; Dann machen wir was, wenn nicht dann restliche Tasten abfragen
26
rcall  LCD_DATA
27
28
row1_ende:
29
      
30
cbi  PORTB, 0
31
rcall  D250_ms    ; Kleine Verzoegerung um doppeltes Druecken zu vermeiden
32
33
rjmp  Start_Scan

Ziel ist es flexibel zu sein und anhand der Verdrahtung das jeweiligen 
Bitmuster oben in vier untere Register zu laden. Doch der AND Befehl 
funktioniert nicht, es findet keine uebereinstimmung statt brne springt 
immer zum Punkt "row1_ende"

Ersetze ich
1
and  r19, r1

mit ANDI (UND Register -> Konstante) direkt mit der Konstante:
1
andi  r19, 0b00000010

dann funktioniert es. Diese Feststellung habe ich am Mega328P gemacht 
und auf einem anderen Controller noch nicht getestet.

Kann mir Jemand ein Tipp geben?

von (prx) A. K. (prx)


Lesenswert?

BaeumeKommunizierenElektromagnetisch schrieb:
> lds  r1, 0b00000010  ; PORTB - PIN 1

Wenn das kein Xmega ist, ist das R1 = R2.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

lds ist nicht ldi (was auf r1 ohnehin nicht geht)

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

BaeumeKommunizierenElektromagnetisch schrieb:
> Kann mir Jemand ein Tipp geben?

Ja.
1
   lds  r1, 0b00000010  ; PORTB - PIN 1
Das ist sicher nicht PB.1, du hast r1 mit Inhalt der Adresse 0x02 
geladen.
Richtig wäre:
1
   ldi  r16, 0b00000010  ; PORTB - PIN 1
2
   mov r1, r16

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

BaeumeKommunizierenElektromagnetisch schrieb:
> Nun bin ich am Optimieren meiner Zeilen

Wenn es um Optimieren geht:
Folgendes:
1
lds  r1, 0b00000010  ; PORTB - PIN 1
2
lds  r2, 0b00000100  ; PORTB - PIN 2
3
lds  r3, 0b00001000  ; PORTB - PIN 3
4
lds  r4, 0b00000001  ; PORTC - PIN 0
ersetzen mit:
1
.EQU Spalte0 = 0x01 ; Tasten an PINC.1
2
.EQU Spalte1 = 0x02 ;
3
.EQU Spalte2 = 0x04 ;
4
.EQU Spalte3 = 0x08 ;
5
.EQU AnyKey  = 0x0E ; Irgendeine Taste an PINB.1 - PINB.3
Warum?
Weil es nicht sehr smart ist, irgendwelche register (und insbesondere
r0/r1) mit konstanten Werten zu laden und somit vom späteren
Gebrauch auszuschließen.

Und dann folgendes:
1
in  r19, PINB          ; Status einlesen      
2
and  r19, r1           ; gezieltes Bit auf High setzen      
3
cpi  r19, 0b00000010   ; War sie gedrueckt?
4
brne  row1_ende
mit folgendem ersetzen:
1
KeyChk_B:
2
in    r19, PINB        ; Status einlesen      
3
andi  r19, AnyKey      ; War überhaupt irgendeine Taste gedrückt?
4
breq  row1_ende        ; Keine Taste gedrückt, überspringe alle weiteren prüfungen für PINB
5
;***  Irgendeine Taste in 3 Reihen für PINB war gedrückt
6
in    r19, PINB        ; Nochmal Status einlesen      
7
andi  r19, Spalte1     ; War sie gedrueckt?      
8
breq  row1_ende
Nicht ausprobiert, keine Garantie.
CopyLeft by ich, All Wrongs Reserved.

: Bearbeitet durch User
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.