[ASM] AND von 2 Registern

Gast #6879854
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?
(Firma: Vescomp) #6879927
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.