Patrick Lucas - CTE Parobé - Microcontrolador Arm 7
Blog dedicado para relatar as atividades feitas em aula.
domingo, 9 de dezembro de 2012
Desafio 4
Download desafio: http://www.4shared.com/office/SLHLW3-A/desafio4.html?
Parte do desafio (exemplo): http://www.4shared.com/rar/-kNV9Lz1/exemplo_parte_des4.html?
Neste desafio iremos, criar um programa para uma panificadora, faça o download do documento e siga as diretrizes. Neste desafio vamos usar a interrupção. Segue abaixo programa criado para a panificadora:
#include <lpc21xx.h>
#include "C:\keil\lcd.h"
#define pao_1 (1<<12)
#define pao_2 (1<<13)
#define pao_3 (1<<14)
#define liga_desliga (1<<15)
#define sensor_porta (1<<16)
#define resistencia_ligada IOSET1=(1<<24)
#define resistencia_desligada IOCLR1=(1<<24)
#define motor (1<<25)
unsigned int val;
//interrupção quando a tampa é aberta
__irq void EINT0_IRQHandler(void)
{
lcd_clr();
lcd_puts("TAMPA ABERTA");
lcd_gotoxy(1,0);
lcd_puts("FECHAR TAMPA");
IOCLR1 = motor;
resistencia_desligada;
EXTINT = 1;
VICVectAddr = 0;
}
__irq void DefISR (void) {
}
void tempo (int limite)
{
int t;
for(t=0;t<limite;t++);
}
int misturar_massa (void)
{
IOSET1 = motor;
lcd_clr();
lcd_puts("BATENDO");
tempo(9999999);
IOCLR1 = motor;
}
int atualiza (void){
ADCR |= 0x01000000;
while ((ADDR & 0x80000000) == 0);
val = ((ADDR >> 6) & 0x03FF);
}
int main(void)
{
IODIR0 = 0XFFFF0FFF;
IODIR1 = 0XFFFFFFFF;
init_lcd();
lcd_clr();
lcd_gotoxy(0,2);
lcd_puts("PANIFICADORA");
PINSEL1 = 400001;
VPBDIV = 0X02;
ADCR = 0X00210601;
EXTMODE=0x00;
EXTPOLAR=0x00;
EXTINT=0x03;
VICVectAddr0 = (unsigned long) EINT0_IRQHandler;
VICVectCntl0 = ( 0x20 | 14 );
VICIntEnable |= ((unsigned long)1<<14);
VICDefVectAddr = (unsigned long) DefISR; /* un-assigned VIC interrupts */
while(1)
{
atualiza();
while(!(IOPIN0&(liga_desliga)))
{
lcd_clr();
lcd_puts("DESLIGADA");
}
lcd_clr();
lcd_gotoxy(0,5);
lcd_puts("LIGADA");
while(1)
{
lcd_clr();
lcd_gotoxy(0,4);
lcd_puts("ESCOLHER");
lcd_gotoxy(1,4);
lcd_puts("PROGRAMA");
if (IOPIN0&(pao_1))
{
goto pao1;
}
if (IOPIN0&(pao_2))
{
goto pao2;
}
if (IOPIN0&(pao_3))
{
goto pao3;
}
}
pao1:
while (IOPIN0&(pao_1))
{
lcd_clr();
lcd_puts("PAO 1");
misturar_massa();
lcd_clr();
lcd_puts("REPOUSO");
tempo(9999999);
goto assar1;
}
assar1:
if (val<=110)
{
resistencia_ligada;
lcd_clr();
lcd_puts("ASSANDO");
lcd_gotoxy(1,0);
lcd_puts("PAO 1");
tempo(9000000);
}
else if (val>=110)
{
resistencia_desligada;
lcd_clr();
lcd_puts("PAO 1");
tempo(10000000);
goto fim1;
}
fim1:
{
resistencia_desligada;
lcd_clr();
lcd_puts("PAO 1 PRONTO");
while(1);
}
pao2:
while (IOPIN0&(pao_2))
{
lcd_clr();
lcd_puts("PAO 2");
misturar_massa();
lcd_clr();
lcd_puts("REPOUSO");
tempo(9999999);
goto assar2;
}
assar2:
if (val<=220)
{
resistencia_ligada;
lcd_clr();
lcd_puts("ASSANDO");
lcd_gotoxy(1,0);
lcd_puts("PAO 2");
tempo(9000000);
}
else if (val>=220)
{
resistencia_desligada;
lcd_clr();
lcd_puts("PAO 2");
tempo(10000000);
goto fim2;
}
fim2:
{
resistencia_desligada;
lcd_clr();
lcd_puts("PAO 2 PRONTO");
while(1);
}
pao3:
while (IOPIN0&(pao_3))
{
lcd_clr();
lcd_puts("PAO 3");
misturar_massa();
lcd_clr();
lcd_puts("REPOUSO");
tempo(9999999);
goto assar3;
}
assar3:
if (val<=330)
{
resistencia_ligada;
lcd_clr();
lcd_puts("ASSANDO");
lcd_gotoxy(1,0);
lcd_puts("PAO 3");
tempo(9000000);
}
else if (val>=330)
{
resistencia_desligada;
lcd_clr();
lcd_puts("PAO 3");
tempo(10000000);
goto fim3;
}
fim3:
{
resistencia_desligada;
lcd_clr();
lcd_puts("PAO 3 PRONTO");
while(1);
}
}
}
Circuito criado no Proteus:
Desafio 3.1
Segue o link para download do desafio: Conversor Analógico/Digital http://www.4shared.com/office/tbdqlj-V/desafio31.html?
Arquivo de exemplo: http://www.4shared.com/rar/VAKfy5lZ/adclpc2138.html?
Exemplo de Resposta: http://www.4shared.com/rar/gnjYDKFF/desafio31resposta.html?
Meu programa:
#include <lpc21xx.h>
#include <stdio.h>
#define a (1<<16)
#define b (1<<17)
#define c (1<<18)
#define d (1<<19)
#define e (1<<20)
#define f (1<<21)
#define g (1<<22)
#define num_1 IOSET1=b|c ; IOCLR1=a|d|e|f|g
#define num_2 IOSET1=a|b|e|d|g ; IOCLR1=c|f
#define num_3 IOSET1=a|b|c|d|g ; IOCLR1=e|f
#define num_4 IOSET1=b|c|f|g ; IOCLR1=a|d|e
#define num_5 IOSET1=a|c|d|f|g ; IOCLR1=b|e
unsigned int val;
unsigned char teste[];
int main(void)
{
IODIR1 = 0xffffffff;
PINSEL1 = 0x400000;
VPBDIV = 0x02;
ADCR = 0x00210601;
while(1)
{
atualiza:
ADCR |= 0x01000000;
while ((ADDR & 0x80000000) == 0);
val = ((ADDR >> 6) & 0x03FF);
if (val<204)
{
num_1;
goto atualiza;
}
else if (val>204 & val<408)
{
num_2;
goto atualiza;
}
else if (val>408 & val<612)
{
num_3;
goto atualiza;
}
else if (val>612 & val<816)
{
num_4;
goto atualiza;
}
else if (val>816 & val<1023)
{
num_5;
goto atualiza;
}
}
}
Arquivo de exemplo: http://www.4shared.com/rar/VAKfy5lZ/adclpc2138.html?
Exemplo de Resposta: http://www.4shared.com/rar/gnjYDKFF/desafio31resposta.html?
Meu programa:
#include <lpc21xx.h>
#include <stdio.h>
#define a (1<<16)
#define b (1<<17)
#define c (1<<18)
#define d (1<<19)
#define e (1<<20)
#define f (1<<21)
#define g (1<<22)
#define num_1 IOSET1=b|c ; IOCLR1=a|d|e|f|g
#define num_2 IOSET1=a|b|e|d|g ; IOCLR1=c|f
#define num_3 IOSET1=a|b|c|d|g ; IOCLR1=e|f
#define num_4 IOSET1=b|c|f|g ; IOCLR1=a|d|e
#define num_5 IOSET1=a|c|d|f|g ; IOCLR1=b|e
unsigned int val;
unsigned char teste[];
int main(void)
{
IODIR1 = 0xffffffff;
PINSEL1 = 0x400000;
VPBDIV = 0x02;
ADCR = 0x00210601;
while(1)
{
atualiza:
ADCR |= 0x01000000;
while ((ADDR & 0x80000000) == 0);
val = ((ADDR >> 6) & 0x03FF);
if (val<204)
{
num_1;
goto atualiza;
}
else if (val>204 & val<408)
{
num_2;
goto atualiza;
}
else if (val>408 & val<612)
{
num_3;
goto atualiza;
}
else if (val>612 & val<816)
{
num_4;
goto atualiza;
}
else if (val>816 & val<1023)
{
num_5;
goto atualiza;
}
}
}
Circuito Proteus:
Desafio 3
Link para download do desafio 3: http://www.4shared.com/office/Q-oc7KGY/desafio_3.html?
Neste desafio teremos que fazer um cruzamento. Lendo e tirando as informações do desafio 3, montei esse programa aqui:
#include <lpc213x.h>
#include "C:/keil/lcd.h"
#define liga_desliga (1<<16)
#define vermelho_1 (1<<16)
#define amarelo_1 (1<<17)
#define verde_1 (1<<18)
#define vermelho_2 (1<<19)
#define amarelo_2 (1<<20)
#define verde_2 (1<<21)
int tempo (void)
{
int d;
for(d=0;d<100000;d++);
}
int main (void)
{
IODIR0 = 0XFFFEFFFF;
IODIR1 = 0XFFFFFFFF;
init_lcd();
if(IOPIN0&(liga_desliga))
{
IOSET1 = verde_1;
IOSET1 = vermelho_2;
lcd_clr();
lcd_gotoxy(0,0);
lcd_puts("Rua 1 aberta");
lcd_gotoxy(1,0);
lcd_puts("Rua 2 fechada");
IOCLR1 = verde_1;
IOSET1 = amarelo_1;
lcd_clr();
lcd_puts("Atencao Rua 1");
tempo();
IOCLR1 = amarelo_1;
IOCLR1 = vermelho_2;
IOSET1 = vermelho_1;
IOSET1 = verde_2;
lcd_clr();
lcd_gotoxy(0,0);
lcd_puts("Rua 1 fechada");
lcd_gotoxy(1,0);
lcd_puts("Rua 2 aberta");
tempo();
IOCLR1 = verde_2;
IOSET1 = amarelo_2;
lcd_clr();
lcd_puts("Atencao Rua 2");
IOCLR1 = vermelho_1;
IOCLR1 = amarelo_2;
}
else
{
if (!(IOPIN0&(liga_desliga)))
{
IOSET1 = amarelo_1;
IOSET1 = amarelo_2;
tempo();
IOCLR1 = amarelo_1;
IOCLR1 = amarelo_2;
lcd_clr();
lcd_puts("Modo Economia");
tempo();
return;
}
}
}
Neste desafio teremos que fazer um cruzamento. Lendo e tirando as informações do desafio 3, montei esse programa aqui:
#include <lpc213x.h>
#include "C:/keil/lcd.h"
#define liga_desliga (1<<16)
#define vermelho_1 (1<<16)
#define amarelo_1 (1<<17)
#define verde_1 (1<<18)
#define vermelho_2 (1<<19)
#define amarelo_2 (1<<20)
#define verde_2 (1<<21)
int tempo (void)
{
int d;
for(d=0;d<100000;d++);
}
int main (void)
{
IODIR0 = 0XFFFEFFFF;
IODIR1 = 0XFFFFFFFF;
init_lcd();
if(IOPIN0&(liga_desliga))
{
IOSET1 = verde_1;
IOSET1 = vermelho_2;
lcd_clr();
lcd_gotoxy(0,0);
lcd_puts("Rua 1 aberta");
lcd_gotoxy(1,0);
lcd_puts("Rua 2 fechada");
IOCLR1 = verde_1;
IOSET1 = amarelo_1;
lcd_clr();
lcd_puts("Atencao Rua 1");
tempo();
IOCLR1 = amarelo_1;
IOCLR1 = vermelho_2;
IOSET1 = vermelho_1;
IOSET1 = verde_2;
lcd_clr();
lcd_gotoxy(0,0);
lcd_puts("Rua 1 fechada");
lcd_gotoxy(1,0);
lcd_puts("Rua 2 aberta");
tempo();
IOCLR1 = verde_2;
IOSET1 = amarelo_2;
lcd_clr();
lcd_puts("Atencao Rua 2");
IOCLR1 = vermelho_1;
IOCLR1 = amarelo_2;
}
else
{
if (!(IOPIN0&(liga_desliga)))
{
IOSET1 = amarelo_1;
IOSET1 = amarelo_2;
tempo();
IOCLR1 = amarelo_1;
IOCLR1 = amarelo_2;
lcd_clr();
lcd_puts("Modo Economia");
tempo();
return;
}
}
}
Segue exemplo de circuito no proteus:
DUVIDAS ACESSEM O BLOG: alessandrors.blogspot.com.br
Desafio 2
Link para download do desafio: http://www.4shared.com/office/smNmEAtl/desafio_2_unico.html?
No desafio dois, teremos que projetar uma Máquina de Lavar Roupa. Com base nas diretrizes montei este programa:
#include <lpc213x.h>
#include "C:/keil/lcd.h"//lê o arquivo lcd.h
#define valvula_admissao (1<<16)//define os pinos
#define bomba_expurgo (1<<17)
#define sensor_nivel (1<<20)
#define sensor_porta (1<<16)
#define motor_1 (1<<18)
#define motor_2 (1<<19)//define os pinos
int tempo (void)//função tempo
{
int d;
for(d=0;d<100000;d++);
}
int main (void)
{
IODIR0 = 0XFFFEFFFF;
IODIR1 = 0XFFEFFFFF;
init_lcd();
if(IOPIN0&(sensor_porta))
{
IOCLR1 = valvula_admissao;
lcd_clr();
lcd_puts("Porta Aberta");
while(1);
}
if(IOPIN1&(sensor_nivel))
{
lcd_clr();
lcd_puts("Agua Disponivel");
}
else
{
IOCLR1 = valvula_admissao;
lcd_clr();
lcd_puts("Sem Agua");
while(1);
}
if(!(IOPIN0&(sensor_porta)))
{
IOSET1 = valvula_admissao;
lcd_clr();
lcd_puts("Admitindo Agua");
IOCLR1 = valvula_admissao;
IOSET1 = motor_1;
lcd_clr();
lcd_puts("Lavando Direita");
tempo();
IOCLR1 = motor_1;
IOSET1 = motor_2;
lcd_clr();
lcd_puts("Lavando Esquerda");
tempo();
IOCLR1 = motor_2;
IOSET1 = motor_1;
lcd_clr();
lcd_puts("Lavando Direita");
tempo();
IOCLR1 = motor_1;
IOSET1 = motor_2;
lcd_clr();
lcd_puts("Lavando Esquerda");
tempo();
IOCLR1 = motor_2;
IOSET1 = motor_1;
lcd_clr();
lcd_puts("Lavando Direita");
tempo();
IOCLR1 = motor_1;
IOSET1 = motor_2;
lcd_clr();
lcd_puts("Lavando Esquerda");
tempo();
IOCLR1 = motor_2;
IOSET1 = motor_1;
lcd_clr();
lcd_puts("Lavando Direita");
tempo();
IOCLR1 = motor_1;
IOSET1 = motor_2;
lcd_clr();
lcd_puts("Lavando Esquerda");
tempo();
IOCLR1 = motor_2;
IOSET1 = bomba_expurgo;
lcd_clr();
lcd_puts("Enxaguando");
IOCLR1 = bomba_expurgo;
IOSET1 = valvula_admissao;
lcd_clr();
lcd_puts("Agua Novamente");
IOCLR1 = valvula_admissao;
IOSET1 = bomba_expurgo;
lcd_clr();
lcd_puts("Tirando Agua");
tempo();
IOCLR1 = bomba_expurgo;
IOSET1 = motor_1;
IOSET1 = motor_2;
lcd_clr();
lcd_puts("Centrifugando");
tempo();
IOCLR1 = motor_1;
IOCLR1 = motor_2;
lcd_clr();
lcd_puts("Roupa Limpa");
while (1);
}
}
O circuito no Proteus ficará assim:
No desafio dois, teremos que projetar uma Máquina de Lavar Roupa. Com base nas diretrizes montei este programa:
#include <lpc213x.h>
#include "C:/keil/lcd.h"//lê o arquivo lcd.h
#define valvula_admissao (1<<16)//define os pinos
#define bomba_expurgo (1<<17)
#define sensor_nivel (1<<20)
#define sensor_porta (1<<16)
#define motor_1 (1<<18)
#define motor_2 (1<<19)//define os pinos
int tempo (void)//função tempo
{
int d;
for(d=0;d<100000;d++);
}
int main (void)
{
IODIR0 = 0XFFFEFFFF;
IODIR1 = 0XFFEFFFFF;
init_lcd();
if(IOPIN0&(sensor_porta))
{
IOCLR1 = valvula_admissao;
lcd_clr();
lcd_puts("Porta Aberta");
while(1);
}
if(IOPIN1&(sensor_nivel))
{
lcd_clr();
lcd_puts("Agua Disponivel");
}
else
{
IOCLR1 = valvula_admissao;
lcd_clr();
lcd_puts("Sem Agua");
while(1);
}
if(!(IOPIN0&(sensor_porta)))
{
IOSET1 = valvula_admissao;
lcd_clr();
lcd_puts("Admitindo Agua");
IOCLR1 = valvula_admissao;
IOSET1 = motor_1;
lcd_clr();
lcd_puts("Lavando Direita");
tempo();
IOCLR1 = motor_1;
IOSET1 = motor_2;
lcd_clr();
lcd_puts("Lavando Esquerda");
tempo();
IOCLR1 = motor_2;
IOSET1 = motor_1;
lcd_clr();
lcd_puts("Lavando Direita");
tempo();
IOCLR1 = motor_1;
IOSET1 = motor_2;
lcd_clr();
lcd_puts("Lavando Esquerda");
tempo();
IOCLR1 = motor_2;
IOSET1 = motor_1;
lcd_clr();
lcd_puts("Lavando Direita");
tempo();
IOCLR1 = motor_1;
IOSET1 = motor_2;
lcd_clr();
lcd_puts("Lavando Esquerda");
tempo();
IOCLR1 = motor_2;
IOSET1 = motor_1;
lcd_clr();
lcd_puts("Lavando Direita");
tempo();
IOCLR1 = motor_1;
IOSET1 = motor_2;
lcd_clr();
lcd_puts("Lavando Esquerda");
tempo();
IOCLR1 = motor_2;
IOSET1 = bomba_expurgo;
lcd_clr();
lcd_puts("Enxaguando");
IOCLR1 = bomba_expurgo;
IOSET1 = valvula_admissao;
lcd_clr();
lcd_puts("Agua Novamente");
IOCLR1 = valvula_admissao;
IOSET1 = bomba_expurgo;
lcd_clr();
lcd_puts("Tirando Agua");
tempo();
IOCLR1 = bomba_expurgo;
IOSET1 = motor_1;
IOSET1 = motor_2;
lcd_clr();
lcd_puts("Centrifugando");
tempo();
IOCLR1 = motor_1;
IOCLR1 = motor_2;
lcd_clr();
lcd_puts("Roupa Limpa");
while (1);
}
}
O circuito no Proteus ficará assim:
Quando o circuito e o programa ja estiverem prontos, basta colocar o programa no LPC e ver o funcionamento do programa.
segunda-feira, 22 de outubro de 2012
Desafio 1.2
Link para download do desafio 1.2: http://www.4shared.com/office/MNc-89Rd/desafio12.html?
Obs: Não usar o bit P0.14 para a falta d'água, utilizar o bit P1.21, para funcionar corretamente o programa.
Este desafio é a continuação do desafio 1.1. Adicionamos um lcd de 2x16, com objetivo de aparecer as mensagens nele. Para isso usamos um arquivo para escrever no lcd, este arquivo se chama lcd.h, segue o link para download, link para download retirado do blog alessandrors.blogspot.com.br (http://www.4shared.com/file/QZIoHjW8/lcd.html?).
#include <lpc213x.h> //define biblioteca
#include "C:/keil/lcd.h" //arrumar de acordo com o diretorio do computador
#define maximo (1<<16)
#define minimo (1<<17)
#define bomba (1<<18)
#define dmae (1<<21)
int main (void)
{
IODIR0 = 0XFFFFFFFF; //todos os bits são saídas neste port, pois o lcd está ligado nele
IODIR1 = 0XFFDCFFFF;
init_lcd(); //iniciar o lcd
while(1)
{
if(!(IOPIN1&(dmae)))
{
IOCLR1 = bomba;
lcd_clr();//limpa lcd, para podermos escrever a mensagem
lcd_gotoxy(1,5);// define o lugar, o qual vai aparecer a mensagem no lcd
lcd_puts("falta agua"); //mensagem que aparecerá no lcd
}
else
{
if(!(IOPIN1&(minimo)))
{
IOSET1 = bomba;
lcd_clr();
lcd_gotoxy(0,0);
lcd_puts("caixa enchendo");
}
else
{
if(IOPIN1&(maximo))
{
IOCLR1 = bomba;
lcd_clr();
lcd_gotoxy(0,5);
lcd_puts("caixa cheia");
}
}
}
}
}
Após escrever o programa no Keil, teremos que fazer o circuito no Proteus. Abaixo é o circuito que criei:
Neste link, http://www.4shared.com/zip/3X2IfWIS/3_LCD_2X_16_3.html? já há um circuito com o lcd e o lpc. Para ver funcionando o circuito, temos que adicionar o arquivo .hex gerado pelo Keil ao lpc2138, basta clicar duas vezes sobre ele e na caixa de diálogo que contem uma pasta, localizar o arquivo .hex.
Todos os links retirados do blog: www.alessandrors.blogspot.com.br
quarta-feira, 12 de setembro de 2012
Criando Circuito no Proteus
Iremos criar o desafio 1.0 no Proteus. Primeiro passo é criar o arquivo .hex no Keil, feito isso vamos começar a desenhar o circuito no Proteus. Vamos utilizar um LPC2138, dois BUTTONS, um LED Animated, um BC547, quatro POWERS (+3.3V), um DC VOLTMETER, quatro GROUNDS e quatro RESISTORS (três de 12k e um de 65R).
Para achar os componentes necessários, vá até a aba de seletor de objetos, localizado no lado esquerdo da tela, ache a opção Component Mode. Abaixo da vista panorâmica, clique na letra P (Pick from Libraries) irá abrir o menu onde acharemos alguns componentes, como resistores, capacitores, leds, chaves, entre outros. Para acharmos o ground e o power, vá até Terminals Mode. O voltímetro está localizado em Virtual Instruments Mode.
Exemplo de como fazer o circuito:
Obs: Ligaremos os pinos de acordo com o desafio 1.0.
Como ficará o circuito no Proteus:
Para achar os componentes necessários, vá até a aba de seletor de objetos, localizado no lado esquerdo da tela, ache a opção Component Mode. Abaixo da vista panorâmica, clique na letra P (Pick from Libraries) irá abrir o menu onde acharemos alguns componentes, como resistores, capacitores, leds, chaves, entre outros. Para acharmos o ground e o power, vá até Terminals Mode. O voltímetro está localizado em Virtual Instruments Mode.
Exemplo de como fazer o circuito:
Obs: Ligaremos os pinos de acordo com o desafio 1.0.
Como ficará o circuito no Proteus:
Com o circuito pronto, vamos adicionar o arquivo .hex ao LPC2138. Clique duas vezes sobre o LPC, abrirá um menu, vá até a caixa de texto chamada Program File, clique na pasta que tem ao lado, ache o arquivo .hex que foi criado no desafio 1.0 e adicione ele. Pronto, agora só falta rodar o circuito, na parte de baixo da tela, encontra-se o botão Play, o qual iremos clicar para rodar o circuito e verificar se há erros. Caso haja erros, veja qual é o erro e corrija-o.
Assinar:
Comentários (Atom)







