Escolar Documentos
Profissional Documentos
Cultura Documentos
RIBEIRÃO PRETO
2011
Fernando Américo Velozo
Marcos Freitas
Osvaldo Rodrigues de Matos Filho
Thiago Ferrari
Wallace Daniel Sertori
RIBEIRÃO PRETO
2011
.
Aprovado em:
BANCA EXAMINADORA
_______________________/__/___
Prof. .
Universidade Paulista – UNIP
_______________________/__/___
Prof. .
Universidade Paulista – UNIP
_______________________/__/___
Prof. .
Universidade Paulista UNIP
DEDICATÓRIA
The system should work alone under the supervision of an operator who will
set the requirements for the product. The process will be controlled by software
that once set will make the evaluation of product sizes and even distinguishing 8
(eight) colors. After analysis on a treadmill, the product will be separated and
directed as determined by operator configuration, or even released for another
treadmill which leads to the deposit of waste.
1. INTRODUÇÃO....................................................................................................9
2. SENSOR DE COR............................................................................................ 10
3. RECEPÇÃO DAS CORES................................................................................12
4. APRESENTAÇÃO DO PROJETO PROPOSTO...............................................15
5. PROPOSTA DE PROJETO..............................................................................16
5.1 Sensor de cor RGB:................................................................................................16
5.2 Esteiras automatizadas..........................................................................................17
5.3 Painel de operação e controle:..............................................................................17
5.3.1 Display LCD:..............................................................................................18
5.3.2 LEDs indicativos:......................................................................................18
5.3.3 Botões de comando:.................................................................................19
6. PRINCIPIO DE FUNCIONAMENTO DO PROTÓTIPO.....................................20
6.1 Desenvolvimento do sensor de cor................................................................262
6.1.1 Testes com os LDR.................................................................................264
6.1.2 Definições para o circuito do sensor RGB.............................................26
6.1.3 Especificação dos resistores e LDR’s do sensor..................................26
6.2 Especificações Técnicas...................................................................................27
6.2.1 Micro-Controlador.....................................................................................27
6.2.2 Painel de operação....................................................................................28
6.2.3 Esteiras.......................................................................................................28
7. CÁLCULOS REALIZADOS..............................................................................32
7.1 Definições para o circuito do sistema..............................................................32
8. LISTA DE MATERIAS......................................................................................34
9. RECURSOS...................................................................................................... 35
10. CONCLUSÃO................................................................................................... 36
REFERÊNCIA BIBLIOGRÁFICA..............................................................................36
APÊNDICES..............................................................................................................36
10
1. INTRODUÇÃO
Conta com opção para diferenciador de tamanhos e para até 8 (oito) cores
básicas, separação de produtos por cor e tamanho, contagem especifica por cor,
descarte automático para produtos de refugo e memória de leituras anteriores onde
o operador pode verificar uma lista com quantidades por cor.
11
2. SENSOR DE COR
Foram realizados alguns testes utilizando LDRs comuns nas cores referentes
à RGB (Vermelho, Verde, Azul), para análise da luz refletida pelo objeto. Quando
excitados por uma luz de frequência similar à emitida quando o mesmo é alimento,
os LEDs apresentam uma tensão em seus terminais.
.
12
Módulo
Sensor de
presença
R1
R2
R3
Módulo 1
Amplificad
or
Módulo 2
Amplificad
or
Módulo 3
Amplificad
or
No sistema de cores, existem oito cores principais, além das descritas acima
como as primarias, temos também as cores secundárias que são os chamados
CMYK.
CMYK = 1-RGB.
Segue abaixo uma tabela com alguns comprimentos de onda das cores que
compoem o arco-iris e suas respectivas frequências:
Considerando-se que nenhum objeto possui uma cor formada pela frequência
de IR, toda a frequência de IR emitida pela própria câmera, é novamente refletida e
esta, por sua vez, através de software específico, faz a leitura desta reflexão e
converte em imagem visível porém, não é possível identificar a real cor do objeto
filmado, dai a explicação da imagem monocromática adquirida.
16
Conta com opção para diferenciador de tamanhos e para até 8 (oito) cores
básicas, separação de produtos por cor e tamanho, contagem especifica por cor,
descarte automático para produtos de refugo e memória de leituras anteriores onde
o operador pode verificar uma lista com quantidades por cor.
17
5. PROPOSTA DE PROJETO
RESPOSTA DO SENSOR
Cor da
amostra
Vermelho (R) Verde (G) Azul (B)
0 0 0 Preta
0 0 1 Azul
18
0 1 0 Verde
0 1 1 Ciano
1 0 0 Vermelha
1 0 1 Magenta
1 1 0 Amarela
1 1 1 Branca
Tabela 2 – Combinação de cores em RGB
A terceira esteira estará em nível mais baixo que a segunda e será utilizada
para levar os produtos não requisitados para o setor de descarte.
O controle do sistema será formado por uma central de comando móvel, com
alimentação por fonte removível e bateria interna, possuirá LEDs indicativos, botões
de comando e um display LCD, para visualização das leituras do sensor e
conferênca do histórico de dados obtidos.
de resposta, assim como quando não possuir nenhum bloco refletindo. Caso não
haja a necessidade de leitura desta cor, o sensor de presença pode ser removido e
o sensor de cor acionado diretamente.
Para resolvermos este problema, utilizaremos um LED branco RGB. Este tipo
de componente, se trata de 3 LEDs nas cores vermelho (R), verde (G) e azul (B)
montados em um único encapsulamento. Ao acionarmos todas as cores ao mesmo
tempo, a somatória destas resultará na luz de cor branca, com a somatória da
freqüência de luz das 3 cores necessárias para o sensor.
Sensor
bloco
Ao emitirmos uma luz num bloco colorido, este reflete uma luz na frequência
correspondente à sua cor. Esta freqüência, ao passar por filtros de cada cor (RGB),
será dividida e recebida pelo LDR que estiver com um filtro na cor correspondente,
ou seja, permitirá a passagem de luz somente nos receptores das cores primárias
que compõem a cor em análise, reduzindo assim a resistência entre os terminais
dos LDRs.
RESPOSTA DO SENSOR
Cor da
amostra
Vermelho (R) Verde (G) Azul (B)
0 0 0 Preta
0 0 1 Azul
0 1 0 Verde
0 1 1 Ciano
1 0 0 Vermelha
1 0 1 Magenta
1 1 0 Amarela
1 1 1 Branca
Tabela 2 – Combinação de cores em RGB
26
Foram utilizados resistores distintos para cada cor, em cada divisor de tensão
das entradas dos comparadores. Os mesmos foram adotados baseados nos
resultados de testes com os LDRs.
6.2.1 Micro-Controlador
1-A/E/USART,
Periféricos de comunicação Digital 1-MSSP(SPI/I2C)
Comparadores 2
Quantidade de pinos 28
Nos circuitos criados, não foram utilizados nem ao menos 20% da capacidade
de processamento dos micro-controladore porém, devido ao baixo custo e facilidade
de aquisição dos mesmos, estes foram utilizados com sucesso.
Neste painel é possível programar o que será realizado com cada tipo de
bloco individualmente (separar para esquerda, direita ou rejeitar) e visualizar a
30
contagem dos blocos que passaram pela esteira. Há também as opções de habilitar/
desabilitar som do beep, apagar valores contados e ressetar todo o sistema.
6.2.3 Esteiras
Interrupção
Serial
Leitura pino
S
de comando Há Armazena o Byte do Aguarda Interrup.
complemento? Texto Serial
N
T
Texto /
Valor
S
Exige Bit Beep = 1
V
Beep?
Bit Beep = 0
Apaga Display
S
Escreve 1ª linha do 2º Texto? Define variável
Display posição 2ª linha
Escreve 2ª linha do
Display
1 Aciona Beep
Bit
Beep por 1seg
0
32
Desliga
Início esteiras e
sensores
Config. e inicializar
Ra7 = bit Envia sinal de
entradas e saídas
de controle Erro ‘SEM
bit Rb4 => entrada BLOCO
0
1 Liga bit controle Leitura
Ra S1 até S1
esteiras e => saída
7 10s
0 sensores 1
Armazena
Leitura
valor de 3bits
Leitura S2
na última
resp.
posição da Sensor
Circ.
pilha de Cor
Mestre
dados
1
bit controle Set bit de Envia cód. Id Leitura
Ra S1 & S3
0 => entrada controle para PortB
7
Parar
Desliga
0000 0000 Início
Esteiras e
Interrupção
Direita sensores
Aciona Atuador
(sensor 4) Retorn
0000 0001 2 para direita
o
Esquerda
Copia 1º Valor Aciona Atuador
da pilha 0000 0010 2 para
Eliminar esquerda
Rotaciona Para Liga Liga Desliga Desliga
valores da 0000 0011 esteiras atuador esteira C atuador atuador
pilha 1 1 1
AeB Desliga
esteira C
7. CÁLCULOS REALIZADOS
35
Sensor R: 6K
Sensor G: 10K
Sensor B: 10K
R2: 10K
R=(5-1,8)/0,006
IB=IC/beta
IB=0,250/100
IB=2,5mA
RB=Vcc/IB
RB=5/0,0025
8. LISTA DE MATERIAS
37
Esta lista foi composta por materiais previstos para serem utilizados
durante o projeto
9. RECURSOS
38
10. CONCLUSÃO
39
Este recurso pode ser utilizado para separar produtos diversos utilizando
apenas uma linha de montagem / produção. Considerando-se que nem todas as
empresas possuem mais de 8 (oito) produtos por linha de montagem, este sensor
pode abranger uma grande gama de aplicações, identificando etiquetas ou a própria
cor da embalagem.
REFERÊNCIAS BIBLIOGRÁFICAS
40
//PIC 16F886
#include "htc.h"
#include "Main.h"
#include "Read_write_esteiras.h"
#include "Interrupções.h"
#include "Setup.h"
#include "Interface.h"
#include "Funções por tela.h"
//////////////////////////////////////////////////////////////////////
// VARIÁVEIS GLOBAIS //
//////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
// PROGRAMA PRINCIPAL
/////////////////////////////////////////////////////////////////
void main(void)
{
Setup(); //Chama a rotina de Setup
asm("clrwtd");
Beep_OFF();
PIN_RESET = 1; //tira resset dos demais circuitos
Buzzer = 1;
if(!botao_teste) //com a CH_RUN acionada ao ligar, entra na rotina de
testes
{
Rotina_de_testes(); //e entra na rotina de testes
//*********************************************//
void Delay_ms(unsigned int qtd_ms)
{
//funcionalidade para 8MHz
unsigned int x;
unsigned int y;
for(x = 0 ; x < qtd_ms ; x++)
{
//asm("clrwtd");
for(y=0;y<160;y++) asm("nop"); //asm("clrwtd");
}
}
//**********************************************//
//**********************************************//
void Rotina_de_testes(void)
{
Beep_ON(); // 2 beeps curtos
Delay_ms(200);
Beep_OFF();
Delay_ms(100);
Beep_ON();
Delay_ms(200);
Beep_OFF();
SendtoLCD(0x3A); //Envia a palavra "ROTINA DE TESTES"
while(!botao_teste) //aguarda soltar o botão de testes
{
}
for(;;)
{
if(!botao_teste) Debounce_teste();
if(habilita_escrita == 1)
{
while(!TXIF) //Aguarda liberar a transmissão (teste TSR)
{
}
SendtoLCD(texto_teste);
while(!TXIF) //Aguarda liberar a transmissão (teste TSR)
{
}
if(nT_N == 1) nT_N = 0;
else nT_N=1;
habilita_escrita=0;
}
}
}
//**************************
void Debounce_teste(void)
{
if(!botao_teste) deb_vezes--;
else deb_vezes = 0x0AFF;
if(deb_vezes == 0)
{
habilita_escrita = 1;
texto_teste += 2;
while(deb_vezes < 0x0AFF) //Rotina aguarda soltar o botão
{
if(botao_teste) deb_vezes++;
else deb_vezes = 0x0000;
}
}else
{
habilita_escrita = 0;
46
}
if(texto_teste > 0x3A)
{
texto_teste = 0;
nT_N ^= 1;
}
}
Arquivo Setup.c
#include "htc.h"
#include "Setup.h"
// - CIRCUITO 1 - MESTRE
/////////////////
//FUNÇÕES LOCAIS
/////////////////
void Setup_IO(void);
void Setup_Timer(void);
void Setup_USART(void);
void Setup_Interrupts(void);
void Setup_ADC(void);
////////////////////
//FUNÇOES DE SETAGEM
////////////////////
void Setup(void)
{
//OSCCON = 0b01110100;//Configura frequência de clock
OSCCON = 0b01110101;//Para 16F886 8MHz
Setup_IO();
Setup_Timer();
Setup_USART();
Setup_ADC();
Setup_Interrupts();
SWDTEN = 0; //Mantém Watchdog desabilitado
}
void Setup_IO(void)
{
//pull-ups das portas
nRBPU = 0; //Habilita Pull Ups
// nWPUEN = 0; //Habilita Pull-ups
WPUB = 0xFE;
void Setup_Timer(void)
{
//TIMER 1
// TMR1 ON
// nothing|
// ext clk sync||
47
//TIMER 2
// prescaler
// TMR2 ON ||
// postscaler ||| - pre 00, post 0111 e PR2 250 para 1ms;
// ||||||| - pre 11, post 0000 e PR2 250 para 1s;
T2CON = 0b00111000;
TMR2IE = 1;
PR2 = 0xFF;//mudar tb na definição de DUTY em "Functions.c"
void Setup_USART(void)
{
SPBRGH = 0;//
SPBRG = 12;//12 para 9600 com erro de 0.3%
BRGH = 0;//
BRG16 = 0;//these registers and bits have to be set to achive desired baud
rate.
SYNC = 0;//clear for asynchronous operation
SPEN = 1;//enable serial port
TX9 = 0;//Enable/Disable 9-bit reception
ADDEN = 0;//Enable/Disable address detection
TXEN = 1;
TXIE = 0;
//RCIE = 1;
CREN = 0; //Enable/Disable reception
}
void Setup_Interrupts(void)
{
PEIE = 1; //Peripherals interrupt enable;
// IOCIE = 1; //PORTB Change interrupt;
// IOCBN = 0b00110000; //Enable IOC on pin RB3 and RB4;
// IOCBP = 0b00110000;
// RBIE = 1; //16F886
// IOCB = 0b00110000; //16F886
GIE = 1; //Global interrup enable;
}
void Setup_ADC(void)
{
}
Arquivo INTERRUPÇÕES.c
#include "htc.h"
#include "Interrupções.h"
//////////////////////////////////////////////////////////////
// INTERRUPÇÕES //
//////////////////////////////////////////////////////////////
void interrupt interrupcao(void)
48
{
static unsigned char ct_25ms=0;
static unsigned char ct_1s=0;
GIE = 0;
if(RCIF) //Interrupção Serial
{
flag_erro = 0;
transmition_ok = 1;
RCIF = 0;
return;
}
if(T0IF)
{
T0IF = 0;
}
/*if (TMR2IF)//interrupção TIMER2 a cada 1ms
{
t_1ms++;
TMR2IF=0;
return;
TMR2 = 0x00;
PR2 = 0xFF;
}*/
if (TMR1IF)//interrupção TIMER1 a cada 2,5ms
{
// flag_2_5ms=1;
ct_25ms++;
if(ct_25ms>=10)
{
flag_25ms=1;
ct_25ms=0;
ct_1s++;
if(ct_1s>=40)//40 para 1s
{
// flag_1s=1;
ct_1s=0;
t_10s++;
if(t_10s >= 10)
{
t_10s = 0;
Esteira_vazia = 1;
}
}
}
TMR1H = 0xB1;//
TMR1L = 0xDF;//
TMR1IF = 0;
return;
}
GIE = 1;
return;
}
Arquivo INTERFACE.c
#include "htc.h"
#include "Main.h"
#include "Read_write_esteiras.h"
#include "Interrupções.h"
#include "Setup.h"
#include "Interface.h"
#include "Funções por tela.h"
// CH_BAIXO -----|--
49
// CH_DIR ----||--
// CH_CONFIG ---|||--
// CH_RUN --||||--
//PORTB 0b76543210
//******************************
void Leitura_teclado(void)
{
const unsigned int deb_max = 1000;
static unsigned int deb_rb5 = 0;
static unsigned int deb_rb4 = 0;
static unsigned int deb_rb3 = 0;
static unsigned int deb_rb2 = 0;
if(RB5 == 0) deb_rb5++;
if(RB4 == 0) deb_rb4++;
if(RB3 == 0) deb_rb3++;
if(RB2 == 0) deb_rb2++;
//*****************************
void SendtoLCD(unsigned char byte)
50
{
Delay_ms(10);
TXREG = byte;
Delay_ms(20);
// nT_N = 0;
}
Arquivo READ_WRITE_ESTEIRAS.c
#include "htc.h"
#include "Main.h"
#include "Read_write_esteiras.h"
#include "Interrupções.h"
#include "Setup.h"
#include "Interface.h"
#include "Funções por tela.h"
//**************************************************
void Sistema_em_funcionamento(void)
{
unsigned char dadosbloco = 0;
unsigned char config = 0;
unsigned char qtd = 0;
Esteira_vazia = 0;
TMR1ON = 1;
Bit_controle = 1;
Delay_ms(1);
TRISA7 = 1;
dadosbloco = Config_Blocos[Bloco];
config = dadosbloco << 4;
PORTA &= config;
Bit_controle = 1;
switch(config)
{
case 0: dadosbloco = 0x0E; break; //palavra REJEITA
case 1: dadosbloco = 0x10; break; //palavra ESQUERDA
case 2: dadosbloco = 0x12; break; //palavra DIREITA
default: dadosbloco = 0x0E;
}
SendtoLCD(dadosbloco);
Delay_ms(50);
qtd = Qtd_Blocos[Bloco] + 1;
Qtd_Blocos[Bloco] = qtd;
if(config != 0)
{
SendtoLCD(qtd);
Delay_ms(50);
}
TRISA7 = 1;
}
if(Esteira_vazia)
{
ESTEIRAS_VAZIAS();
break;
}
51
//**************************************************
//**************************************************
void ESTEIRAS_VAZIAS(void)
{
t_10s = 0;
DESLIGAR_ESTEIRAS();
SendtoLCD(0x06); //Escreve ESTEIRAS VAZIAS
}
//**************************************************
//**************************************************
void DESLIGAR_ESTEIRAS(void)
{
TRISA7 = 0;
PORTA &= 0b00001111;
Bit_controle = 1;
}
TELA_CONFIGURACAO();
break;
}
if(CH_RUN)
{
CH_RUN = 0;
RUNNING();
break;
}
}
}
//******************************************************************
//******************************************************************
void TELA_CONFIGURACAO (void)
{
nT_N = 0;
SendtoLCD(0x08); //envia a palavra "CONFIGURAR"
Delay_ms(100);
SendtoLCD(0x0A); //envia palavbra "BLOCOS E CORES"
//******************************************************************
//******************************************************************
void DEFINIR_BLOCOS(void)
{
nT_N = 0;
unsigned char caixa;
unsigned char config;
unsigned char palavradestatus;
unsigned char bloco_old = 1;
Bloco = 0;
while(1) //VERIFICAR FUNCIONALIDADE
{
if(bloco_old != Bloco)
{
config = Config_Blocos[Bloco];
switch(config)
{
case 0: palavradestatus = 0x0E; break; //palavra REJEITA
case 1: palavradestatus = 0x10; break; //palavra ESQUERDA
case 2: palavradestatus = 0x12; break; //palavra DIREITA
default: palavradestatus = 0x0E; config = 0;
}
caixa = Tipo_Bloco[Bloco];
SendtoLCD(caixa); //Escreve o tipo da caixa
53
Delay_ms(100);
SendtoLCD(palavradestatus); //Escreve a config da caixa
bloco_old = Bloco;
}
//******************************************************************
//******************************************************************
void APAGAR_VALORES(void)
54
{
nT_N = 0;
SendtoLCD(0x1A); //envia a palavra "APAGAR VALORES"
unsigned char x;
//******************************************************************
//******************************************************************
void RESET_ALL(void)
{
while(1)
{
nT_N = 0;
SendtoLCD(0x1E); //envia a palavra "RESET ALL"
//******************************************************************
//******************************************************************
55
void CONFIRMA_RESET(void)
{
nT_N = 0;
SendtoLCD(0x20); //envia a palavra "CONFIRMA RESET"
//******************************************************************
//******************************************************************
void VISUALIZAR_BLOCOS(void)
{
unsigned char caixa;
Bloco = 0;
while(1) //VERIFICAR FUNCIONALIDADE
{
nT_N = 1;
caixa = Qtd_Blocos[Bloco];
SendtoLCD(caixa);
nT_N = 0;
caixa = Tipo_Bloco[Bloco];
SendtoLCD(caixa);
//******************************************************************
//******************************************************************
void RUNNING(void)
{
SendtoLCD(0x04); //Envia a palavra "Em Funcionamento"
Sistema_em_funcionamento();
if(Esteira_vazia)
{
while(CH_RUN == 0)
56
{
Leitura_teclado(); //Verifica tecla pressionada
}
CH_RUN = 0;
Esteira_vazia = 0;
}
}
Arquivo MAIN.h
#include "htc.h"
/*
#define CH_RUN RB5
#define CH_CONFIG RB4
#define CH_DIR RB3
#define CH_BAIXO RB2
*/
//***************************************************
//VARIÁVEIS EXTERNAS
typedef union
{
unsigned int Byte;
struct
{
unsigned Bit0 :1;
unsigned Bit1 :1;
unsigned Bit2 :1;
unsigned Bit3 :1;
unsigned Bit4 :1;
unsigned Bit5 :1;
unsigned Bit6 :1;
unsigned Bit7 :1;
unsigned Bit8 :1;
unsigned Bit9 :1;
unsigned Bit10 :1;
unsigned Bit11 :1;
unsigned Bit12 :1;
unsigned Bit13 :1;
unsigned Bit14 :1;
unsigned Bit15 :1;
} Bits;
} _Flags1;
///////////////////////////////////////////////////////
////////////////////////////////////////////////////
void Valor_de_Texto(void);
void Valor_de_Numero(void);
void Delay_ms(unsigned int qtd_ms);
void Rotina_de_testes(void);
void Debounce_teste(void);
Arquivo Setup.h
#include "htc.h"
#include "Main.h"
//Funções Globais
extern void Setup(void);
extern void Liga_timers(void);
Arquivo INTERRUPÇÕES.h
#include "htc.h"
#include "Main.h"
extern unsigned char t_10s;
Arquivo INTERFACE.h
#include "htc.h"
Arquivo READ_WRITE_ESTEIRAS.h
#include "htc.h"
//PIC 16F886
#include "htc.h"
#include "Main.h"
#include "Read_write_esteiras.h"
#include "Interrupções.h"
#include "Setup.h"
/////////////////////////////////////////////////////////
// VARIÁVEIS GLOBAIS //
/////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
// PROGRAMA PRINCIPAL //
///////////////////////////////////////////////////////////////
void main(void)
{
Setup(); //Chama a rotina de Setup
Esteira_vazia = 0;
while(1)
{
if(Bit_controle) Ligar_sistema();
}
}
//*********************************************//
void Delay_ms(unsigned int qtd_ms)
{
//funcionalidade para 8MHz
unsigned int x;
unsigned int y;
for(x = 0 ; x < qtd_ms ; x++)
{
if(S4) Bloco_no_final();
//asm("clrwtd");
for(y=0;y<160;y++) asm("nop"); //asm("clrwtd");
}
60
Arquivo Setup.c
#include "htc.h"
#include "Setup.h"
// - CIRCUITO 2 - ESTEIRAS
/////////////////
//FUNÇÕES LOCAIS
/////////////////
void Setup_IO(void);
void Setup_Timer(void);
void Setup_USART(void);
void Setup_Interrupts(void);
void Setup_ADC(void);
////////////////////
//FUNÇOES DE SETAGEM
////////////////////
void Setup(void)
{
//OSCCON = 0b01110100;//Configura frequência de clock
OSCCON = 0b01110101;//Para 16F886 8MHz
Setup_IO();
Setup_Timer();
Setup_USART();
Setup_ADC();
Setup_Interrupts();
SWDTEN = 0; //Mantém Watchdog desabilitado
}
void Setup_IO(void)
{
//pull-ups das portas
// nRBPU = 0; //Habilita Pull Ups
// nWPUEN = 0; //Habilita Pull-ups
// WPUX = 0b76543210
// WPUA = 0xFF;
// WPUB = 0xFE;
// WPUC = 0xFF;
void Setup_Timer(void)
{
//TIMER 1
// TMR1 ON
// nothing|
// ext clk sync||
// low power oscil|||
61
// prescaler||||
// clock source||||||
// ||||||||
T1CON = 0b00000000;
TMR1IE = 1;
TMR1H = 0xB1;
TMR1L = 0xDF;
// CCPR1H = 0x00;
// CCPR1L = 0x00;
//TIMER 2
// prescaler
// TMR2 ON ||
// postscaler |||
// ||||||| - pre 11, post 1111 e PR2 32mS;
T2CON = 0b01111011;
TMR2IE = 1;
PR2 = 0xFA;//mudar tb na definição de DUTY em "Functions.c"
//Interrupts a cada 8ms
void Setup_USART(void)
{
}
void Setup_Interrupts(void)
{
PEIE = 1; //Peripherals interrupt enable;
// IOCIE = 1; //PORTB Change interrupt;
// IOCBN = 0b00110000; //Enable IOC on pin RB3 and RB4;
// IOCBP = 0b00110000;
// RBIE = 1; //16F886
// IOCB = 0b00110000; //16F886
GIE = 1; //Global interrup enable;
}
void Setup_ADC(void)
{
}
Arquivo Interrupções.c
#include "htc.h"
#include "Interrupções.h"
/////////////////////////////////////////////////////////////////////
// INTERRUPÇÕES
//
///////////////////////////////////////////////////////////////////
void interrupt interrupcao(void)
{
static unsigned char ct_25ms = 0;
static unsigned char ct_1s = 0;
static unsigned int ct_8s = 0;
GIE = 0;
if(T0IF)
{
T0IF = 0;
}
62
if(TMR2IF)
{
TMR2IF = 0;
ct_8s++;
if(ct_8s >= 1000);
{
ct_8s = 0;
EsteiraC = OFF;
TMR2ON = 0; //desliga timer2
TMR2 = 0x00;
}
}
if (TMR1IF)//interrupção TIMER1 a cada 2,5ms
{
// flag_2_5ms=1;
ct_25ms++;
if(ct_25ms>=10)
{
flag_25ms=1;
ct_25ms=0;
ct_1s++;
if(ct_1s>=40)//40 para 1s
{
// flag_1s=1;
ct_1s=0;
t_10s++;
if(t_10s >= 10)
{
t_10s = 0;
Esteira_vazia = 1;
}
}
}
TMR1H = 0xB1;//
TMR1L = 0xDF;//
TMR1IF = 0;
}
GIE = 1;
return;
}
Arquivo Read_write_esteiras.c
#include "htc.h"
#include "Main.h"
#include "Read_write_esteiras.h"
#include "Interrupções.h"
#include "Setup.h"
//**************************************************
//*********************************************//
volatile char box_position = 0;
//volatile char position_out = 0;
void Ligar_sistema(void)
{
Liga_sensores = ON;
EsteirasAB = ON;
TRISA7 = 0; //Seta Bit_controle como saída
TMR1ON = 1;
while(1)
{
if(Esteira_vazia) Desligar_tudo(); break;
if(S1) Entrada_de_bloco();
if(S4) Bloco_no_final();
}
}
//*********************************************//
63
void Desligar_tudo(void)
{
TMR1ON = 0;
TMR1H = 0xB1;
TMR1L = 0xDF;
TRISA7 = 1;
Liga_sensores = OFF;
EsteirasAB = OFF;
}
void Entrada_de_bloco(void)
{
unsigned char colorposition = 0;
unsigned char leituracoratual = 0;
unsigned char corlida = 0;
if(S4) Bloco_no_final();
mediadacor[colorposition];
if(colorposition < 50) colorposition++;
}
if(S1) bloco_grande=1; //Bloco grande
else bloco_grande=0;
colorposition = colorposition/2;
corlida = mediadacor[colorposition];
if(bloco_grande) corlida+=1;
if(S4) Bloco_no_final();
PORTA |= corlida;
Bit_controle = 1;
Delay_ms(50);
Aguardar_resposta();
}
//**************************************************
//**************************************************
void Aguardar_resposta(void)
{
TRISA7 = 1;
while(1)
{
if(Bit_controle) Armazenar_Whattodo(); break;
if(S4) Bloco_no_final();
}
}
//**************************************************
void Armazenar_Whattodo(void)
{
}
//**************************************************
void Bloco_no_final(void)
{
//**************************************************
void DESLIGAR_ESTEIRAS(void)
{
TRISA7 = 0;
PORTA &= 0b00001111;
Bit_controle = 1;
64
Arquivo Main.h
#include "htc.h"
/*
--- SENSORES ---
RB0 - S4 => Sensor final
RB1 - S3 => Sensor tamanho
RB2 - S1 => Sensor de entrada
RB3 - B => BLUE
RB4 - G => GREEN
RB5 - R => RED
RC4 e 5 - Atuador1 => Rejeita
RC6 e 7 - Atuador2 => Direita/esquerda
*/
#define S4 RB0
#define S3 RB1
#define S1 RB2
#define ON 0
#define OFF 1
#define EsteirasAB RC0
#define EsteiraC RC1
//***************************************************
//VARIÁVEIS EXTERNAS
typedef union
{
unsigned int Byte;
struct
{
unsigned Bit0 :1;
unsigned Bit1 :1;
unsigned Bit2 :1;
unsigned Bit3 :1;
unsigned Bit4 :1;
unsigned Bit5 :1;
unsigned Bit6 :1;
unsigned Bit7 :1;
unsigned Bit8 :1;
unsigned Bit9 :1;
unsigned Bit10 :1;
unsigned Bit11 :1;
unsigned Bit12 :1;
unsigned Bit13 :1;
unsigned Bit14 :1;
unsigned Bit15 :1;
} Bits;
} _Flags1;
Arquivo Setup.h
#include "htc.h"
#include "Main.h"
//Funções Globais
extern void Setup(void);
extern void Liga_timers(void);
Arquivo Interrupções.h
#include "htc.h"
#include "Main.h"
extern unsigned char t_10s;
Arquivo Read_write_esteiras.h
#include "htc.h"
////////////////////////////////////////////////////////////////////
// VARIÁVEIS GLOBAIS //
////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// PROGRAMA PRINCIPAL //
//////////////////////////////////////////////////////////////////////
void main(void)
{
Setup(); //Chama a rotina de Setup
Delay_ms(100);
// rotina_teste = 0;
// if(!botao_teste) rotina_teste = 1;
Init_LCD();
nT_N = 0;
flag_erro = 0;
while(1)
{
if((FERR == 1|OERR == 1) & flag_erro == 0) //Verificam os
erros seriais
{
flag_erro = 1;
CREN = 0;
Send_word_LCD(Erro); //Escreve ERRO FUNCIONAL no
Display
lixo = Buffer;//RCREG;
CREN = 1;
}
if(reception_ok)
{
//CREN = 0;
//CREN = 1;
//nT_N = nono_bit; //Verifica se é texto ou número
verificando porta RB0
valor_recebido = Buffer; //RCREG;
status_circuito = valor_recebido & 0b11000000;
//Mantém somente os 2 MSB
status_circuito >>= 6;
//transforma nos 2 LSB
if(nono_bit == 1)
{
Valor_de_Numero();
}else
{
Valor_de_Texto();
}
reception_ok = 0;
}
// }
}
//*********************************************************************
/*else //ROTINA DE TESTES
{
Beep_ON();
Delay_ms(100);
Beep_OFF();
Delay_ms(100);
Beep_ON();
Delay_ms(150);
Beep_OFF();
LED_EMERG_ON();
LED_SB_ON();
LED_RUN_ON();
Send_word_LCD(Testes); //Escreve "Rotina de testes"
while(1)
{
if(!botao_teste) Debounce_teste();
asm("clrwdt");
if(habilita_escrita)
{
habilita_escrita = 0;
valor_recebido = texto_teste;
}
}
}
}*/
}
//*********************************************//
void Valor_de_Texto(void)
{
LED_EMERG_OFF();
LED_RUN_OFF();
LED_SB_OFF();
Send_word_LCD(valor_recebido);
switch(status_circuito)
{
case 1: //indica sistema em Stand By
LED_EMERG_OFF();
LED_RUN_OFF();
LED_SB_ON();
break;
case 2: //indica sistema em Funcionamento
LED_EMERG_OFF();
LED_RUN_ON();
LED_SB_OFF();
break;
case 3: //indica sistema em Emergência com LED e 3 beeps
LED_EMERG_ON();
LED_RUN_OFF();
LED_SB_OFF();
Beep_ON();
Delay_ms(100); //Beep curto
Beep_OFF();
Delay_ms(50);
Beep_ON();
Delay_ms(100); //beep curto
Beep_OFF();
Delay_ms(50);
Beep_ON();
Delay_ms(600); //beep longo
Beep_OFF();
break;
default: break;
}
//*********************************************//
void Valor_de_Numero(void)
{
LCD_line = 1;
LCD_column = 14;
Send_number_LCD(valor_recebido);
//*********************************************//
void Delay_ms(unsigned int qtd_ms)
{
unsigned int x;
unsigned int y;
//********************************************************************************
//********************************************************************************
//********************************************************************************
void LED_EMERG_ON(void)
{
RC4=1;
Beep_ON();
Delay_ms(800); //Beep longo
Beep_OFF();
}
void Beep_ON(void)
{
RC5 = ~Buzzer;
}
Arquivo Setup.c
#include "htc.h"
#include "Setup.h"
// CIRCUITO 3 - DISPLAY
/////////////////
//FUNÇÕES LOCAIS
/////////////////
void Setup_IO(void);
void Setup_Timer(void);
void Setup_USART(void);
void Setup_Interrupts(void);
void Setup_ADC(void);
////////////////////
//FUNÇOES DE SETAGEM
////////////////////
void Setup(void)
{
//OSCCON = 0b01110100;//Configura frequência de clock
OSCCON = 0b01110101;//Para 16F886 - 8MHz
Setup_IO();
Setup_Timer();
Setup_USART();
Setup_ADC();
Setup_Interrupts();
// SWDTEN = 1;//Habilita Watchdog
}
void Setup_IO(void)
{
//pull-ups das portas
// WPUX = 0b76543210
// WPUA = 0xFF;
WPUB = 0b00100001;
// WPUC = 0xFF;
nRBPU = 0; //Habilita Pull Ups
//ANSELB = 0b00000000;
ANSEL = 0b00000000;//Para 16F886
ANSELH = 0b00000000;//Para 16F886
}
void Setup_Timer(void)
{
//TIMER 0
// prescaler
// presc. ref ao tmr0 |||
// ||||
// OPTION &= 0b11001111;
// T0IE = 0; //Interrupção do timer 0 desabilitada
//TIMER 1
// TMR1 ON
// nothing|
// ext clk sync||
// low power oscil|||
// prescaler||||
// clock source||||||
// ||||||||
// T1CON = 0b00000100;
// TMR1IE = 0;
// TMR1H = 0xFF;
// TMR1L = 0xFF;
// CCPR1H = 0x00;
// CCPR1L = 0x00;
//TIMER 2
// prescaler
// TMR2 ON ||
// postscaler ||| - pre 00, post 0111 e PR2 250 para 1ms;
// ||||||| - pre 11, post 0000 e PR2 250 para 1s;
// T2CON = 0b00111000;
// TMR2IE = 1;
// PR2 = 0xFF;//Valor Final do timer2
void Setup_USART(void)
{
SPBRGH = 0;//
SPBRG = 12;//12 para 9600 com erro de 0.3%
BRGH = 0;//
BRG16 = 0;//these registers and bits have to be set to achive desired baud
rate.
SYNC = 0; //clear for asynchronous operation
SPEN = 1; //enable serial port
RX9 = 0; //Enable/Disable 9-bit reception
ADDEN = 0; //Enable/Disable address detection
// TXEN = 1;
// TXIE = 0;
RCIE = 1;
CREN = 1; //Enable/Disable reception
}
void Setup_Interrupts(void)
{
PEIE = 1; //Peripherals interrupt enable;
// IOCIE = 1; //PORTB Change interrupt;
// IOCBN = 0b00110000; //Enable IOC on pin RB3 and RB4;
// IOCBP = 0b00110000;
// RBIE = 1; //16F886
// IOCB = 0b00110000; //16F886
GIE = 1; //Global interrup enable;
}
72
void Setup_ADC(void)
{
// ADCON0 = 0b00000001;
// ADCON1 = 0b00000000;
// GO_nDONE= 1;
}
Arquivo Interrupções.c
#include "htc.h"
#include "Interrupções.h"
GIE = 0;
if(RCIF) //Interrupção Serial
{
Buffer = RCREG;
RCIF = 0;
flag_erro = 0;
reception_ok = 1;
nT_N = nono_bit; //Verifica se é texto ou número verificando porta
RB0
}
if(T0IF)
{
T0IF = 0;
}
if (TMR1IF)//interrupção TIMER1 a cada 2,5ms
{
flag_2_5ms=1;
TMR1IF = 0;
}
GIE = 1;
return;
}
void Init_LCD(void)
{
LCD_COMANDO();
LCD_DATA = 0X38; //Cursor para direita
LCD_enable();
asm("nop");
LCD_disable();
Delay_ms(15);
73
Limpa_display();
}
extern void Limpa_display (void)
{
LCD_COMANDO();
LCD_DATA = 0X01; //Limpa display
LCD_enable();
asm("nop");
LCD_disable();
Delay_ms(15);
}
//*********************************************//
void Send_number_LCD(char numero)
{
unsigned char unidade = 0;
unsigned char dezena = 0;
unsigned char centena = 0;
unsigned char digito = 0;
centena = numero/100;
dezena = numero/10 - centena*10;
unidade = numero - (centena*100 + dezena*10);
LCD_line = 2;
LCD_posicao();
LCD_enable();
asm("nop");
LCD_disable();
Delay_ms(tw);
}
}
//*********************************************//
void LCD_posicao(void)
{
unsigned char posicao;
LCD_COMANDO();
if(LCD_line == 1) posicao = 0X80;
else posicao = 0XC0;
posicao = posicao + LCD_column - 1; //define posição inicial
LCD_DATA = posicao;
LCD_enable();
asm("nop");
LCD_disable();
Delay_ms(15);
//LCD_line = 1;
}
//*****************************************//
//*** ***//
//*** ESCRITAS PRINCIPAIS ***//
//*** ***//
//*****************************************//
switch(cod_texto)
{
case 0x00: break;
LCD_column = 1;
break;
break;
default:
word[0] = 0;
Limpa_display();
break;
}
}
Arquivo Main.h
#include "htc.h"
//***************************************************
//VARIÁVEIS EXTERNAS
typedef union
{
unsigned char Byte;
struct
{
unsigned Bit0 :1;
unsigned Bit1 :1;
unsigned Bit2 :1;
unsigned Bit3 :1;
unsigned Bit4 :1;
unsigned Bit5 :1;
unsigned Bit6 :1;
unsigned Bit7 :1;
} Bits;
} _Flags1;
///////////////////////////////////////////////////////
extern unsigned char valor_recebido;
extern unsigned char status_circuito;
extern unsigned char cod_texto;
extern unsigned char numero;
extern volatile char LCD_line;
extern volatile char LCD_column;
////////////////////////////////////////////////////
extern void Valor_de_Texto(void);
extern void Valor_de_Numero(void);
extern void Delay_ms(unsigned int qtd_ms);
extern void LED_EMERG_ON(void);
extern void Beep_ON(void);
Arquivo Setup.h
#include "htc.h"
80
#include "Main.h"
//Funções Globais
extern void Setup(void);
extern void Liga_timers(void);
Arquivo Interrupções.h
#include "htc.h"
#include "Main.h"
//_____________________________
//#define LCD_RS RC1 //0=Comando | 1=Dados
//#define dado 1
//#define comando 0
#define LCD_COMANDO()RC1 = 0
#define LCD_DADO() RC1 = 1
//_____________________________
/*******************************
Protótipo de Funções
*******************************/