Autor Tópico: Contrôle de motores com PIC16F628A  (Lida 64308 vezes)

Description:

0 Membros e 2 Visitantes estão vendo este tópico.

Offline C N C N o w !

  • CNCMASTER
  • ******
  • Posts: 6300
  • Sexo: Masculino
Re: Contrôle de motores com PIC16F628A
« Resposta #240 Online: 31 de Julho de 2010, 13:10 »
Se os dados a serem transmitidos fossem somente os sinais para a movimentação dos motores, a iluminação e um sinal para servo motor, você faria a transmissaõ pela interface direta ???

Anderson, veja, a questão não é o que é transmitido, o volume dos dados, mas sua importância, o impacto que a perda da comunicação ou interferências pode causar. Evidentemente a incapacidade, ainda que momentânea, de controlar o veículo, é algo que pode ter consequências funestas ...

Há dois aspectos que eu acho mais importantes, no que se refere à interface de comunicação. Um é a possibilidade de interferência, outra é a distância alcançável.

O ambiente subaquático é bastante limpo, no que se refere às interferências exógenas, eu não me preocuparia muito com este aspecto, mas as interferências endógenas são muito possíveis. Os motores do veículo podem interferir, mas é o tipo de coisa que se deve matar no ninho, eliminar na origem, mas cuidados adicionais melhoram a confiabilidade do sistema.

Quanto a distância, depende da velocidade e das características da interface, aqui não há dúvidas que RS232 ou 485 são muito superiores à interface direta.

Em suma, eu não temeria fazer a transmissão com interface direta no caso de curta distância, mas tenho que dizer que isto é um falso dilema, de vez que é algo muito simples, barato, pequeno peso e volume, não há pq não implementar, exceto talvez para testes.

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #241 Online: 31 de Julho de 2010, 13:50 »
Em suma, eu não temeria fazer a transmissão com interface direta no caso de curta distância, mas tenho que dizer que isto é um falso dilema, de vez que é algo muito simples, barato, pequeno peso e volume, não há pq não implementar, exceto talvez para testes.

Correto, de qualquer forma as informações serviram para fortalecer a decisão de utilizar a RS-485. Vou dar uma estudada no assunto e assim que tenha novidades retorno ao fórum.
Obrigado.


Offline C N C N o w !

  • CNCMASTER
  • ******
  • Posts: 6300
  • Sexo: Masculino
Re: Contrôle de motores com PIC16F628A
« Resposta #242 Online: 31 de Julho de 2010, 15:40 »

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #243 Online: 31 de Julho de 2010, 17:34 »

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #244 Online: 31 de Julho de 2010, 20:52 »
Código: [Selecionar]
[size=2]
;-------------------------------------------------------------
;Software para comando de Joystick e potenciometro
;ROV - Abissal

;Byte 1:
;   7    6     5     4     3     2     1     0   
; |----S1---|--------M2-------|--------M1--------|
;
;Byte 2:
;   7     6     5     4     3     2     1     0
;  Z-    Z+    L3    L2    L1  |-------M3--------|
;
;
; M1 - controle do motor 1 (estados RR,MR,LR,P,LF,MF,RF)
; M2 - controle do motor 2 (estados RR,MR,LR,P,LF,MF,RF)
; M3 - controle do motor 3 (estados RB,MB,LB,P,LC,MC,RC)
; S1 - aciona servo 1
;
; L1 - liga/desliga a iluminação frontal
; L2 - liga/desliga a iluminação traseira
; L3 - liga/desliga a iluminação ou alguma outra carga extra
; Z+ - aproximar Zoom
; Z- - afastar Zoom
;---------------------------------------------------------------




   list P=16F877A
   #include "P16F877A.INC"

   __CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON
   
   errorlevel -302      ; turn off bank bits warning

;
; Seleção de entradas do MUX (ADDCON0)
;
#DEFINE  EAN_0 B'01000001'    ; f/8, AN0, DONE, A/D On
#DEFINE  EAN_1 B'01001001'    ; f/8, AN1, DONE, A/D On
#DEFINE  EAN_2 B'01010001'    ; f/8, AN2, DONE, A/D On
#DEFINE  EAN_3 B'01011001'    ; f/8, AN3, DONE, A/D On
#DEFINE BOTAO PORTB,7 ; porta do botão da iluminação - 0 = pressionado  1 = liberado
#DEFINE ZOOM_P PORTB,6 ; porta do zoom+ 0 = pressionado 1 = liberado

;
; Saídas
;
#DEFINE LED1 PORTD,7 ;Porta do LED    0 = apagado   1 = aceso
#DEFINE LED2 PORTD,6 ;Porta do LED_D2    0 = apagado   1 = aceso
#DEFINE LED3 PORTD,5 ;Porta do LED_D3    0 = apagado   1 = aceso
#DEFINE LED4 PORTD,4 ;Porta do LED_D4    0 = apagado   1 = aceso

;
;   Variáveis da RAM internas
;   
   cblock H'20'
        ld_loop_ex
      ld_loop_in
Valor_AN0
Valor_AN1
Valor_AN2
Valor_AN3
Valor_DIG_0
Valor_ZOOM_P
Estado_botao
    endc
;
; Inicio do Programa
;
   ORG   0h         

; Inicializaçao do PIC, do display e da porta serial
   bcf         STATUS,RP1
   bsf         STATUS,RP0 ; Habilita banco 1
   clrf    TRISD          ; porta do display, de saída
   movlw     B'00000010'    ; setup do conversor A/D
   movwf    ADCON1          ; left justify result
                              ; port A: only analogue inputs
;
; Ajusta parametros da UART (usando cristal externo de 4MHz)
; Baud Rate = 9600 bps, No Parity, 1 Stop Bit
;
    movlw   0x19              ; 0x19=9600 bps / 0x0C=19200 bps
    movwf   SPBRG
    movlw   b'00100100'      ; TX_Enable, assync. mode, brgh = high (2)
    movwf   TXSTA            ; enable Async Transmission, BRGH=1
    movlw   b'10111111'      ; RC6 saida, outros bits da PORTC sao de entrada
    movwf   TRISC
    bcf        STATUS,RP0      ; Habilita banco 0
    clrf    PORTD          ; zera saídas do display
    movlw   b'01000000'    ; Setup Port C
    movwf   PORTC          ; RC6(TX)=1 others are 0
    movlw   b'10000000'    ; habilita a UART
    movwf   RCSTA
    movlw b'11111111'         ; PORTB todo como entrada
    movwf TRISB
;
; Loop principal
;
start:

;-------Ler entradas
    movlw   EAN_0 ; lendo entrada analógica 0
    call    read_ad ; chama a rotina de conversão AD
movwf Valor_AN0 ; carrega o valor convertido em Valor_AN0

movlw   EAN_1 ; lendo entrada analógica 1
    call    read_ad ; chama a rotina de conversão AD
movwf Valor_AN1 ; carrega o valor convertido em Valor_AN1

movlw   EAN_2 ; lendo entrada analógica 2
    call    read_ad ; chama a rotina de conversão AD
movwf Valor_AN2 ; carrega o valor convertido em Valor_AN2

movlw   EAN_3 ; lendo entrada analógica 3
    call    read_ad ; chama a rotina de conversão AD
movwf Valor_AN3 ; carrega o valor convertido em Valor_AN3

btfsc BOTAO ; lendo entrada digital 0. O botão está pressionado ?


call pressionado         ; Sim, então vá para rotina pressionado.
call liberado         ; Não, então vá para rotina liberado.

btfsc ZOOM_P ; lendo entrada digital 0. O botão está pressionado ?
call zoom_menos ; Não, então vá para rotina zoom_mais.
call zoom_mais         ; Sim, então vá para rotina zoom_menos.
movwf Valor_ZOOM_P ;carrega o valor de LED aceso em Valor_DIG_0
goto envia         ;vai para a rotina envia

liberado:
bsf LED1 ;apaga o LED
movlw b'00001000'
movwf Valor_DIG_0 ;carrega o valor de LED apagado em Valor_DIG_0
goto envia         ;vai para a rotina envia
return
pressionado:
bcf LED1
movlw b'00000000' ;acende o LED
movwf Valor_DIG_0 ;carrega o valor de LED aceso em Valor_DIG_0
goto envia         ;vai para a rotina envia
return

zoom_mais:
bsf LED2
movlw b'00001000' ;acende o LED
;movwf Valor_ZOOM_P ;carrega o valor de LED aceso em Valor_DIG_0
;goto envia         ;vai para a rotina envia
return

zoom_menos:
bcf LED2
movlw b'00000000' ;acende o LED
;movwf Valor_ZOOM_P ;carrega o valor de LED aceso em Valor_DIG_0
;goto envia         ;vai para a rotina envia
return




;-------Enviando dadops pela serial

envia:

movfw Valor_AN0 ; recupera o valor convertido para ser enviado
call send         ; chama a rotina de envio pela serial

movfw Valor_AN1 ; recupera o valor convertido para ser enviado
call send         ; chama a rotina de envio pela serial

movfw Valor_AN2 ; recupera o valor convertido para ser enviado
call send         ; chama a rotina de envio pela serial

movfw Valor_AN3 ; recupera o valor convertido para ser enviado
call send         ; chama a rotina de envio pela serial

movfw Valor_DIG_0 ; recupera o valor do LED para ser enviado
call send         ; chama a rotina de envio pela serial

movfw Valor_ZOOM_P ; recupera o valor do LED para ser enviado
call send         ; chama a rotina de envio pela serial


call   delay1s ; chama as rotinas de tempo para aguardar o termino da transmissão
        goto   start


;
; Envia byte (contido em W) pela UART e espera terminar
;
send:
    movwf    TXREG            ; send data in W
TransWt:
    bsf    STATUS,RP0            ; banco 1
WtHere:
    btfss    TXSTA,TRMT         ; Transmissao terminou se TRUE
    goto    WtHere                 ; Senao, espera
    bcf    STATUS,RP0            ; banco 0
    return


;
; Conversor A/D, palavra ADDCON0 em W
;
read_ad:
   movwf    ADCON0
   bsf         ADCON0,GO        ; Iniciar conversao
wait:
   btfsc      ADCON0,GO        ; Testa se terminou conversao
   goto    wait
   movf    ADRESH,W
   return
;
; Display de LEDs
;
display:
   movwf   PORTD
   return

   
;
;-----------------------------------------------------------------------------
;
;   Delay for about 1s
;
delay1s:
    movlw   D'250'
    call   waitx400
    movlw   D'250'
    call   waitx400
    movlw   D'250'
    goto   waitx400

;
;-----------------------------------------------------------------------------
;
;   Delay for about 250 ms
;
delay250ms:
    movlw   D'250'
    goto   waitx400
;
;-----------------------------------------------------------------------------
;
;   Delay for about 400x cycles
;
;    Se w=1, temporiza 1ms @ fck = 4MHz
;
waitx400:
    movwf   ld_loop_ex
ld_loopex:
    movlw   (400-4)/4
    movwf   ld_loop_in
ld_loopin:
    decf    ld_loop_in,F
    skpz
    goto    ld_loopin
    decf    ld_loop_ex,F
    skpz
    goto    ld_loopex
    return

    END[/size]

No código não estou conseguindo equacionar um problema relativamente simples:  Tenho 4 entradas analógicas e duas digitais, as analógicas estão sendo lidas e transmitidas regularmente. A entrada digital "BOTAO" também funciona normalmente, mas a "ZOOM_P" simplesmente não consigo fazer funcionar. Não transmite, não consigo fazer acender os leds , nada.
« Última modificação: 01 de Agosto de 2010, 11:23 por fgilii »

Offline C N C N o w !

  • CNCMASTER
  • ******
  • Posts: 6300
  • Sexo: Masculino
Re: Contrôle de motores com PIC16F628A
« Resposta #245 Online: 31 de Julho de 2010, 23:12 »
Anderson, eu esperaria dois botões para zoom, (+) e (-) e um bit para cada função, no entanto parece que vc não definiu corretamente os bits e as chamadas para as subrotinas, veja:


   7     6     5     4     3     2     1     0
   Z-    Z+    L3    L2    L1 |-------M3--------|

#DEFINE   BOTAO    PORTB,7      ; porta do botão da iluminação - 0 = pressionado  1 = liberado
#DEFINE   ZOOM_P   PORTB,6      ; porta do zoom+   0 = pressionado      1 = liberado


« Última modificação: 01 de Agosto de 2010, 08:23 por C N C N o w ! »

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #246 Online: 07 de Agosto de 2010, 08:02 »
Pessoal,

Estou realizando testes no código e ao utilizar a janela watch do MPLab pude verificar que estão disponíveis somente os SFR. Como faço para habilitar Add Symbol para visualização ?

Grato,

Offline C N C N o w !

  • CNCMASTER
  • ******
  • Posts: 6300
  • Sexo: Masculino
Re: Contrôle de motores com PIC16F628A
« Resposta #247 Online: 07 de Agosto de 2010, 08:59 »

Watch Window FAQ

How do I:

Add a watch (address, SFR or symbol) to a Watch window? 

Select the Watch window you want by clicking on the appropriate button in the bottom of the window.

To add a watch at a specific address, click in the Address column of the first available row and enter a hex address.

To add a special function register to a Watch view, select the SFR from the list next to the Add SFR button and then click on the button. To add a symbol to a Watch view, select the symbol from the list next to the Add Symbol button and then click on the button.

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #248 Online: 07 de Agosto de 2010, 09:28 »


Select the Watch window you want by clicking on the appropriate button in the bottom of the window.

To add a watch at a specific address, click in the Address column of the first available row and enter a hex address.

Certo, mas o que está acontecendo é que na janela "Watch" o botão para seleção dos SFR está disponível e o botão para seleção de "Add Symbol" está desabilitado, não permitindo a inclusão de nenhum registro para visualização.

Offline C N C N o w !

  • CNCMASTER
  • ******
  • Posts: 6300
  • Sexo: Masculino
Re: Contrôle de motores com PIC16F628A
« Resposta #249 Online: 07 de Agosto de 2010, 09:47 »
... o que está acontecendo é que na janela "Watch" o botão para seleção dos SFR está disponível e o botão para seleção de "Add Symbol" está desabilitado ...

O programa está carregado e o simulador habilitado ?

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #250 Online: 07 de Agosto de 2010, 18:11 »
O programa está carregado e o simulador habilitado ?

Sim, programa carregado e simulador habilitado....

....Acaba que fiquei procurando alguma configuração e agora está funcionando normalmente. O pior é que não sei em que eu mexi que retornou ao funcionamento normal.
« Última modificação: 07 de Agosto de 2010, 20:57 por aguizan »

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #251 Online: 07 de Agosto de 2010, 21:07 »
Estou montando meus dois bytes para transmissão, está ficando assim:



;-------Ler entradas Analógicas
   bcf     STATUS,RP0        ; Habilita banco 0

      movlw   EAN_0            ; lendo entrada analógica 0
      call      read_ad         ; chama a rotina de conversão AD
   andlw   0xE0                 ; mascara os três bits mais significativos e coloca o resultado em W
   movwf   SER_DATA_1   ; SER_DATA_1 = [X7 X6 X5 0,   0  0  0  0]
   rrf      SER_DATA_1,F   ; SER_DATA_1 = [0 X7 X6 X5,   0  0  0  0]
   rrf      SER_DATA_1,F   ; SER_DATA_1 = [0  0 X7 X6,   X5 0  0  0]
   rrf      SER_DATA_1,F   ; SER_DATA_1 = [0  0 0  X7,   X6 X5 0  0]

   movlw   EAN_1             ; lendo entrada analógica 1
      call      read_ad         ; chama a rotina de conversão AD
   andlw   0xE0                 ; mascara os três bits mais significativos e coloca o resultado em W
   addwf   SER_DATA_1,F   ; SER_DATA_1 = [Y7  Y6  Y5  X7,   X6  X5   0   0]
   rrf      SER_DATA_1,F   ; SER_DATA_1 = [ 0  Y7  Y6  Y5,   X7  X6   X5  0]
   rrf      SER_DATA_1,F   ; SER_DATA_1 = [ 0   0  Y7  Y6,   Y5  X7  X6  X5]

   movlw   EAN_2         ; lendo entrada analógica 2
      call      read_ad         ; chama a rotina de conversão AD
   andlw   0xE0                 ; mascara os três bits mais significativos e coloca o resultado em W
   addwf   SER_DATA_1,F   ; SER_DATA_1 = [Y7  Y6  Y5  X7,   X6  X5   0   0]
   rrf      SER_DATA_1,F   ; SER_DATA_1 = [ 0  Y7  Y6  Y5,   X7  X6   X5  0]
   rrf      SER_DATA_1,F   ; SER_DATA_1 = [ 0   0  Y7  Y6,   Y5  X7  X6  X5]
   
   movlw   EAN_3         ; lendo entrada analógica 3
      call      read_ad         ; chama a rotina de conversão AD
   andlw   0xE0                 ; mascara os três bits mais significativos e coloca o resultado em W
   addwf   SER_DATA_2,F   ; SER_DATA_2 = [Z7  Z6  Z5   0,    0    0    0   0]
   rrf      SER_DATA_2,F   ; SER_DATA_2 = [ 0  Z7  Z6  Z5,    0    0    0   0]
   rrf      SER_DATA_2,F   ; SER_DATA_2 = [ 0   0  Z7  Z6,   Z5    0    0   0]
   rrf      SER_DATA_2,F   ; SER_DATA_2 = [ 0   0   0  Z7,   Z6   Z5    0   0]
   rrf      SER_DATA_2,F   ; SER_DATA_2 = [ 0   0   0   0,   Z7   Z6   Z5   0]
   rrf      SER_DATA_2,F   ; SER_DATA_2 = [ 0   0   0   0,    0   Z7   Z6  Z5]


É isso mesmo ???

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #252 Online: 08 de Agosto de 2010, 13:36 »
Pessoal,

Meu Proteus travou e precisei desinstalá-lo. Agora não consigo instalar novamente o software. Alguma sugestão ?

O software é carregado mas na hora da simulação sempre falta alguma dll. Segue a mensagem que aparece:

SIMULATION LOG
==============
Design:   H:\Arquivos de Instalação\PROTEUS\SAMPLES\Chess\avrchess.DSN
Doc. no.: <NONE>
Revision: <NONE>
Author:   <NONE>
Created:  19/09/01
Modified: 21/02/02

Compiling source files...
Build completed OK.
Compiling netlist...
Linking netlist...
Partition analysis...

Simulating partition 1 [0717C76C]...
PROSPICE Release 6.2 SP0 (C) Labcenter Electronics 1993-2002.
SPICE Kernel Version 3f5. (C) Berkeley University ERL.

Reading netlist...
FATAL: [CHESS-KEYPAD#0011] External model DLL "KEYPAD.DLL" not found. GLE=0x00000003.

Simulation FAILED due to fatal simulator errors.




Grato
« Última modificação: 08 de Agosto de 2010, 20:29 por aguizan »

Offline Blackmore

  • CNCMASTER
  • ******
  • Posts: 1568
  • Sexo: Masculino
  • Profissão: Projetista Mecânico/Automação
Re: Contrôle de motores com PIC16F628A
« Resposta #253 Online: 08 de Agosto de 2010, 22:07 »
vc jah desinstalou ... fez uma limpeza no arquivo de registro .. apagou a pasta onde o proteus foi instalado ... reiniciou o pc e tentou reinstalar tudo de novo?

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #254 Online: 09 de Agosto de 2010, 06:08 »
vc jah desinstalou ... fez uma limpeza no arquivo de registro .. apagou a pasta onde o proteus foi instalado ... reiniciou o pc e tentou reinstalar tudo de novo?

Vou experimentar a limpeza no arquivo de registro, o resto fiz tudo.

Resolvido. O software já está funcionando normalmente.
« Última modificação: 09 de Agosto de 2010, 10:55 por aguizan »

 

/** * */