-
        

Ergebnis 1 bis 6 von 6

Thema: Verständnisfrage: cpi vs. andi

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.09.2005
    Beiträge
    102

    Verständnisfrage: cpi vs. andi

    Anzeige

    Hallo,

    beschäftige mich erst neuerdings (gezwungenermaßen ) mit Assembler.

    Habe leider ein Verständnisproblem mit den Befehlen cpi und andi

    Ich war bis jetzt der Meinung, dass ich mit cpi einen Vergleich mache.

    Also:

    cpi var_x, 0 if(x==0)
    breq jp_true wenn gleich: springe zu jp_true




    soweit so gut.

    Nun bin ich auf ein Problem gestoßen wenn ich PINA (an dem Port hängen Switches) abfragen möchte.

    in C würde meine Abfrage lauten:

    Code:
    if ( PINA & _BV(1) != 0 ){
    // Taste gedrückt
    }
    Nun der Assembler teil
    in tmp, PINA
    cpi tmp, 1 if(tmp==1)
    breq jp_true wenn gleich: springe zu jp_true




    Das klappt so aber leider nicht

    Statdessen klappt es wenn ich den Befehl andi nehme.
    Kann mir bitte jemand sagen warum das so ist?

    Muss ich bei PINx immer andi nehmen oder verwechsel ich die Bedeutung von cpi und mein "if(x==xyz)" muss ich mit andi realisieren.


    Danke
    Kesandal

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Der CPI Befehl (und die anderen ähnliche Formen wie CMP, CPC usw. ) dienen dazu Zahlenwerte zu vergleichen. Also ganze Bytes, oder zusammengesetzt auch 16 Bit Zahlen. Befehle wie ANDI und ähnliche sind Bitoperationen, da werden also die Bits verknüpft. Damit kann man dann einzelne Bits überprüfen.

    Es gibt auch noch extra Befehle um direkt ein Bit abzufragen und dann ggf. einen Befehl zu überspringen. Das sind die Befehle SBRS, SBRC, SBIS und SBIC. Um entweder ein Bit im CPU Register (R0...R31) oder in einem der ersten 32 IO-Register zu testen.
    Als andere Alternative um einzelne Bits zu testen gibt es noch den Befehl BST und dann als Sprung BRTC oder BRTS.

    Die Bits vom IO Port haben eher selten die Bedeutung als Zahl - meist fragt man da die Bits einzeln ab.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.09.2005
    Beiträge
    102
    Vielen Dank für Deine ausführliche Antwort. Diese hat Licht ins Dunkle gebracht

    Eine Frage habe ich noch:

    Warum funktioniert folgender Code

    Code:
    mainloop:
    in tmp,PINA
    mov save,tmp
    
    mov tmp,save
    andi tmp,2
    breq taste1
    
    mov tmp,save
    andi tmp,1
    breq taste0
    
    rjmp mainloop
    anstatt
    Code:
    mainloop:
    		
    in tmp,PINA
    mov save,tmp
    
    andi tmp,2
    breq taste1
    
    andi tmp,1
    breq taste0
    
    rjmp mainloop
    Wieso muss ich erst tmp in ein weiteres Register kopieren um es anschließend wieder zurück zu kopieren?



    Gruß und danke

  4. #4
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.970
    Hallo!

    ... weil "andi" verändert den Inhalt vom "tmp".
    MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.09.2005
    Beiträge
    102
    Zitat Zitat von PICture Beitrag anzeigen
    Hallo!

    ... weil "andi" verändert den Inhalt vom "tmp".

    oh.
    Dann ist es klar

    Vielen Dank für Deine Antwort!

  6. #6
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Wenn man die Abfrage mit dem Befehl BST und dem T Flag macht, kann man es auch ohne die extra Kopie machen.
    Mit BST wird einfach das eine Bit direkt ins T Flag kopiert und kann dann für Sprünge benutzt werden. Also etwa so:

    mainloop:

    in tmp,PINA

    BST tmp,1 ; Bit-Nummer, nicht bitwert !
    brtc taste1

    BST tmp,0
    brtc taste0
    ...
    rjmp mainloop

Ähnliche Themen

  1. Verständnisfrage Spannungsversorgung
    Von bbraune im Forum Elektronik
    Antworten: 30
    Letzter Beitrag: 12.08.2008, 11:39
  2. Verständnisfrage zur Eingangsbeschaltung
    Von dwod im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 25.01.2007, 11:24
  3. SPI Verständnisfrage
    Von bertl100 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 07.09.2006, 17:54
  4. Verständnisfrage
    Von Shadow² im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 30.08.2006, 12:56
  5. PWM Verständnisfrage
    Von Amri im Forum AVR Hardwarethemen
    Antworten: 9
    Letzter Beitrag: 01.04.2005, 14:36

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •