Ir ao conteúdo

Controle de motor de passo com PIC 16f877A


raf123

Posts recomendados

Postado

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

Postado
nintendo;5416526]você ja fez outr coisa com esse pic ou é a primeira coisa que faz com ele

Olá mister Nintendo

Será que aquele loop infinito que eu fiz não vai travar o pic? (não entendo muito de programação de pics)

Abraço mister nintendo.

Postado
nintendo;5416539]sim ou não pode ser que ele esteja com problema por isso pergunto

esqueci de responder =)

ainda não havia utilizado. Comprei a pouco tempo.

Abraço.

Postado

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;

Postado

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.

Postado
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.

Postado

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?

Postado

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);
}
}

Postado

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?

Postado

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

Postado
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.

Postado

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

Postado

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. ;)

Postado
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?

Postado
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.

Postado
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?

Postado

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 ;)

Postado

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).

Postado

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?

Postado

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

}

}

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!