Autor Tema: error al compilar con assembler (apartado Config)  (Leído 2285 veces)

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

Desconectado pumuky

  • PIC10
  • *
  • Mensajes: 7
error al compilar con assembler (apartado Config)
« en: 20 de Enero de 2011, 14:36:57 »
Saludos compañeros.
Adjunto un programa en ensamblador para el pic 16f84, vereis que en las primeras líneas el programador informa que se debe introducir una dirección de memoria en el apartado -CONFIG, lo señala con "????"
Pués bien, realmente no sé que poner aquí. El problema es que si no pongo nada, al compilar me indica que estoy enviando información en la misma dirección. Supongo que estoy direccionando salidas o varibles al mismo sitio.
Supongo que alguien con un poco de experiencia verá el error enseguida. Bueno lo adjunto , a ver si hay suerte. Muchas gracias.


PROGRAMA:

;**************************************************
; Contador de 3 digitos UP/DOWN
; piccounter3d.txt
;
; (c) 2001 Elias Jahn
; (elias_jahn@clix.pt)
; http://electronicaxxdelphi.cjb.net
;**************************************************       


        PROCESSOR       16F84
        RADIX           DEC
        INCLUDE         "p16f84.inc"
        ERRORLEVEL      -302

       

   ;__CONFIG        ????H     usar este "ajuste" dos Bits de Configuração do PIC apenas,
                                   ;se o programador que usa não tiver a opção de as configurar.
                                   ;neste caso insere um valor onde estão os ? que configura o seguinte:
                                   ;XT Oscillator, Code Protect Disabled (0), WatchDog Timer enabled (1), PowerUp Timer enabled (1).
                                   ;Assim tambem terá que por os bits no caso do programador ser capaz disso.
                              ;os valores hex da configuração aqui no codigo não os conheço ainda, perdoe-me... tb nunca os irei usar, eu
                                   ;uso o PonyProg, e ai dá para ajustar os bits todos. Bem, agora ao Programa:
Digit0       EQU      2
Digit1      EQU        1
Digit2      EQU      0
Reset       EQU      0
Count       EQU      3
UpDown      EQU      4     
   
            ORG      0Ch
Number      RES      3
Zero        RES      3
Counter     RES      1
Counter2    RES      1
Idle        RES      2
Down        RES      1
            ORG        00h

            bsf      STATUS,RP0
            movlw    B'00011000'
            movwf    TRISA
            movlw    B'00000001'
            movwf    TRISB
            bcf      STATUS,RP0
         
       movlw    0
       movwf    Number             ;todos os valores dos digitos em zero
       movlw    0
       movwf    Number+1
       movlw    0 
       movwf    Number+2
       bcf      PORTA,Digit0       ;todos os digitos desligados
       bcf      PORTA,Digit1
       bcf      PORTA,Digit2
            bcf      Idle+1,0           ;incicializar as variaveis
            bcf      Down,0           
Main
            call     Delaywait         
       call     TheDigit0          ;fazer aparecer no display o valor devido no primeiro digito
       call     Delaywait
            call     TheDigit1          ;proceder assim tb com os outros dois digitos
       call     Delaywait
            call     TheDigit2
            btfss    Idle+1,0           ;estamos ocupados por um botão ter sido premido anteriormente?
            goto     Continue           ;não? então bora lá continuar
            decfsz   Idle,1             ;ai sim? então decrementa lá isso, pá
            goto     Main               ;já acabou? não? vamos para Main repetir a cena toda
       btfss    PORTB,Reset        ;sim? então teste se botão Reset ainda está premido
            goto     Prepare            ;prepare mais uma longa espera...
            btfss    PORTA,Count        ;teste se botão Count ainda está premido
       goto     Prepare           
            btfss    PORTA,UpDown       ;teste se botão Up/Down ainda está premido
            goto     Prepare
Continue                                ;vamos aqui no caso normal
            bcf      Idle+1,0           ;nada de esperas desnecessarias
            btfss    PORTB,Reset        ;Reset premido?
            goto     ResetIt            ;então reseta-me lá isso
            btfss    PORTA,UpDown       ;para cima ou para baixo?!
            goto     SetUpDown         
            btfsc    PORTA,Count        ;Vamos ou não vamos contar?
            goto     Main               ;não?? então repete tudo de novo
Increment
            btfsc    Down,0             ;vamos contar para baixo?
            goto     Decrement          ;então vamos a Decrement
            incf     Number,F           ;não, vamos é incrementar
       movf     Number,W           
       sublw    10                 ;tudo isto aqui para baixo serve para detectar a passagem do 9 para 10 e para por isso a zero neste caso
       btfss    STATUS,Z
       goto     Prepare
       movlw    0
       movwf    Number
       incf     Number+1,F         
       movf     Number+1,W
       sublw    10
       btfss    STATUS,Z
       goto     Prepare
       movlw    0
       movwf    Number+1
       incf     Number+2,F
       movf     Number+2,W
       sublw    10
       btfss    STATUS,Z
       goto     Prepare
            movlw    0
       movwf    Number+2   
Prepare                               ;em caso de espera prolongada telefona para:
            bsf      Idle+1,0         ;temos que esperar...
       movlw    50               ;mais precisamente 50 vezes (valor pode ser mudado para tempos maiores ou menores de reposta dos botões)
            movwf    Idle
              goto     Main
ResetIt                               ;o nome diz tudo...
            movlw    0
            movwf    Number
            movwf    Number+1
            movwf    Number+2
            bsf      Zero,0
            bsf      Zero+1,0
            bsf      Zero+2,0
            goto     Prepare               
SetUpDown                             ;para cima ou para baixo?
            btfsc    Down,0           ;testar a variavel
            goto     NextUp           ;estava para baixo? então vai para NextUp
            bsf      Down,0           ;estava para cima? então Down = 1
            movf     Number,W
            sublw    0                ;aqui é para ver se o digito mais á direita está em 0
            btfsc    STATUS,Z
            goto     Set1             ;sim? então vamos ver
            bcf      Zero,0           ;não? então Zero(+0) = 0
            goto     Continue1
Set1
            bsf      Zero,0           ;Zero(+0) = 1
Continue1
            movf     Number+1,W       ;aqui é que continua
            sublw    0
            btfsc    STATUS,Z         ;será que o outro digito está a zero? proceder como antes.
            goto     Set2
            bcf      Zero+1,0
            goto     Continue2
Set2
            bsf      Zero+1,0
Continue2
            movf     Number+2,W       ;ou será que o digito mais á esquerda está a zero? Proceder igualmente.
            sublw    0
            btfsc    STATUS,Z
            goto     Set3
            bcf      Zero+2,0
            goto     Prepare          ;mas aqui é diferente: já que todos os digitos foram verificados, voltamos ao inicio
Set3
            bsf      Zero+2,0
            goto     Prepare          ;mas aqui é diferente: já que todos os digitos foram verificados, voltamos ao inicio
NextUp
            bcf      Down,0           ;carece de explicação...
            goto     Prepare
Decrement
            btfsc    Zero,0           ;digito 0 (mais direito) tá em zero??
            goto     Zero1            ;então vai para Zero1
            decfsz   Number,F         ;não? então decrementa
            goto     Prepare          ;se não está zero, volta ao inicio
            bsf      Zero,0           ;está zero? então Zero(+0) = 1
            goto     Prepare         
Zero1
            btfsc    Zero+1,0         ;e o digito 1?? está em zero tambem?
            goto     Check            ;sim, então checke isso
            bcf      Zero,0           ;não? então este digito 0 já vai deixar de estar em zero, por isso Zero(+0) = 0
            movlw    9                ;depois do zero vem o que? resposta: nove!
            movwf    Number
            decfsz   Number+1,F       ;decrementa o outro digito!!
            goto     Prepare         
            bsf      Zero+1,0         ;mas n me digas que está em zero já! Zero(+1) = 1
            goto     Prepare
Check
            btfsc    Zero+2,0         ;bem, dois digitos já estão em zero, falta ver o ultimo
            goto     ThirdZero        ;tambem?!
            bcf      Zero,0           ;ainda bem que não... , então os outros também não merecem estar em zero
            bcf      Zero+1,0
            movlw    9                ;e como dois digitos estavam em zero... vamos pô-los em 99
            movwf    Number
            movwf    Number+1
            decfsz   Number+2,F       ;e decrementar o terceiro digito
            goto     Prepare
            bsf      Zero+2,0         ;já tá em zero?! então Zero(+2) = 1
            goto     Prepare
ThirdZero
            bcf      Zero,0           ;carecem de explicação, pois após 000 vem o que? 999, claro!
            bcf      Zero+1,0
            bcf      Zero+2,0
            movlw    9
            movwf    Number
            movwf    Number+1
            movwf    Number+2
            goto     Prepare   
           
                                      ;e acabou... aqui vão as subrotinas:

Delaywait
            movlw    255         
            movwf    Counter2
Loop2
             decfsz   Counter2,1
       goto     Loop2
       return
Delay
            movlw    255         
       movwf    Counter
Loop
            decfsz   Counter,1
            goto     Loop
       return
TheDigit0                               ;aqui vai o truque do display multiplexado!!
           movf     Number,W         
       call     Table              ;ver na tabela qual o valor para as saidas...
            movwf    PORTB              ;por este nas saidas
       bsf      PORTA,Digit0       ;ligar digito 0
       bcf      PORTA,Digit2       ;desligar digito 2
       return
TheDigit1           
            movf     Number+1,W
            call     Table
            movwf    PORTB
       bsf      PORTA,Digit1       ;ligar digito 1
       bcf      PORTA,Digit0       ;desligar digito 0
       return
TheDigit2         
       movf     Number+2,W
       call     Table 
            movwf    PORTB
       bsf      PORTA,Digit2       ;ligar digito 2
       bcf      PORTA,Digit1       ;desligar digito 1
            return
Table                                   ;Tabela
            addwf    PCL,1              ;o truque conhecido
            retlw    B'01111110'        ;return with literal in W
            retlw    B'00001100'
            retlw    B'10110110'
            retlw    B'10011110'
            retlw    B'11001100'
            retlw    B'11011010'
            retlw    B'11111010'
            retlw    B'00001110'
            retlw    B'11111110'
            retlw    B'11011110'
                 
            END

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: error al compilar con assembler (apartado Config)
« Respuesta #1 en: 20 de Enero de 2011, 16:04:16 »
Cambiando esto asi compila, otra cosa es que funcione.
Supongo que ese ensamblador que usa el, ponyprog, tiene directivas distintas al MPLAB yo nunca lo use.

 __CONFIG        3FF5H     ;usar este "ajuste" dos Bits de Configuração do PIC apenas,
                                   ;se o programador que usa não tiver a opção de as configurar.
                                   ;neste caso insere um valor onde estão os ? que configura o seguinte:
                                   ;XT Oscillator, Code Protect Disabled (0), WatchDog Timer enabled (1), PowerUp Timer enabled (1).
                                   ;Assim tambem terá que por os bits no caso do programador ser capaz disso.
                              ;os valores hex da configuração aqui no codigo não os conheço ainda, perdoe-me... tb nunca os irei usar, eu
                                   ;uso o PonyProg, e ai dá para ajustar os bits todos. Bem, agora ao Programa:
   
   
            CBLOCK      0Ch
Number     
Zero       
Counter     
Counter2   
Idle       
Down       
            ENDC

Digit0       EQU      2
Digit1      EQU        1
Digit2      EQU      0
Reset       EQU      0
Count       EQU      3
UpDown      EQU      4

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: error al compilar con assembler (apartado Config)
« Respuesta #2 en: 20 de Enero de 2011, 18:31:14 »
esta directiva lo que hace es configurar diferente registros o circuitos internos del pic.lo puedes poner con un valor hexagesimal o con texto.

es lo mismo poner:

__CONFIG   _XT_OSC & _CP_OFF & _WDT_OFF

que: 3FF9H

lo que se indica es que configure el oscilador en el modo XT,que la proteccion de codigo este en OFF y que el watchdog este en OFF.

tambien lo puedes configurar desde el MPLAB.en configure->configuration bits.
y ahi hay una casilla de verificacion para que la gonfiguracion de estos bist se realicen desde el valor introduciodo en el codigo o desde la configuracion del MPLAB.

el valor que tienes que poner depende del programa que realices.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado pumuky

  • PIC10
  • *
  • Mensajes: 7
Re: error al compilar con assembler (apartado Config)
« Respuesta #3 en: 21 de Enero de 2011, 16:52:05 »
Gracias tapi8, ahora montaré el circuito en Proteus y pruebo la simulación.
De momento, como bien dices, esta compilado.
Ahora ya veremos.


 

anything