Autor Tema: dspic en ensamblador  (Leído 22674 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ramirotaipe

  • PIC10
  • *
  • Mensajes: 5
dspic en ensamblador
« en: 21 de Febrero de 2006, 09:38:00 »
Como veo que nadie ha sido tan especifico en trabajar en bajo nivel , voy a empezar a subir programas en bajo nivel que he bajado de internet y los voy a poner a consideracion de vosotros , para vert si por ahi nos ayudamos , soy un experto en programcion de piucs en bajo nivel , y veo que para entender completamente un dspic es necesario empezar por ahi. . Asi que solicito su colaboracion para empezar con este proyecto. Un abrazo a todos.

Desconectado electronando

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 427
RE: dspic en ensamblador
« Respuesta #1 en: 21 de Febrero de 2006, 10:51:00 »
creo que tienes razon yo empeze en basic pero me di cuenta que el asembler te abre muchas puertas , y aca falta un especialista en asembler es buena tu propuesta Sonrisa Gigante

Desconectado ivanda

  • PIC10
  • *
  • Mensajes: 2
RE: dspic en ensamblador
« Respuesta #2 en: 27 de Febrero de 2006, 15:57:00 »
hola a todos, estoy dispuesto a trabajar en asembler para los dspic, cuando comenzamos?

Desconectado ramirotaipe

  • PIC10
  • *
  • Mensajes: 5
RE: dspic en ensamblador
« Respuesta #3 en: 09 de Marzo de 2006, 09:01:00 »
Aqui les pongo unos programas uasndo lenguaje ensamblador , estoy pensando en poderme reunir en mi pais, proponer la creacion de personas apasionadas a los dspiucs, para lo cual estoy definiendo detalles para dar una charla sobre dspics.
;  files obtained  in internet    
; La estructura del programa en language ensamblador para un dspic es
;   ramirotaipe@yahoo.com                               593-03-2603171
;   codigo internacional – codigo de proincia- numero del usuario  
;    PODRA CAMBIAR LA EDUCACION QUIEN TENGA EL CORAJE DE  
;    PENSAR LIBRTEMENTE Y ACTUAR  
;    Dispongo de todos los libros mostrados en este foro de microcontroladores si ;deseas llama  no de dspics      .                                  
;    EL  A/D es habilitado para mostrar 2 pots sobre el  demo board    
;    conectado a AN7 and AN12.  VR1 es usado to vary the V/Hz ratio de la
;    modulacion.  VR2 es usado to vary the modulacion frecuencia.  Por
;    experimentacion con los 2 pot ajustando, puedes encontrar un optimo V/Hz  
;    ratio  para manejar el motor
        .equ __30F6010, 1
        .include "C:pic30_toolssupportincp30f6010.inc"
       
        .global   __reset
       
;..............................................................................
;CONFIGURACION DEL DSPIC30F6010
;..............................................................................

        config __FOSC, CSW_FSCM_OFF & XT_PLL4   ;use un oscilador XT

        config __FWDT, WDT_OFF              ;Desabilitado Watchdog Timer

        config __FBORPOR, PBOR_ON & BORV_27 & PWRT_16 & MCLR_EN
                                            ;BOR habilitado
                                            ; EL dspic empiesa a funcionar despues de 16ms .
                                           
        config __FGS, CODE_PROT_OFF         ; Proteccion de codigo desabilitado

       
;..............................................................................
;Uninitialized variables in Near data memory (Lower 8Kb of RAM)
;..............................................................................

          .section .nbss, "b"

   ; This variable is added to the 16-bit sine wave table pointer at each
   ; PWM period.  A value of 246 will provide 60 Hz modulation frequency
   ; with 16 KHz PWM
Frequency:   .space 2
   
   ; This variable is used to set the modulation amplitude and scales the
   ; value retrieved from the sine wave table.  Valid values range from 0
   ; to 32767
Amplitude:      .space 2

   ; This variable is the pointer to the sinewave table.  It is incremented
   ; by the value of the Frequency variable at each PWM interrupt.
Phase:         .space 2

;..............................................................................
;Constants stored in Program space
;..............................................................................

        .section .sine_table, "x"
        .align   256
      ; This is a 64 entry sinewave table covering 360 degrees of the
      ; sine function. These values were calculated using Microsoft
      ; Excel and pasted into this program.
      
SineTable:   
.hword 0,3212,6393,9512,12539,15446,18204,20787,23170,25329
.hword 27245,28898,30273,31356,32137,32609,32767,32609,32137,31356,30273,28898
.hword 27245,25329,23170,20787,18204,15446,12539,9512,6393,3212,0,-3212,-6393
.hword -9512,-12539,-15446,-18204,-20787,-23170,-25329,-27245,-28898,-30273
.hword -31356,-32137,-32609,-32767,-32609,-32137,-31356,-30273,-28898,-27245
.hword -25329,-23170,-20787,-18204,-15446,-12539,-9512,-6393,-3212
;..............................................................................
; Constants for this application
;..............................................................................
   ; This constant is used to scale the sine lookup value to the valid range
   ; of PWM duty cycles.  This is based on the value written to PTPER.  We will
   ; PTPER = 230 for this application, which allows duty cycles between 0 and
   ; 460.  The sine table data is signed, so we will multiply the table data
   ; by 230, then add a constant offset to scale the lookup data to positive
   ; values
   .equ PWM_Scaling, 230
   
   ; The pointer to the sign wave table is 16 bits.  Adding 0x5555 to the
   ; pointer will provide a 120 degree offset and 0xAAAA will give a 240
   ; degree offset.  These offsets are used to get the lookup values for
   ; phase 2 and phase 3 of the PWM outputs.
   .equ Offset_120, 0x5555

;..............................................................................
;Code Section in Program Memory
;..............................................................................

.text                                ;Start of Code section
__reset:
      MOV    #__SP_init, W15     ;Inicializa puntero de píla
        MOV    #__SPLIM_init, W0   ;Inicializa el  registro limite puntero de pila
        MOV    W0, SPLIM
        NOP                             ;agrega  NOP a la  SPLIM initiacializacion
       
        CALL    _wreg_init             ;llama a subrutina _wreg_init subroutine
                                           ;Opcionalmente use RCALL in lugar de  CALL
   call   Setup         ; Call the routine to setup I/O and PWM
;------------------------------------------------------------------------------
; Inicializacion de variables
;------------------------------------------------------------------------------      
      
      clr      Frequency
      clr      Amplitude
      
;------------------------------------------------------------------------------
; Principal lazo del codigo
; The PWM interrupt flag is polled in the main loop
;------------------------------------------------------------------------------       
      
Loop:   btss   IFS2,#PWMIF         ; poll the PWM interrupt flag
      bra      CheckADC      ; si esto es 1 logico, continue
      call   Modulation         ; call the sinewave modulation
      bclr   IFS2, #PWMIF      ; Clear the PWM interrupt flag
      
CheckADC:
      btss   IFS0,#ADIF
      bra      Loop
      call   ReadADC      
      bra      Loop
;------------------------------------------------------------------------------
; ADC processing subroutine
;------------------------------------------------------------------------------
ReadADC:
      
      push.d   W0
      push.d   W4
      mov      ADCBUF0,W0   ; Read the ADC results into W0
      mov      ADCBUF1,W1   ; and W1.
      asr      W0,#2,W4      ; Right shift by 2 bits to get the
      mov      W4,Frequency   ; modulation frequency.
      sl      W1,#5,W4   ; Left shift AN7 y AN12 values to get
      sl      W0,#5,W5      ; 1.15 fractional data.
      mpy      W4*W5,A   ; multiply freq, by V/Hz gain to get
      sac      A,W0      ; mod. amplitude.  Store result in W0
      mov      #28000,W1   ; Limit modulation amplitude to avoid
      cp      W1,W0   ; dead-time induced distortion in PWM
      bra      GE,NoLimit   ; modulation.
      mov      W1,W0
NoLimit:      
      mov      W0,Amplitude
      
      pop.d   W4
      pop.d   W0      

      return      

;------------------------------------------------------------------------------
; PWM sine wave modulation subroutine
;------------------------------------------------------------------------------
Modulation:      
      push.d   W0               ; Save off working registers
      push.d   W2
      push.d   W4
      push.d   W6
      push.d   W8
      push.d   W10
      
      ;  3 instrucciones siguientes inicialize el TBLPAG y pointer register
      ; for access a la sinewave data in program memory using table reads.
      
      mov      #tblpage(SineTable),W0
      mov      W0,TBLPAG
      mov      #tbloffset(SineTable),W0
      
      ; The next block of instructions loads various constants and variables
      ; used in the sinewave modulation routine.
      
      mov   Phase,W1      ; Load the sinewave table pointer
      mov   #Offset_120,W4   ; This is the value for a 120 degree offset
      mov   Amplitude,W6   ; Load the Amplitude scaling factor
      mov   #PWM_Scaling,W7   ; Load the PWM scaling value
      mov   Frequency,W8   ; Load the Frequency constant that will
               ; be added to the table pointer at each interrupt.
      
      ; This is the pointer adjustment code.  The Frequency value is added
      ; to the sine pointer to move through the sine table.  Then, offsets
      ; are added to this pointer to get the phase 2 and phase 2 pointers.
      ; Note:  If different phase offsets are desired, other constant values
      ; can be used here.   Add 0x4000 to get a 90 degree offset, 0x8000 will
      ; provide a 180 degree offset.  Here, 0x5555 has been loaded to W4
      ; to provide 120 degrees.
      
      add   W8,W1,W1   ; Add the Frequency value to the sine pointer
      add   W1,W4,W2   ; Add 120 degree offset value for phase 2
      add   W2,W4,W3   ; Add another 120 degree offset for phase 3
                   ; The sine table has 64 entries, so the pointers are right shifted
                    ; to get a 6-bit pointer value.
            
      lsr  W1,#10,W9     ; Shift la phase 1 pointer right a get el upper 6 bits
      sl   W9,#1,W9          ; Left shift by one to convert to byte address
      lsr   W2,#10,W10   ; Shift la phase 2 pointer right a get el upper 6 bits
      sl     W10,#1,W10   ; Left shift by one to convert to byte address
      lsr   W3,#10,W11    ; Shift la phase 3 pointer right a get la upper 6 bits
      sl     W11,#1,W11    ; Left shift by one to convert to byte address
      
      ; Now, the pointer for each phase is added to the base table pointer
      ; to get the absolute table address for the lookup value.  The lookup
      ; value is then scaled for the correct amplitude and for the range
      ; of valid duty cycles. El next block of instructions calculates el
      ; duty cycle for phase 1.  The phase 2 and phase 3 code is the same.
      
      add   W0,W9,W9   ; Form the table address for phase 1
      tblrdl    [W9],W5   ; Read the lookup value for phase 1
      mpy   W5*W6,A   ; Multiply by the amplitude scaling
      sac    A,W5      ; Store the scaled result
      mpy   W5*W7,A   ; Multiply by the PWM scaling factor
      sac   A,W8      ; Store the scaled result
      add   W7,W8,W8   ; Add PWM scaling factor a produce 50% offset
      mov   W8,PDC1   ; Write the PWM duty cycle
      
      ; The next block of code calculates the duty cycle for phase 2.
      
      add   W0,W10,W10      ; Form the table address for phase 2
      tblrdl    [W10],W5      ; Read the lookup value for phase 2
      mpy   W5*W6,A               ; Multiply by the amplitude scaling
      sac    A,W5          ; Store the scaled result
      mpy   W5*W7,A           ; Multiply by the PWM scaling factor
      sac   A,W8         ; Store the scaled result
      add   W7,W8,W8   ; Add  PWM scaling factor  produce 50% offset
      mov      W8,PDC2   ; Write the PWM duty cycle
      
      ; The next block of code calculates the duty cycle for phase 3.
      
      add   W0,W11,W11      ; Form the table address for phase 3
      tblrdl    [W11],W5      ; Read the lookup value for phase 3
      mpy   W5*W6,A      ; Multiply by the amplitude scaling
      sac    A,W5         ; Store the scaled result
      mpy   W5*W7,A      ; Multiply by the PWM scaling factor
      sac   A,W8         ; Store the scaled result
      add   W7,W8,W8   ; Add  PWM scaling factor produce 50% offset
      mov   W8,PDC3   ; Write the PWM duty cycle
      
      ; Now, save off the adjusted sinewave table pointer so it can be
      ; used during the next iteration of this code.
      
      mov      W1,Phase
      
      pop.d   W10               ; restore working registers
      pop.d   W8
      pop.d   W6
      pop.d   W4
      pop.d   W2
      pop.d   W0
      
      return                  ; return from the subroutine

;------------------------------------------------------------------------------
; PWM and ADC setup code
;------------------------------------------------------------------------------                                     

Setup:
   
      ; The first thing we need to do before enabling the PWM is to
      ; configure the I/O and reset the power module.  The control board
      ; has a driver IC that buffers the PWM control lines.  The active
      ; low output enable for this buffer is on port RD11.  
      ; The power module has an active high reset line which is connected
      ; to port RE9.
      
      clr      PORTD
      clr      PORTE
      mov      #0xF7FF,W0         ; Make RD11 an output to drive PWM buffer
      mov      W0,TRISD         ; output enable.
      mov      #0xFDFF,W0         ;
      mov      W0,TRISE         ; Make RE9 an output for power module reset
      
      ; Now, ensure the power module is reset by driving the reset line for
      ; a few usec.
      
      bset   PORTE,#9
      repeat   #39
      nop
      bclr   PORTE,#9
      
      ; Setup the ADC
      
      mov      #0x0404,W0         ; scan inputs
      mov      W0,ADCON2         ; 2 sample/converts per interrupt
      mov      #0x0003,W0         ;
      mov      W0,ADCON3         ; Tad is 2*Tcy
      clr      ADCHS         
      clr      ADPCFG         ; all A/D pins Analog mode
      clr      ADCSSL            
      bset   ADCSSL,#7         ; enable scan of AN7
      bset   ADCSSL,#12         ; enable scan of AN12
      mov   #0x8066,W0       ; enable A/D, PWM trigger, auto sample
      mov   W0,ADCON1         
      bclr   IFS0,#ADIF      ; clear A/D interrupt flag
      
      ; Now, setup the PWM registers
      
      mov   #0x0077,W0      ; complementary mode, #1, #2, and #3
      mov   W0,PWMCON1   ; pairs are enabled
      mov   #0x000F,W0      ; 2usec deadtime at 7.38 MIPS
      mov   W0,DTCON1
      mov   #PWM_Scaling, W0   ; set period  16KHz PWM at 7.38 MIPS
      mov   W0,PTPER
      mov   #0x0001,W0         
      mov   W0,SEVTCMP   ; setup  special event trigger for the ADC
      mov   #0x0F00,W0      ; set the special event postscaler to 1:16
      mov   W0,PWMCON2         
      mov   #0x8002,W0   ; PWM timebase enabled, center aligned mode
      mov      W0,PTCON
      return               ; return from the Setup routine

;..............................................................................
;Subroutine: Initialization of W registers to 0x0000
;..............................................................................

_wreg_init:
        CLR W0
        MOV W0, W14
        REPEAT #12
        MOV W0, [++W14]
        CLR W14
        RETURN

;--------End of All Code Sections ---------------------------------------------

.end                               ; FIN DEL CODIGO DE PROGRAMA

Desconectado ramirotaipe

  • PIC10
  • *
  • Mensajes: 5
RE: dspic en ensamblador
« Respuesta #4 en: 09 de Marzo de 2006, 09:04:00 »
;  files obtained  in internet    
; La estructura del programa en language ensamblador para un dspic es
;   ramirotaipe@yahoo.com                               593-03-2603171
;   codigo internacional – codigo de proincia- numero del usuario  
;    PODRA CAMBIAR LA EDUCACION QUIEN TENGA EL CORAJE DE  
;    PENSAR LIBRTEMENTE Y ACTUAR  
;    Dispongo de todos los libros mostrados en este foro de microcontroladores si ;deseas llama  no de dspics      .                                  

;*******************************************************************                                                                            
;    Other Files Required: p30F2010.gld, p30f2010.inc                        
;    Tools Used:   MPLAB IDE : 6.41                                        
;                                                                            
;*******************************************************************                                                                          
;    ESTRUCTURA DEL PROGRAMA EN ENSAMBLADOR PARA UN DSPIC                                                      
 ;   NATIONAL UNIVERSITY OF CHIMBORAZO ( ECUADOR)
;    PODRA CAMBIAR LA EDUCACION QUIEN TENGA EL CORAJE DE  
;    PENSAR LIBRTEMENTE Y ACTUAR
;    ramirotaipe@yahoo.com                   593-03-2603171                                            
 ; codigo internacional – codigo de proincia- numero del usuario
;      Dispongo de  todos los libros de microcontroladores mostrados en este foro si ;deseas llama , de microcontroladores no de dspics                                        
        .equ __30F2010, 1
        .include "p30f2010.inc"

;..............................................................................
;Configuration bits:
;..............................................................................

        config __FOSC, CSW_FSCM_OFF & XT_PLL4   ;use cristal oscilador
                                               ;con el 4x PLL

        config __FWDT, WDT_OFF              ;Desabilitado Watchdog Timer

        config __FBORPOR, PBOR_ON & BORV_27 & PWRT_16 & MCLR_EN
                                            ;Set Brown-out Reset voltage and
                                            ;and set Power-up Timer to 16msecs
                                           
        config __FGS, CODE_PROT_OFF         ;Desabilitado protecion de codigo


;..............................................................................
;Declaraciones globales
;..............................................................................

        .global __reset          ;The label for the first line of code.

        .global __T1Interrupt    ;Declare Timer 1 ISR name global

;..............................................................................
;Unitialized storage in data space
;..............................................................................
      .section .bss

Count:   .space 2
;..............................................................................
;Constants stored in Program space
;..............................................................................
        .section .asciitext, "x"
        .palign 2                ;Align next word stored in Program space to an
                                 ;address that is a multiple of 2
Message:
        .ascii   "dsPIC Starter Demo Board
"


;..............................................................................
;Code Section in Program Memory
;..............................................................................

.text                             ;Start of Code section
__reset:
        MOV #__SP_init, W15          ;Initalize the Stack Pointer
        MOV #__SPLIM_init, W0     ;Initialize the Stack Pointer Limit Register
        MOV W0, SPLIM
        NOP                                        ;Add NOP to follow SPLIM initialization
       
        CALL _wreg_init                    ;Call _wreg_init subroutine
                                 
    clr Count             ; Initialize the count variable used in ISR

InitPorts:
               
        mov   #0x003F,W0         ; Setup all analog pins for digital mode
        mov   W0,ADPCFG         ; by writing ADPCFG register
       
        clr   LATB      ; Clear all I/O port registers.
        clr   LATC
        clr   LATD
        clr LATE
        clr TRISB      ; Make all ports outputs except RF2, RF3
        clr   TRISC      ; which will be used for UART
        clr   TRISD
        clr   TRISE
        mov   0x000C,W0
        mov   W0,TRISF
       
        SetupUART:
      
      mov   #0x8000,W0      ; Setup UART control registers
      mov   W0,U1MODE
      clr   U1STA
      mov   #192,W0   ; Baudrate value  2400 baud  Fcy = 7.37 MHz
      mov      W0,U1BRG
      bset   U1STA,#UTXEN   ; Enable UART transmit
            
      bset   CORCON,#PSV      ; Enable program space visibility
      
         ; Load PSV page register and setup W1 as a pointer to the
         ; ASCII text string stored in program memory
      mov      #psvpage(Message),W0
      mov      W0,PSVPAG      
      mov      #psvoffset(Message),W1

      ; The next block of code writes the ascii string stored in
      ; program memory to to the UART.  The loop repeats until a
      ; null character is found.
MsgLoop:
      mov.b   [W1++],W0      ; Read the data from P.M. using PSV
      cp0.b   W0         ; Is the character 0?
      bra      Z,MsgDone   ; If the character is 0, we"re done.
      call   WriteChar      ; If not, write the character to UART
      bra      MsgLoop   ; Go back to the top of the loop.
            
MsgDone:         
         
         mov      #54084,W0      ; Gives 1/19th second period with 7.38 MHz
         mov      W0,PR1      ; clock and 1:8 prescaler
         bset   T1CON,#TCKPS0      ; 1:8 timer prescaler
         bset   T1CON,#TON      ; Turn on the timer
         bclr   IFS0,#T1IF
         bset   IEC0,#T1IE
         
;..............................................................................
;Software main loop
;..............................................................................

; The main loop looks for incoming characters on the UART and echoes
; them to back to the sender.

Loop:   clrwdt               ; Clear the watchdog timer.
      
      btss   U1STA,#URXDA   ; Is receive data available?
      bra   Loop         ; If not, go back to top of loop.
      
      mov   U1RXREG,W0   ; If so, get the data from the RX buffer
      call   WriteChar      ; Transmit the character back.
      
      bra   Loop         ; Go back to top of loop.


;..............................................................................
;Subroutine: Initialization of W registers to 0x0000
;..............................................................................

_wreg_init:
        CLR W0
        MOV W0, W14
        REPEAT #12
        MOV W0, [++W14]
        CLR W14
        RETURN

;..............................................................................
;Subroutine: Writes character to UART
;..............................................................................

WriteChar:
      btss   U1STA,#TRMT   ; Wait  present transmission to complete
      bra   WriteChar
      mov   W0,U1TXREG   ; Write the character to TX buffer
      return

;..............................................................................
;Timer 1 Interrupt Service Routine
;..............................................................................

; The Timer1 interrupt service routine toggles all of the dsPIC30F2010 I/O
; lines in succession.  Each time the interrupt occurs, the last I/O line
; is turned off and the next one is turned on.  A count value is maintained
; and a computed jump table is used to determine which I/O pin to activate.

__T1Interrupt:
      BCLR    IFS0, #T1IF    ; Clear the timer interrupt flag Status
        push.d   W0         ; Save W0 and W1 on stack
               
      inc    Count      ; Increment the count variable
      mov   #19,W0            
      cp   Count      ; Is the count value 19?
      btsc   SR,#Z
      clr   Count      ; If so, reset count to 0.
      call   IO_Pin_Scan      ; Call  routine that writes the I/O pins.
       
        pop.d   W0            ; Restore W0 and W1
        retfie                              ;Return from Interrupt Service routine
      

;..............................................................................
;Subroutine for toggling I/O pins
;..............................................................................

; This routine is called after every Timer1 interrupt.  The count value
; adjusted in the Timer1 ISR is used to form a computed jump address.  The jump
; address determines which I/O pin to turn on.

IO_Pin_Scan:

      mov   Count,W0
      mov   #3,W1
      
      mul.uu W0,W1,W0
      
      bra      W0
               ; Count = 0
      bclr   LATE,#0
      bset   LATB,#0
      return
      
               ; Count = 1
      bclr   LATB,#0
      bset   LATB,#1
      return
      
               ; Count = 2
      bclr   LATB,#1
      bset   LATB,#2
      return
      
               ; Count = 3
      bclr   LATB,#2
      bset   LATB,#3
      return
      
               ; Count = 4
      bclr   LATB,#3
      bset   LATB,#4
      return
      
               ; Count = 5
      bclr   LATB,#4
      bset   LATB,#5
      return
      
               ; Count = 6
      bclr   LATB,#5
      bset   LATC,#13
      return
      
               ; Count = 7
      bclr   LATC,#13
      bset   LATC,#14
      return
      
               ; Count = 8
      bclr   LATC,#14
      bset   LATD,#1
      return
      
               ; Count = 9
      bclr   LATD,#1
      bset   LATD,#0
      return
      
               ; Count = 10
      bclr   LATD,#0
      bset   LATE,#8
      return
      
               ; Count = 11
      bclr   LATE,#8
      bset   LATF,#3
      return
      
               ; Count = 12
      bclr   LATF,#3
      bset   LATF,#2
      return
      
               ; Count = 13
      bclr   LATF,#2
      bset   LATE,#5
      return
      
               ; Count = 14
      bclr   LATE,#5
      bset   LATE,#4
      return
      
               ; Count = 15
      bclr   LATE,#4
      bset   LATE,#3
      return
      
               ; Count = 16
      bclr   LATE,#3
      bset   LATE,#2
      return
      
               ; Count = 17
      bclr   LATE,#2
      bset   LATE,#1
      return
      
               ; Count = 18
      bclr   LATE,#1
      bset   LATE,#0
      return

;--------End of All Code Sections ---------------------------------------------

.end                               ;End of program code in this file


Desconectado ivanda

  • PIC10
  • *
  • Mensajes: 2
RE: dspic en ensamblador
« Respuesta #5 en: 14 de Marzo de 2006, 17:57:00 »
no les parece empezar desde lo mas basico como por ejemplo encender un led

Desconectado hernando2999

  • PIC12
  • **
  • Mensajes: 99
RE: dspic en ensamblador
« Respuesta #6 en: 14 de Marzo de 2006, 22:20:00 »
amigo ramirotaipe felicito tu labor... te cuento que yo tambien se algo de asm ...he hecho algunas cositas ...ejm www.icotech.8k.com y la verdad como dices el asm puro es lo mejor.

comparto la idea de ivanda lo mejor es empezar por lo basico asi despues podremos dar pasos agigantados.

pdt: tambien me le apunto

saludos

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: dspic en ensamblador
« Respuesta #7 en: 15 de Marzo de 2006, 00:08:00 »
Escrito originalmente por hernando2999
amigo ramirotaipe felicito tu labor... te cuento que yo tambien se algo de asm ...he hecho algunas cositas ...ejm www.icotech.8k.com y la verdad como dices el asm puro es lo mejor.

comparto la idea de ivanda lo mejor es empezar por lo basico asi despues podremos dar pasos agigantados.

pdt: tambien me le apunto

saludos

El tema de aprender .asm para los dsPIC es interesante, pero hernando2999 de esto a comparar como se programa un PIC de la familia 16F te aseguro que tendrás que aprender bastante mas del tema, aparte un tema es copiar y otro desarrollar desde cero.

Un saludo a todos

Atte. CARLOS

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: dspic en ensamblador
« Respuesta #8 en: 16 de Marzo de 2006, 05:27:00 »
Escrito originalmente por hernando2999
amigo ramirotaipe felicito tu labor... te cuento que yo tambien se algo de asm ...he hecho algunas cositas ...ejm www.icotech.8k.com y la verdad como dices el asm puro es lo mejor.

comparto la idea de ivanda lo mejor es empezar por lo basico asi despues podremos dar pasos agigantados.

pdt: tambien me le apunto

saludos



Ramiro y Hernando, realmente aprecio vuestro esfuerzo pero también quisiera emitir mi opinión.

Yo programo en ensamblador en los 16F y en los 18F.  En los 18F me he visto envuelto en proyectos complejos de control que me han llevado a optar por la facilidad del C18 (el cual tampoco es tannn fácil que digamos).  Porque? bueno por cuestión de tiempos , necesitaba dar resultados en un plazo corto y con el ensamblador iba a estar un muuy buen tiempo ya que la lógica es complicada, la matemática inevitablemente de punto flotante y el algoritmo encima no estaba depurado asi que habia que retocarlo contantemente .  No a nivel de cambiarle las constantes sino a nivel de cambiarle TODO!

Es por esto que si bien me siento muy cómodo con el ensamblador también opté por rapidez en del desarrollo.

Creo que cuando uno usa los pics mas grandes es porque se enfrenta a proyectos más complejos.  Es ahí donde uno termina realmente enredado o al menos con un trabajo muy lento con el ensamblador (lento no en ejecución sino en tiempos de desarrollo).  En tiempos donde desarrollar algo "rápido" es más importante en que desarrollarlo y que ejecute super rápido... prefiero lo primero.  Es que si no me alcanza la memoria de un 18F me busco uno un poco mas grande y la diferencia son un par de dólares y el cambio en el firmware sería bastante poco.  

Por otra parte el costo adicional por los kbytes extra sería insignificante al lado del costo de los días o semanas de más que me podría llevar implementar algo o tenerlo que modificar luego si está todo en ensamblador.

Entonces como regla general, para los 16F trabajo en ensamblador
En los 18F en C e intercalo con el ensamblador cuando realmente vale la pena por tiempos o bien por espacio (aunque les digo amigos que es bastante óptimo en relación con el ensamblador).  

En las pcs pasó lo mismo allá por los principios de los "90.  Era la lucha entre programar en C o seguir con el ensamblador.  ¿Quien ganó? Bueno, depende lo que uno mire... si uno se fija en que se usó mas bueno ganó el C, pero esto depende para que tipo de aplicaciones uno haga.  

Recuerdo que por ejemplo los motores graficadores 3D hacian todo en C, pero se ponian timers por todos lados para controlar la demora de ciertas rutinas.  Cuando una rutina se utilizaba mucho y era crítica entonces se la optimizaba y se la pasaba a ensamblador.  He aquí la utilidad del ensamblador.

Yo a los fines de no reinventar la rueda y viendo que el mundo va hacia ese lado he optado por arrojar mis viejas cosas de ensamblador y programar en C en los grandes pics donde la complejidad de mis proyectos y de la lógica me ha llevado a darme cuenta que hago más en menos tiempo.

Para los 16F donde el C es poco óptimo realmente sigo usando el ensamblador, porque además tengo cientos de rutinas y macros que me resuelven todo lo que me he topado resolver.

Entonces, si bien aprecio el esfuerzo quisiera decir que yo en lo personal si fuera uds usaría el C30 e implementaría el ensamblador cuando realmente sea necesario y ojo que les habla un "fan" del ensamblador...

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado ramirotaipe

  • PIC10
  • *
  • Mensajes: 5
RE: dspic en ensamblador
« Respuesta #9 en: 23 de Marzo de 2006, 10:02:00 »
ramirotaipe@yahoo.com
Si queremos que la educación cambien debemos pensar libremente y actuar.
Esto implica continuar hAcia la perfección, TODO OBJETO ES PERFECTIBLE ( día a día se lo mejorara)
DISPONGO DE TODOS LOS LIBROS QUE SE INDICAN AL FINAL DE ESTE FORO.
ADEMÁS DISPONGO DEL LIBRO : Networking and Internetworking with microcontroller del autor Eady , consulte en google , si te interesa sacar copias llama , o si tienes podemos compartirlo con otro libro de interés común

ramirotaipe@yahoo.com                        0593-03-2603171
código de país + código de ciudad + numero de usuario
Algunos Comandos usando en ensamblador para dspics
MOV  W0,W1
Mueve el contenido del registro W0 al registro W1. Como se sabe un dspics esta compuesto de 16 registros de trabajo desde W0, W1, W2... W15 de 16 bits de extensión de cada registro, por este esta instrucción se puede realizar entre registros de trabajo ( registros W) y registros que disponga el dspic, también son validas las siguientes instrucciones:
MOV W1,W2                    ; mueve el contenido de W1 a W2
MOV W5, TRISA          ; mueve el contenido de W5 a TRISA
MOV W0,[W1]   ; mueve el contenido de W0 a la dirección de memoria especificada
           ;W1
MOV WREG,0x0100
Al registro W0 también se lo conoce como WREG   por ende aquí estamos moviendo el contenido de W0 a la dirección de memoria 0x0100
MOV  0x0102,W6
Mueve la palabra ( 16 bits ) de la localización 0x0102 al registro W6.
MOV  #0x0003,W0
Mueve un literal ( un numero) al registro WEG=W0
ADD W0,[W4],W5  
Sumo el contenido de W0 mas el contenido de la dirección de memoria especificado por W4 y el resultado lo coloco en el registro de W5 , la suma es en forma de palabra ( 16 bits)
ADD 0x0106,WREG
Suma W0  al contenido de la dirección de memoria especificado por 0x0106 y lo coloco el resultado en W0
ADD RAM100
Sumo el contenido de la dirección de memoria ( variable) especificad por RAM100 al registro W0 y el resultado lo deposito en la variable RAM100 mismo
PUSH.S
Guarda en la pila de datos el valor de W0, W1, W3, y del registro Status
PUSH W0
Guarda en la pila el valor de W0, esta instrucción es equivalente en lenguaje ensamblador con mov a MOV W0,[W15++]
PUSH W8
Guarda en la pila de datos el valor de W8
POP.S
Retorna de la pila de datos el valor de W0, W1, W3, y del registro Status
POP W0
Retorna de la pila de datos el valor de W0, esta instrucción aquí descrita con mov es equivalente a MOV [--W15],W0
BTSC SR,#Z
El BIT Z (zero) del registro estatus es cero? Si es salta una instrucción, sino continua con la siguiente instrucción.
BSET PORTB,#3
Si el BIT 3 de la pórtico PORTB del Dspic30Fxxxx es 1? Si es salta una instrucción , sino continua con la siguiente instrucción.
MOV 0xFF00, W0
MOV WO, TRISB
Configuro los pines 15:8 del port B como entradas y los pines 7:0 del port B del dspic como salida
LAC W1,A
Muevo el contenido de W1 al registro acumulador del DSPIC
MPY  W4*W5,A
Multiplique W4*W5 y el resultado coloquelo en acumulador
, esta instrucción se ejecuta en dos ciclos de reloj , he aquí en donde entra en operación las ventajas y características del dspic
SAC.R  A,W0
Guarda Acumulador al registro W0
SETM TRISA      ; EQUIVALE A TRISA=0xFFFF
BCLR PORTA,#14    ; pongo a 0 logico el ,pin 14 del PORTA


COMANDOS EN MPLAB

.bss
Ensambla las variables a usarse
.bss
B1:   .space4      ; cuatro bytes reservado para B1
B2:   .space1               ; 1 byte reservado par B1
Count:   .space 2    ; 2 bytes reservado para Count


También tenemos otro comando que es el:
.text
Es la sección donde va ir el código del programa en si.
.text
.global¬__reset
   __reset:
      MOV B1,W1
   Loop:
      Bra Loop    ; equivalente a goto
   Done:
.end

   PINES DE UN DSPIC30F4011
 

EN LOS pines 14, y 15 van conectados el oscilador de cristal de 4, 10, 16, 20 MHZ tal como se les conecta cuando se trabaja con los microcontroladores pudiendo por software incrementar esta velocidad hasta 16 veces ya que dispone de un PLL


Pregunta suelta:
Se trata de diseñar un sistema de control  de electrodomésticos usando los celulares.
De un celular se envía un mensaje  ( código) digamos el 1 se recibe este mensaje en el otro celular este mensaje el 1  , este dato se le ingresa la computadora  y de ahí vía el pórtico serial se la envía al microcontrolador y se activa el electrodoméstico conectado al microcontrolador. La pregunta ¿ es una ignorancia  decir a los alumnos para hacer este proyecto trabajen en java o no ¿
Para el microcontrolador se  trabaja en lenguaje C, assembler, Pascal. Basic, estoy de acuerdo.
Para conectar el computador al celular existen celulares específicos que ya vienen con su propio cable y software , entonces para que el Java ¿
Si alguien m,e da da una razon logica y que me convenza , escríbame a mi correo o deje su respuesta en este foro , que como premio le envio a su correo el primer capitulo del libro Networking and Internetworking with microcontroller del autor Eady , solo necesito que me envié la razón , por cuanto el proyecto en si ya lo tengo realizado y en ningún momento vi para que usar JAVA , sobre todo en que, pero no todos los diseñadores somos iguales


Ramiro sabe ingrese a uah.es/biblioteca/acceso y vea los listados de la
biblioteca y digame alguno, yo puedo sacar de la biblioteca y
fotocopiar aparte
 
bueno entonces yo procedere a la compra de libro esta o maximo la otra
semana le mantendre informado
 
raul


Desconectado juanramirotaipe

  • PIC10
  • *
  • Mensajes: 5
DSPIC DONDE COMPRO ALGUNAAS EN ESPAÑA
« Respuesta #10 en: 06 de Julio de 2006, 13:18:14 »
Tdeseandoles exitos, digamne cualquierra por favor donde puedo comprar en españa estos dichosos integrados dev los dspic30Fxxxx

Desconectado JavisusII

  • PIC12
  • **
  • Mensajes: 79
Re: dspic en ensamblador
« Respuesta #11 en: 06 de Julio de 2006, 16:56:48 »
Buenas amigos,

Quiero felicitarles antes de nada si este es el camino que quieren emprender, un camino arduo complicado.
Quisiera manifestarles un par de obserbaciones:

En primer lugar creo que es incorrecto pensar que uno pueda ser experto en dsPIC,
una persona es ingeniero/a (o técnico) especialista en máquinas hidráulicas, generadores de ozono, automatización, etcc,etc,etc.  .  Experto que, para desarrollar su tarea hace uso de por ejemplo los microcontroladores, autómatas,sensores, ordenadores, etc etc.
Comprenden??  ,los expertos en pic trabajan para MICROCHIP. Los demás simplemente utilizamos los pic, como una herramienta más de miles que se pueden necesitar.

En segundo lugar, no puedo seguir sin hacer mención del post echo por MAUNIX, ya que , si bien muchas veces no he estado de acuerdo con él, esta vez creo que la observación que hace es CRUCIAL, del todo correcta, poniendo aquí si post en toda su esencia.

En tercer lugar, pensar que un programador en ensamblador pueda ser un gran conocedor de la lógica interna del dsPIC, hace perder la perspectiva correcta: La posibilidad de ejecución de una APLICACION, lo único verdaderamente importante. Un programador en C30 puede ser un gran conocedor de la estructura interna del dsPIC. Hay muchos programadores que no utilizan librerías pre-echas ,se las hacen ellos o manipulan directamente los registros, casi como lo haría un programador de asembler.

Otro punto importante creo que es la facilidad , palabra mágica FACILIDAD, si amigos,
bastante díficil puede ser una aplicación como para complicarse la vida con otros menesteres. El C es versátil, muy potente, fácil de usar, y resolutivo.
Un dato importante es ver que la mayoría de programas complejos están en C. Pensad además ,que casi todos los esfuerzos que está haciendo MICROCHIP, de cara a la mejora de sus microcontroladores, es para potenciar más el poder de ejecución de su intérprete en C como el C30.

Un saludo a todos, por supuesto.
     




     
Xavi (Barcelona)

Desconectado juanramirotaipe

  • PIC10
  • *
  • Mensajes: 5
Re: dspic en ensamblador
« Respuesta #12 en: 10 de Julio de 2006, 19:24:22 »
Respecto a los dspics te envio ciertas definiciones correspondiente a las secciones.
Las secciones son básicamente bloques de memoria que ensambaldor emplea para organizar la memoria.
.text               define una sección de código ejecutable
.bss               define una sección de datos no inicializados, solo se reserva el espacio
.data              seccion de datos inicializados.
También se pueden definir secciones por los usuarios ( con la directiva section ,son diferentes atributos que no son mas que extensiones de las tres básicas).
.xbss       sección de datos no inicializados en la zona de memoria x
x.data      sección de datos inicializados en la zona de memoria x
.nbss      seccion de datos no inicializados en la zona de memoria near
.ndata      seccion de datos inicializados en la zona de memoria near.
.ybss      seccion de datos no inicializados en la zona de memoria y
.ydata      seccion de datos inicializados en la zona de memoria y
Los atributos mas importantes son:
.code      indica codigo ejecuttable en memoria de programa
.xmemory    indica zona de memoria x
.ymemory   indica zona de memoria y
.near      indica zona de memoria near
Ejemplos:
.section.constantes,code
cte1: .word 0x0002
cte2: . word 0x0003
cte3: . word 0x0005
cte4: . word 0x000A
.section.xbss,bss,xmemory   ; variables no inicializadas en la memoria de datos x
   variable:.spce 4    ; se reserva 4 bytes

.section.xdata,data,xmemory  : variables inicializadas en la memoria de datos x
var:.hword 0x1111,0x2222,0x3333,0x2376  ; hword hace que las variables introducidas sean colocadas en forma consecutiva.
.section.ybss,bss,ymemory    ; variables no inicializadas en la memoria de datos y
    var: .space 8      ; se reserva 8 bytes
section.ydata,data,ymemory  : variables inicializadas en la memoria de datos y
matriz:.hword 0x1411,0x2522,0x3339,0x2376 
.section.nbss,bss,near
var: .space 8      ; se reserva 8 bytes no inicializados en memoria near
Para llamar a subrutinas procedemos asi:
.global_main
.text
_main:
   mov #0x00FF,W0       ; W0= 0X00FF
   mov #0xFF00,W1      ; W1= 0xFF00
   mov #0xFFFF,W2      ; W2=0xFFFF
   call subrutina
goto main
subrutina:
   mov W0,W3         ;W3=0x00FF
   mov W1,W4         ;W4=0x00FF
   mov W2,W5         ; W5=0xFFFF
   clr W0            ;  W0=0x0000
   clr W1            ; W1=0x0000
   clr W2            ; W2=0x0000
   return
.end

Desconectado juanramirotaipe

  • PIC10
  • *
  • Mensajes: 5
Re: dspic en ensamblador
« Respuesta #13 en: 10 de Julio de 2006, 19:48:23 »
Javi, deseandote exitos, si tu deseas comprender los dspics , se ha visto que es necesario conocer sus registros internos, pasa algo similar con los pics, primero se aprende los registros internos, y que mejor que el ensamblador para comprenderlo mejor. Una ves que se comprende sus registros internos , puedes trabajar en alto nivel y te resulta en una forma autodidactica para aprender, te comento que asi aprende a manejar los pics y ahora ya los uso mas correctamente en lenguaje de alto nivel

responfdeme a mi pregunta
, en españa en que direccion especifica de una tienda elecrtronica los compro
ramirotaipe@yahoo.com

Desconectado juanramirotaipe

  • PIC10
  • *
  • Mensajes: 5
Re: dspic en ensamblador
« Respuesta #14 en: 18 de Julio de 2006, 16:50:22 »
REspecto a la pregunta que hice donde enciontrar dspic en españa , les paso el dato yo mismo, SE HA VISTO QUE POR MAS PEQUEÑAS COSAS QUE ESCRIBAMOS ESTAS PUEDEN SERVIRLE A OTRA PERSONA.
 
http://www.msebilbao.com/tienda/advanced_search_result.php?keywords=dspic
 
   LIBRO10   Libro 10: "dsPIC Diseño Práctico de Aplicaciones"     27.90


 
   24DSPIC30F4013   Procesador de Señal     16.00€