Ir ao conteúdo

PWM no PIC16f628a


costela_splinter

Posts recomendados

Postado

Bom dia.

É minha primeira postagem nesse fórum.

Na universidade aprendi o microcontrolador hc11 mas nunca montei um circuito com microcontrolador, apenas simulávamos.

Agora estou precisando desenvolver um pwm utilizando o pic16f628a. Fiz a programação em C, utilizando o compilador Hi-Tech, simulei no proteus.

No proteus a simulação está ok, conforme desejo, a gravação também funcionou beleza (mandei o icprog verificar várias vezes o código programado e está ok!) o que me leva a descartar problema com o pic ou com o gravador. Também já verifiquei várias vezes a montagem no protoboard e não encontrei ero algum. Estou utilzando um oscilador externo cristal de 10MHz com dois capacitores de 27pF.

Abaixo está o código que desenvolvi. Gostaria de saber se esqueci de considerar alguma coisa que não precisa ser considerada na simulação e deve ser considerada na prática (fusíveis, registros, etc...)

Obrigado a todos.

#include <pic16f62xa.h>

#include <pic.h>

__CONFIG(WDTDIS & XT & PWRTEN);

unsigned char dc, aux;

void main()

{

TRISA = 0xFF;

PR2 = 0xFF;

CCPR1L = 0x00;

CCP1CON = 0b00001100;

TRISB = 0b11110011;

T2CON = 0b00000101;

dc = 0;

aux = 0;

for(;;)

{

dc = 0;

if(RB5) dc+=0b00000001;

if(RB4) dc+=0b00000010;

if(RB1) dc+=0b00000100;

if(RB0) dc+=0b00001000;

if(RA3) dc+=0b00010000;

if(RA2) dc+=0b00100000;

if(RA1) dc+=0b01000000;

if(RA0) dc+=0b10000000;

if(aux!=dc)

{CCPR1L = dc;

aux=dc;

}

CCP1X = RB7;

CCP1Y = RB6;

}

}

Postado

O problema pode ser justamente a utilização de cristal de 10 MHz em uma protoboard.

Num projeto que montei, nem com cristal de 4 MHz ele ficava estável.

Quando mudei para o oscilador interno de 4 MHz ficou estável como uma rocha.

Postado

da uma olhada na forma de onda no no pino 16 do pic, se tiver zerado ele não está oscilando. mais se não estou enganado, esse microcontrolador só funciona até 4Mhz quando usado com cristal.

Postado

verifiquei o pino clkout (pino15) e o oscilador não estava funcionando. substitui o cristal por um de 4MHz e o oscilador continuou sem funcionar. Então configurei o pic pra oscilador interno de 4MHz e o clkout funcionou (com um pouco de ruído). mas mesmo assim meu circuito continuou sem funcionar como no proteus. mesmo quando eu mando o pino pwm (rb3) ficar metade do período em 1, ele continua em 0 por todo o período.

abaixo está o novo código e a foto do circuito no proteus.

#include <pic16f62xa.h>

#include <pic.h>

__CONFIG(WDTDIS & INTCLK & PWRTEN);

unsigned char dc, aux;

void main()

{

OSCF=1;

TRISA = 0xFF;

PR2 = 0xFF;

CCPR1L = 0x00;

CCP1CON = 0b00001100;

TRISB = 0b11110011;

T2CON = 0b00000101;

dc = 0;

aux = 0;

for(;;)

{

dc = 0;

if(RB5) dc+=0b00000001;

if(RB4) dc+=0b00000010;

if(RB1) dc+=0b00000100;

if(RB0) dc+=0b00001000;

if(RA3) dc+=0b00010000;

if(RA2) dc+=0b00100000;

if(RA1) dc+=0b01000000;

if(RA0) dc+=0b10000000;

if(aux!=dc)

{CCPR1L = dc;

aux=dc;

}

CCP1X = RB7;

CCP1Y = RB6;

}

}

forumae2.jpg

Postado

FILE: PWM.asm

; AUTH: Keith Sevcik

; DATE: 5/21/03

; DESC: This program generates a PWM waveform.

; NOTE: Tested on PIC16F84-04/P

;----------------------------------------------------------------------

; cpu equates (memory map)

list p=16f84

radix hex

;----------------------------------------------------------------------

portb equ 0x06 ; port b equate

duty equ 0x0c ; length of duty cycle

temp equ 0x0d ; length of duty cycle

;---------------------------------------------------------------------

c equ 0 ; status bit to check after subtraction

;---------------------------------------------------------------------

org 0x000

movlw 0x00 ; load W with 0x00 make port B output

tris portb ; copy W tristate to port B outputs

movlw 0x00 ; fill w with zeroes

movwf portb ; set port b outputs to low

rstrt movlw d'0'

movwf portb

movlw d'157' ; Duty cycle length

movwf duty

b0loop movf duty,w

movwf temp

bsf portb,0

pwma nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

decfsz temp

goto pwma

movlw d'255'

movwf temp

movf duty,w

subwf temp,f

bcf portb,0

pwmb nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

decfsz temp

goto pwmb

goto rstrt

;----------------------------------------------------------------------

end

  • 5 meses depois...
Postado

Estou iniciando programação de PIC16F628A em assembly com alguns projetos simples, com oscilador interno e sem master clear.

Os programas funcionam na simulação, mas não estou conseguindo fazer funcionarem na matriz de contatos, por exemplo:

; Programa para piscar LEDs no PORTB

; Versão 1.0 Data: 28/01/2009 MCU: PIC16F628A

; Declaração e configuração do processador

PROCESSOR 16F628A ; Tipo de processador

#include "P16F628A.inc"

__CONFIG _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_ON & _MCLRE_OFF & _INTOSC_OSC_NOCLKOUT

#define BANK0 bcf STATUS, RP0

#define BANK1 bsf STATUS, RP0

CONT equ 20H

AUX equ 21H

org 0 ; vetor de reset

CONF

BANK1 ; seleciona banco 1 da memórfifa

clrf TRISB ; configura pinos da porta B como saídas

BANK0

; Inicio do programa principal

LOOP

nop

incfsz AUX, 1

goto LOOP

incfsz CONT, 1

goto LOOP

clrf PORTB

LOOP2

nop

incfsz AUX, 1

goto LOOP2

incfsz CONT, 1

goto LOOP2

movlw 0FFH

movwf PORTB

goto LOOP ; programa fica em loop

end

Não sei se falta alguma configuração no início ou se é outro problema..

Obrigado.

Postado

Amigo Miguel,

Como você, também estou aprendendo e estudando Assembly para o PIC16F628A.

Estou crú ainda na programação.

Enfim, quanto ao seu programa, essa linha que diz pra incluir a biblioteca do PIC:

#include "P16F628A.inc" ---> Nao seria #INCLUDE <P16F628A.INC> ?

Desculpe, mas posso estar comentando coisas sem nexo, de qualquer forma, é errando que se aprende e os feras podem dar o Help salvador!:D

Grande Abraço,

R.Costa.

Nao há definicão para essa instrução LOOP2?

Compila sem erros seu programa?

  • 11 meses depois...
Postado

Baixei da net um programa para controlar um servo motor, já quebrei a cabeça tentando implementar mais 3 servos motores e não consegui obter sucesso, gostaria que alguém me ajudasse a implementar mais 3 servos motores usando esse programa ou então me enviace outra solução desde já agradeço pela ajuda.

;*****************************************************************

;Este programa usa interrupções de Timer0 e prescalers para enviar RC servo PWM compatível em 55 Hz; para 57 Hz dependendo o comprimento do seu pulso elevado. No 4 mhz e prescale de 1:64, será timer0

; Rolar sobre e interromper a cerca de 61 Hz para a parte baixa do pulso. O pulso alto usa um

; 1: 8 prescale, que iria rolar sobre todos os 2048us. Pretende assim um intervalo de 1000us a 2000us

; pré-carregamento timer1 com um valor que vai deixar rolar sobre cedo para obter a largura de pulso desejar.

;2000 / 8 = 250 conta para o pulso mais longo. 256-250 = 6 portanto se você pré-carregar timer1 com 6, ele

; irão rolar sobre após as contagens de 250. 1000 / 8 = 125 conta para o pulso mais curto. 256-125 = 131

; portanto se você pré-carregar timer1 com 131, vai rolar sobre após as contagens de 125.

;O Centro é de aproximadamente 68 portanto se você colocar 68 /-up para 62 na variável “ posição ”, você deve

; obter uma gama completa de movimento ou velocidade. Esta é a baixa resolução. Você só obter 125 posições ou

;62 acelera a esquerda e direita, mas ele apenas interrompe o seu programa sobre 20us, 120 vezes por minuto.

;Graças a Nigel GOODWIN e seus tutoriais para atrasos e inicializar Timer0 e interrupções.

;Clyde Crashkop

;==========================================================================================================

LIST p = 16F628A ; dizer assembler que chip estamos usando

incluir "P16F628A.inc" ; incluir as predefinições para o chip

ERRORLEVEL 0,-302 ; suprimir mensagens de seleção de banco

__config 0x3D18 ; conjuntos de configurações (tipo de Oscilador etc.).

;=============================================================================

;definições do programa

;==========================================================================================================

cblock 0 x 20 ; iniciar de registos de propósito geral

Contagem ; usado em looping rotinas

count1 ; utilizados na rotina de atraso

counta ; utilizados na rotina de atraso

countb ; utilizados na rotina de atraso

alternância ; bandeira alterne entre PWM alto & baixo

A posição ; Centro é de 68 /-62 para extremos

W_TEMP

STATUS_TEMP

endc

;===========================================================================================================

org 0x0000

GoTo iniciar

Interrupção Timer0.

ORG 0X0004

MOVWF W_TEMP

SWAPF STATUS, W

MOVWF STATUS_TEMP

BCF INTCON, T0IF

MOVF alternância, f; movê-la volta para sua auto para zero sinalizador

SKPNZ

GOTO LowOut

clrf alterna ; para alternar para próxima interrupção.

MOVF Posição, w ; obter posição duração de pulso elevado

MOVWF TMR0 ; Centro é 68 /-60 para os extremos

bsf STATUS, RP0 ; banco select 1

MOVLW b '00000010' ; prescaler = 1: 8 para o tempo

MOVWF OPTION_REG

bcf STATUS, RP0 ; banco Selecione 0

BSF PORTB, 3 ; fisicamente farthest da entrada de frequência de T1CKI B6.

SWAPF STATUS_TEMP,W

MOVWF STATUS

SWAPF W_TEMP, F

SWAPF W_TEMP,W

RETFIE

;===========================================================================================================

LowOut

BSF Alternar, 0 ; para alternar para próxima interrupção.

bsf STATUS, RP0 ; banco select 1

MOVLW b '00000101' ; prescaler = 1:64 para baixo tempo

MOVWF OPTION_REG

bcf STATUS, RP0 ; banco Selecione 0

BCF PORTB, 3 ; fisicamente farthest da entrada de frequência de T1CKI B6.

SWAPF STATUS_TEMP,W

MOVWF STATUS

SWAPF W_TEMP,F

SWAPF W_TEMP,W

RETFIE

Inicie movlw 0x07

movwf CMCON; desativar o comparators (torná-la como um 16F84)

Initialise

clrf Contagem

clrf PORTA

clrf PORTB

SetPorts

bsf STATUS, RP0; banco select 1

movlw 0x00; fazer todas as saídas de pinos

movwf TRISA

movlw 0x00; fazer todas as saídas de pinos

movwf TRISB

MOVLW b '00000101'; prescaler = 1:64 para baixo tempo

MOVWF OPTION_REG

bcf STATUS, RP0; banco Selecione 0

CLRF INTCON

BSF INTCON, T0IE; habilitar interrupções de timer

clrf TMR0

bcf INTCON, T0IF; iniciar o temporizador

bsf INTCON, GIE; iniciar interrupções

;================================================================

Principal; tudo aqui no é apenas para exercer o servo

MOVLW d '68'; Centro

MOVWF posição

CALL Delay255

CALL Delay255

CALL Delay255

CALL Delay255

MOVLW d '6'; pulso Long

MOVWF posição

CALL Delay255

CALL Delay255

CALL Delay255

CALL Delay255

MOVLW d '125'; pulso curto

MOVWF posição

CALL Delay255

CALL Delay255

CALL Delay255

CALL Delay255

GoTo principal; loop para sempre

;===============================================================

;Rotinas atraso

Delay255 movlw 0xff; atrasar mS 255

GoTo d0

Delay100 movlw d '100'; atrasar 100mS

GoTo d0

Delay50 movlw d '50'; atrasar 50mS

GoTo d0

Delay20 movlw d '20'; atrasar 20mS

GoTo d0

Delay5 movlw 0x05; atrasar 5.000 ms (relógio de 4 MHz)

d0 movwf count1

D1 movlw 0xC7; atrasar 1mS

movwf counta

movlw 0x01

movwf countb

Delay_0

decfsz counta, f

GoTo $ 2.

decfsz countb, f

GoTo Delay_0

decfsz count1, f

GoTo d1

retlw 0x00

; final do final de rotinas de atraso

;================================================================

end

Postado
  digam AMD disse:
Amigo Miguel,

Como você, também estou aprendendo e estudando Assembly para o PIC16F628A.

Estou crú ainda na programação.

Enfim, quanto ao seu programa, essa linha que diz pra incluir a biblioteca do PIC:

#include "P16F628A.inc" ---> Nao seria #INCLUDE <P16F628A.INC> ?

Desculpe, mas posso estar comentando coisas sem nexo, de qualquer forma, é errando que se aprende e os feras podem dar o Help salvador!:D

Grande Abraço,

R.Costa.

Nao há definicão para essa instrução LOOP2?

Compila sem erros seu programa?

Amigo, se você fizer #include "blabla", o compilador primeiro procura pelo arquivo a ser incluído na pasta atual e depois nas pastas definidas pelo compilador ou por você nas opções (geralmente /i).

Se você fizer #inclue <blabla>, o compilador só vaí procurar nas pastas definidas por ele ou por você nas opções (geralmente /i).

Se não fui claro me avise que explico novamente.

Postado

Amigo, desculpe o arquivo que eu anexei anteriomente apresenta varios erros o arquivo compilado é este aqui em anexo!

Tanto assim #include "P16F628A.inc" como assim #INCLUDE <P16F628A.INC> , compila sem erro.

Eu não a entedi a pergunta em relação instrução LOOP2? Compile este progarma!

;===========================================================

LIST p = 16F628A ; dizer assembler que chip estamos usando

#include"P16F628A.inc" ; incluir as predefinições para o chip

ERRORLEVEL 0,-302 ; suprimir mensagens de seleção de banco

__config 0x3D18 ; conjuntos de configurações (tipo de Oscilador etc.).

;=============================================================================

;definições do programa

;==========================================================================================================

CBLOCK 0x20 ; iniciar de registos de propósito geral

contagem ; usado em looping rotinas

count1 ; utilizados na rotina de atraso

counta ; utilizados na rotina de atraso

countb ; utilizados na rotina de atraso

alterna ; bandeira alterne entre PWM alto & baixo

posição ; Centro é de 68 /-62 para extremos

W_TEMP

STATUS_TEMP

ENDC

;===========================================================================================================

org 0x0000

GOTO iniciar

;Interrupção Timer0.

ORG 0X0004

MOVWF W_TEMP

SWAPF STATUS, W

MOVWF STATUS_TEMP

BCF INTCON, T0IF

MOVF alterna, f; movê-la volta para sua auto para zero sinalizador

SKPNZ

GOTO LowOut

clrf alterna ; para alternar para próxima interrupção.

MOVF posição, w ; obter posição duração de pulso elevado

MOVWF TMR0 ; Centro é 68 /-60 para os extremos

bsf STATUS, RP0 ; banco select 1

MOVLW b'00000010' ; prescaler = 1: 8 para o tempo

MOVWF OPTION_REG

bcf STATUS, RP0 ; banco Selecione 0

BSF PORTB, 3 ; fisicamente farthest da entrada de frequência de T1CKI B6.

SWAPF STATUS_TEMP,W

MOVWF STATUS

SWAPF W_TEMP, F

SWAPF W_TEMP,W

RETFIE

;===========================================================================================================

LowOut

BSF alterna, 0 ; para alternar para próxima interrupção.

bsf STATUS, RP0 ; banco select 1

MOVLW b'00000101' ; prescaler = 1:64 para baixo tempo

MOVWF OPTION_REG

bcf STATUS, RP0 ; banco Selecione 0

BCF PORTB, 3 ; fisicamente farthest da entrada de frequência de T1CKI B6.

SWAPF STATUS_TEMP,W

MOVWF STATUS

SWAPF W_TEMP,F

SWAPF W_TEMP,W

RETFIE

iniciar movlw 0x07

movwf CMCON; desativar o comparators (torná-la como um 16F84)

Initialise

clrf contagem

clrf PORTA

clrf PORTB

SetPorts

bsf STATUS, RP0; banco select 1

movlw 0x00; fazer todas as saídas de pinos

movwf TRISA

movlw 0x00; fazer todas as saídas de pinos

movwf TRISB

MOVLW b'00000101'; prescaler = 1:64 para baixo tempo

MOVWF OPTION_REG

bcf STATUS, RP0; banco Selecione 0

CLRF INTCON

BSF INTCON, T0IE; habilitar interrupções de timer

clrf TMR0

bcf INTCON, T0IF; iniciar o temporizador

bsf INTCON, GIE; iniciar interrupções

;================================================================

principal; tudo aqui no é apenas para exercer o servo

MOVLW d'68'; Centro

MOVWF posição

CALL Delay255

CALL Delay255

CALL Delay255

CALL Delay255

MOVLW d'6'; pulso Long

MOVWF posição

CALL Delay255

CALL Delay255

CALL Delay255

CALL Delay255

MOVLW d'125'; pulso curto

MOVWF posição

CALL Delay255

CALL Delay255

CALL Delay255

CALL Delay255

GoTo principal; loop para sempre

;===============================================================

;Rotinas atraso

Delay255 movlw 0xff; atrasar mS 255

GoTo d0

Delay100 movlw d'100'; atrasar 100mS

GoTo d0

Delay50 movlw d'50'; atrasar 50mS

GoTo d0

Delay20 movlw d'20'; atrasar 20mS

GoTo d0

Delay5 movlw 0x05; atrasar 5.000 ms (relógio de 4 MHz)

d0 movwf count1

D1 movlw 0xC7; atrasar 1mS

movwf counta

movlw 0x01

movwf countb

Delay_0

decfsz counta, f

GoTo $+2

decfsz countb, f

GoTo Delay_0

decfsz count1, f

GoTo D1

retlw 0x00

; final do final de rotinas de atraso

;================================================================

end

Grande Abraço, ejss.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Mostrar mais  

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

Mostrar mais  
×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!