Escolar Documentos
Profissional Documentos
Cultura Documentos
Fórum
int tcl = 0;
int tecla_pres;
//Aqui inicia a sub rotina de verificação de tecla pressionada
int varre_teclas (void)
{
if (!input(pin_b6)) return(1); // S1 NIVEL CHEIO(sensor)
if (!input(pin_b3)) return(2); // D POSICIONADO (sensor)
// se nenhuma tecla está pressionada, o flag desligará
// tecla_pres e retorna o valor 0
tecla_pres = 0;
return (0);
}
lcd_ini();
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf(lcd_escreve,"Forum 2.VitorReis \n\r");
lcd_pos_xy(1,2);
printf(lcd_escreve,"Aguarde, inicializando");
delay_ms(2000);
lcd_escreve ('\f');
while(true)
{
tcl = teclas();
if(tcl == 2)
{
output_low(PIN_B7);
lcd_pos_xy(1,2);
printf(lcd_escreve,"Posicionado");
//delay_ms(1000);
output_high(PIN_B5);
lcd_escreve('\f');
lcd_pos_xy(1,2);
printf(lcd_escreve,"Enchendo o galão...");
do
{
tcl=teclas();
}while(tcl != 1);
output_low(PIN_B5);
output_high(PIN_B4);
delay_ms(1000);
output_low(PIN_B4);
lcd_escreve('\f');
printf(lcd_escreve,"Galão cheio.");
output_high(PIN_B7);
delay_ms(1000);
}
else
Forum.rdl 06/06/2011 11:37:57 Página 3 de 28
{
output_high(PIN_B7);
lcd_escreve('\f');
printf(lcd_escreve,"Posicionando");
delay_ms(1000);
}
}
}
20064424-Vitor Aparecido dos Reis 31/05/2011 13:03
Boa tarde.
Estou postando essa explicação para quem assim como eu usou a sub-rotina no programa. No contexto da programação, uma sub-
rotina (função, procedimento ou mesmo subprograma) consiste em uma porção de código que resolve um problema muito
específico, parte de um problema maior (a aplicação final). O conceito de função difere da noção de procedimento, já que devolve
um valor, se bem que, em algumas linguagens, esta distinção não é sequer existente, por exemplo, em C, a implementação de um
procedimento é uma função do tipo void. No contexto da programação orientada a objetos, estas sub-rotinas são encapsuladas nos
próprios objetos, passando a designar-se métodos.
Algumas das vantagens na utilização de sub-rotinas durante a programação são:
. a redução de código duplicado num programa;
. a possibilidade de reutilizar o mesmo código sem grandes alterações em outros programas;
. a decomposição de problemas grandes em pequenas partes;
. melhorar a interpretação visual de um programa;
. esconder ou regular uma parte de um programa, mantendo o restante código alheio às questões internas resolvidas dentro dessa
função;
As componentes de uma sub-rotina são:
. O seu protótipo, que inclui os parâmetros que são passados à sub-rotina na altura da invocação;
. O corpo, que contém o bloco de código que resolve o problema proposto;
. Um possível valor de retorno, que poderá ser utilizado imediatamente a seguir à invocação da sub-rotina.
Como exemplo de compilações de sub-rotinas, a biblioteca STL da linguagem C++, que fornece ao utilizador uma série de funções e
procedimentos que realizam tarefas triviais, poupando o programador da sua reimplementação.
// Progama Principal
void main()
{
lcd_ini(); // inicializa o lcd
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
if (input(PIN_B1))
{
do
{
output_high(PIN_B4); //Tirando o galão
while (input(PIN_B1));
}
}
if (input(PIN_B2))
{
do
{
output_high(PIN_B4); // Posicionando o galão
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Posicionando!");
while (!input(PIN_B1));
}
output_high(PIN_B3); //Abindo a valvula V2
output_low(PIN_B5); // Mantendo a valvula V1 fechada
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Enchendo");
delay_ms(10000); // Tempo de enchimento do galão
output_low(PIN_B3); // Fechando a valvula V2
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Pronto!");
do
{
output_high(PIN_B4); //Tirando o galão
while (input(PIN_B1));
}
}
if (input(PIN_B1)) && (input(PIN_B2))
{
do
{
output_high(PIN_B4); //Tirando o galão
while (input(PIN_B1));
}
do
{
output_high(PIN_B4); // Posicionando o galão
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Posicionando!");
while (!input(PIN_B1));
}
output_high(PIN_B3); //Abindo a valvula V2
output_low(PIN_B5); // Mantendo a valvula V1 fechada
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Enchendo");
delay_ms(10000); // Tempo de enchimento do galão
output_low(PIN_B3); // Fechando a valvula V2
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Pronto!");
do
{
output_high(PIN_B4); //Tirando o galão
while (input(PIN_B1));
}
}
while (true)
Forum.rdl 06/06/2011 11:37:57 Página 6 de 28
{
do
{
output_high(PIN_B5); // Aciona a valvula V1
lcd_escreve ('\f'); // apaga o display
do
{
output_high(PIN_B4); // Posicionando o galão
lcd_pos_xy(1,1);
printf (lcd_escreve,"Posicionando!");
while (!input(PIN_B1));
}
while (!input(PIN_B2));
}
output_high(PIN_B3); //Abindo a valvula V2
output_low(PIN_B5); // Mantendo a valvula V1 fechada
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Enchendo");
delay_ms(10000); // Tempo de enchimento do galão
output_low(PIN_B3); // Fechando a valvula V2
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Pronto!");
do
{
output_high(PIN_B4); //Tirando o galão
while (input(PIN_B1));
}
}
}
20071046-Douglas de Marqui Zapata da Silva 30/05/2011 11:20
Bom dia pessoal, lendo as postagens no forum notei que alguns amigos optaram por criar uma subrotina de varre teclas para
analisar os sensores, tentei criar uma programação que não utiliza essa subrotina, peço que analisem minha programação afim de
comparar se ela executa a mesma função da varre teclas, obrigado.
#define V1 PIN_B0
#define V2 PIN_B1
#define S1 PIN_B2
#define D PIN_B3
#define M PIN_B4
{
lcd_ini(); // inicializando LCD
lcd_escreve('\f'); // limpa o LCD
lcd_pos_xy(1,1); //posicionando cursor do LCD
printf(lcd_escreve, "Automação Digital");
delay_ms(1000);
//setando os pinos:
output_low V1, V2, M;
do
{
output_high M; //ativando esteira
if (!input M)
{
output_low M; // desativando esteira
}
do
{
output_high V1; // enchendo reservatório
if (!input S1)
{
//Iniciando Programa
#define V1 (PIN_BO)
#define V2 (PIN_B1)
#define S (PIN_B2)
#define D (PIN_B3)
#define M (PIN_B4)
void main ()
while (true)
{
if(!input(S));
{
do
{
output_high (V1);
}
}
while (true0
{
if(input(S));
{
do
{
output_low (V1);
}
}
}
while (true)
{
if(input(D)); //verifica se já há algum galão de tinta na esteira
{
do
{
output_high (D); //ativando sensor para verificação de presença de galão
output_high (M);//ativando esteira para posicionamento de galão
lcd_escreve('\f'); //apaga o lcd
lcd_escreve_xy(1,1);
printf(lcd_escreve,"Posicionando..");
}
}
while (true)
if(input(D));
do
{
Forum.rdl 06/06/2011 11:37:57 Página 10 de 28
output_low (M); //desativa motor da esteira
lcd_escreve('\f'); //limpa lcd
lcd_escreve_xy(1,1);
printf(lcd_escreve,"Posicionado!");
output_high (V2); //ativa a valvula V1 para enchimento do reservatório
delay_ms(5000);
lcd_escreve ('\f');
lcd_escreve_xy(1,1)
printf(lcd_escreve,"Enchendo..");
delay_ms(5000); //ativa o sensor para verificação do enchimento máximo do tanque
output_low (V2);
lcd_escreve ('\f'); // limpa lcd
lcd_escreve_xy(1,1);
printf(lcd_escreve,"Enchimento");
lcd_escreve_xy(1,2);
printf(lcd_escreve,"Completo");
lcd_escreve ('\f'); //apaga o lcd
}
}
// Progama Principal
void main()
{
lcd_ini(); // inicializa o lcd
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(4,1);
printf (lcd_escreve,"Forum 2");
delay_ms(1000);
while (true)
{
if (input(PIN_B1)) //Confere se já existe algum galão posicionado
{
do
{
output_high(PIN_B4); //Tirando o galão
}while (input(PIN_B1));
output_low(PIN_B4);
delay_ms(1);
}
if (input(PIN_B2))
{
do
{
output_high(PIN_B4); // Posicionando o galão
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Posicionando!");
}while (!input(PIN_B1));
output_low(PIN_B4);
delay_ms(1);
output_high(PIN_B3); //Abindo a valvula V2
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Enchendo");
delay_ms(10000); // Tempo de enchimento do galão
output_low(PIN_B3); // Fechando a valvula V2
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Pronto!");
do
{
output_high(PIN_B4); //Tirando o galão
}while (input(PIN_B1));
output_low(PIN_B4);
}
do
{
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(4,1);
printf (lcd_escreve,"AGUARDE!");
output_high(PIN_B5); // Aciona a valvula V1
}while (!input(PIN_B2));
output_low(PIN_B5);
delay_ms(1);
do
{
output_high(PIN_B4); // Posicionando o galão
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Posicionando!");
}while (!input(PIN_B1));
output_low(PIN_B4);
delay_ms(1);
output_high(PIN_B3); //Abindo a valvula V2
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Enchendo");
delay_ms(10000); // Tempo de enchimento do galão
output_low(PIN_B3); // Fechando a valvula V2
lcd_escreve ('\f'); // apaga o display
Forum.rdl 06/06/2011 11:37:57 Página 13 de 28
lcd_pos_xy(1,1);
printf (lcd_escreve,"Pronto!");
do
{
output_high(PIN_B4); //Tirando o galão
}while (input(PIN_B1));
output_low(PIN_B4);
delay_ms(1);
}
}
#include <16f877A.h>
#use delay(clock=4000000)
#fuses HS,NOWDT,PUT,NOBROWNOUT,NOLVP
#define V1 PIN_B0
#define V2 PIN_B1
#define S1 input(PIN_B2)
#define D input(PIN_B3)
#define Motor PIN_B4
// Definição de Variáveis
int tcl;
boolean tecla_pres;
while (true)
{
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Reservatorio");
lcd_pos_xy(1,2);
lcd_pos_xy(1,1);
printf (lcd_escreve," Galao ");
lcd_pos_xy(1,2);
Forum.rdl 06/06/2011 11:37:57 Página 16 de 28
printf (lcd_escreve," Posicionando ");
lcd_pos_xy(1,2);
printf (lcd_escreve," Enchendo... ");
lcd_pos_xy(1,2);
printf (lcd_escreve," Pronto! ");
Delay_ms(1000);
}
}
#include <16f877A.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,PUT,NOBROWNOUT,NOLVP
// Progama Principal
void main()
{
lcd_ini(); // inicializa o lcd
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(4,1);
printf (lcd_escreve,"PHENIX");
lcd_pos_xy(3,2);
printf (lcd_escreve,"AUTOMATION");
delay_ms(1000);
// Verificação inicial do estado atual do processo
while (true)
{
if (input(PIN_B1)) //Confere se já existe algum galão posicionado
{
do
{
output_high(PIN_B4); //Tirando o galão
}while (input(PIN_B1));
output_low(PIN_B4);
delay_ms(1);
}
if (input(PIN_B2))
{
do
{
output_high(PIN_B4); // Posicionando o galão
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Posicionando!");
}while (!input(PIN_B1));
output_low(PIN_B4);
delay_ms(1);
output_high(PIN_B3); //Abindo a valvula V2
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Enchendo");
delay_ms(10000); // Tempo de enchimento do galão
output_low(PIN_B3); // Fechando a valvula V2
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Pronto!");
do
{
output_high(PIN_B4); //Tirando o galão
}while (input(PIN_B1));
output_low(PIN_B4);
}
do
{
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(4,1);
printf (lcd_escreve,"AGUARDE!");
output_high(PIN_B5); // Aciona a valvula V1
}while (!input(PIN_B2));
output_low(PIN_B5);
delay_ms(1);
do
{
output_high(PIN_B4); // Posicionando o galão
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Posicionando!");
}while (!input(PIN_B1));
output_low(PIN_B4);
delay_ms(1);
output_high(PIN_B3); //Abindo a valvula V2
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Enchendo");
Forum.rdl 06/06/2011 11:37:57 Página 19 de 28
delay_ms(10000); // Tempo de enchimento do galão
output_low(PIN_B3); // Fechando a valvula V2
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Pronto!");
do
{
output_high(PIN_B4); //Tirando o galão
}while (input(PIN_B1));
output_low(PIN_B4);
delay_ms(1);
}
}
// Progama Principal
void main()
{
lcd_ini(); // inicializa o lcd
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
// Progama Principal
void main()
{
lcd_ini(); // inicializa o lcd
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
if (input(PIN_B1))
{
do
{
output_high(PIN_B4); //Tirando o galão
while (input(PIN_B1));
}
}
if (input(PIN_B2))
{
do
{
output_high(PIN_B4); // Posicionando o galão
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Posicionando!");
while (!input(PIN_B1));
}
output_high(PIN_B3); //Abindo a valvula V2
output_low(PIN_B5); // Mantendo a valvula V1 fechada
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Enchendo");
delay_ms(10000); // Tempo de enchimento do galão
output_low(PIN_B3); // Fechando a valvula V2
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Pronto!");
do
{
output_high(PIN_B4); //Tirando o galão
while (input(PIN_B1));
}
}
if (input(PIN_B1)) && (input(PIN_B2))
{
do
{
output_high(PIN_B4); //Tirando o galão
while (input(PIN_B1));
}
do
{
output_high(PIN_B4); // Posicionando o galão
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Posicionando!");
while (!input(PIN_B1));
}
output_high(PIN_B3); //Abindo a valvula V2
output_low(PIN_B5); // Mantendo a valvula V1 fechada
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Enchendo");
delay_ms(10000); // Tempo de enchimento do galão
output_low(PIN_B3); // Fechando a valvula V2
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Pronto!");
do
{
output_high(PIN_B4); //Tirando o galão
while (input(PIN_B1));
}
}
while (true)
Forum.rdl 06/06/2011 11:37:57 Página 23 de 28
{
do
{
output_high(PIN_B5); // Aciona a valvula V1
lcd_escreve ('\f'); // apaga o display
do
{
output_high(PIN_B4); // Posicionando o galão
lcd_pos_xy(1,1);
printf (lcd_escreve,"Posicionando!");
while (!input(PIN_B1));
}
while (!input(PIN_B2));
}
output_high(PIN_B3); //Abindo a valvula V2
output_low(PIN_B5); // Mantendo a valvula V1 fechada
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Enchendo");
delay_ms(10000); // Tempo de enchimento do galão
output_low(PIN_B3); // Fechando a valvula V2
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf (lcd_escreve,"Pronto!");
do
{
output_high(PIN_B4); //Tirando o galão
while (input(PIN_B1));
}
}
}
20070361-Fabio Henrique dos Reis 21/05/2011 13:34
Colegas, estou tentando criar uma rotina de verificação do sistema (como ele se encontra no momento de inicialização), mas não sei
qual comando devo usar para comparar duas entradas. Alguem pode ajudar.
20070361-Fabio Henrique dos Reis 21/05/2011 13:34
Colegas, estou tentando criar uma rotina de verificação do sistema (como ele se encontra no momento de inicialização), mas não sei
qual comando devo usar para comparar duas entradas. Alguem pode ajudar.
20045189-Thiago da Silva Velani 21/05/2011 09:04
Estou com um pouco de dificuldade no microcomtrolador (pic),mas estou tentando.
20064123-Lucas Fernandes Borin 18/05/2011 08:55
Fábio / Denivon,
Estou na mesma situação, com um pouco de dificuldades com o microcontrolador por ser algo novo para nós, e além de ter que
revisar toda a disciplina de programação para relembrar os conceitos.
Sugiro marcarmos uma reunião para discutir o projeto em questão e assim podermos alinhar os pensamentos. Vale ressaltar que a
dica postada pelo Laerte é muito interassante não só para esse projeto, como para o próprio TCC de cada um.
20064324-Laerte Ribeiro Silveira 17/05/2011 15:43
Caros,
aqui vai uma dica: Depois de compilado o programa, na hora de carregar o arquivo para o PIC no Proteus, ao invés de abrir o .HEX
abra o .COFF, e comece a simulação apertando o botão "pause". Se as funções estiverem habilitadas, isto permitirá que você
vizualize seu programa sendo executado linha a linha apertando a tecla F10 para dar andamento passo a passo.
OBS: Para a vizualização é preciso que seu programa esteja na mesma pasta que o seu circuito do Proteus está salvo.
Dessa forma conseguirá detectar possíveis erros em sua programação, pois ficará em seu comando cada linha de sua programação e
poderá vizualizar o circuito em funcionamento.
Porém não confunda, na hora de gravar o microcontrolador fisicamente, só deve ser carregado no programa de gravação o
arquivo .HEX
Como também é primeira vez que estou conhecendo a ferramenta microcontrolador (PIC) e o simulador (Proteus), também estou
tendo dificuldades, mas continuarei tentando, qualque novidade nos falamos.
20070361-Fabio Henrique dos Reis 15/05/2011 00:06
Estou tentando criar o programa, mas estou com muitas dificuldades, principamente no que se refere aos comandos. Vou continuar
tentando e assim que tver algo pronto colocarei no forum.
void main(){
char automato;
automato = 'A';
lcd_init();
lcd_putc('\f');
while(true){
switch (automato){
case 'A':{
output_low(pin_b2); //desliga válvula V2
output_high(pin_b1); //liga válvula V1
automato = 'B';
}
break;
case 'B':{
if (!input(pin_a0)){ //verifica o nivel do reservatório (sensor S1)
delay_ms(50); //filtra ruído no sensor S1
}
if (!input(pin_a0)){ //verifica denovo o nível do reservatório (sensor S1)
output_low(pin_b2); //desliga válvula V1
output_high(pin_b0); //liga motor da esteira
automato = 'C';
lcd_putc('\f');
}
}
break;
case 'C':{
if (!input(pin_a1)){ //verifica presença de galão (sensor D)
delay_ms(50); //filtra ruído no sensor D
}
if (!input(pin_a1)) { //verifica denovo presença de galão (sensor D)
lcd_gotoxy(1,1);
printf(lcd_putc,"Posicionado");
output_low(pin_b0); //desliga o motor da esteira
delay_ms(3000);
output_high(pin_b2); //liga válvula V2
lcd_putc('\f');
lcd_gotoxy(1,1);
printf(lcd_putc,"Enchendo");
delay_ms(10000); //10 segundos para encher o galão
output_low(pin_b2); //desliga válvula V2
lcd_putc('\f');
lcd_gotoxy(1,1);
printf(lcd_putc,"Pronto");
automato = 'A';
}
}
break;
}
}
}
int tcl = 0;
int tecla_pres;
// Subrotina de verificação de tecla pressionada
int varre_teclas (void)
{
if (!input(pin_b6)) return(1); // S1 NIVEL CHEIO(sensor)
if (!input(pin_b3)) return(2); // D POSICIONADO (sensor)
// se nenhuma tecla está pressionada, desliga o flag
// tecla_pres e retorna o valor 0
tecla_pres = 0;
return (0);
}
lcd_ini();
lcd_escreve ('\f'); // apaga o display
lcd_pos_xy(1,1);
printf(lcd_escreve,"Forum 2.EdsonAB \n\r");
lcd_pos_xy(1,2);
printf(lcd_escreve,"Inicializando");
delay_ms(2000);
lcd_escreve ('\f');
while(true)
{
tcl = teclas();
if(tcl == 2)
{
output_low(PIN_B7);
lcd_pos_xy(1,2);
printf(lcd_escreve,"Posicionado");
//delay_ms(1000);
output_high(PIN_B5);
lcd_escreve('\f');
lcd_pos_xy(1,2);
printf(lcd_escreve,"Enchendo");
do
{
tcl=teclas();
}while(tcl != 1);
output_low(PIN_B5);
output_high(PIN_B4);
delay_ms(1000);
output_low(PIN_B4);
lcd_escreve('\f');
printf(lcd_escreve,"Cheio");
output_high(PIN_B7);
delay_ms(1000);
}
else
Forum.rdl 06/06/2011 11:37:57 Página 27 de 28
{
output_high(PIN_B7);
lcd_escreve('\f');
printf(lcd_escreve,"Posicionando");
delay_ms(1000);
}
}
}