Ir ao conteúdo

O 16f877a


CIS

Posts recomendados

Postado

Ola pessoal, estou ja alguns dias tentando com PIC16F877A e um display de sete segmentos, queria fazer um contador simples de 0 a 9 mas não estou conseguindo,meu programa ate compila no pic c ccs e grava, mas não roda no protoboard, ligo o MCLR tudo certinho ,mas ele não faz a contagem...

gostaria de tentar no mickro C , mas como é um fonte que peguei na net e esta para o CCS, não estou sabendo faze-lo no mickro C sera que alguem tem uma ideia????

minha dificuldade e na hora de iniciar o PIC com os conversores, comparadores , essas coisas....

// Código de exemplo de ligação de display de 7 segmentos anodo
// comum com PIC16F877A

// Para ser compilado com o PICC-CCS

#include "main_7seg.h"

byte const digito[] = { 0b11000000, // 0 Define cada segmento
0b11111001, // 1 dos valores mostrados
0b10100100, // 2 no display de LEDs
0b10110000, // 3 em binário para ficar
0b10011001, // 4 mais fácil de codificar
0b10010010, // 5 cada dígito dos valores
0b10000010, // 6 mostrados no display.
0b11111000, // 7
0b10000000, // 8
0b10010000};// 9

void main() // Função principal
{
int contador; // variável de contagem

setup_adc_ports(NO_ANALOGS); // Configura analógicos
setup_adc(ADC_OFF); // ADC desligado
setup_psp(PSP_DISABLED); // PSP desligado
setup_spi(SPI_SS_DISABLED); // SPI delsigado
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // Configura Timer 0
setup_timer_1(T1_DISABLED); // Configura Timer 1
setup_timer_2(T2_DISABLED,0,1); // Configura Timer 2


while (true) // Loop infinito
{
for (contador = 0; contador != 10; contador++) // Contagem de 0 até 9
{
output_b (digito[contador]); // Apresenta Digito[valor_do_contador]
delay_ms (200); // Aguarda 200ms para dar uma pausa no PIC
}
}
}

Postado

Não se esqueça do resistor no MCLR.

Circuito:

circuito_PIC_7seg.jpg

Código:

//Programa feito no PCW da CCS, conhecido como PICC.

#include <16F877A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000)

#define frame_time 500 //Velocidade do motor

int8 i;

char sete_seg[10]=
{
0b00111111, //PASSO0
0b00000110, //PASSO1
0b01011011, //PASSO2
0b01001111, //PASSO3
0b01100110, //PASSO4
0b01101101, //PASSO5
0b01111100, //PASSO6
0b00000111, //PASSO7
0b01111111, //PASSO8
0b01100111, //PASSO9
};

void main ()
{
while(true)
{
for(i=0;i<10;i++)
{
output_b(sete_seg[i]);
delay_ms(frame_time);
}
}
}

Falou

Postado

por favor pessoal, deem opiniões e comentem possiveis erros...

tentei passar um fonte do CCS para o mickro C, sera que ficou certo....e para o 16F877a

#define display1 pin_c6

#define display2 pic_c7

unsigned char numero[10] = {0b11000000,0b11111001,0b10100100,0b10110000,0b10011001,0b10010010,0b10000010,0b11111000,0b10000000,0b10010000};

int unidade , dezena;

int a;

void main() {

trisc = 0;

trisb = 0;

while(1) {

for(a=0;a<100;a++) {

unidade = a/10;

dezena = a - (unidade*10);

portb = numero[unidade];

display1 = 1;

delay_ms(100);

display1 = 0;

portb = numero[dezena];

display2 = 1

delay_ms(100);

display2 = 0;

}

}

}

Não se esqueça do resistor no MCLR.

Circuito:

circuito_PIC_7seg.jpg

Código:

//Programa feito no PCW da CCS, conhecido como PICC.

#include <16F877A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000)

#define frame_time 500 //Velocidade do motor

int8 i;

char sete_seg[10]=
{
0b00111111, //PASSO0
0b00000110, //PASSO1
0b01011011, //PASSO2
0b01001111, //PASSO3
0b01100110, //PASSO4
0b01101101, //PASSO5
0b01111100, //PASSO6
0b00000111, //PASSO7
0b01111111, //PASSO8
0b01100111, //PASSO9
};

void main ()
{
while(true)
{
for(i=0;i<10;i++)
{
output_b(sete_seg[i]);
delay_ms(frame_time);
}
}
}

Falou

valeu cara, mas sera que da pra fazer no mickro C???

é, ja encontrei um erro nas definiçoes dos displays e ja corrigi pessoal, mas aguardo a opnioes de vocês

Postado


void main
{
int cont;
unsigned char sete_seg[10]=
{
0b00111111, //PASSO0
0b00000110, //PASSO1
0b01011011, //PASSO2
0b01001111, //PASSO3
0b01100110, //PASSO4
0b01101101, //PASSO5
0b01111100, //PASSO6
0b00000111, //PASSO7
0b01111111, //PASSO8
0b01100111, //PASSO9
};

(faça suas configurações aqui desabilita interrupções
comparadores seta saidas e esntrads etc)

while(1)
{
if(botão==1)
{
cont++;
delay_ms(100);
}
portb=sete_seg[cont];

if(cont>9 || cont<0)
{
cont=0;
}
}
}

qualque duvida sobre meu codigo ou do mickroC( que é o compilador que eu uso que sei e conheço bem) é so falar

implementei um botão só para não ficar contando que nem louco

Postado

olha essa apostila é muito boa, ela tem como configurar o canal analogico entre outras coisas.

http://www.ebah.com.br/content/ABAAAADUEAH/linguagem-c-pic

exemplo de canal analogico configurado:


long int exemplo1,exemplo;2
setup_adc_ports(RA0_RA1_RA3_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
exemplo1=read_adc();
delay_ms(50);
set_adc_channel(1);
exemplo2=read_adc();
delay_ms(50);

setup_adc_ports(ALL_ANALOG);

aqui você configuraria as entradas analogicas, da uma olhada no datasheet do pic porque se eu não me engano ele não aceita configurar apenas uma entrada como canal analogico, ai voce define tambem qual vai ser o referencial se vai ser um externo ou não.

e nas diretivas de compilação voce define tambem a quantidade de bits da conversão que são 10 ou 8 bits,ficaria assim #device adc=10

Postado

obrigado Tagmcx! não consegui ver a apostila que você indicou, mas vou fazer uma busca por aqui

...

valeu

bom pessoal, consegui com esse programa fazer um contador ate 99 , funcionou beleza, mas agora como fazer uma contador com 3 , ou 4 displays??? a questao é, como vou fazer pra acrescentar uma cetena e depois uma milhar?? to usando o microC e o 16F877a...

#define display1 portc.f6

#define display2 portc.f7

unsigned char numero[10] = {0b11000000,0b11111001,0b10100100,0b10110000,0b10011001,0b10010010,0b10000010,0b11111000,0b10000000,0b10010000};

int unidade , dezena;

int a;

void main() {

trisc = 0;

trisb = 0;

portc = 0;

portb = 0;

while(1) {

for(a=0;a<100;a++) {

unidade = a/10;

dezena = a - (unidade*10);

portb = numero[unidade];

display1 = 1;

delay_ms(100);

display1 = 0;

portb = numero[dezena];

display2 = 1 ;

delay_ms(100);

display2 = 0;

}

}

}

Postado
pode usar a multiplexaçao,aqui no forum tem um codigo q passei q ensina como fazer

valeu Jorge, mas cara eu não sei onde esta o topico que você se refere ainda não sei usar o forum direitinho, como faço pra buscar essa informação???

Postado

Relaxa manino agente passa pra você


dezm = (m/10);
unim = (m-(dezm*10));

dezh = (h/10);
unih = (h-(dezh*10));

output_b (digito[unih]); // Apresenta Digito[unidade_do_contador]
output_high (Display1); // Habilita display 1
delay_ms (1); // Aguarda 50ms para dar uma pausa no PIC
output_low (Display1); // Desabilita display 1
output_b (digito[dezh]); // Apresenta Digito[dezena_do_contador]
output_high (Display2); // Habilita display 2
delay_ms (1); // Aguarda 50ms para dar uma pausa no PIC
output_low (Display2); // Desabilita display 2

output_b (digito[unim]); // Apresenta Digito[unidade_do_contador]
output_high (Display3); // Habilita display 1
delay_ms (1); // Aguarda 50ms para dar uma pausa no PIC
output_low (Display3); // Desabilita display 1
output_b (digito[dezm]); // Apresenta Digito[dezena_do_contador]
output_high (Display4); // Habilita display 2
delay_ms (1); // Aguarda 50ms para dar uma pausa no PIC
output_low (Display4);

Lembrando que para cada display tera uma variavel ,tipo unidade ,dezena,unidade_centena,dezena_centena etc...... ,analisa este ,se nao entender grita aeeeeeeeeeeeee.

Postado

valeu cara, mas eu realmente não entendi a questão das variaveis , e eu uso o mickro 5.30, .

eu gostaria de saber assim, como no programa postado por mim, onde a unidade é a variavel a divido por 10, a dezena é a variavel a menos ela mesmo vezes 10. ate aqui beleza, agora eu to pensando aqui comigo, sera que a centena pode ser a variavel menos ela mesmo vezes 100???? eu gostaria de entender assim, se puder cara

valeu a ajuda

!!!

Postado

o amigao,tenta assim,acho q da certo:

Crie tres variaveis : centena,dez_centena,uni_centena e tente essa conta aqui:


centena =numero/100
dezcentena= (numero-100)/10
unidade= numero-(dezenacentena*10)

Postado
o amigao,tenta assim,acho q da certo:

Crie tres variaveis : centena,dez_centena,uni_centena e tente essa conta aqui:


centena =numero/100
dezcentena= (numero-100)/10
unidade= numero-(dezenacentena*10)

ok, vamos ver !!!

Postado

Tenta este raciocinio

short(pode ser int mas short é uma variavel que consome muita memoria por isso uso short)

voltando

void main()

{

short unidade, dezena, centena;

(configurações demais coisas)

while(1)

{

if(bt1==1)

{

unidade++;

}

if(unidade>9)

{

dezena++;

unidade=0;

}

if(dezena>9)

{

centena++;

dezena=0;

}

}

}

é um esboço agora tens que se preocupar como indentificar o numero como mostrar no display e possiveis bug's como os que vão aparecer caso coloque um botão para a subtração do numero vou procurar um codigo que postei que fiz mostrando a demutiplexação

Postado
Tenta este raciocinio

short(pode ser int mas short é uma variavel que consome muita memoria por isso uso short)

voltando

void main()

{

short unidade, dezena, centena;

(configurações demais coisas)

while(1)

{

if(bt1==1)

{

unidade++;

}

if(unidade>9)

{

dezena++;

unidade=0;

}

if(dezena>9)

{

centena++;

dezena=0;

}

}

}

é um esboço agora tens que se preocupar como indentificar o numero como mostrar no display e possiveis bug's como os que vão aparecer caso coloque um botão para a subtração do numero vou procurar um codigo que postei que fiz mostrando a demutiplexação

ok jorge vamos ver!!! obrigado

  • 4 semanas depois...
Postado

de volta pessoal!!!! to com o PIC16F877A, mas não estou conseguindo nada com alguns botões e uns leds, no mickro C pro FOR PIC.. tem alguma coisa coisa especial que devo fazer nesse compilador?? alguem tem algum exemplo para isso???

Postado
você ja entrou na pg de configuração dele para configurar coisas como watchdog oscilador usado etc

aperte

ctrl+shift+e

e configure

ok, vou tentar isso... mas acho que não seja, ja que consigo outros programinhas simples coma mesma configuração... tava pensando se não tem que habilitar alguma coisa do compilador para trabalhar com botões....

Postado
ok, vou tentar isso... mas acho que não seja, ja que consigo outros programinhas simples coma mesma configuração... tava pensando se não tem que habilitar alguma coisa do compilador para trabalhar com botões....

Algumas versões do MikroC misteriosamente não pré-habilitam as "libraries". Esteja certo de que as bibliotecas necessárias estejam marcadas antes de compilar o programa.

Postado
Algumas versões do MikroC misteriosamente não pré-habilitam as "libraries". Esteja certo de que as bibliotecas necessárias estejam marcadas antes de compilar o programa.

certo irmão, mas a questão é como fazer ou verificar isso... to usando a versão demo 5.40 para ate 2k, baixei do site da mickroeletronica semana passada...

por ser a mais nova acho que vem tudo certinho ou não????

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!