sábado, 22 de dezembro de 2012

  Então Galera.. O Desafio 4 foi o Ultimo para mim.. foi até onde consegui fazer.
Mas pretendendo utilizar o Blog para ir postando coisas que vou desenvolvendo no curso, coisas sobre a eletrônica Também!!

 Em seguida postarei uma projeto desenvolvido na matéria de Eletrônica Digital.. Com o professor Fernando.
Abraço!!


domingo, 9 de dezembro de 2012

Desafio 4.0 - Panificadora

Essa Desafio Foi bem difícil, é o ante penúltimo e estamos com pouco tempo pra terminar o que esta faltando, então vou postar esse, e se der tudo certo, postarei o ultimo.

Diretrizes:

Nas diretrizes Consta como saída um Display Grafico, que deveria ser escrito o que diz nas diretrizes da segunda imagem, só que não é obrigatório usa-lo.

Nessa primeira imagem esta descrito o que é entra e o que é saída.






Nessa imagem tem o que deve aparecer no display e o que cada função faz. Como disse antes, o display Gráfico não precisamos utiliza-lo.



O meu programa ficou da seguinte maneira:


#include <lpc21xx.h>                   
#include "C:\Keil\ARM\lcd.h"             

#define liga_des (1<<24)            

#define prog_1 (1<<25)
#define prog_2 (1<<26)
#define prog_3 (1<<27)
#define resistencia (1<<28)
#define motor (1<<29)

unsigned int val;
__irq void EINT0_IRQHandler(void) 
{
IOCLR1 = motor;
lcd_clr();
lcd_gotoxy(1,0);
lcd_puts("fechar a tampa");
EXTINT = 1; 
VICVectAddr = 0; 
}
__irq void DefISR (void) {
}
int tempo (int limite)
{
int t;
for(t=0;t<limite;t++);
}
int mistura_massa (void)
{
IOSET1 = motor;
tempo(5000000);
IOCLR1 = motor;
}
int atualiza (void)
{
ADCR |= 0x01000000; 
while ((ADDR & 0x80000000) == 0); 
val = ((ADDR >> 6) & 0x03FF);
}
int main(void)
{
IODIR0 = 0XF7FEFFFF;
IODIR1 = 0XF0FFFFFF;
init_lcd();
lcd_clr();
lcd_puts("PANIFICADORA 4.0");
PINSEL1 = 0x400001;
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; 

while(1)
{
atualiza();
while ((IOPIN1&(liga_des)))
{
lcd_clr();
lcd_puts("DESLIGADA");
}
lcd_clr();
lcd_puts("LIGADA");
while(1)
{
lcd_clr();
lcd_gotoxy (0,3);
lcd_puts("SELECIONE");
lcd_gotoxy (1,3);
lcd_puts("PROGRAMA");
if (!(IOPIN1&(prog_1)))
{
lcd_clr();
lcd_gotoxy (0,3);
lcd_puts("Selecionado");
lcd_gotoxy (1,5);
lcd_puts("PAO");
goto prog1;
}
if (!(IOPIN1&(prog_2)))
{
lcd_clr();
lcd_gotoxy (0,3);
lcd_puts("SELECIONADO");
lcd_gotoxy (1,5);
lcd_puts ("BOLO");
goto prog2;
}
if (!(IOPIN1&(prog_3)))
{
lcd_clr();
lcd_gotoxy (0,3);
lcd_puts("SELECIONADO");
lcd_gotoxy (1,3);
lcd_puts ("PAO SOVADO");
goto prog3;
}
}
prog1:
{
while (!(IOPIN1&(prog_1)))
{
lcd_clr();
lcd_puts("Misturando massa");
mistura_massa();
lcd_clr();
lcd_puts("Massa em repouso");
tempo(5000000);
goto cozinha1;
}
cozinha1:
if (val<200)
{
IOSET1 = resistencia;
lcd_clr();
lcd_puts("ASSANDO");
tempo(80000000);
}
else if (val>200)
{
IOCLR1 = resistencia;
lcd_clr();
lcd_puts("ASSANDO");
tempo(80000000);
goto fim1;
}
fim1:
IOCLR1 = resistencia;
lcd_clr();
lcd_puts("PRONTO");

while(1);

}
prog2:
{
while (!(IOPIN1&(prog_2)))
{
lcd_clr();
lcd_puts("Misturando massa");
mistura_massa();
lcd_clr();
lcd_puts("Massa em repouso");
tempo(5000000);
goto cozinha2;
}
cozinha2:
if (val<250)
{
IOSET1 = resistencia;
lcd_clr();
lcd_puts("ASSANDO");
tempo(5000000);
}
else if (val>400)
{
IOCLR1 = resistencia;
lcd_clr();
lcd_puts("ASSANDO");
tempo(6500000);
goto fim2;
}
fim2:
IOCLR1 = resistencia;
lcd_clr();
lcd_puts("PRONTO");
while(1);
}
prog3:
{
while (!(IOPIN1&(prog_3)))
{
lcd_clr();
lcd_puts("Misturando massa");
mistura_massa();
lcd_clr();
lcd_puts("Massa em repouso");
tempo(5000000);
goto cozinha3;
}
cozinha3:
if (val<400)
{
IOSET1 = resistencia;
lcd_clr();
lcd_puts("ASSANDO");
tempo(6000000);
}
else if (val>600)
{
IOCLR1 = resistencia;
lcd_clr();
lcd_puts("ASSANDO");
tempo(5000000);
goto fim3;
}
fim3:
IOCLR1 = resistencia;
lcd_clr();
lcd_puts("PRONTO");
while(1);
}
}
}


  Bom, as características da minha panificadora, não são muito diferentes das dos demais alunos, Ela  tem uma chave de interrupção, para que se a tampa estiver aberta ou for aberta durante o processo, a panificadora pare de trabalhar, contem também uma chave de liga e desliga, e outras três chaves, uma para cada programa, ou seja, há três tipos de pão que podem ser feitos, que são: Pão, Bolo, Pão Sovado.


Há também uma resistência, para poder assar o alimento, e um motor, para mexer a massa, a resistência é acionada  por um Relé.

-FOTO:




Vídeo do Funcionamento:

   O vídeo a Seguir mostra o funcionamento do programa, Se acompanharmos o display, veremos que ele descreve o que esta acontecendo, primeiro ele avisa que esta desligada, quando pressionamos o botão de liga e desliga ele escreve Ligada, e Pede para selecionar o Programa, o primeiro que escolho é o Bolo,  então ele mistura a massa e logo a deixa em repouso, por fim o assa, termina o processo. Depois escolho o Programa Pão. Note que ele demora mais, pois o tempo que escolhi para cada programa é diferente.




E o próximo vídeo, demonstra como funciona a interrupção, note que ao pressionar a chave da tampa, imediatamente o programa para e escreve no display para fechar a tampa, e quando pressionada novamente ela volta para onde estava.


Então.. Esse foi meu desafio 4.0, espero que o post tenha sido claro, e que possa ser entendido com facilidade. Agora vou correr para Fazer o desafio 5.0, espero que consiga termina- lo. 

Abraço!!!!

sábado, 8 de dezembro de 2012

Desafio 3.1 - Vídeo No Proteus



Desafio 3.0 Semaforo

Nesse desafio devíamos fazer um semáforo pra 2 ruas, um pra cada. Enquanto uma tivesse aberta a outra taria fechada, e enquanto isso informações vão sendo escritas no LCD, dizendo qual rua esta aberta e qual esta fechada!

Diretrizes:



O meu programa ficou da seguinte forma:


#include <LPC213X.H>
#include "C:\Keil\ARM\lcd.h"

#define S1_VERM (1<<16)
#define S1_AM (1<<17)
#define S1_VERDE (1<<18)
#define S2_VERM (1<<19)
#define S2_AM (1<<20)
#define S2_VERDE (1<<21)
#define CEEE (1<<22)


int d;
int i; 
lcd_init();

void ceee (void)
{
IOCLR1 = (S1_VERM);
IOCLR1 = (S1_AM);
IOCLR1 = (S1_VERDE);
IOCLR1 = (S2_VERM);
IOCLR1 = (S2_AM);
IOCLR1 = (S2_VERDE);
lcd_puts("Falta de Energia");
IOSET1 = (S1_AM);
IOSET1 = (S2_AM);
for (d=0; d<100000; d++);
IOCLR1 = (S1_AM);
IOCLR1 = (S2_AM);
}

void main (void)
{
 
while (1)
 {
IODIR0 = 0xFFFFFFFF; 
IODIR1 = 0xFFBFFFFF;

lcd_puts("Rua 1 Fechada, Rua 2 OK");
IOSET1 = S1_VERM;
IOCLR1 = S2_VERM;
IOSET1 = S2_VERDE;
for (d=0; d<100000; d++);
IOCLR1 = (S2_VERDE);

if (!(IOPIN1&(CEEE)))
{
while (!(IOPIN1&(CEEE)))
{
ceee();
}
}

IOSET1 = (S2_AM);
for (d=0; d<100000; d++);
IOCLR1 = (S2_AM);


IOSET1 = (S2_VERM);
IOCLR1 = (S1_VERM);
IOSET1 = (S1_VERDE);
lcd_puts("Rua 1 OK, Rua 2 Fechada");
for (d=0; d<100000; d++);

if (!(IOPIN1&(CEEE)))
{
while (!(IOPIN1&(CEEE)))
{
ceee();
}
}

IOCLR1 = (S1_VERDE);

IOSET1 = (S1_AM);
for (d=0; d<100000; d++);
IOCLR1 = (S1_AM);

}

}


Imagem demonstrativa do Proteus:







terça-feira, 4 de dezembro de 2012

Desafio 2.0 - Maquina de Lavar

Diretrizes : A seguir esta anexados as diretrizes Proposta pelos professores, nosso programa da maquina de lavar deveria conter todas as características a seguir, exceto a chave liga/desliga que é opcional. E uma rotina de tempo.




...



...




Meu programa ficou o seguinte:


#include <lpc213x.h>
#include "C:\Keil\ARM\lcd.h"  // Ajuda para escrever no display//

#define valvulaadmissao (1<<16)
#define bombaexpurgo (1<<17)
#define sensornivel (1<<20)
#define sensorporta (1<<16)
#define motor_direita (1<<18)
#define motor_esquerda (1<<19)

// aqui é a rotina de tempo//
int tempo (void)
{
int d;
for(d=0;d<1000;d++);
}

//inicio da função main//
int main (void)
{
IODIR0 = 0XFFFEFFFF;
IODIR1 = 0XFFEFFFFF;
init_lcd();

if(IOPIN0&(sensorporta))
{
IOCLR1 = valvulaadmissao;
lcd_clr(); // esse comando zera o display//
lcd_puts("Porta Aberta"); //essa função serva para escrever no display//
while(1);
}
if(IOPIN1&(sensornivel))
{
lcd_clr();
lcd_puts("Iniciando");
}
else
{
IOCLR1 = valvulaadmissao;
lcd_clr();
lcd_puts("Falta Agua");
while(1);
}
if(!(IOPIN0&(sensorporta)))
{
IOSET1 = valvulaadmissao;
lcd_clr();
lcd_puts("Admitindo Agua");
IOCLR1 = valvulaadmissao;
IOSET1 = motor_direita;
lcd_clr();
lcd_puts("Lavando");
tempo();
IOCLR1 = motor_direita;
IOSET1 = motor_esquerda;
lcd_clr();
lcd_puts("Lavando");
tempo();
IOCLR1 = motor_esquerda;
IOSET1 = motor_direita;
lcd_clr();
lcd_puts("Lavando");
tempo();
IOCLR1 = motor_direita;
IOSET1 = motor_esquerda;
lcd_clr();
lcd_puts("Lavando");
tempo();
IOCLR1 = motor_esquerda;
IOSET1 = motor_direita;
lcd_clr();
lcd_puts("Lavando");
tempo();
IOCLR1 = motor_direita;
IOSET1 = motor_esquerda;
lcd_clr();
lcd_puts("Lavando");
tempo();
IOCLR1 = motor_esquerda;
IOSET1 = motor_direita;
lcd_clr();
lcd_puts("Lavando");
tempo();
IOCLR1 = motor_direita;
IOSET1 = motor_esquerda;
lcd_clr();
lcd_puts("Lavando");
tempo();
IOCLR1 = motor_esquerda;
IOSET1 = bombaexpurgo;
lcd_clr();
lcd_puts("Enxaguando");
IOCLR1 = bombaexpurgo;
IOSET1 = valvulaadmissao;
lcd_clr();
lcd_puts("Admitindo agua");
IOCLR1 = valvulaadmissao;
IOSET1 = bombaexpurgo;
lcd_clr();
lcd_puts("Evacuando agua");
tempo();
IOCLR1 = bombaexpurgo;
IOSET1 = motor_direita;
IOSET1 = motor_esquerda;
lcd_clr();
lcd_puts("Centrifugando");
    tempo();
IOCLR1 = motor_direita;
IOCLR1 = motor_esquerda;
lcd_clr();
lcd_puts("Roupa Limpa");
while (1);
}
}


Demonstração no Proteus:






segunda-feira, 3 de dezembro de 2012

Desafio 1.2 Caixa D'agua com Display

Bom, o Desafio 1.2 consiste na continuação do primeira da caixa d'agua, nesse implementamos um display, no qual ira aparecendo as condições da caixa, se esta cheia, vazia, se esta enchendo, e assim por diante.
O Programa ficou da Seguinte maneira..



#define max (1<<16)
#define min (1<<17)
#define bomba (1<<18)
#define corsan (1<<21)

int main (void)
{
init_lcd();

IODIR0 = 0xFFFFFFFF;
IODIR1 = 0xFFDCFFFF;

if(!(IOPIN1 & (corsan)))
{
IOCLR1 = bomba;

lcd_clr();
lcd_gotoxy(1,5);
lcd_puts("Falta_agua");
}
else
{
if(IOPIN1 & (max))
{
IOCLR1 = bomba;

lcd_clr();
lcd_gotoxy(0,5);
lcd_puts("Caixa_Cheia");
}
else
{
if(!(IOPIN1 & (min)))
{
IOSET1 = bomba;

lcd_clr();
lcd_gotoxy(0,0);
lcd_puts("Caixa_Enchendo");
}
}
}
}

A foto a seguir mostra somente a ilustração da descrição da caixa enchendo, mas o ideia é que quando se tem a realiadade de cada situação nos comandos acima. apareça o que esta escrito entre parenteses depois de lcd_puts.



E assim se Segue o programa..

Resgistradores Para Seleção de Funções dos Pinos do Port0 - PINSEL

Os pinos do Microcontrolador que utilizamos há varias Funções..
O PINSEL, nos permite selecionarmos então quais dessas aplicações utilizaremos.

Tabela:
       
                     
PINSEL 0
PINO 0.0
PINO 0.1
PINO 0.2
....
PINO 0.15


0
1
2
3
4

30
31

0
0
0
0
0
0

0
0


0
1
0
1
0
1

0
1


1
0
1
0
1
0

1
0


1
1
1
1
1
1

1
1


P0.0
P0.1
P0.2

P0.15





PINSEL 1
PINO 0.16
PINO 0.17
PINO 0.18
....
PINO 0.31


0
1
2
3
4
5

30
31

0
0
0
0
0
0

0
0


0
1
0
1
0
1

0
1


1
0
1
0
1
0

1
0


1
1
1
1
1
1

1
1


P0.16
P0.17
P0.18

P0.31