- SF800 Solar Speicher Tutorial         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: If else in Assembler

  1. #11
    Benutzer Stammmitglied
    Registriert seit
    27.02.2005
    Beiträge
    58
    Anzeige

    Powerstation Test
    Hi,

    ich habe noch was.
    Wie setzte ich das um.
    Das geht doch mit
    in R16, PIND ; lies den Eingang von Port D
    oder?
    Aber wie geht das dann das .gl_bit gesetzt wird und die anderen Port's nicht überschrieben werden?


    Code:
      Gl_inp Alias Pina                                           'LCD data input
      Gl_tris Alias Ddra                                          'LCD data redirection
      Dim Gl_bit As Byte
      Dim Gl_rstflag As Byte
      Dim Gl_pix As Byte
      
    Gl_tris = &B00000000                                     'Port input    
    
    Gl_read = Gl_inp  'laden
    
    Gl_tris = &B11111111                                     'port output
      
    
        
        If Gl_rstflag = 0 Then
          Set Gl_read.gl_bit
        Else
          Reset Gl_read.gl_bit
        End If
        Gl_pix = Gl_read
    end

  2. #12
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    da gl_bit eine BitNUMMER von 0 - 7 ist, du aber für das setzen eine BitMASKE brauchst, musst du letztere erstmal durch links-shiften eines 1-ers (gl_bit mal) konstruieren. dann kannst du mit OR setzen.
    oder Maske invertieren und mit AND löschen

    ein Beispiel für das konvertieren findest du bei
    http://www.rn-wissen.de/index.php/Ba...e-Code#PULSEIN
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    27.02.2005
    Beiträge
    58
    Code:
    $asm
    .equ Gl_tris_asm = Ddra
    $end Asm
    
    lds R20,{Gl_bit} 
    !cbi Gl_tris_asm, 3                                   '; löscht das Bit 3 in DDRA
    Das geht so.
    Aber ich kann jetzt nicht die 3 durch die R20 ersetzen.

  4. #14
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Code:
                     LDS   r24 , {Gl_bit}
    
    L_0x00F6:
    	LDI	r25,0x01             '  1-er laden
    	AND	r24,r24               '  gl_bit = 0 ?    
    	BREQ	L_0x0104           '  dann fertig
    	CLC                                  '  clear carry
    L_0x00FE:
    	ROL	r25                   ' rot left
    	DEC	r24                   ' bit-nr  - 1
    	BRNE	L_0x00FE          '  fertig ?
    L_0x0104:
    '-------------------------------------------------------------------------
                    LDS         r23,  {gl_read }
                    OR          r23, r24             ' bit setzen
    
    '-------------------------------------------------------------------------
    	COM	r24                  ' invertieren
                    AND        r23, r24             ' bit löschen
    
    '-------------------------------------------------------------------------
                   STS         {  Gl_pix } , r23
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #15
    Benutzer Stammmitglied
    Registriert seit
    27.02.2005
    Beiträge
    58
    Hi,
    danke.
    Ich habe es mal eingebaut, aber es geht nicht.

    Code:
    '-----------------------------
    $asm
    LDS r24, {Gl_bit}
    
    L_0x00f6:
       LDI r25,0x01                                             '  1-er laden
       !AND r24,r24                                             '  gl_bit = 0 ?
       BREQ L_0x0104                                            '  dann fertig
       CLC                                                      '  clear carry
    L_0x00fe:
       ROL r25                                                  ' rot left
       DEC r24                                                  ' bit-nr  - 1
       BRNE  L_0x00FE                                           '  fertig ?
    L_0x0104:
       LDS r23, {gl_read}
       COM r24                                                  ' invertieren
    $end Asm
    
    If Gl_rstflag = 1 Then
       !OR r23, r24                                             ' bit setzen
    Else
       !AND r23, r24                                            ' bit löschen
    End If
    
       !STS {Gl_pix}, r23
    '-----------------------------------------------------
    Was mache ich falsch.

  6. #16
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Code:
       LDS r23, {gl_read} 
    $end Asm 
    
    If Gl_rstflag = 1 Then 
       !OR r23, r24                                             ' bit setzen 
    Else 
       COM r24                                                  ' invertieren 
       !AND r23, r24                                            ' bit löschen 
    End If 
    
       !STS {Gl_pix}, r23
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    27.02.2005
    Beiträge
    58
    Hi,

    sorry, aber es will nicht.

    Code:
    '-----------------------------
    Gl_read = Gl_inp                                         'PIND                                         'Assign data
    Gl_tris = &B11111111                                     'port output
    
    
    $asm
    LDS r24, {Gl_bit}
    
    L_10x00f6:
       LDI r25,0x01                                             '  1-er laden
       !AND r24,r24                                             '  gl_bit = 0 ?
       BREQ L_10x0104                                           '  dann fertig
       CLC                                                      '  clear carry
    L_10x00fe:
       ROL r25                                                  ' rot left
       DEC r24                                                  ' bit-nr  - 1
       BRNE  L_10x00FE                                          '  fertig ?
    L_10x0104:
       LDS r23, {gl_read}
    $end Asm
    
    
    If Gl_rstflag = 1 Then
       !OR r23, r24                                             ' bit setzen
    Else
       COM r24                                                  ' invertieren
       !AND r23, r24                                            ' bit löschen
    End If
    
    !STS {Gl_pix}, r23
    '-------------------------------

  8. #18
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    sry, waren fehler drin.

    das hier jedenfalls hab ich getestet, das tut, wie es soll.
    Code:
       Gl_rstflag = 1             ' zum testen
       Gl_bit = 3                  ' zum testen 
    
       $asm
       LDS r24, {Gl_bit}
    L_10x00f6:
       ldi r25, &H01
       !AND r24,r24                                             '  gl_bit = 0 ?
       BREQ L_10x0104                                           '  dann fertig
       CLC                                                      '  clear carry
    L_10x00fe:
       ROL r25                                                  ' rot left
       DEC r24                                                  ' bit-nr  - 1
       BRNE  L_10x00FE                                          '  fertig ?
    L_10x0104:
       LDS r23, {gl_read}
    $end Asm
    
    
    If Gl_rstflag = 1 Then
       !OR r23, r25                                             ' bit setzen
    Else
       COM r25                                                  ' invertieren
       !AND r23, r25                                            ' bit löschen
    End If
    
      !STS {Gl_pix}, r23
    Anm: sowas wie "ldi r25, 0x01" ignoriert Bascom ohne meldung
    muss aber heissen (Bascom-Style)
    "ldi r25, &H01"
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #19
    Benutzer Stammmitglied
    Registriert seit
    27.02.2005
    Beiträge
    58
    Hi,

    also sorry, es geht nicht.
    Komisch es werden keine Linien angezeigt.
    So wie jetzt geht es, sobald ich Bascom Code überspringe geht es nicht.

    Code:
       '----------------------------------
       !sbi Glcd_controll,Gl_a0_asm                             'CD high
       'Gl_dat = Sys_mread
       !lds R20, {Sys_mread_asm}
       !out Gl_dat_asm, R20
       !cbi Glcd_controll,Gl_wr_asm                             'WR low
       ! nop
       !sbi Glcd_controll,Gl_wr_asm                             'WR high
       !cbi Glcd_controll,Gl_a0_asm                             'CMD low
       '! nop
       'Gl_tris = &B00000000                                     'Port input                                    'Make portd input
       clr R20                                                  '&B00000000'
       !out Gl_tris_asm,R20
    
    
       !sbi Glcd_controll,Gl_a0_asm                             'Set A0 high
       !cbi Glcd_controll,Gl_rd_asm                             'RD low
        ser R20                                                 '&B11111111
       ! nop
       ! nop
       ! nop
       ! nop
       ! nop
       'Gl_read = Gl_inp                                         'PIND                                         'Assign data
       in R18,Gl_inp_asm
       sts {Gl_read} , R18
    
       !sbi Glcd_controll,Gl_rd_asm                             'RD high
       ! nop
       !cbi Glcd_controll,Gl_a0_asm                             'CD low high
       'Gl_tris = &B11111111                                     'port output
       !out Gl_tris_asm, R20
       '--------------------------------
    
    
    
        If Gl_rstflag = 0 Then
          Set Gl_read.gl_bit
        Else
          Reset Gl_read.gl_bit
        End If
        Gl_pix = Gl_read
    
    
        Goto Jumptestasm
    '-----------------------------
    
    $asm
    LDS r24, {Gl_bit}
    
    L_10x00f6:
       LDI r25, &H01                                            '  1-er laden
       !AND r24, r24                                            '  gl_bit = 0 ?
       BREQ L_10x0104                                           '  dann fertig
       CLC                                                      '  clear carry
    L_10x00fe:
       ROL r25                                                  ' rot left
       DEC r24                                                  ' bit-nr  - 1
       BRNE  L_10x00FE                                          '  fertig ?
    L_10x0104:
       LDs R23, {gl_read}
    $end Asm
    
    
    If Gl_rstflag = 1 Then
       !OR r23, r24                                             ' bit setzen
    Else
       COM r24                                                  ' invertieren
       !AND r23, r24                                            ' bit löschen
    End If
    
    !STS {Gl_pix}, r23
    '-------------------------------
    Jumptestasm:
    
    
    
       !sbi Glcd_controll,Gl_a0_asm                             'CD high
       !lds R20, {Sys_cur_addr_asm}
       !out Gl_dat_asm, R20
       'Gl_dat = Sys_cur_addr                                    'CSRW cmd
       !cbi Glcd_controll,Gl_wr_asm                             'WR low
       ! Nop
       !sbi Glcd_controll,Gl_wr_asm                             'WR high
       !cbi Glcd_controll,Gl_a0_asm                             'CMD low
       ! nop
    
       !lds R20, {Gl_addrlo}
       !out Gl_dat_asm, R20
       'Gl_dat = Gl_addrlo
       !cbi Glcd_controll,Gl_wr_asm                             'WR low
       ! nop
       !sbi Glcd_controll,Gl_wr_asm                             'WR high
    
       !lds R20, {Gl_addrhi}
       !out Gl_dat_asm, R20
       'Gl_dat = Gl_addrhi
       !cbi Glcd_controll,Gl_wr_asm                             'WR low
       ! nop
       !sbi Glcd_controll,Gl_wr_asm                             'WR high
    
       !sbi Glcd_controll,Gl_a0_asm                             'CD high
    
       !lds R20, {Sys_mwrite_asm}
       !out Gl_dat_asm, R20
       'Gl_dat = Sys_mwrite
       !cbi Glcd_controll,Gl_wr_asm                             'WR low
       ! nop
       !sbi Glcd_controll,Gl_wr_asm                             'WR high
       !cbi Glcd_controll,Gl_a0_asm                             'CMD low
    
       !lds R20, {Gl_pix}
       !out Gl_dat_asm, R20
       'Gl_dat = Gl_pix
       !cbi Glcd_controll,Gl_wr_asm                             'WR low
       ! nop
       !sbi Glcd_controll,Gl_wr_asm                             'WR high
    
       !lds R20, {Gl_rstflag}
       clr R20
    
     'Gl_rstflag = 0

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Labornetzteil AliExpress