Ir ao conteúdo
  • Cadastre-se

Controle de motor de passo com PIC 16f877A


raf123

Posts recomendados

Olá,

Nos últimos dias estive tentando acender um led com o pic16f877A, porém sem sucesso.

Alguém poderia me ajudar?

Todos os capacitores (C1, C2, C3) são cerâmicos.

C1 = 100nF

C2 = 33pF

C2= 33pF

R1 = 1K

R2 = 330

Cristal de 4 Mhz

e Para alimentação utilizei os 5V de uma fonte de alimentação de computador.

Fiquei com dúvida na numeração dos capacitores que não manjo muito bem. O C1 é 104

, C2 e C3 são 333. Está tudo correto?

Segue o circuito e o código em C, pelo Flowcod

http://forum.clubedohardware.com.br/attachment.php?attachmentid=85651&stc=1&d=1326069575

Código:

//************************************************************************************
//**
//** File name: C:\Documents and Settings\Rafael\Desktop\Flowcode\Examples\Examples\Components\LED & Switch\2. Outputting an 8-bit value.c
//** Generated by: Flowcode v4.3.7.63
//** Date: Sunday, January 08, 2012 21:47:22
//** Licence: Professional
//** Registered to: 20ACM8
//**
//**
//** http://www.matrixmultimedia.com
//************************************************************************************


#define MX_PIC

//Definições para o microcontrolador
#define P16F877A
#define MX_EE
#define MX_EE_TYPE2
#define MX_EE_SIZE 256
#define MX_SPI
#define MX_SPI_C
#define MX_SPI_SDI 4
#define MX_SPI_SDO 5
#define MX_SPI_SCK 3
#define MX_UART
#define MX_UART_C
#define MX_UART_TX 6
#define MX_UART_RX 7
#define MX_I2C
#define MX_MI2C
#define MX_I2C_C
#define MX_I2C_SDA 4
#define MX_I2C_SCL 3
#define MX_PWM
#define MX_PWM_CNT 2
#define MX_PWM_TRIS1 trisc
#define MX_PWM_1 2
#define MX_PWM_TRIS2 trisc
#define MX_PWM_2 1

//Funções
#define MX_CLK_SPEED 4000000
#ifdef _BOOSTC
#include <system.h>
#endif
#ifdef HI_TECH_C
#include <pic.h>
#endif

//Configuração de dados
#ifdef _BOOSTC
#pragma DATA 0x2007, 0x3f3e
#endif
#ifdef HI_TECH_C
__CONFIG(0x3f3e);
#endif

//Funções internas
#include "C:\Arquivos de programas\Matrix Multimedia\Flowcode V4\FCD\internals.h"

//Declarações da função Macro
void FCM_INTERRUPT_TMR0();
void FCM_INTERRUPT_RB0INT();
void FCM_INTERRUPT_PORTB();


//Declarações da variável



//Implementações Macro

void FCM_INTERRUPT_TMR0()
{

}

void FCM_INTERRUPT_RB0INT()
{

}

void FCM_INTERRUPT_PORTB()
{

}

void main()
{
//Output a value to a port

//Iniciação
adcon1 = 0x07;


//Código de iniciação de interrupção
option_reg = 0xC0;


//Atraso
//Atraso: 20 ms
delay_ms(20);


//Ciclo
//Ciclo: Enquanto1
while (1)
{
//Saída
//Saída: 1 -> A3
trisa = trisa & 0xf7;
if (1)
porta = (porta & 0xf7) | 0x08;
else
porta = porta & 0xf7;


}


mainendloop: goto mainendloop;
}

void MX_INTERRUPT_MACRO(void)
{
}

Muito Obrigado pessoal.

post-43027-13884961557608_thumb.gif

Link para o comentário
Compartilhar em outros sites

Pra quem quer acender um led aquele programa está muito extenso. porque não tentar com algo mais simples? como por exemplo

LED=1;

DELAY_MS(X);

LED=0;

nintendo;5416539]sim ou não pode ser que ele esteja com problema por isso pergunto
Muito complicado este programa,cheio de coisas q nao vai usar para acender um led

Para acender o led se baseia no pseudo codigo a seguir:

loop:

Led=1

delay xtempo

led=0

delay xtempo

volta ao loop

Obs:É claro vai usar a linguagem do teu compilador para fazer o codigo.

Ok pessoal

e quanto ao circuito, está correto?

Muito Obrigado pessoal.

Link para o comentário
Compartilhar em outros sites

ok LEOPUENA =) Muito Obrigado

Desta vez tentei com o seguinte código e mesmo assim não funcionou! =(

Certa vez me disseram que seria bom colocar uns capacitores na alimentação.. será que este é o motivo?

#define MX_PIC

//Definições para o microcontrolador
#define P16F877A
#define MX_EE
#define MX_EE_TYPE2
#define MX_EE_SIZE 256
#define MX_SPI
#define MX_SPI_C
#define MX_SPI_SDI 4
#define MX_SPI_SDO 5
#define MX_SPI_SCK 3
#define MX_UART
#define MX_UART_C
#define MX_UART_TX 6
#define MX_UART_RX 7
#define MX_I2C
#define MX_MI2C
#define MX_I2C_C
#define MX_I2C_SDA 4
#define MX_I2C_SCL 3
#define MX_PWM
#define MX_PWM_CNT 2
#define MX_PWM_TRIS1 trisc
#define MX_PWM_1 2
#define MX_PWM_TRIS2 trisc
#define MX_PWM_2 1

//Funções
#define MX_CLK_SPEED 4000000
#ifdef _BOOSTC
#include <system.h>
#endif
#ifdef HI_TECH_C
#include <pic.h>
#endif

//Configuração de dados
#ifdef _BOOSTC
#pragma DATA 0x2007, 0x3f3e
#endif
#ifdef HI_TECH_C
__CONFIG(0x3f3e);
#endif

//Funções internas
#include "C:\Arquivos de programas\Matrix Multimedia\Flowcode V4\FCD\internals.h"

//Declarações da função Macro
void FCM_INTERRUPT_TMR0();
void FCM_INTERRUPT_RB0INT();
void FCM_INTERRUPT_PORTB();


//Declarações da variável



//Implementações Macro

void FCM_INTERRUPT_TMR0()
{

}

void FCM_INTERRUPT_RB0INT()
{

}

void FCM_INTERRUPT_PORTB()
{

}

void main()
{
//Output a value to a port

//Iniciação
adcon1 = 0x07;


//Código de iniciação de interrupção
option_reg = 0xC0;


//Saída
//Saída: 0 -> A3
trisa = trisa & 0xf7;
if (0)
porta = (porta & 0xf7) | 0x08;
else
porta = porta & 0xf7;


//Atraso
//Atraso: 1 s
delay_s(1);


//Saída
//Saída: 1 -> A3
trisa = trisa & 0xf7;
if (1)
porta = (porta & 0xf7) | 0x08;
else
porta = porta & 0xf7;


mainendloop: goto mainendloop;
}

void MX_INTERRUPT_MACRO(void)
{
}

Alguém tem alguma dica?

Link para o comentário
Compartilhar em outros sites

Se isso é simples não sei o que seria complicado. Mas pronto, aí está um programa simples e completo que acende e apaga um led de 1 em 1 segundo, feito no MikroC e testado no proteus com base no teu circuito.


void main()
{

//------------CONFIGURAÇÃO DE I/O---------------------
TRISA=( 0x00 );

//---------------------------------------

while(1){

porta=0x08;
delay_ms(1000);
porta=0x00;
delay_ms(1000);
}
}

Link para o comentário
Compartilhar em outros sites

Pessoal preciso utilizador o pic16f877A para fazer meu tcc para esse semestre. O pic vai controlar alguns reles.. o circuito já fiz e funciona, porém falta o pic para controlar. Preciso acender um LED, assim conseguirei fazer praticamente todo o restante.

Inicialmente tentei utilizar o programa Flowcode que gera o código atráves de diagrama.

Poderiam me indicar um programa que tenha uma maior facilidade e que vocês possam me ajudar a acender um led?

Tenho instalado aqui o microC PRO e o MPLAB IDE. Com o MPLAB IDE eu posso passar o programa para meu PIC direto. Tambem tenho o PICKit 2.

Meu gravador é o MultiPROG.

Poderiam me ajudar a criar um programinha a partir do zero?

Obrigado pessoal.

Se isso é simples não sei o que seria complicado. Mas pronto, aí está um programa simples e completo que acende e apaga um led de 1 em 1 segundo, feito no MikroC e testado no proteus com base no teu circuito.


void main()
{

//------------CONFIGURAÇÃO DE I/O---------------------
TRISA=( 0x00 );

//---------------------------------------

while(1){

porta=0x08;
delay_ms(1000);
porta=0x00;
delay_ms(1000);
}
}

Muito Obrigado LEOPUENA!

Utilizando o código que o amigo LEOPUENA passou, fiz o seguinte:


#include <16f877.h> // identifica microcontrolador alvo
#device ADC=10 // define AD para 10 bits, variando de 0 a 1023
#use delay (clock=4000000) // <- define cristal para 4Mhz. Para outros valores, mude e recompile.
#include <cuscostdio.h> // inclui biblioteca de funções do projeto CUSCOPiC

void main()
{

//------------CONFIGURAÇÃO DE I/O---------------------
TRISA=( 0x00 );

//---------------------------------------

while(1){

porta=0x08;
delay_ms(1000);
porta=0x00;
delay_ms(1000);
}
}

Está correto?

Link para o comentário
Compartilhar em outros sites

esta mas não vai acender todos os led's do porta se era essa sua intenção mas você não configurou um monte de coisa não desabilitou o conversor AD e é muito necessario não desabilitou as interrupções e também é necessario isso tudo vai no datasheet sugiro que leia mas como não quero ser muito cruel é so add ai no seu codigo

intcon=0x00;

adcon0=0x06;

não lembro se no conversor para desbilitar o conversor AD se configura o adcon0 ou o adcon1 ou os dois mas deu pra ter uma noção

Link para o comentário
Compartilhar em outros sites

nintendo;5419872]esta mas não vai acender todos os led's do porta se era essa sua intenção mas você não configurou um monte de coisa não desabilitou o conversor AD e é muito necessario não desabilitou as interrupções e também é necessario isso tudo vai no datasheet sugiro que leia mas como não quero ser muito cruel é so add ai no seu codigo

intcon=0x00;

adcon0=0x06;

não lembro se no conversor para desbilitar o conversor AD se configura o adcon0 ou o adcon1 ou os dois mas deu pra ter uma noção

ehhehue valeu misternintedo!

A inteção é realmente acender apenas 1 led por enquanto.

Logo irei testar e ler o datasheet sim!

Muito Obrigado. Abraço.

Link para o comentário
Compartilhar em outros sites

cara também perguntei se ja usou ele porque queria chegar no ponto que chegaram o codigo que estas fazendo é meio avançadinho usa até o tmr1 e essas coisas sendo inicializadas ou com erros que o co pilador não detecta vai dar bug varias coisas mais faz um cod assim mais ou menos assim

led=1;

delay

led=0;

só pra testar o pic pelo menos garantindo que funcione faça o que estas a fazer

Link para o comentário
Compartilhar em outros sites

Mais uma vez sem resultados =(

Desta vez tentei com o código que o LEOPUENA me passou! e também com um outro muito parecido que achei pela net, porém não tenho mais..

Quando ligo, todas as portas ficam com 0,60 +- Volts. O led ainda não acende.

Fiz pelo miKroC PRO. Configurei e utilizei um cristal de 4Mhz

void main()
{

//------------CONFIGURAÇÃO DE I/O---------------------
TRISD=( 0x00 );

//---------------------------------------

while(1){

portd=0x08;
delay_ms(1000);
portd=0x00;
delay_ms(1000);
}
}

Se alguém poder me ajudar. ;)

Link para o comentário
Compartilhar em outros sites

Tem a certeza que tá tudo bem ligado? o cristal no pino 13 e 14, MCLR ao positivo, VCC-11, GND-12. Como voce gravou?

Sim.. Está tudo ligado corretamente.

Para gravar utilizei o gravador MultiPROG Plus e o programa PICKit 2

Será que os valores dos diodos são estes mesmos?

estes diodos devem ser todos cerâmicos?

Link para o comentário
Compartilhar em outros sites

Será que os valores dos diodos são estes mesmos?

estes diodos devem ser todos cerâmicos?

Diodos?Ceramicos? Nao seriam capacitores? Eles sao ceramicos de 10pf a 33pf se nao me engano,ja usei 10pf e funcionou muito bem....Seria bom postar um esquema de como esta ligando teu hardware.Abraços.

Link para o comentário
Compartilhar em outros sites

Será que os valores dos diodos são estes mesmos?

Referes-te aos capacitores?! Os valores são esses mesmos (15 á 33p), mas tambem funciona sem eles.

Pessoalmente uso o ICPROG. Mas estou ssempre usando o PICKIT2 em trabalhos externos e nunca tive problemas.

De certeza que o PIC está bom?

Link para o comentário
Compartilhar em outros sites

Conforme combinado:

Refiz o circuito e também utilizei um 16f877A novo! E não funcionou! Todas as saídas ficaram com 0,50V ! =(

Tenho um PIC 16f628A nunca usado.. e cristal de 10, 20 e 4 Mhz.. além de diversos capacitores. Alguma sugestão?

Algum teste básico para fazer?

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Diodos?Ceramicos? Nao seriam capacitores? Eles sao ceramicos de 10pf a 33pf se nao me engano,ja usei 10pf e funcionou muito bem....Seria bom postar um esquema de como esta ligando teu hardware.Abraços.

ehuhehu

exatamente! Capacitores!

o esquema segue:

http://forum.clubedohardware.com.br/attachment.php?attachmentid=85651&d=1326069575

Referes-te aos capacitores?! Os valores são esses mesmos (15 á 33p), mas também funciona sem eles.

Pessoalmente uso o ICPROG. Mas estou ssempre usando o PICKIT2 em trabalhos externos e nunca tive problemas.

De certeza que o PIC está bom?

Por via das dúvidas irei refazer o circuito e também utilizar um outro PIC que tenho de reserva.

Mais tarde postarei os resultados ;)

Link para o comentário
Compartilhar em outros sites

Não entendo =S

com esse código:


void main() { //------------CONFIGURAÇÃO DE I/O---------------------
TRISD=( 0x00 ); //---------------------------------------

while(1){ portd=0x08;
delay_ms(1000);
portd=0x00;
delay_ms(1000);
}
}

Só funciona quando eu encosto no cristal... As vezes tem que mexer um pouco.. mais na maioria das vezes é só encostar que a saída 22 da porta D, conforme está configurado no código me dá 5,20 V, ou seja acende o led. Não pisca! Apenas acende o led.

O cristal é de perfil alto e de 4Mhz. Já testei outro de 4Mhz.

Alguém pode me ajudar?

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Iria sugerir usar esse 16f628 com oscilador interno. Mas o caso é muito estranho...

Já aconteceu comigo algumas vezes e os problemas foram os que citei (programa ou circuito).

Certo.. irei fazer mais testes, tentar mudar o circuito e a programação.. irei pesquisar..

Estou usando uma fonte de computador.. Ta saindo 5,40 V dela.. será que é o suficiente? Segundo o datasheet sim.. mais vai saber né rs

Sabe me dizer se o mesmo programa para acender o led posso utilizar no 16f628a?

Link para o comentário
Compartilhar em outros sites

cara tem que encostar um pouco então acho que é mal contato na proto board pelo que vi não problema no pic então (ufa não perdeu dinheiro) cara ja ouvi também fala de cristais que o encapsulamento deve ser aterrado pode ser isso também puxa um fiozinho do terra e de um jeito de encosta e permanecer encostado no encapsulamento

pode usar o mesmo programa só que nas config coloque assim

void main()

{

intcon=0x00;

cmcon=0x07;

trisa=;

trisb=;

while(1)

{

cod

}

}

Link para o comentário
Compartilhar em outros sites

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

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

×
×
  • Criar novo...