Ir ao conteúdo

Relógio Digital - Qual PIC?


allantoshio

Posts recomendados

Postado

Bom dia a todos!

Sou iniciante na área dos microcontroladores e gostaria muito de uma ajudinha do pessoal.

Pretendo fazer um relógio digital utilizando PIC.

Pelas pesquisas que fiz, vi que para ter um relógio confiável (precisão) terei de usar um CI RTC.

Irei utilizar 4 displays de 7 segmentos, 2 para as horas e os outros 2 para os minutos.

Ainda quero fazer o seguinte, trasmitir os dados do relógio para outro display, via RF (433.92MHz).

A minha dúvida é a seguinte, qual PIC serve melhor ao meu projeto? Tendo em vista que ele deverá se comunicar com o RTC, com os 4 displays e com o transmissor RF.

Como já mencionei, não entendo muito (ainda) de microcontroladores. Minha intenção com esse projeto é principalmente aprender, e, resolvi reunir componentes que quero me aprofundar (RF, PIC) em um único projeto.

Desde já agradeço a colaboração de todos!

Postado

Seu projeto é relativamente fácil, como você é iniciante vou recomendar um PIC mais poderoso e a medida que seus conhecimentos avançarem você poderá economizar no PIC nos próximos projetos.

- PIC16F877A

- PIC18F452

ambos são muito parecidos a diferença é que o 18F roda mais rápido, tem mais instruções em Assembly e mais memoria de programa. (consequentemente mais caro)

no fim das contas eu optaria pelo 877A que é o mais proximo de todos os modelos.

Se vai usar um RTC aproveite o modulo pronto I2C que pode ser programado no PIC, e para enviar os dados por RF você pode usar o modulo USART do PIC para efetuar a transmissão e recepção de dados.

de mais detalhes do projeto que nos vamos ajudando!

abs.

Postado

Felipe, obrigado pela pronta ajuda! :)

Então, basicamente o meu projeto inicial é esse.

O relógio principal vai ser composto pelo PIC, RTC, transmissor RF e 4 displays. Nele deverá ser possível o ajuste de horas.

E vai ter o relógio secundário, composto por um PIC, receptor RF e 4 displays. O relógio secundário vai apenas mostrar a hora recebida pelo relógio principal.

O PIC do relógio secundário poderá ser um mais simples, certo?

Mais uma vez, obrigado!

Postado

Na verdade ainda não defini uma linguagem a ser utilizada.

Não sei quais linguagens eu consigo utilizar para programar um PIC, pelo que pesquisei até agora eu vi C, Basic e Assembler. Desses três tenho mais "intimidade" com Basic e C.

Há alguma indicação que você possa me fazer? Ainda não pesquisei sobre compiladores, mas tenho preferência em programas OpenSource ou Free.

Obrigado pela ajuda!

Postado

Olha compilador C e Basic open source difícil hein, mas a maioria da uma limitação de código que não faz muita diferença em projetos simples, veja algumas IDEs:

- PSI - Pic Simulator IDE , o grande diferencial dessa IDE aqui é o simulador que acompanha que traz displays, eeproms, teclados osciloscopios e um monte de coisa pra simular teu codigo no PC, seu compilador funciona em linguagem Basic.

-CCS Ide em linguagem C, simples e intuitiva da pra fazer muita coisa aqui com pouco conhecimento de linguagem C, o problema é que ela não segue a risca o padrão ANSI -C e para configurar o microcontrolador e seus módulos os nomes dos registradores mudam, nãoseguem o padrão do datasheet.

- MikroC acho que é uma das IDE em C mais usadas por aqui, o legal dela é a grande quantidade de bibliotecas prontas para as mais diversas funções, ela segue o padrão ANSI e possui uma limitação de codigo de ate 2K.

-MikroBasic identico ao Mikroc porém em linguagem Basic.

- MPLAB IDE bom essa é minha favorita (programo em assembly) deve ser um das menos usadas por aqui, é a IDE da propria microchip, e se conecta diretamente com os gravadores mais populares como o ICD2 e o PICKIT, possui um simulador para debug de código bem eficiente, porém essa aqui é pro pessoal que realmente quer aprender assembly e sem duvvidas é a mias assim 'difícil' de se aprender.

acho que ja da pra ter uma base...

abs.

Postado

Acho que já usei o MPLAB na faculdade...

Vou instalar ele e dar uma olhada, baixar alguns tutoriais de Assembly e vamos ver no que vai dar! Sabe de algum tutorial bom?

Acho que não deve ser tão difícil, não é? Tudo segue a mesma lógica..

Falando em gravador, eu iria precisar de um.. vi um no Mercado Livre (Picburner), será que é bom? Quero um simples mesmo, para aprendizado.

Obrigado.

Postado

Felipe, obrigado pelas indicações!

Estou estudando um pouco sobre a linguagem Assembly no link que você passou, baixei o MPLAB e vou "brincar" um pouco com ele. Paralelamente a isso, estou dando uma olhada em C, pois como já havia dito, é uma das linguagens que tenho um pouco mais de afinidade.

Assim que tiver algum progresso no meu projeto posto aqui o andamento dele.

Mais uma vez, obrigado!

Postado

Pessoal, é o seguinte...

Já consegui fazer o PIC16F877A se comunicar com o CI RTC (DS1307) e inclusive já fiz o PIC mostrar no display 2 dígitos de um horário.

O que acontece é que para ter 4 dígitos (HH:MM) tenho que multiplexar os displays.

Fiz vários testes, tentei de várias formas... mas não sei o que estou errando.

Estou usando o Proteus para simular o circuito, e quando coloco para rodar, os 4 displays ficam piscando aleatoriamente os números.

Não sei se tem algo a ver com o clock, não sei se no Proteus esse tipo de simulação não funciona...

Fiz até um circuito só com os displays multiplexados e o PIC para testar, mas mesmo assim não vai..

Postado

Poste o circuitinho aqui...

Não sei em qual linguagem está fazendo mas em assembly eu abuso dos registradores FSR e INDF para fazer esse tipo de trabalho.

Ja cogitou a possibilidade de usar LCDs são menos trabalhosos de usar e dispensam multiplexação.

Abs.

Postado

Felipe, estou programando em C mesmo.

Segue anexo o circuito que estou testando.

O código fonte que estou usando para testar o display multiplexado é esse:

/*
* Project name:
Display7seg (Advanced 7Seg. display example)
* Copyright:
(c) MikroElektronika, 2005-2008.
* Description:
This code demonstrates displaying number on four 7-segment display (common
cathode), in multiplex mode. All 7-segment displays are connected to PORTD
(RD0..RD7, segment A to RD0, segment B to RD1, etc) with refresh via pins
RA0..RA3 on PORTA. Number is on for 1 second.
* Test configuration:
MCU: PIC16F887
Dev.Board: EasyPIC5
Oscillator: HS, 08.0000 MHz
Ext. Modules: -
SW: mikroC PRO for PIC
* NOTES:
- Turn on 7seg displays on (SW6.5, SW6.6, SW6.7, SW6.8 ) (board specific)
*/

#include "Display_utils.h"

unsigned short shifter, portd_index;
unsigned int digit, number;
unsigned short portd_array[4];

void interrupt() {
PORTA = 0; // Turn off all 7seg displays
PORTD = portd_array[portd_index]; // bring appropriate value to PORTD
PORTA = shifter; // turn on appropriate 7seg. display

// move shifter to next digit
shifter <<= 1;
if (shifter > 8u)
shifter = 1;

// increment portd_index
portd_index++ ;
if (portd_index > 3u)
portd_index = 0; // turn on 1st, turn off 2nd 7seg.

TMR0 = 0; // reset TIMER0 value
INTCON = 0x20; // Clear T0IF
}

void main() {
ANSEL = 0; // Set AN pins to Digital I/O
ANSELH = 0;
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;

OPTION_REG = 0x80; // Timer0 settings
digit = 0;
portd_index = 0;
shifter = 1;
TMR0 = 0;
INTCON = 0xA0; // Enable GIE, T0IE
PORTA = 0;
TRISA = 0; // Set PORTA as output
PORTD = 0;
TRISD = 0; // Set PORTD as output

number = 5555; // some initial value
do {
digit = number / 1000u ; // extract thousands digit
portd_array[3] = mask(digit); // and store it to PORTD array
digit = (number / 100u) % 10u; // extract hundreds digit
portd_array[2] = mask(digit); // and store it to PORTD array
digit = (number / 10u) % 10u; // extract tens digit
portd_array[1] = mask(digit); // and store it to PORTD array
digit = number % 10u; // extract ones digit
portd_array[0] = mask(digit); // and store it to PORTD array

Delay_ms(1000); // one second delay

number++ ; // increment number
if (number > 9999u)
number = 0;

} while(1); // endless loop
}

Include Display_utils.c:

//-------------- Returns mask for common cathode 7-seg. display
unsigned short mask(unsigned short num) {
switch (num) {
case 0 : return 0x3F;
case 1 : return 0x06;
case 2 : return 0x5B;
case 3 : return 0x4F;
case 4 : return 0x66;
case 5 : return 0x6D;
case 6 : return 0x7D;
case 7 : return 0x07;
case 8 : return 0x7F;
case 9 : return 0x6F;
} //case end
}

Esse código veio de exemplo no compilador MikroC (obrigado pela indicação!)

Valeu!

post-699915-13884955214846_thumb.png

Postado

Eis o erro crucial do seu projeto:

- O código foi feito para o pic16f887;

- você esta usando o PIC16F877A;

Como os arquivos headers são diferentes vai dar problema no código, das duas uma:

- Ou você modifica o código e compila ele como sendo o 877A

- Ou substitui o 877A que ta no seu circuito pelo 887 e deixa o código do jeito que ta.

EDIT.: E tem mais observe que você não pos o cicruito oscilador (o cristal e os dois capacitores) com isso o PIC fica sem clock e não processa nada...

Abs.

Abs.

Postado

Fala Felipe!

Valeu pela ajuda cara, mas mesmo assim não funcionou!

Realmente, eu estava simulando com o PIC errado! Agora estou rodando o simulador com o PIC utilizado no código teste (PIC16F887).

Pensei que não havia necessidade de se colocar o cristal no simulador... Pensei que bastava configurar isso nas propriedades do PIC (no ISIS).

Mesmo fazendo essas modificações o display não funciona corretamente. Fica só piscando os números aleatoriamente entre os 4 displays.

Testei vários códigos fontes, diferentes formas de se programar isso e nada.

Não sei no que estou errando.. Esse sábado vou comprar o PIC e vou testar isso "em carne e osso", pois estou achando que é o simulador...

Postado

Acho que deve ser alguma configuração de clock que eu não estou sabendo lidar...

Testei uma configuração de clock em 0.01MHz nas propriedades do PIC (Processor Clock Frequency) e aconteceu que funcionou "mais ou menos". O contador incrementava normalmente e mostrava no display, só que o display ficava piscando em sequência..

Os displays multiplexados funcionam assim mesmo, mas eu acho que eles devem piscar muito mais rápido, para dar a sensação de que todos eles estão acesos ao mesmo tempo, não é?

Na programação, o código diz isso: "Oscillator: HS, 08.0000 MHz". É o cristal, certo?

post-699915-13884955218668_thumb.jpg

post-699915-13884955218943_thumb.jpg

post-699915-13884955219096_thumb.jpg

post-699915-13884955219259_thumb.jpg

Postado

Pessoal, pesquisando arduamente pela net cheguei a uma conclusão: Ao que parece, o Proteus não simula perfeitamente como deve aparecer um display multiplexado.

Para melhorar o efeito que um display multiplexado produz, devemos configurar um item no Proteus.

Para configurar, basta ir no menu System, Set Animation Options;

Coloque o Frames per Second = 50;

Timestep per Frame = 200m;

Isso dá uma melhorada, os displays continuam piscando, porém dá para visualizar bem o que aparece.

Bom, feito minha simulação, vou dar andamento no projeto!

Já estou com os displays e alguns componentes em mãos, vou ver o PIC amanhã.

Quero ver se vai dar tudo certo fazendo isso "de verdade" no protoboard :D

Valeu pessoal. Obrigado Felipe pela ajuda!

  • mês depois...
Postado

Boa tarde meus amigos , estou fazendo um projeto porém tive que migrar do 877 para o 887,contudo esta acontecendo um problema com o pino A5, segundo o manual de migração, reza que tenho carregar o registrados ansel com 0 para que o pino a5 possa funcionar como um i/o digital,e não sei como fazer isso, fico muito grato se alguem puder me ajudar, abç a todos

Postado

Então meu amigo eu fiz o programa que esta funcionando perfeitamente no 877, mas quand migrei para o 887 tive alguns problemas mas consegui reslover,,, mas o pino A5 no consigo fazer com que responda as linhas de comando,,, esqueci de dizer mas estou usando o CCS 4.023. Assim que chegar vou fazer o teste para ver se esta linha de comando rsolve meu problema, por enquanto agradeço.Obrigado Allantoshio

  • 7 meses depois...
Postado

boas tardes a todos!

Estou a tentar fazer um pequeno projecto, também com uma PIC16F877A.

Estou com problemas, pelo menos na simulação (ainda nao parti para a montagem)...

Não estou a conseguir fazer a multiplexagem... quero multiplexar 2 displays, mas não sei o motivo para por exemplo, activo apenas um dos transistores (para activar um dos displays) e os displays ficam os 2 activos... porque será!?

Cumprimentos

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!