Ir ao conteúdo
  • Cadastre-se

Programação em C para PIC


oiluj

Posts recomendados

Eu num mudei o componente não, o problema é que na epoca da facul, um monte de gente mexe no meu PC, ai já viu neah, vira bagunça..

ahsudihasiudhasui...

Outra Coisa, acho que minha biblioteca de LCD que deve estar com pau, porque eu peguei simulei lá do jeito que tava, ai funcionou legal....

Depois eu só abri o arquivo .c no CCS e apertei F9, nem mexi em anda, num digitei nada.... A partir do momento que fiz isso,fui no Proteus, abri lá, carreguei o .Hex de novo, e adivinha, já não rodou mais!

Manda sua biblioteca do Lcd aí se tiver como!

Tô meio enrolado, aqui que tô dando faxina eu vou continuar nos estudos da linguagem hoje a noite no meu serviço..

Aqui te fazer uma pergunta esse Periodo você pagou Circuitos I com o Bento?

Porque, acho que tinha um Matheus que era de uns periodos pra frente na sala, as vezes era vocÊ!!

Abraços!!

Link para o comentário
Compartilhar em outros sites

Ah tá, mas foi no periodo passado que eu fiz circuitos I, esse Periodo vou fazer o II com o Sidney... Hehehe...

Mas aqui voltando ao assunto, como editei ali em cima e disse, eu acho que minha biblioteca do LCD tá com pala, pelo seguinte... Eu peguei seus arquivos e simulei, aí funcionou, depoi peguei e abri o arquivo .c no CCS e simplesmente compilei, apertei F9 sem nem mexer na tela de programação, aí depois peguei fui no Proteus, e carreguei o arquivo .hex de novo no PIC, aí quando fui simular, pronto, á não apareciz nada no LCD novamente...

Eu achoq ue é minha biblioteca de LCD do CCS, teria como você postar a sua aí pra eu dar uma olhada?!! (Ou até mesmo, substituir a minha por ela!)

T+, abraços!!!

Link para o comentário
Compartilhar em outros sites

Bem, você não pode confiar demais na simulação do proteus. Tem hora que ela buga.

Mas de toda forma, tá aí a biblioteca padrão do CCS:


//// LCDD.C ////
//// Driver for common LCD modules ////
//// ////
//// lcd_init() Must be called before any other function. ////
//// ////
//// lcd_putc(c) Will display c on the next position of the LCD. ////
//// The following have special meaning: ////
//// \f Clear display ////
//// \n Go to start of second line ////
//// \b Move back one position ////
//// ////
//// lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1) ////
//// ////
//// lcd_getc(x,y) Returns character at position x,y on LCD ////
//// ////
///////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2007 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS C ////
//// compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, reproduction ////
//// or distribution is permitted without written permission. ////
//// Derivative programs created using this software in object code ////
//// form are not restricted in any way. ////
///////////////////////////////////////////////////////////////////////////

// As defined in the following structure the pin connection is as follows:
// D0 enable
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7
//
// LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B
// #define use_portb_lcd TRUE


struct lcd_pin_map { // This structure is overlayed
BOOLEAN enable; // on to an I/O port to gain
BOOLEAN rs; // access to the LCD pins.
BOOLEAN rw; // The bits are allocated from
BOOLEAN unused; // low order up. ENABLE will
int data : 4; // be pin B0.
} lcd;


#if defined use_portb_lcd
//#locate lcd = getenv("sfr:PORTB") // This puts the entire structure over the port
#ifdef __pch__
#locate lcd = 0xf81
#else
#locate lcd = 6
#endif
#define set_tris_lcd(x) set_tris_b(x)
#else
//#locate lcd = getenv("sfr:PORTD") // This puts the entire structure over the port
#ifdef __pch__
#locate lcd = 0xf83
#else
#locate lcd = 8
#endif
#define set_tris_lcd(x) set_tris_d(x)
#endif

#ifndef lcd_type
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#endif

#define lcd_line_two 0x40 // LCD RAM address for the second line


BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
// These bytes need to be sent to the LCD
// to start it up.


// The following are used for setting
// the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in



BYTE lcd_read_byte() {
BYTE low,high;
set_tris_lcd(LCD_READ);
lcd.rw = 1;
delay_cycles(1);
lcd.enable = 1;
delay_cycles(1);
high = lcd.data;
lcd.enable = 0;
delay_cycles(1);
lcd.enable = 1;
delay_us(1);
low = lcd.data;
lcd.enable = 0;
set_tris_lcd(LCD_WRITE);
return( (high<<4) | low);
}


void lcd_send_nibble( BYTE n ) {
lcd.data = n;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
}


void lcd_send_byte( BYTE address, BYTE n ) {

lcd.rs = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
lcd.rs = address;
delay_cycles(1);
lcd.rw = 0;
delay_cycles(1);
lcd.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}


void lcd_init() {
BYTE i;
set_tris_lcd(LCD_WRITE);
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(15);
for(i=1;i<=3;++i) {
lcd_send_nibble(3);
delay_ms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}


void lcd_gotoxy( BYTE x, BYTE y) {
BYTE address;

if(y!=1)
address=lcd_line_two;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
}

void lcd_putc( char c) {
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break;
case '\b' : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;
}
}

char lcd_getc( BYTE x, BYTE y) {
char value;

lcd_gotoxy(x,y);
while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
lcd.rs=1;
value = lcd_read_byte();
lcd.rs=0;
return(value);
}
///////////////////////////////////////////////////////////////////////////

O meu CIRC II é com o sidney também, eu acho. No integral.

Então faremos a matéria juntos!

Falou

Link para o comentário
Compartilhar em outros sites

Realmente era a minha biblioteca, peguei a sua, salvei lá, compilei de novo o programa e simulei no proteus e agora funcionou...

Eu hein, eu nunca alterei as bibliotecas que vieram com o CCS, e essa tá doidona.. Hasudhaisdhasiud...

Então, vamo ver o que que ele vai arrumar esse periodo, espero que esteja de boua, já devo matérias demais, pre ficar devendo circuitos II também.....

Abraços!!!

EDIT:

Cara o do LCD funcionou certinho, mas agora tô tentando com 2 displays de 7 segmentos, aí que tá, o pau que tá dando é no proteus, tipo eu estou usando Catodo comum lá, aí coloquei os pinos comuns 1 e 2 (um de cada displau) ligado a 2 transistors(BC548) e aí liguei a bas deles nos pinos do PIC(com um resistor de 10k), e no emissor o ground, o problema é que quando desativa o quadradinho lá(aqueles que ficam vermelho com positivo, azul com negativo, e cinza quando tá sem sinal), ele não fica cinza fica só em azul lá na cehgada do display, vocÊ sabe o que pode ser?

Abraços!!!

Link para o comentário
Compartilhar em outros sites

Uai a turma do C sumiu, hehe...

Mas aqui galera, fora esse problema aí de cima tive mais uns esses dias que foi o seguinte, eu fiz um projeto de cubo de leds, em Basc, e fui passar ele pro C, mas em Basic, eu fiz da seguinte forma, declarei 3 variavéis(matrizes), e depois em cada sub-rotina, fui atribuindo valores a elas, e em c a cada nova rotina eu criava novas variavéis, no fim das contas, quando fui compilar o programa, deu que a memória RAM era insuficiente, para todas variavéis, aí estou modificando o programa e trando as variavéis e no lugar estou colocando output_x(), e ali o que teria que aparecer!

Queria saber de você que são mais experientes, o que seria mais aconselhavel, eu continuar fazendo isso, ou eu fazer o mesmo que eu fiz no Basic, declarar no inioc e depois apenas atribuir valores?!!

Ah um detalhe, nem todas as matrizes do mesmo tamanho, e na verdade são vetores são!

Abraços, e desde já agradeço!!

Link para o comentário
Compartilhar em outros sites

Não tinha visto seu edit.

Poste o circuito do display 7 seg. Fica mais fácil de verificar. Se você tiver como enviar os arquivos todos, melhor ainda.

Não entendi muito bem sua 2ª dúvida. Mas pelo que entendi, é mais fácil você declarar algumas variáveis e na medida que precisar, ir modificando seus valores. Se não você vai fazer uma constante e com o tempo seu programa fica cheio.

Tem uma forma de diminuir o espaço ocupado pelos vetores. Ao invés de declarar como int ou char, tente declarar como const, acho q é esse o comando mesmo. O vetor dessa forma vai para a ROM e nao para a RAM.

EDIT

Conferi e é isso mesmo:

const int sequencia_1[85][3];

Exemplo de um vetor com 85 linhas e 3 colunas.

Falou

Link para o comentário
Compartilhar em outros sites

E aí Matheus, beleza? Já tá em SJDR!!

Aqui com relação a mostrar lá nos dislays de 7-seg, os arquivos estaõ aqui:

http://www.4shared.com/file/ZSD4b-_y/Medidor_de_Tenso_-_7seg.html

E quanto a declaração das variavéis, eu estou vendo aqui, fiz uum programa sem nenhuma declaração apenas tratando as ações mesmo, e depois vou fazer um declarando pra ver a diferença de memória gasta!

Abraços e valeu!!

Link para o comentário
Compartilhar em outros sites

Cara colega, já estou em sao joao mesmo.

Só q o meu PC ficou na minha casa pois estou mudando de república e só podeei de ajudar quando trouxer meu PC ou você me encontrar na facul.

Tenho aula hj as 21H de eficiencia energética. Me procure na hora do intervalo. 31-8884-7496.

Falou

Link para o comentário
Compartilhar em outros sites

Vendo algumas duvidas acho que este material pode ajudar:

https://sites.google.com/site/rmaalmeida/unifei/downloads-1/elt024

na apostila e labs (elt025) estou usando o compilador SDCC pra PIC que é opensource. Tem os slides das aulas, inclusive explicando como montar a biblioteca de driver do LCD.

abraços.

Link para o comentário
Compartilhar em outros sites

Boa noite, turma andei meio sumido porque as aulas começaram, e agora as coisas vão ser meio que assim mesmo, hasudihasiud... Periodo vai ser corrido!!!

Mas eu queria um dica sobre o PIC e não a programação dele, o CCP2 do pic funciona como? Tipo um interrupção, ou ali eu coloco por exemplo um botão, e assim que eu o aperto o PIC executa algo??

Outra coisa agora sobre programação, queria saber como fazer algo ficar piscando no lcd, por Exemplo tenho la a mensagem, "Olhe isso Aqui" como fazer o "Olhe isso" ficar fixo e o "Aqui" ficar piscando??

Novamente mais duvidas sobre programação, eu fiz um programa e antes assim que eu apertava o botão ligado ao CCP2, ele já ia fazer a ação, agora criei um laço FOR e enquanto o PIC está realizando o For, eu posso apertar que não acontece nada, vocês sabem o que pode estar acontecendo???

Desde já agradeço, Abraços!!

Link para o comentário
Compartilhar em outros sites

Galera sei que está todo mundo com as vidas corridas e nem estão tendo tempo para o tópico, porque eu também estou assim!!! Hasuidahsiudas...

Mas as duvidas que psotei anteriormente são por causa que estou montando, um circuito de um relógio digital, com termometro, já montei praticamente toda a programação...

O programa está aqui:


/// Relógio.C ///
/// ///
/// Programa de um Relógio com Termometro ///
/// ///
/// Júlio César Souza Silveira Júnior ///
/// ///
////////////////////////////////////////////////////////////////////////////////

///========================Definições do Programa============================///
#include <16F877A.h>
#include <mudancas.inc>
#device adc=10
#FUSES NOWDT,XT,PUT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD
#use delay(clock=4000000)
#include <ds1307.c>
#include <lcdd.c>
#define botao_incr RB0
#define botao_decr RB1
///==========================================================================///

///===================Variavéis utilizadas no programa=======================///
int8 seg, min, hrs, dia, mes, ano, dow, modo;
float temp, temp1, tempf;
char dia_da_semana[7][8]=
{
"DOM",
"SEG",
"TER",
"QUA",
"QUI",
"SEX",
"SAB",
};
///==========================================================================///

///================================Captura===================================///
#int_ccp2
void trata_ccp_2()
{
modo++;
if (modo > 7 )
{
modo = 0;
}
}
///==========================================================================///

///=========================Leitura da Temperatura===========================///
void temperatura()
{
temp=read_adc();
temp1=temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
tempf=temp1/10;
tempf=(tempf*150/1023);
}
///==========================================================================///

///===========================Programa Principal=============================///
void main()
{
//Configurando o CCP2 como Captura
setup_ccp2(CCP_CAPTURE_RE);
enable_interrupts (int_ccp2);
enable_interrupts (global);

//Configurando o ADC
setup_adc_ports(AN0_Vref_Vref);
setup_adc(adc_clock_internal);
set_adc_channel(0);
delay_ms(20);

//Inicializando o DS1307
ds1307_init();
delay_ms(10);
ds1307_set_date_time(1,1,11,7,0,0,0);
delay_ms(10);

//Inicializando o LCD
lcd_init();
delay_ms(10);

modo = 0;
while(true)
{
//Menu para mostrar a data e acerto do Relógio
switch (modo)
{
case 1:
{
delay_ms(1000);
ds1307_get_date(dia,mes,ano,dow);
delay_ms(10);
ds1307_get_time(hrs,min,seg);
delay_ms(10);
printf(lcd_putc,"\f");
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d:\%02d:\%02d"hrs,min,seg);
lcd_gotoxy(5,2);
printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);
}
case 2:
{
if (input(BOTAO_INCR))
{
delay_ms (75);
min++;
}
if (input(BOTAO_DECR))
{
delay_ms (75);
min--;
}
if (min > 59 )
{
min = 0;
}
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d:\%02d:\%02d"hrs,min,seg);
lcd_gotoxy(5,2);
printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);
delay_ms (100);
break;
}
case 3:
{
if (input(BOTAO_INCR))
{
delay_ms (75);
hrs++;
}
if (input(BOTAO_DECR))
{
delay_ms (75);
hrs--;
}
if (hrs > 23 )
{
hrs = 0;
}
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d:\%02d:\%02d"hrs,min,seg);
lcd_gotoxy(5,2);
printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);
delay_ms (100);
break;
}
case 4:
{
if (input(BOTAO_INCR))
{
delay_ms (75);
dia++;
}
if (input(BOTAO_DECR))
{
delay_ms (75);
dia--;
}
if (dia > 31 )
{
dia = 1;
}
if (dia == 0 )
{
dia = 31;
}
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d:\%02d:\%02d"hrs,min,seg);
lcd_gotoxy(5,2);
printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);
delay_ms (100);
break;
}
case 5:
{
if (input(BOTAO_INCR))
{
delay_ms (75);
mes++;
}
if (input(BOTAO_DECR))
{
delay_ms (75);
mes--;
}
if (mes > 12 )
{
mes = 1;
}
if (mes == 0 )
{
mes = 12;
}
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d:\%02d:\%02d"hrs,min,seg);
lcd_gotoxy(5,2);
printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);
delay_ms (100);
break;
}
case 6:
{
if (input(BOTAO_INCR))
{
delay_ms (75);
ano++;
}
if (input(BOTAO_DECR))
{
delay_ms (75);
ano--;
}
if (ano > 99 )
{
ano = 1;
}
if (ano == 0 )
{
ano = 99;
}
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d:\%02d:\%02d"hrs,min,seg);
lcd_gotoxy(5,2);
printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);
delay_ms (100);
break;
}
case 7:
{
if (input(BOTAO_INCR))
{
delay_ms (75);
dow++;
}
if (input(BOTAO_DECR))
{
delay_ms (75);
dow--;
}
if (dow > 7 )
{
dow = 1;
}
if (dow == 0)
{
dow = 7;
}
printf(lcd_putc,"\f");
lcd_gotoxy(5,1);
printf(lcd_putc,"%s"dia_da_semana[dow-1]);
lcd_gotoxy(5,2);
printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);
lcd_gotoxy(1,1);
delay_ms (100);
ds1307_set_date_time(dia,mes,ano,dow,hrs,min,seg);
break;
}
default:
{
delay_ms(1000);
ds1307_get_date(dia,mes,ano,dow);
delay_ms(10);
ds1307_get_time(hrs,min,seg);
delay_ms(10);
temperatura();
delay_ms(10);
printf(lcd_putc,"\f");
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d:\%02d:\%02d"hrs,min,seg);
lcd_gotoxy(1,2);
printf(lcd_putc,"\%s \%3.1f C"dia_da_semana[dow-1],tempf);
}
}
}
}
////////////////////////////////////////////////////////////////////////////////

E o circuito é esse:

http://img851.imageshack.us/i/semttuloy.jpg/

Se alguem puder me ajudar com as duvidas ai de cima fico grato!!

OBS! O programa já está muito grande, quando adiciono, alguma coisa maior um pocuo, já da pau na compilação!

Link para o comentário
Compartilhar em outros sites

Fala garoto.

Ando sumido também pois com mudança de república estou só com net 3G da TIM q é uma carroça aqui em sao joao e pre carnaval muendo.. só bebendo e zuando mesmo.

SEguinte, tanto o CCP1 como o CCp2 você pode configurar como CAPTURE, COMPARE OU PWM.

você configurando ele no mode de CAPTURE ele faz o teste do botão p você. você faz assim:

CCP_CAPTURE_FE

ou

CCP_CAPTURE_RE

Com o FE (falling Edge) você está usando detecção por descida de borda. Botão com resistor de pull-up.

Com o RE (Rising Edge) você está usando detecção por subda de borda. Botão com resistor de pull-down.

Aí logo em seguinte você habilita as interrupções:

ENABLE_INTERRUPTS(INT_CCP2);
ENABLE_INTERRUPTS(GLOBAL);

Logo em seguida chama as interrupçoes fora do main:

#int_ccp2
void trata_ccp
{
seu codigo aqui;
}

E para piscar, faça assim:

#include <18f4550.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 NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000)

#include <lcd.C>

void main()
{
lcd_init ();

while (true)

{
lcd_putc("Olhe isso");
lcd_gotoxy (10,1);
lcd_putc(" AQUI!");
delay_ms(500);
lcd_putc("\f");
lcd_putc("Olhe isso");
delay_ms(500);
lcd_putc("\f");
}
}

Vô sair p bber com a galera da facul e depois volto e respondo melhor.

Falou

Link para o comentário
Compartilhar em outros sites

Fala turma...

Aqui to com um problema com relação ao relógio que mostrei acima, piscando ele já está já consegui, porém, queria que enquanto eu acertasse a data e a hora, ele continuasse atualizando os segundos e a hora normamelnte, mas não consegui isso, pois fiz da forma como está no código abaixo, e não dá certo, quando vou acertar uma variavel, ela por exemplo, vai pra um, mas quando ele pisca, ela volta pra zero...

O Código é esse aqui:


////////////////////////////////////////////////////////////////////////////////
/// Relógio.C ///
/// ///
/// Programa de um Relógio com Termometro ///
/// ///
/// Júlio César Souza Silveira Júnior ///
/// ///
////////////////////////////////////////////////////////////////////////////////

///========================Definições do Programa============================///
#include <16F877A.h>
#include <mudancas.inc>
#device adc=10
#FUSES NOWDT,XT,PUT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD
#use delay(clock=4000000)
#include <ds1307.c>
#include <lcdd.c>
#define botao_incr RB0
#define botao_decr RB1
///==========================================================================///

///===================Variavéis utilizadas no programa=======================///
int8 seg, min, hrs, dia, mes, ano, dow, modo;
float temp, temp1, tempf;
char dia_da_semana[7][8]=
{
"DOM",
"SEG",
"TER",
"QUA",
"QUI",
"SEX",
"SAB",
};
char dia_da_semana1[7][8]=
{
"DOMINGO",
"SEGUNDA",
"TERCA",
"QUARTA",
"QUINTA",
"SEXTA",
"sábado",
};
///==========================================================================///

///================================Captura===================================///
#int_ccp2
void trata_ccp_2()
{
modo++;
if (modo > 7 )
{
modo = 0;
}
}
///==========================================================================///

///=========================Leitura da Temperatura===========================///
void TEMPERATURA()
{
temp=read_adc();
temp1=temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
temp=read_adc();
temp1=temp1+temp;
delay_us(8300);
tempf=temp1/10;
tempf=(tempf*150/1023);
delay_ms(10);
}
///==========================================================================///

///=========================Leitura da Temperatura===========================///
void LE_RTC()
{
ds1307_get_date(dia,mes,ano,dow);
delay_ms(10);
ds1307_get_time(hrs,min,seg);
delay_ms(10);
}
///==========================================================================///

///=========================Leitura da Temperatura===========================///
void GRAVA_RTC()
{
delay_ms(100);
ds1307_set_date_time(dia,mes,ano,dow,hrs,min,seg);
}
///==========================================================================///

///=========================Leitura da Temperatura===========================///
void MOSTRA_DATA()
{
DELAY_MS(1000);
ds1307_get_date(dia,mes,ano,dow);
delay_ms(10);
ds1307_get_time(hrs,min,seg);
delay_ms(10);
printf(lcd_putc,"\f");
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d:\%02d:\%02d"hrs,min,seg);
lcd_gotoxy(5,2);
printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);
}
///==========================================================================///

///===========================Programa Principal=============================///
void main()
{
//Configurando o CCP2 como Captura
setup_ccp2(CCP_CAPTURE_RE);
enable_interrupts (int_ccp2);
enable_interrupts (global);

//Configurando o ADC
setup_adc_ports(AN0_Vref_Vref);
setup_adc(adc_clock_internal);
set_adc_channel(0);
delay_ms(20);

//Inicializando o DS1307
ds1307_init();
delay_ms(10);
ds1307_set_date_time(1,1,11,7,0,0,0);
delay_ms(10);

//Inicializando o LCD
lcd_init();
delay_ms(10);

modo = 0;
while(true)
{
//Menu para mostrar a data e acerto do Relógio
switch (modo)
{
case 1:
{
MOSTRA_DATA();
break;
}
case 2:
{
if (input(BOTAO_INCR))
{
delay_ms (75);
min++;
}
if (input(BOTAO_DECR))
{
delay_ms (75);
min--;
}
if (min > 59 )
{
min = 0;
}
printf(lcd_putc,"\f");
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d:\%02d:\%02d"hrs,min,seg);
lcd_gotoxy(5,2);
printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);
delay_ms(500);
LE_RTC();
printf(lcd_putc,"\f");
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d: :\%02d"hrs,seg);
lcd_gotoxy(5,2);
printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);
GRAVA_RTC();
break;
}
case 3:
{
if (input(BOTAO_INCR))
{
delay_ms (75);
hrs++;
}
if (input(BOTAO_DECR))
{
delay_ms (75);
hrs--;
}
if (hrs > 23 )
{
hrs = 0;
}
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d:\%02d:\%02d"hrs,min,seg);
lcd_gotoxy(5,2);
printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);
delay_ms(500);
LE_RTC();
printf(lcd_putc,"\f");
lcd_gotoxy(5,1);
printf(lcd_putc," :\%02d:\%02d"hrs,seg);
lcd_gotoxy(5,2);
printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);
GRAVA_RTC();
break;
}
case 4:
{
if (input(BOTAO_INCR))
{
delay_ms (75);
dia++;
}
if (input(BOTAO_DECR))
{
delay_ms (75);
dia--;
}
if (dia > 31 )
{
dia = 1;
}
if (dia == 0 )
{
dia = 31;
}
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d:\%02d:\%02d"hrs,min,seg);
lcd_gotoxy(5,2);
printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);
delay_ms(500);
LE_RTC();
printf(lcd_putc,"\f");
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d:\%02d:\%02d"hrs,min,seg);
lcd_gotoxy(5,2);
printf(lcd_putc," /\%02d/\%02d"mes,ano);
GRAVA_RTC();
break;
}
case 5:
{
if (input(BOTAO_INCR))
{
delay_ms (75);
mes++;
}
if (input(BOTAO_DECR))
{
delay_ms (75);
mes--;
}
if (mes > 12 )
{
mes = 1;
}
if (mes == 0 )
{
mes = 12;
}
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d:\%02d:\%02d"hrs,min,seg);
lcd_gotoxy(5,2);
printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);
delay_ms(500);
LE_RTC();
printf(lcd_putc,"\f");
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d:\%02d:\%02d"hrs,min,seg);
lcd_gotoxy(5,2);
printf(lcd_putc,"%02d/ /\%02d"dia,ano);
GRAVA_RTC();
break;
}
case 6:
{
if (input(BOTAO_INCR))
{
delay_ms (75);
ano++;
}
if (input(BOTAO_DECR))
{
delay_ms (75);
ano--;
}
if (ano > 99 )
{
ano = 1;
}
if (ano == 0 )
{
ano = 99;
}
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d:\%02d:\%02d"hrs,min,seg);
lcd_gotoxy(5,2);
printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);
delay_ms(500);
le_rtc();
printf(lcd_putc,"\f");
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d:\%02d:\%02d"hrs,min,seg);
lcd_gotoxy(5,2);
printf(lcd_putc,"%02d/\%02d/ "dia,mes);
GRAVA_RTC();
break;
}
case 7:
{
if (input(BOTAO_INCR))
{
delay_ms (75);
dow++;
}
if (input(BOTAO_DECR))
{
delay_ms (75);
dow--;
}
if (dow > 7 )
{
dow = 1;
}
if (dow == 0)
{
dow = 7;
}
printf(lcd_putc,"\f");
lcd_gotoxy(3,1);
printf(lcd_putc,"Dia da Semana");
lcd_gotoxy(6,2);
printf(lcd_putc,"%s"dia_da_semana1[dow-1]);
delay_ms(500);
printf(lcd_putc,"\f");
lcd_gotoxy(3,1);
printf(lcd_putc,"Dia da Semana");
GRAVA_RTC();
break;
}
default:
{
delay_ms(1000);
LE_RTC();
TEMPERATURA();
printf(lcd_putc,"\f");
lcd_gotoxy(5,1);
printf(lcd_putc,"%02d:\%02d:\%02d"hrs,min,seg);
lcd_gotoxy(1,2);
printf(lcd_putc,"\%s \%3.1f C"dia_da_semana[dow-1],tempf);
}
}
}
}

Se alguém souber o que eu posso fazer para arrumar isso fico muito grato, Ah, e tem mais um problema, o programa está chegio de subrotinas assim, porque qualquer coisinha que coloco ele da erro de OUT OF ROM, no CCS com esse prog aí tá dando 71% da ROM!!

Outra duvida minha é com relação a outro programa, que vai controlar um painel de Leds 16x16, ou 24X24, como faço pra mandar um "trem" de bits, por uma porta do PIc em C?

a montagem é essa aqui:

http://img231.imageshack.us/i/semttulozhy.jpg/

Será que o 16F877A da conta???

Abraços, e desde já grato!!!

Link para o comentário
Compartilhar em outros sites

  • 2 meses depois...
  • 3 meses depois...

Então Galera?!!!

E aí Tudo na Santa Paz...

Andei meio sumido aqui do FCH, porque tava sem PC e sem mexer com eletronica e PIC's, mas agora voltei, e voltei querendo aprimorar o projeto que tava fazendo ai do Relogio com Termometro...

Mas estou sofrendo com problemas, meu codigo está grande demais para a memoria do meu PIC, e me sugeriram num tópico que eu abri com a duvida otimizar meu código, mas não sei se tá sendo minha falta de criatividade, ou minha alta exigência que não tá permitindo, tipo...

Eu quero o seguinte...

*Na hora que eu estiver acertando um dado, tipo: hora, minuto, dia, etc... o valor referente a ele no LCD fique piscando0.

*Quando o alarme zoar quero que o buzzer seja acionado por um tempo determinado(Ex: 30seg.)

*Queria que o Black Light do LCD desligasse depois deum tempo, mas isso nem implementei ja que nao está cabendo

Vou postar o código se alguem tiver alguma sugestão para otimização por favor me falem...

Olhem o Código aqui:

////////////////////////////////////////////////////////////////////////////////

/// Relógio.C ///

/// ///

/// Programa de um Relógio com Termometro ///

/// ///

/// Júlio César Souza Silveira Júnior ///

/// ///

////////////////////////////////////////////////////////////////////////////////

///========================Definições do Programa============================///

#include <16F877A.h>

#include <mudancas.inc>

#device adc=10

#FUSES NOWDT,XT,PUT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD

#use delay(clock=4000000)

#include <ds1307.c>

#include <lcdd.c>

#define botao_incr PIN_B0

#define botao_decr PIN_B1

///==========================================================================///

///===================Variavéis utilizadas no programa=======================///

int1 mode;

int8 seg, min, hrs, dia, mes, ano, dow, modo, hrsa, mina, buzer;

float temp, temp1, tempf;

const char dia_da_semana[7][4]=

{

"DOM",

"SEG",

"TER",

"QUA",

"QUI",

"SEX",

"SAB",

};

const char dia_da_semana1[7][8]=

{

"DOMINGO",

"SEGUNDA",

"TERCA",

"QUARTA",

"QUINTA",

"SEXTA",

"sábado",

};

///==========================================================================///

///================================Interrupção Alarme========================///

#int_timer1

void trata_alarm()

{

buzer++;

if (buzer == 60)

{

output_low (PIN_B7);

buzer=0;

disable_interrupts( INT_TIMER1); //Desabilita interrupção timer1

}

set_timer1 (3036);

}

#int_ccp1

void trata_ccp_1()

{

mode++;

if (mode=0)

{

lcd_gotoxy(6,1);

printf(lcd_putc,"\fAlarme ON");

lcd_gotoxy(7,2);

printf(lcd_putc,"%02d:\%02d"hrsa,mina);

delay_ms(1000);

}

if (mode=1)

{

lcd_gotoxy(6,1);

printf(lcd_putc,"\fAlarme OFF");

lcd_gotoxy(7,2);

printf(lcd_putc,"%02d:\%02d"hrsa,mina);

delay_ms(1000);

}

}

///==========================================================================///

///================================Captura===================================///

#int_ccp2

void trata_ccp_2()

{

modo++;

if (modo > 9 )

{

modo = 0;

}

}

///==========================================================================///

///=========================Leitura da Temperatura===========================///

void TEMPERATURA()

{

temp=read_adc();

temp1=temp;

delay_us(8300);

temp=read_adc();

temp1=temp1+temp;

delay_us(8300);

temp=read_adc();

temp1=temp1+temp;

delay_us(8300);

temp=read_adc();

temp1=temp1+temp;

delay_us(8300);

temp=read_adc();

temp1=temp1+temp;

delay_us(8300);

temp=read_adc();

temp1=temp1+temp;

delay_us(8300);

temp=read_adc();

temp1=temp1+temp;

delay_us(8300);

temp=read_adc();

temp1=temp1+temp;

delay_us(8300);

temp=read_adc();

temp1=temp1+temp;

delay_us(8300);

temp=read_adc();

temp1=temp1+temp;

delay_us(8300);

tempf=temp1/10;

tempf=(tempf*150/1023);

delay_ms(10);

}

///==========================================================================///

///=========================Leitura da Temperatura===========================///

void LE_RTC()

{

ds1307_get_date(dia,mes,ano,dow);

delay_ms(10);

ds1307_get_time(hrs,min,seg);

delay_ms(10);

}

///==========================================================================///

///=========================Leitura da Temperatura===========================///

void GRAVA_RTC()

{

delay_ms(100);

ds1307_set_date_time(dia,mes,ano,dow,hrs,min,seg);

}

///==========================================================================///

///=========================Leitura da Temperatura===========================///

void MOSTRA_DATA()

{

DELAY_MS(1000);

ds1307_get_date(dia,mes,ano,dow);

delay_ms(10);

ds1307_get_time(hrs,min,seg);

delay_ms(10);

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);

}

///==========================================================================///

///===========================Programa Principal=============================///

void main()

{

//Configurando o CCP2 como Captura

setup_ccp2(CCP_CAPTURE_RE);

enable_interrupts (int_ccp2);

//Configurando o CCP1 como Captura

setup_ccp1(CCP_CAPTURE_RE);

enable_interrupts (int_ccp1);

//Configurando o Timer 1

setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);

enable_interrupts (global);

//Configurando o ADC

setup_adc_ports(AN0_Vref_Vref);

setup_adc(adc_clock_internal);

set_adc_channel(0);

delay_ms(20);

//Inicializando o DS1307

ds1307_init();

delay_ms(10);

//Inicializando o LCD

lcd_init();

delay_ms(10);

modo = 0;

while(true)

{

//Menu para mostrar a data e acerto do Relógio

switch (modo)

{

case 1:

{

MOSTRA_DATA();

break;

}

case 2:

{

if (input(botao_incr))

{

delay_ms (75);

min++;

}

if (input(BOTAO_DECR))

{

delay_ms (75);

min--;

}

if (min > 59 )

{

min = 0;

}

if (min == 255 )

{

min = 59;

}

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);

delay_ms(500);

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d: :\%02d"hrs,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);

GRAVA_RTC();

break;

}

case 3:

{

if (input(botao_incr))

{

delay_ms (75);

hrs++;

}

if (input(BOTAO_DECR))

{

delay_ms (75);

hrs--;

}

if (hrs > 23 )

{

hrs = 0;

}

if (hrs == 255 )

{

hrs = 23;

}

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);

delay_ms(500);

lcd_gotoxy(5,1);

printf(lcd_putc,"\f :\%02d:\%02d"min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);

GRAVA_RTC();

break;

}

case 4:

{

if (input(BOTAO_INCR))

{

delay_ms (75);

dia++;

}

if (input(BOTAO_DECR))

{

delay_ms (75);

dia--;

}

if (dia > 31 )

{

dia = 1;

}

if (dia == 0 )

{

dia = 31;

}

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);

delay_ms(500);

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc," /\%02d/\%02d"mes,ano);

GRAVA_RTC();

break;

}

case 5:

{

if (input(BOTAO_INCR))

{

delay_ms (75);

mes++;

}

if (input(BOTAO_DECR))

{

delay_ms (75);

mes--;

}

if (mes > 12 )

{

mes = 1;

}

if (mes == 0 )

{

mes = 12;

}

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);

delay_ms(500);

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/ /\%02d"dia,ano);

GRAVA_RTC();

break;

}

case 6:

{

if (input(BOTAO_INCR))

{

delay_ms (75);

ano++;

}

if (input(BOTAO_DECR))

{

delay_ms (75);

ano--;

}

if (ano > 99 )

{

ano = 1;

}

if (ano == 0 )

{

ano = 99;

}

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);

delay_ms(500);

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/ "dia,mes);

GRAVA_RTC();

break;

}

case 7:

{

if (input(BOTAO_INCR))

{

delay_ms (75);

dow++;

}

if (input(BOTAO_DECR))

{

delay_ms (75);

dow--;

}

if (dow > 7 )

{

dow = 1;

}

if (dow == 0)

{

dow = 7;

}

lcd_gotoxy(3,1);

printf(lcd_putc,"\fDia da Semana");

lcd_gotoxy(6,2);

printf(lcd_putc,"%s"dia_da_semana1[dow-1]);

GRAVA_RTC();

break;

}

case 8:

{

if (input(BOTAO_INCR))

{

delay_ms (75);

hrsa++;

}

if (input(BOTAO_DECR))

{

delay_ms (75);

hrsa--;

}

if (hrsa > 23 )

{

hrsa = 0;

}

if (hrsa == 255)

{

hrsa = 23;

}

lcd_gotoxy(6,1);

printf(lcd_putc,"\fAlarme");

lcd_gotoxy(7,2);

printf(lcd_putc,"%02d:\%02d"hrsa,mina);

delay_ms(500);

lcd_gotoxy(6,1);

printf(lcd_putc,"\fAlarme");

lcd_gotoxy(7,2);

printf(lcd_putc," :\%02d"mina);

break;

}

case 9:

{

if (input(BOTAO_INCR))

{

delay_ms (75);

mina++;

}

if (input(BOTAO_DECR))

{

delay_ms (75);

mina--;

}

if (mina > 59 )

{

mina = 0;

}

if (mina == 255)

{

mina = 59;

}

lcd_gotoxy(6,1);

printf(lcd_putc,"\fAlarme");

lcd_gotoxy(7,2);

printf(lcd_putc,"%02d:\%02d"hrsa,mina);

delay_ms(500);

lcd_gotoxy(6,1);

printf(lcd_putc,"\fAlarme");

lcd_gotoxy(7,2);

printf(lcd_putc," :\%02d"mina);

break;

}

default:

{

delay_ms(1000);

TEMPERATURA();

LE_RTC();

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(1,2);

printf(lcd_putc,"\%s \%3.1f C"dia_da_semana[dow-1],tempf);

if(mode==1)

{

if ((hrsa == hrs) && (mina ==min))

{

output_high (PIN_B7);

enable_interrupts( INT_TIMER1); //Habilita interrupção timer1

set_timer1 (3036);

}

}

}

}

}

}

Abração a todos!

Link para o comentário
Compartilhar em outros sites

O negócio de piscar tem uma alternativa mais "enjambrada". Você pode colocar o cursor do LCD piscando e posicionar em cima do digito. Vai dar o mesmo efeito. Caso queira algo mais elaborado creio que timers irão resolver tudo que você precisa. Quantos timers tem o PIC?

Link para o comentário
Compartilhar em outros sites

Na verdade o que eu estou querendo mesmo é reduzir o tamanho do código...

Já fiz uma alteração na leitura do adc, e eu também havia esquecido das bibliotecas aí vou postar elas aqui agora...

Então tá tudo aqui as bibliotecas eo código com a mudança...

A de mudancas.inc está aqui:

#define TrisA(X) set_tris_A (X)

#define TrisB(X) set_tris_B (X)

#define TrisC(X) set_tris_C (X)

#define TrisD(X) set_tris_D (X)

#define TrisE(X) set_tris_E (X)

#define RA0 PIN_A0

#define RA1 PIN_A1

#define RA2 PIN_A2

#define RA3 PIN_A3

#define RA4 PIN_A4

#define RA5 PIN_A5

#define RB0 PIN_B0

#define RB1 PIN_B1

#define RB2 PIN_B2

#define RB3 PIN_B3

#define RB4 PIN_B4

#define RB5 PIN_B5

#define RB6 PIN_B6

#define RB7 PIN_B7

#define RC0 PIN_C0

#define RC1 PIN_C1

#define RC2 PIN_C2

#define RC3 PIN_C3

#define RC4 PIN_C4

#define RC5 PIN_C5

#define RC6 PIN_C6

#define RC7 PIN_C7

#define RD0 PIN_D0

#define RD1 PIN_D1

#define RD2 PIN_D2

#define RD3 PIN_D3

#define RD4 PIN_D4

#define RD5 PIN_D5

#define RD6 PIN_D6

#define RD7 PIN_D7

#define RE0 PIN_E0

#define RE1 PIN_E1

#define RE2 PIN_E2

#define ClearBit(x) output_low (x)

#define SetBit(x) output_high (x)

#define ReadBit(x) input (x)

#define timer0(modo,presc) setup_counters(modo,presc)

#define Enable(X) enable_interrupts(X)

#define EnableAll enable_interrupts(global)

#define DisableAll disable_interrupts(global)

#define NOP delay_cycles(1)

#define Ms(x) delay_ms(x)

#define Us(x) delay_us(x)

#define PullUpOn port_b_pullups(true)

#define PullUpOff port_b_pullups(false)

#define ext_0 ext_int_edge(h_to_l)

#define ext_1 ext_int_edge(l_to_h)

A do LCD, a lcdd.c é essa:

///////////////////////////////////////////////////////////////////////////

//// LCDD.C ////

//// Driver for common LCD modules ////

//// ////

//// lcd_init() Must be called before any other function. ////

//// ////

//// lcd_putc© Will display c on the next position of the LCD. ////

//// The following have special meaning: ////

//// \f Clear display ////

//// \n Go to start of second line ////

//// \b Move back one position ////

//// ////

//// lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1) ////

//// ////

//// lcd_getc(x,y) Returns character at position x,y on LCD ////

//// ////

///////////////////////////////////////////////////////////////////////////

//// © Copyright 1996,2007 Custom Computer Services ////

//// This source code may only be used by licensed users of the CCS C ////

//// compiler. This source code may only be distributed to other ////

//// licensed users of the CCS C compiler. No other use, reproduction ////

//// or distribution is permitted without written permission. ////

//// Derivative programs created using this software in object code ////

//// form are not restricted in any way. ////

///////////////////////////////////////////////////////////////////////////

// As defined in the following structure the pin connection is as follows:

// D0 enable

// D1 rs

// D2 rw

// D4 D4

// D5 D5

// D6 D6

// D7 D7

//

// LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B

// #define use_portb_lcd TRUE

struct lcd_pin_map { // This structure is overlayed

BOOLEAN enable; // on to an I/O port to gain

BOOLEAN rs; // access to the LCD pins.

BOOLEAN rw; // The bits are allocated from

BOOLEAN unused; // low order up. ENABLE will

int data : 4; // be pin B0.

} lcd;

#if defined use_portb_lcd

//#locate lcd = getenv("sfr:PORTB") // This puts the entire structure over the port

#ifdef __pch__

#locate lcd = 0xf81

#else

#locate lcd = 6

#endif

#define set_tris_lcd(x) set_tris_b(x)

#else

//#locate lcd = getenv("sfr:PORTD") // This puts the entire structure over the port

#ifdef __pch__

#locate lcd = 0xf83

#else

#locate lcd = 8

#endif

#define set_tris_lcd(x) set_tris_d(x)

#endif

#ifndef lcd_type

#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines

#endif

#define lcd_line_two 0x40 // LCD RAM address for the second line

BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};

// These bytes need to be sent to the LCD

// to start it up.

// The following are used for setting

// the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out

struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in

BYTE lcd_read_byte() {

BYTE low,high;

set_tris_lcd(LCD_READ);

lcd.rw = 1;

delay_cycles(1);

lcd.enable = 1;

delay_cycles(1);

high = lcd.data;

lcd.enable = 0;

delay_cycles(1);

lcd.enable = 1;

delay_us(1);

low = lcd.data;

lcd.enable = 0;

set_tris_lcd(LCD_WRITE);

return( (high<<4) | low);

}

void lcd_send_nibble( BYTE n ) {

lcd.data = n;

delay_cycles(1);

lcd.enable = 1;

delay_us(2);

lcd.enable = 0;

}

void lcd_send_byte( BYTE address, BYTE n ) {

lcd.rs = 0;

while ( bit_test(lcd_read_byte(),7) ) ;

lcd.rs = address;

delay_cycles(1);

lcd.rw = 0;

delay_cycles(1);

lcd.enable = 0;

lcd_send_nibble(n >> 4);

lcd_send_nibble(n & 0xf);

}

void lcd_init() {

BYTE i;

set_tris_lcd(LCD_WRITE);

lcd.rs = 0;

lcd.rw = 0;

lcd.enable = 0;

delay_ms(15);

for(i=1;i<=3;++i) {

lcd_send_nibble(3);

delay_ms(5);

}

lcd_send_nibble(2);

for(i=0;i<=3;++i)

lcd_send_byte(0,LCD_INIT_STRING);

}

void lcd_gotoxy( BYTE x, BYTE y) {

BYTE address;

if(y!=1)

address=lcd_line_two;

else

address=0;

address+=x-1;

lcd_send_byte(0,0x80|address);

}

void lcd_putc( char c) {

switch © {

case '\f' : lcd_send_byte(0,1);

delay_ms(2);

break;

case '\n' : lcd_gotoxy(1,2); break;

case '\b' : lcd_send_byte(0,0x10); break;

default : lcd_send_byte(1,c); break;

}

}

char lcd_getc( BYTE x, BYTE y) {

char value;

lcd_gotoxy(x,y);

while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low

lcd.rs=1;

value = lcd_read_byte();

lcd.rs=0;

return(value);

}

E a do DS1307, é essa aqui:

////////////////////////////////////////////////////////////////////////////////

/// DS1307.C ///

/// Driver for Real Time Clock ///

/// ///

/// ds1307_init() - Enable oscillator without clearing the seconds register -///

/// used when PIC loses power and DS1307 run from 3V BAT ///

/// - Disable squarewave output ///

/// ///

/// ds1307_set_date_time(day,mth,year,dow,hour,min,sec) Set the date/time ///

/// ///

/// ds1307_get_date(day,mth,year,dow) Get the date ///

/// ///

/// ds1307_get_time(hr,min,sec) Get the time ///

/// ///

////////////////////////////////////////////////////////////////////////////////

#define RTC_SDA PIN_C4

#define RTC_SCL PIN_C3

#use i2c(master, sda=RTC_SDA, scl=RTC_SCL)

BYTE bin2bcd(BYTE binary_value);

BYTE bcd2bin(BYTE bcd_value);

void ds1307_init(void)

{

BYTE seconds = 0;

i2c_start();

i2c_write(0xD0); // WR to RTC

i2c_write(0x00); // REG 0

i2c_start();

i2c_write(0xD1); // RD from RTC

seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307

i2c_stop();

seconds &= 0x7F;

delay_us(3);

i2c_start();

i2c_write(0xD0); // WR to RTC

i2c_write(0x00); // REG 0

i2c_write(bin2bcd(seconds)); // Start oscillator with current "seconds value

i2c_start();

i2c_write(0xD0); // WR to RTC

i2c_write(0x07); // Control Register

i2c_write(0x80); // Disable squarewave output pin

i2c_stop();

}

void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min, BYTE sec)

{

sec &= 0x7F;

hr &= 0x3F;

i2c_start();

i2c_write(0xD0); // I2C write address

i2c_write(0x00); // Start at REG 0 - Seconds

i2c_write(bin2bcd(sec)); // REG 0

i2c_write(bin2bcd(min)); // REG 1

i2c_write(bin2bcd(hr)); // REG 2

i2c_write(bin2bcd(dow)); // REG 3

i2c_write(bin2bcd(day)); // REG 4

i2c_write(bin2bcd(mth)); // REG 5

i2c_write(bin2bcd(year)); // REG 6

i2c_write(0x80); // REG 7 - Disable squarewave output pin

i2c_stop();

}

void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow)

{

i2c_start();

i2c_write(0xD0);

i2c_write(0x03); // Start at REG 3 - Day of week

i2c_start();

i2c_write(0xD1);

dow = bcd2bin(i2c_read() & 0x7f); // REG 3

day = bcd2bin(i2c_read() & 0x3f); // REG 4

mth = bcd2bin(i2c_read() & 0x1f); // REG 5

year = bcd2bin(i2c_read(0)); // REG 6

i2c_stop();

}

void ds1307_get_time(BYTE &hr, BYTE &min, BYTE &sec)

{

i2c_start();

i2c_write(0xD0);

i2c_write(0x00); // Start at REG 0 - Seconds

i2c_start();

i2c_write(0xD1);

sec = bcd2bin(i2c_read() & 0x7f);

min = bcd2bin(i2c_read() & 0x7f);

hr = bcd2bin(i2c_read(0) & 0x3f);

i2c_stop();

}

BYTE bin2bcd(BYTE binary_value)

{

BYTE temp;

BYTE retval;

temp = binary_value;

retval = 0;

while(1)

{

// Get the tens digit by doing multiple subtraction

// of 10 from the binary value.

if(temp >= 10)

{

temp -= 10;

retval += 0x10;

}

else // Get the ones digit by adding the remainder.

{

retval += temp;

break;

}

}

return(retval);

}

// Input range - 00 to 99.

BYTE bcd2bin(BYTE bcd_value)

{

BYTE temp;

temp = bcd_value;

// Shifting upper digit right by 1 is same as multiplying by 8.

temp >>= 1;

// Isolate the bits for the upper digit.

temp &= 0x78;

// Now return: (Tens * 8) + (Tens * 2) + Ones

return(temp + (temp >> 2) + (bcd_value & 0x0f));

}

A do PIC16F877A, eu num vou colocar porque ela é padrão..

o programa utilizando a rotina sugerida por nosso amigo ai em cima ficou assim:

////////////////////////////////////////////////////////////////////////////////

/// Relógio.C ///

/// ///

/// Programa de um Relógio com Termometro ///

/// ///

/// Júlio César Souza Silveira Júnior ///

/// ///

////////////////////////////////////////////////////////////////////////////////

///========================Definições do Programa============================///

#include <16F877A.h>

#include <mudancas.inc>

#device adc=10

#FUSES NOWDT,XT,PUT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD

#use delay(clock=4000000)

#include <ds1307.c>

#include <lcdd.c>

#define botao_incr PIN_B0

#define botao_decr PIN_B1

///==========================================================================///

///===================Variavéis utilizadas no programa=======================///

int1 mode;

int8 seg, min, hrs, dia, mes, ano, dow, modo, hrsa, mina, buzer, x;

float temp, temp1, tempf;

const char dia_da_semana[7][4]=

{

"DOM",

"SEG",

"TER",

"QUA",

"QUI",

"SEX",

"SAB",

};

const char dia_da_semana1[7][8]=

{

"DOMINGO",

"SEGUNDA",

"TERCA",

"QUARTA",

"QUINTA",

"SEXTA",

"sábado",

};

///==========================================================================///

///================================Interrupção Alarme========================///

#int_timer1

void trata_alarm()

{

buzer++;

if (buzer == 60)

{

output_low (PIN_B7);

buzer=0;

disable_interrupts( INT_TIMER1); //Desabilita interrupção timer1

}

set_timer1 (3036);

}

#int_ccp1

void trata_ccp_1()

{

mode++;

if (mode=0)

{

lcd_gotoxy(6,1);

printf(lcd_putc,"\fAlarme ON");

lcd_gotoxy(7,2);

printf(lcd_putc,"%02d:\%02d"hrsa,mina);

delay_ms(1000);

}

if (mode=1)

{

lcd_gotoxy(6,1);

printf(lcd_putc,"\fAlarme OFF");

lcd_gotoxy(7,2);

printf(lcd_putc,"%02d:\%02d"hrsa,mina);

delay_ms(1000);

}

}

///==========================================================================///

///================================Captura===================================///

#int_ccp2

void trata_ccp_2()

{

modo++;

if (modo > 9 )

{

modo = 0;

}

}

///==========================================================================///

///=========================Leitura da Temperatura===========================///

void TEMPERATURA()

{

for(x=0;x<9;x++)

{

temp=read_adc();

temp1=temp1+temp;

delay_us(8300);

}

tempf=temp1/10;

tempf=(tempf*150/1023);

delay_ms(10);

}

///==========================================================================///

///=========================Leitura da Temperatura===========================///

void LE_RTC()

{

ds1307_get_date(dia,mes,ano,dow);

delay_ms(10);

ds1307_get_time(hrs,min,seg);

delay_ms(10);

}

///==========================================================================///

///=========================Leitura da Temperatura===========================///

void GRAVA_RTC()

{

delay_ms(100);

ds1307_set_date_time(dia,mes,ano,dow,hrs,min,seg);

}

///==========================================================================///

///=========================Leitura da Temperatura===========================///

void MOSTRA_DATA()

{

DELAY_MS(1000);

ds1307_get_date(dia,mes,ano,dow);

delay_ms(10);

ds1307_get_time(hrs,min,seg);

delay_ms(10);

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);

}

///==========================================================================///

///===========================Programa Principal=============================///

void main()

{

//Configurando o CCP2 como Captura

setup_ccp2(CCP_CAPTURE_RE);

enable_interrupts (int_ccp2);

//Configurando o CCP1 como Captura

setup_ccp1(CCP_CAPTURE_RE);

enable_interrupts (int_ccp1);

//Configurando o Timer 1

setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);

enable_interrupts (global);

//Configurando o ADC

setup_adc_ports(AN0_Vref_Vref);

setup_adc(adc_clock_internal);

set_adc_channel(0);

delay_ms(20);

//Inicializando o DS1307

ds1307_init();

delay_ms(10);

//Inicializando o LCD

lcd_init();

delay_ms(10);

modo = 0;

while(true)

{

//Menu para mostrar a data e acerto do Relógio

switch (modo)

{

case 1:

{

MOSTRA_DATA();

break;

}

case 2:

{

if (input(botao_incr))

{

delay_ms (75);

min++;

}

if (input(BOTAO_DECR))

{

delay_ms (75);

min--;

}

if (min > 59 )

{

min = 0;

}

if (min == 255 )

{

min = 59;

}

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);

delay_ms(500);

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d: :\%02d"hrs,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);

GRAVA_RTC();

break;

}

case 3:

{

if (input(botao_incr))

{

delay_ms (75);

hrs++;

}

if (input(BOTAO_DECR))

{

delay_ms (75);

hrs--;

}

if (hrs > 23 )

{

hrs = 0;

}

if (hrs == 255 )

{

hrs = 23;

}

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);

delay_ms(500);

lcd_gotoxy(5,1);

printf(lcd_putc,"\f :\%02d:\%02d"min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);

GRAVA_RTC();

break;

}

case 4:

{

if (input(BOTAO_INCR))

{

delay_ms (75);

dia++;

}

if (input(BOTAO_DECR))

{

delay_ms (75);

dia--;

}

if (dia > 31 )

{

dia = 1;

}

if (dia == 0 )

{

dia = 31;

}

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);

delay_ms(500);

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc," /\%02d/\%02d"mes,ano);

GRAVA_RTC();

break;

}

case 5:

{

if (input(BOTAO_INCR))

{

delay_ms (75);

mes++;

}

if (input(BOTAO_DECR))

{

delay_ms (75);

mes--;

}

if (mes > 12 )

{

mes = 1;

}

if (mes == 0 )

{

mes = 12;

}

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);

delay_ms(500);

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/ /\%02d"dia,ano);

GRAVA_RTC();

break;

}

case 6:

{

if (input(BOTAO_INCR))

{

delay_ms (75);

ano++;

}

if (input(BOTAO_DECR))

{

delay_ms (75);

ano--;

}

if (ano > 99 )

{

ano = 1;

}

if (ano == 0 )

{

ano = 99;

}

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/\%02d"dia,mes,ano);

delay_ms(500);

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(5,2);

printf(lcd_putc,"%02d/\%02d/ "dia,mes);

GRAVA_RTC();

break;

}

case 7:

{

if (input(BOTAO_INCR))

{

delay_ms (75);

dow++;

}

if (input(BOTAO_DECR))

{

delay_ms (75);

dow--;

}

if (dow > 7 )

{

dow = 1;

}

if (dow == 0)

{

dow = 7;

}

lcd_gotoxy(3,1);

printf(lcd_putc,"\fDia da Semana");

lcd_gotoxy(6,2);

printf(lcd_putc,"%s"dia_da_semana1[dow-1]);

GRAVA_RTC();

break;

}

case 8:

{

if (input(BOTAO_INCR))

{

delay_ms (75);

hrsa++;

}

if (input(BOTAO_DECR))

{

delay_ms (75);

hrsa--;

}

if (hrsa > 23 )

{

hrsa = 0;

}

if (hrsa == 255)

{

hrsa = 23;

}

lcd_gotoxy(6,1);

printf(lcd_putc,"\fAlarme");

lcd_gotoxy(7,2);

printf(lcd_putc,"%02d:\%02d"hrsa,mina);

delay_ms(500);

lcd_gotoxy(6,1);

printf(lcd_putc,"\fAlarme");

lcd_gotoxy(7,2);

printf(lcd_putc," :\%02d"mina);

break;

}

case 9:

{

if (input(BOTAO_INCR))

{

delay_ms (75);

mina++;

}

if (input(BOTAO_DECR))

{

delay_ms (75);

mina--;

}

if (mina > 59 )

{

mina = 0;

}

if (mina == 255)

{

mina = 59;

}

lcd_gotoxy(6,1);

printf(lcd_putc,"\fAlarme");

lcd_gotoxy(7,2);

printf(lcd_putc,"%02d:\%02d"hrsa,mina);

delay_ms(500);

lcd_gotoxy(6,1);

printf(lcd_putc,"\fAlarme");

lcd_gotoxy(7,2);

printf(lcd_putc," :\%02d"mina);

break;

}

default:

{

delay_ms(1000);

TEMPERATURA();

LE_RTC();

lcd_gotoxy(5,1);

printf(lcd_putc,"\f%02d:\%02d:\%02d"hrs,min,seg);

lcd_gotoxy(1,2);

printf(lcd_putc,"\%s \%3.1f C"dia_da_semana[dow-1],tempf);

if(mode==1)

{

if ((hrsa == hrs) && (mina ==min))

{

output_high (PIN_B7);

enable_interrupts( INT_TIMER1); //Habilita interrupção timer1

set_timer1 (3036);

}

}

}

}

}

}

Abração ai galera...

Link para o comentário
Compartilhar em outros sites

  • 7 meses depois...

E ai pessoal ja tive muito problema de ultapasar os 25% de rom do pic 16f877a e o ccs acusar out of Rom, reduzi meu código e resolvi o problema.

Mas o pic16f877a tem 8k de memória e os 25% são somente 2k na semana pasada descobri abaixo da seleção do pic no CCS tem um item que fala o seguinte Use 16bit poiters for ful Ram use. Marque ele e você vai poder gerar um codigo até 100% de rom

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!