Compilação estática em C++ e QT no Linux

Após um post informando como efetuar a compilação do QT para utilização das bibliotecas estáticas no Windows, vamos agora efetuar compilação para ao Linux [Testado no Kubuntu 9.04 e LinuxMint 7].



1 - Efetue a instalação do seguintes pacotes via APT



[sourcecode language="cpp"]
$ sudo apt-get install libx11-dev libfreetype6-dev libavahi-gobject-dev libSM-dev libXrender-dev libfontconfig-dev libXext-dev build-essential
[/sourcecode]


2 - Execute ./configure com os seguintes parâmetros



[sourcecode language="cpp"]
$ sudo ./configure -static -release -nomake demos -nomake examples -nomake tools
[/sourcecode]


3 - Execute o make e o make install



[sourcecode language="cpp"]
$ sudo make ; sudo make install
[/sourcecode]

4 - Configure o makefile do seu projeto adicionando as seguinte linha no arquivo .pro



[sourcecode language="cpp"]
CONFIG += static
[/sourcecode]

 



OBS: Caso ocorra algum erro há algumas dicas nesse link http://www.sistemasparalinux.com.br/Compilar_Qt_Debian.html



<a href="http://twitter.com/home?status=Currently reading " title="Click aqui para enviar esse post ao Twitter!" target="_blank">Compartilhe no Twitter

Compilação estática em C++ e QT no Windows

Para adicionar as bibliotecas estáticas aos programas gerados em C++ e QT é necessário recompilar o QT, pois o que é instalado por padrão utiliza as bibliotecas dinâmicas, dificultando assim a distribuição do aplicativo.




  1. Set as variáveis de ambiente include e lib.

    • No menu "Iniciar", selecione a opção "Painel de controle";

    • Acesse o item "Sistema";

    • Selecione a guia "Avançado";

    • Acesse "Variáveis de ambiente", e no campo Variáveis do Sistema acesse "Nova"

    • Cria duas variáveis, uma INCLUDE e o outra LIB

      • Na variável INCLUDE adicione a seguinte linha no campo "Valor da variável"


      C:\Qt\mingw\include


      • Na variável LIB adicione a seguinte linha no campo "Valor da variável"


      C:\Qt\mingw\lib


    • OBS: Caso o caminho da instalaçõa do seu QT não seja C:\QT, troque o pelo caminho correto.

    • Pressione o botão "OK" para confirmar cada uma das configurações.



  2. Entre no console da Qt: Menu iniciar -> Qt SDK (ou outro) -> Qt Command Prompt

  3. Execute o comando: configure -static -no-phonon

  4. Execute o comando: mingw32-make sub-src (Esse comando deve demoras algumas horas, dependendo do seu hardware).



Após efetuar essa recompilação ao gerar algum projeto no QTCreator adicione a seguinte linha no arquivo .pro:



CONFIG += static



 



Pronto, agora para disponibilizar seus programas apenas envie o executável gerado com a dll mingwm10.dll.

Modificando a senha do root

Como eu e o Juliano sempre dizemos: "Segurança local é uma coisa que colocam na sua cabeça".



Abaixo mostro como trocar a senha de root localmente via grub.



1. Ao ligar o seu computador, espere aparecer a tela do grub.  



2. Quando aparecer o menu de inicialização do grub, digite ‘e’, para editar.



3. Depois selecione a linha do kernel e digite ‘e’ novamente.



4. Agora, deixe a linha da seguinte forma:



kernel /boot/seu_kernel root=/dev/hdxn init=/bin/bash rw



onde:



      seu_kernel - É o nome do arquivo do seu kernel. Geralmente vmlinuz.



       hdxn - É a sua partição raiz.



Ex: hda1. Feito isso, aperte enter e em seguida ‘b‘.



O sistema irá iniciar. Assim que o sistema iniciar, digite passwd e escolha uma nova senha.



 



Fonte: http://ubuntuforum-br.org/index.php?topic=26815.0

Console do Windows equipado

Pra quem usa linux, quando vai para para o Windows sente muita falta de um console com mais opções. Para minimizar um pouco essa saudade existe esse console AQUI e ainda tem a opção de abas (oitava maravilha do mundo! na minha opinião é claro).

Limitando a uso da banda de internet no APT e no WGET

As vezes é necessário efetuar um apt ou download via wget, mas não queremos que o mesmo consuma toda banda, para isso efetuamos a seguinte configuração: Para o APT: Crie o arquivo /etc/apt/apt.conf.d/76download e adicione o seguinte conteúdo:



Acquire { Queue-mode "access"; http { Dl-Limit 20; } }



Onde: Dl-Limit 20 é o local onde informamos a banda utilizada pelo APT, que nesse exemplo está limitando para 20 KB/s Para o WGET: Utilize a opção "limit-rate" da seguinte forma:



wget --limit-rate=20k caminho



Onde: A banda nesse exemplo é limitada em 20 KB/s Há também a possibilidade de limitar a banda pelo comando trickle, que pode ser instalado pelo apt. Nesse link mais informações sobre o trickle.

Editor Nano com syntax highlight

A dica encontra-se AQUI

Utilizando repositorios antigo no UBUNTU

Para quem tem versões do Ubuntu que não tem mais suporte pela Canonical mas ainda deseja utilizar essas versões, abaixo segue os repositórios. Substitua a palavra "version" pelas respectivas versões, que podem ser: warty - versão 4.10 hoary - versão 5.04 breezy- versão 5.10 edgy - versão 6.10 feisty - versão 7.04 gutsy - versão 7.10



 



deb http://old-releases.ubuntu.com/ubuntu/ version main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ version-updates main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ version-security main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ version-backports main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ version-backports main restricted universe multiverse



 

Trocando o NetworkManager pelo WICD no Kubuntu 9.04 com KDE4

Inteligente gerenciador de rede WICD pode ser um otimo substituto para o o gerenciador padrão das distros baseadas no ubuntu, o NetworkManager, que já me deixou algumas vezes na mão.
Vamos a instalação.
1 - Como o wicd conflita com o network-manager, é necessário remover o mesmo.


$ sudo dpkg -r plasma-widget-network-manager (Caso esteja utilizando o KDE4)
$ sudo dpkg -P network-manager


2 - Adicionando o repositório do WICD para obter-mos a ultima versão.


# echo deb http://apt.wicd.net jaunty extras >> /etc/apt/sources.list


3 - Adicionando a chave GPG


$ wget -q http://apt.wicd.net/wicd.gpg -O- | sudo apt-key add -


4 - Atualizando o repositório e instalando o WICD.


$ sudo apt-get update && sudo apt-get install wicd


Abaixo a tela principal do WICD

[caption id="" align="alignnone" width="563" caption="http://wicd.sourceforge.net/screenshot.php"]http://wicd.sourceforge.net/screenshot.php[/caption]

Configurando microfone ATI Technologies Inc RS780 Azalia controller no [K]ubuntu

Acrescente as linhas abaixo no arquivo /etc/modprobe.d/alsa-base.conf


# Keep snd-pcsp from beeing loaded as first soundcard
options snd-pcsp index=-2
alias snd-card-0 snd-hda-intel
alias sound-slot-0 snd-hda-intel
options snd-hda-intel model=dell-m4-1
options snd-hda-intel enable_msi=1

Instalando o VirtualBox 3 no [K]ubuntu Jaunty 9.04

1 - Adicionar mirror do VirtualBox no sources.list


# echo deb http://download.virtualbox.org/virtualbox/debian jaunty non-free >> /etc/apt/sources.list


2 - Adicionar a chave pública

$ wget -c deb http://download.virtualbox.org/virtualbox/debian jaunty non-free | sudo apt-key add sun_vbox.asc


3 - Atualizar a lista de pacotes

$ sudo apt-get update


4 - Instalando o VirtualBox

$ sudo apt-get install virtualbox-3.0

Tema do Firefox KDE 4 Oxygen

Com esse tema o firefox fica com o mesmo tema do KD4 o chamado Oxygen, [ baixar aqui ]

Definindo codificação default do KATE

Abra o arquivo:



$HOME/.kde/share/config/katerc



na seção [Kate Document Defaults] edite a opção Encoding.



Caso quera usar o ISO 8859-1, a configuração ficará assim:



Encoding=ISO 8859-1

Funk da Engenharia

Segue abaixo o funk da engenharia, não é da Engenharia de Controle e Automação mas a idéia é a mesma.
Vamo que vamo lá curso de doidão.

Tabela em Assembly para escrever em um display de LCD com PIC

Após ter apanhado um monte com assembly e perturbado bastante o professor da cadeira de projetos com microcontroladores aprendi a trabalhar com tabelas em assembly, mesmo sabendo que percorrer uma tabela em assembly no microcontrolador PIC é um sacrifício (que no final recompensa o trabalho). Mas vamos deixa de conversa e ir direto aos trabalhos...


Primeiro devemos conhecer uma das diretivas de dados do assembly, a responsável de gerar series de instruções RETLW (Instrução que retorna de uma chamada CALL com o resultado de W ), uma instrução para cada termo.


DT: Definindo uma tabela de dados


Sintaxe:     dt [termo]


Descrição:  Esta diretiva vai gerar uma série de instruções RETLW, uma instrução para cada termo.


dt "Mensagem" , 0
dt primeiro, segundo, terceiro


Após saber como funciona o DT vamos escrever em um LCD com essa instrução (em um outro post irei informar como inicializar e configurar um Display LCD 16x2).


A rotina abaixo é parte de um projeto que desenvolvi, que tem a função de escrever em um LCD de 16x2 que pula para próxima linha do LCD automaticamente após o termino da escrita na primeira linha.




;*********************************************************
;* MSG *
;*********************************************************
LCD_PRINCIPAL ;DEFINIÇÃO DE FUNÇÃO
BANK0
CLRF CONT_MENS ;LIMPA VARIÁVEL
CALL ESCREVE_LINHA1 ;INFORMA A LINHA EM QUE VAI ESCREVER
MOVLW .16 ;DEFINE A QUANTIDADE DE COLUNAS
MOVWF LINHA ;JOGA DENTRO DE LINHA
BCF POSICAO ;INFORMA A POSIÇÃO DE ESCRITA 0 = PRIMEIRA LINHA MSG_PRINCIPAL
BANK0
MOVF CONT_MENS,W ;JOGA O VALOR DE CONT_MENS PARA W
CALL STRING_LCD ;VAI PARA ESCRITA DA MENSAGEM
MOVWF CARACTER ;COLOCA O RETORNO DA FUNÇÃO STRING EM CARACTER
SUBLW .0 ;SUBTRAI W DE ZERO
BANK0
BTFSC STATUS,Z ;O RESULTADO DEU ZERO?
GOTO VARRE ;SE == 0, JÁ LEU TODA STRING E VAI PARA A ROTINA PRINCIPAL
INCF CONT_MENS,1 ;SE =! 0, INCREMENTE 1 NA VARIÁVEL CONT_MENS
MOVF CARACTER,W ;JOGA A LETRA QUE ESTA EM CARACTER E JOGA PRA W
MOVWF DADOS_LCD ;JOGA CARACTER PARA O LCD
CALL PULSO ;ROTINA DO LCD
DECFSZ LINHA,1 ;DECREMENTA OS 16. QUE E A QUANTIDADE MÁXIMA DE ESCRITA EM UMA LINHA
GOTO RECOMECA ;RECOMEÇA O ENVIO DE UMA PRÓXIMA LETRA NA LINHA 1
GOTO RECOMESA_POS2 ;RECOMEÇA O ENVIO DE UMA PRÓXIMA LETRA NA LINHA 2 STRING_LCD
BANK0
ADDWF PCL,1 ;SOMA W AO DESLOCAMENTO AO PC (PROGRAM COUNT) - W + PC
MSG_LCD DT "MENSAGEM A SER ENVIADA PRO LCD",0 ;CADA LETRA LIDA PELA POSIÇÃO DO PC E ADICIONADA EM W E RETORNA PELO COMANDO RETLW RECOMECA
GOTO MSG_PRINCIPAL ;RECOMEÇA O ENVIO DE UMA PRÓXIMA LETRA RECOMESA_POS2
BANK0
BTFSS POSICAO ;A ESCRITA ESTA EM QUE POSIÇÃO? SE "0" VAI PRA FUNÇÃO ESCREVE_LINHA2 E
CALL ESCREVE_LINHA2 ;DEFINE ESCRITA NA LINHA 2 E MUDA VALOR DA VARIÁVEL POSIÇÃO PARA 1, SENÃO CONTINUA ESCREVENDO NA LINHA 1
GOTO MSG_PRINCIPAL



Abaixo segue a logica do código:
lcd_principal


Aguarde os próximos capítulos, pois estarei disponibilizando mais algumas técnicas que aprendi com essa cadeira.

Equipando o Konqueror

O Konqueror é o browser nativo do KDE. Além de navegador, o Konqueror também serve como gerenciador de arquivos e pode ser expandido com novas funções
Falem o que quiser mais o Konqueror, se não o melhor, é sim um dos melhores gerenciadores de arquivo, principalmente em meio aos que já usei (entre eles Nautilus, Dolphi, Windows Explorer). Mas vamos deixar de blá, blá, blá e ir direto ao que interessa esse post.
Hoje vou mostrar como adicionar novos recursos no Konqueror de forma rápida e eficiente. Pra quem utiliza o linux sabe que uma hora ou outra é necessário abrir determinadas pastas como root ou com usuário administrativo, para efetuar isso a partir do konqueror apenas com o mouse faremos o seguinte:

1 - Crie um arquivo de nome konq_root.desktop e adicione o seguinte conteúdo a ele:


[Desktop Entry]
ServiceTypes=inode/directory
Actions=open_as_root

[Desktop Action open_as_root]
Name=Abrir como Root
Icon=konsole
Exec=kdesu konqueror %F


Salve e copie em:
~/.kde/share/apps/konqueror/servicemenus


Após isso ao clicar com botão direito do mouse e acessar a opção "Ações" aparecerá uma opção chamada "Abrir como Root", como mostra a figura a baixo:

konqueror

Impressora imprimindo caracteres estranhos sem parar.

Em 2002 ouve um surto de infecção de um vírus para computador chamado Bugbear (ou Bicho Papão, em português, ou Tanatos como também é conhecido) ele é um vírus de e-mail com comportamento similar ao "famoso" Klez. Isso é, quando sua máquina está infectada, ele começa a enviar e-mails do seu computador. Um dos efeitos maléfico desse vírus é o envio de códigos ininteligíveis para a fila de impressão do Windows, efetuando assim enumeras paginas impressas escrito " this program can not be run in dos mode" ou seja "este programa não funciona no modo DOS" ou "This program can not be run" (Este programa não pode ser executado) no cabeçalho e posteriormente diversos códigos desconexos. Outra característica do Bugbear, dessa vez ligada ao teclado, é que o vírus duplica caracteres especiais, como os acentos e o cedilha.

Para remover o vírus da sua máquina é relativamente fácil, é só apagar os arquivos do vírus. O problema é que na hora da infecção, os arquivos são criados com nomes aleatórios e, portanto, não temos como saber o nome exato dos arquivos a serem excluídos. De qualquer forma, existe na Internet um programa para eliminar esse vírus, que pode ser baixado gratuitamente em ftp://ftp.f-secure.com/anti-virus/tools/f-bugbr.zip ou o bearsfx da Sophos http://www.sophos.com/tools/bearsfx.exe. Basta baixar, descompactar caso baixe o primeiro e rodar.

Se a sua máquina estiver em rede, o vírus tenta se alastrar pela rede também. Por isso, no caso de redes locais, a rede inteira deve ser desligada antes de passar o antivírus em todas as máquinas, pois, caso contrário, você pode eliminar o vírus de sua máquina mas, caso outro micro esteja infectado, pouco tempo depois seu micro será infectado novamente, via rede.

Como o vírus pode se apresentar de inúmeras maneiras, não há um regra única para identificá-lo. Para tentar se proteger, faça o seguinte:

1) Atualize os programas da Microsoft instalados em sua máquina. Para isso, visite a página windowsupdate.microsoft.com. As atualizações são automáticas e no mesmo idioma do sistema.

2) Atualize seu programa antivírus, pois a maioria das empresas já lançou vacinas contra o worm.

3) Nunca clique em arquivos desconhecidos sem antes testá-los com um antivírus em dia. Em caso de dúvida, simplesmente apague o arquivo.

Para informações completas sobre esse vírus, visite http://www.f-secure.com/v-descs/tanatos.shtml.

Ajustando impressão no Firefox

Algumas vezes nos deparamos com uma impressão a ser efetuada pelo Firefox onde a janela onde contém a página não mostra as opções de configuração, impedindo assim a configuração da página a ser impressa, outra coisa que acontece muito e a configuração feita para impressão não ficar gravada. Para resolver esses pequenos problemas é necessário efetuar as seguinte configurações na tela de configuração do Firefox: Acesse o Firefox e digite no campo de inserção da URL:



about:config



Mude as seguinte flags, para os valores subsequentes:



print.postscript.paper_size = a4



print.print_footerleft = [deixe esse campo vazio] - Retira rodapé esquerdo



print.print_footerright = [deixe esse campo vazio] - Retira rodapé direito



print.print_headerleft = [deixe esse campo vazio] - Retira cabeçalho esquerdo



print.print_headerright = [deixe esse campo vazio] - Retira cabeçalho direito



print.print_scaling = [coloque um valor entre 0 e 1,0] - Configura redução de escala da pagina 0 = 0% e 1,00 = 100%



print.print_shrink_to_fit = False - Desativa a opção de ajuste automático da pagina para impressão. Pode ser necessário efetuar essa configuração em todas as impressoras instaladas.



Com essas configurações uma página que estaria imprimindo em duas folhas, facilmente seria ajustado para a impressão em apenas uma folha. Lembre-se que além de economizar papel, você ajuda o meio ambiente, diminuindo o corte de árvores.

Arquivos compartilhados via NFS

NFS (Network File System) é um serviço no qual é possível você montar um diretório ou hd de uma máquina que está na rede e usá-lo como se foce um HD instalado localmente na sua maquina , como se fosse um hd físico.

OBS: Essa configuração foi efetuada em um servidor Ubuntu Server 6.06 e cliente Ubuntu Desktop 9.04

1º - Configuração no servidor.

Instalação do serviço NFS:

 # apt-get install nfs-kernel-server 


Após a instalação edite o arquivo /etc/exports adicionando a seguinte linha:
/home/user *(rw,async,no_root_squash)

Onde:
* - Informa que qualquer maquina da rede pode efetuar a montagem.
RW - Permissão de leitura e escrita dos arquivos.
async - Transferência de forma assíncrona.
no_root_squash - Permissão para que o root possa montar o sistema de arquivo.

Restart o serviço NFS:
# /etc/init.d/nfs-kernel-server restart


2º - Configuração no cliente.

Instalação do portmap e NFS-common:
# sudo apt-get install portmap nfs-common


Montando o compartilhamento:
$ sudo mount -t nfs 10.1.1.234:/pasta_servidor /home/usuario/pasta_cliente


Onde:

10.1.1.234 - É o IP do seu servidor
pasta_servidor - É a pasta compartilha no arquivo export
/home/usuario/pasta_cliente - Local onde será montado o compartilhamento

Compartilhamento sendo montado na inicialização:

Adicione a linha abaixo no arquivo /etc/fstab
10.1.1.234:/pasta_servidor /home/usuario/pasta_cliente nfs rsize=8192,wsize=8192,timeo=14,intr


Por enquanto é só isso, falow meu Rei.

Retirar ^M de arquivos editado no windows

Tive diversos problemas com arquivos modificados no Windows, pois o mesmo ao efetuar a edição adiciona no fim de cada linha os caracteres ^M. Para quem utilizar o Vim pode resolver isso sem maiores problemas, bastando apenas seguir os passos abaixo:



  • Abra o arquivo pelo vim e pressione : (dois pontos)

  • Após os dois pontos digite: set fileformat=unix


  • Aplicativos GTK em Português no Kubuntu 8.04

    Caso esteja utilizando alguma versão do Kubuntu e os aplicativos que utilizam GTK estejam em inglês, é necessário efetuar os seguintes passos:


    $ sudo apt-get install language-pack-gnome-pt language-pack-gnome-pt-base


    Caso o Firefox esteja mostrando informações em inglês em algum aplicativo feito em javascript e necessário efetuar o seguinte procedimento:

    Digite no browser:
     about:config

    Encontre o nome:
    general.useragent.locale

    e troque o valor:
    en-US
    por
    pt-BR

    Eletricidade sem fio

    Vi essa reportagem no Fantástico e achei muito interessante, vale a pena assistir.
    Espero que não queime nosso juízo.

    http://www.youtube.com/watch?v=l0ifMZ2O4SY

    Instalando o Amsn 0.98 com AntiAliase no Linux

    Para instalar o Amsn 0.98 com o AntiAliase basta fazer o download do pacote .DEB caso você uma distribuição baseada no debian ou .RMP caso utilize alguma distribuição baseada nesse tipo de pacote.

    Para efetua a instalação .deb utilize o seguinte comando:

    dpkg -i aMSN-0.98SVN-10-03-2008-tcl-tk8.6_libsnack-2.noarch.deb


    Para efetua a instalação .rpm utilize o seguinte comando:

    rpm -i --nodeps aMSN-0.98SVN-10-03-2008-tcl-tk8.6_libsnack-2.noarch.rpm


    Com a algumas mudanças feitas pela MICROSOFT nos servidores do MSN deve ser necessário efetuar os seguintes comandos para conectar-se:

    $ cd /usr/local/amsn/share/amsn
    $ sudo mv protocol.tcl protocol.tcl.bkp
    $ sudo wget http://www.e_portifolio.kit.net/download/protocol.tcl


    fonte: http://ubuntuforum-br.org/index.php?topic=33912.0
    fonte: http://www.vivaolinux.com.br/topico/aMSN/conexao-mal-sucedida-Amsn

    Criando um Live CD/DVD da Instalação do [K]ubuntu

    Depois que adquirir meu novo notebook um HP Pavilion dv5-1125br Entertainment Notebook PC, vi a necessidade de após a instalação criar um cd de restauração, pois depois de configurar a placa de rede wifi, os controles do notebook, instalar as maquinas virtuais e configurar o ambiente de desenvolvimento, não ia ter o saco pra configurar tudo de novo, dai que usei o Remastersys.

    Informações de como utilizar o remastersys pode ser encontrado AQUI.

    Gravando conversas do Skype

    Um dia tive a necessidade de gravar as minhas conversas do skype, e em minhas googladas encontrei o Skype Call Recorder aplicativo responsável por esse feito.

    No Viva o Linux há um ótimo tutorial informando como proceder com a instalação.

    OBS: Só funciona para linux.

    Elevador Microcontrolado

    Nesse post vou mostrar os passos efetuados no desenvolvimento do elevador microcontrolado, que foi tema de um trabalho da faculdade. O objetivo do trabalho era entender o funcionamento de um microcontrolador. Em cima desse objetivo e muitas discussões optamos (eu e minha equipe) em fazer um elevador comercial.



    Obs: Todo o desenvolvimento foi efetuado em ambiente Windows :(



    Ferramentas Utilizadas:  



    Software:



    Compilador: CCS PCWH v4.074



    Simulador: Proteus Asis 7



    Gravador: PICkit 2 V2.55.01



    PCB Design : Proteus Ares 7  



    Hardware



    Gravador: MicroICD ZIF da Microgenios



    Microcontrolador PIC 16F877A



    LCD de 16x2



    Motor de passo



    Display de 7 Segmentos Ânodo Comum




      O desenvolvimento inicio-se com a resolução e entendimento do problema, onde o procedimento a ser tomado pelo elevador era:

  • 1 - Conter 3 andares

  • 2 - A prioridade de chamada é dada aos usuários internos do elevador

  • 3 - A chamada externa é guardada em memoria e atendida conforme o andar

  • 4 - A prioridade de andar e feita por proximidade

  • 5 - O controle de andar sendo efetuado pelo controle de passo do motor

  • 6 - Um LCD 16x2 mostrando a informação de que andar está e pra onde vai

  • 7 - Temporizador de 30 segundos, para verificação de tempo de uso

  • 8 - Display de informação de andar

  • 9 - Sistema de desligamento


  • Depois de montado o layout de resolução foi efetuado o algoritmo em C.



    [sourcecode language="css"]
    //Elevador.h

    #include
    #device adc=8

    #FUSES NOWDT //No Watch Dog Timer
    #FUSES XT //Crystal osc &lt;= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
    #FUSES NOPUT //No Power Up Timer
    #FUSES NOPROTECT //Code not protected from reading
    #FUSES NODEBUG //No Debug mode for ICD
    #FUSES NOBROWNOUT //No brownout reset
    #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOCPD //No EE protection
    #FUSES NOWRT //Program memory not write protected

    #use delay(clock=4000000)

    </pre>
    <pre class="brush:c">//Elevador.c

    //ELEVADOR MICROCONTROLADO
    //Trabalho de SDM II - Engenharia de Controle e Automação e Telecomunicação
    //Equipe: Hamilton Sena
    // André Fazione
    // Leandro Rossi
    // Robson Molgaro

    #include "Elevador.h"
    #include

    #define MAX_PASSO 3 // 0-3 (Total de 4 passos)

    //Variaveis Globais
    char Passos[4]={8,4,2,1}; //Full Step 1
    int index=0;//indice para matriz de passos
    int TempoPasso=75;//Tempo de cada passo
    int viAndar = 0;
    int vaPinosPassado[7];
    static int viContador;
    int viSegundos;
    int viPino5;
    int viPino4;
    int viPino3;

    #int_timer0
    //Essa função conta até 125 formando 1 segundo
    void ControleTimer(){

    //Se tiver no terreo ou 1 andar e for chamado no 2 andar
    if(input(PIN_A5) == 1){

    viPino5 = 1;
    output_high(pin_c7);//2 Andar

    }

    //Se tiver no terreo ou 2 andar e for chamado no 1 andar

    if(input(PIN_A4) == 1){

    viPino4 = 1;
    output_high(pin_c6);//1 Andar

    }

    //Se tiver no 1 andar ou 2 andar e for chamado no terreo
    if(input(PIN_A3) == 1){

    viPino3 = 1;
    output_high(pin_c5);//Terreo

    }

    set_timer0(131-get_timer0());
    viContador++;

    }

    //Função que controla o display de 7 segmentos
    int ControlaDisplay(int vaPinos[]){

    output_bit(pin_c0,vaPinos[0]);
    output_bit(pin_c1,vaPinos[1]);
    output_bit(pin_c2,vaPinos[2]);
    output_bit(pin_c3,vaPinos[3]);
    output_bit(pin_e2,vaPinos[4]);
    output_bit(pin_e1,vaPinos[5]);
    output_bit(pin_e0,vaPinos[6]);

    return 0;
    }

    //Função Responsavel de girar o motor em sentido horario ou anti-horario
    int MovimentaMotor(int nibble, int viSentido){

    if (viSentido == 0){

    //Testa um bit determinado da variavel passada, onde nibble é a
    //variavel passada e o outro algarismo é o bit testado
    output_bit(pin_b3,bit_test(nibble,0));
    output_bit(pin_b2,bit_test(nibble,1));
    output_bit(pin_b1,bit_test(nibble,2));
    output_bit(pin_b0,bit_test(nibble,3));
    return 0;

    }else{

    output_bit(pin_b3,bit_test(nibble,3));
    output_bit(pin_b2,bit_test(nibble,2));
    output_bit(pin_b1,bit_test(nibble,1));
    output_bit(pin_b0,bit_test(nibble,0));
    return 0;
    }

    }//FIM FUNÇÃO MOVIMENTA MOTOR

    //Função que faz Girar o motor e modificar o display de 7 segmentos quando passa no 1 andar
    int MovimentaElevador(int viQtdPassos, int viSentidoAndar, int viAndarSentido, int viMostraPasso ){

    int viControle = 0;
    while(viControle = MAX_PASSO){//Controla os passos (indice da matriz)
    index=0;
    }else{
    index++;//incrementa para proximo passo
    viControle++; //Incrementa os passos
    }
    }//FIM WHILE

    return 0;

    }//FIM MOVIMENTA ELEVADOR

    int vFuncAndar_T(){

    output_low(pin_c5);//Não pode ser feito chamada no terreo
    viPino3 = 0;

    lcd_putc("\f -&gt; Terreo");
    lcd_gotoxy(1,2);
    lcd_putc(" Engenharia");
    vaPinosPassado[0] = 1;
    vaPinosPassado[1] = 1;
    vaPinosPassado[2] = 1;
    vaPinosPassado[3] = 1;
    vaPinosPassado[4] = 1;
    vaPinosPassado[5] = 1;
    vaPinosPassado[6] = 0;
    ControlaDisplay(vaPinosPassado);

    if (viPino4 == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" R.H.");
    delay_ms(2000);
    //move motor para andar 1
    MovimentaElevador(82,0,0,0);
    viAndar = 1;
    viPino4 = 0;
    output_low(pin_c6);
    return 0;

    }

    if (viPino5 == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" Comercial");
    delay_ms(2000);
    //move motor para andar Comercial
    //Quando chamar no Comercial passa o valor 1 viAndarSentido e o valor 82 para viQtdPassos
    MovimentaElevador(168,0,1,82);
    viAndar = 2;
    viPino5 = 0;
    output_low(pin_c7);
    return 0;

    }

    while(viAndar == 0){

    output_low(pin_c5);//Não pode ser feito chamada no terreo
    viPino3 = 0;

    if (viPino4 == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" R.H.");
    delay_ms(2000);
    //move motor para andar 1
    MovimentaElevador(82,0,0,0);
    viAndar = 1;
    viPino4 = 0;
    output_low(pin_c6);
    return 0;

    }

    if (viPino5 == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" Comercial");
    delay_ms(2000);
    //move motor para andar Comercial
    MovimentaElevador(168,0,1,82);
    viAndar = 2;
    viPino5 = 0;
    output_low(pin_c7);
    return 0;

    }

    //Se desligar o sistema retorna para o MAIN()
    if(input(PIN_B4) == 0){

    return 0;

    }

    if ((input(PIN_A1) == 1) &amp; (input(PIN_A0) == 0)){

    lcd_putc("\f Subindo para...");
    lcd_gotoxy(1,2);
    lcd_putc(" R.H.");
    //move motor para andar 1
    MovimentaElevador(82,0,0,0);
    viAndar = 1;
    return 0;

    }

    if ((input(PIN_A1) == 0) &amp; (input(PIN_A0) == 1)){

    lcd_putc("\f Subindo para...");
    lcd_gotoxy(1,2);
    lcd_putc(" Comercial");
    //move motor para andar 2
    MovimentaElevador(168,0,1,82);
    viAndar = 2;
    return 0;

    }

    if ((input(PIN_A1) == 1) &amp; (input(PIN_A0) == 1)){

    lcd_putc("\f Subindo para...");
    lcd_gotoxy(1,2);
    lcd_putc(" R.H.");
    //move o motor para o andar 1
    MovimentaElevador(82,0,0,0);
    viAndar = 1;
    return 0;
    }

    if (input(PIN_A4) == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" R.H.");
    //move o motor para o andar 1
    MovimentaElevador(82,0,0,0);
    viAndar = 1;
    viPino4 = 0;
    return 0;

    }

    if (input(PIN_A5) == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" Comercial");
    //move o motor para o andar 2
    MovimentaElevador(168,0,1,82);
    viAndar = 2;
    viPino5 = 0;
    return 0;

    }

    }//FIM WHILE

    }//FIM FUNÇÃO vFuncAndar_T

    int vFuncAndar_1(){

    output_low(pin_c6);//Não pode ser feito chamada no 1 andar
    viPino4 = 0;

    viSegundos = 0;
    lcd_putc("\f -&gt; 1 Andar");
    lcd_gotoxy(1,2);
    printf(lcd_putc, " R.H.");
    vaPinosPassado[0] = 0;
    vaPinosPassado[1] = 1;
    vaPinosPassado[2] = 1;
    vaPinosPassado[3] = 0;
    vaPinosPassado[4] = 0;
    vaPinosPassado[5] = 0;
    vaPinosPassado[6] = 0;
    ControlaDisplay(vaPinosPassado);

    if (viPino3 == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" Engenharia");
    delay_ms(2000);
    //move motor para o terreo
    MovimentaElevador(82,1,0,0);
    viAndar = 0;
    viPino3 = 0;
    output_low(pin_c5);
    return 0;

    }

    if (viPino5 == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" Comercial");
    delay_ms(2000);
    //move motor para andar terreo
    MovimentaElevador(85,0,0,0);
    viAndar = 2;
    viPino5 = 0;
    output_low(pin_c7);
    return 0;

    }

    while(viAndar == 1){

    output_low(pin_c6);//Não pode ser feito chamada no 1 andar
    viPino4 = 0;

    if (viPino3 == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" Engenharia");
    delay_ms(2000);
    //move motor para o terreo
    MovimentaElevador(82,1,0,0);
    viAndar = 0;
    viPino3 = 0;
    output_low(pin_c5);
    return 0;

    }

    if (viPino5 == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" Comercial");
    delay_ms(2000);
    //move motor para andar terreo
    MovimentaElevador(85,0,0,0);
    viAndar = 2;
    viPino5 = 0;
    output_low(pin_c7);
    return 0;

    }

    //Mostra contador de segundos
    if(viContador == 125){
    viSegundos++;
    viContador = 0;
    lcd_gotoxy(1,2);
    printf(lcd_putc, " R.H. -&gt; %i",viSegundos);
    }

    //Se desligar o sistema retorna para o MAIN()
    if(input(PIN_B4) == 0){

    return 0;

    }

    if ((input(PIN_A2) == 1) &amp; (input(PIN_A0) == 0)){

    lcd_putc("\f Descendo para...");
    lcd_gotoxy(1,2);
    lcd_putc(" Engenharia");
    //move motor para andar Terreo
    MovimentaElevador(82,1,0,0);
    viAndar = 0;
    return 0;

    }

    if ((input(PIN_A2) == 0) &amp; (input(PIN_A0) == 1)){

    lcd_putc("\f Subindo para...");
    lcd_gotoxy(1,2);
    lcd_putc(" Comercial");
    //move motor para andar 2
    MovimentaElevador(85,0,0,0);
    viAndar = 2;
    return 0;

    }

    if ((input(PIN_A2) == 1) &amp; (input(PIN_A0) == 1)){

    lcd_putc("\f Descendo para...");
    lcd_gotoxy(1,2);
    lcd_putc(" Engenharia");
    //move o motor para o andar Terreo
    MovimentaElevador(82,1,0,0);
    viAndar = 0;
    return 0;
    }

    if (input(PIN_A3) == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" Engenharia");
    //move o motor para o andar terreo
    MovimentaElevador(82,1,0,0);
    viAndar = 0;
    viPino3 = 0;
    return 0;

    }

    if (input(PIN_A5) == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" Comercial");
    //move o motor para o andar 2
    MovimentaElevador(85,0,0,0);
    viAndar = 2;
    viPino5 = 0;
    return 0;

    }

    //viTempoControle = viTempoControle + 1;

    if(viSegundos == 30){

    lcd_putc("\f Descendo...");
    lcd_gotoxy(1,2);
    lcd_putc("Tempo Esgotado");
    MovimentaElevador(82,1,0,0);
    viAndar = 0;
    return 0;
    }

    }//FIM WHILE

    }//FIM FUNÇÃO vFuncAndar_1

    int vFuncAndar_2(){

    output_low(pin_c7);//Não pode ser feito chamada no 2 andar
    viPino5 = 0;

    viSegundos = 0;
    lcd_putc("\f -&gt; 2 Andar");
    lcd_gotoxy(1,2);
    printf(lcd_putc, " Comercial");
    vaPinosPassado[0] = 1;
    vaPinosPassado[1] = 1;
    vaPinosPassado[2] = 0;
    vaPinosPassado[3] = 1;
    vaPinosPassado[4] = 1;
    vaPinosPassado[5] = 0;
    vaPinosPassado[6] = 1;
    ControlaDisplay(vaPinosPassado);

    if (viPino4 == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" R.H.");
    delay_ms(2000);
    //move motor para andar 1
    MovimentaElevador(83,1,0,0);
    viAndar = 1;
    viPino4 = 0;
    output_low(pin_c6);
    return 0;

    }

    if (viPino3 == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" Engenharia");
    delay_ms(2000);
    //move motor para andar terreo
    //Quando chamar no Terreo passa o valor 2 viAndarSentido e o valor 83 para viQtdPassos
    MovimentaElevador(166,1,2,83);
    viAndar = 0;
    viPino3 = 0;
    output_low(pin_c5);
    return 0;

    }

    while(viAndar == 2){

    output_low(pin_c7);//Não pode ser feito chamada no 2 andar
    viPino5 = 0;

    if (viPino4 == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" R.H.");
    delay_ms(2000);
    //move motor para andar 1
    MovimentaElevador(83,1,0,0);
    viAndar = 1;
    viPino4 = 0;
    output_low(pin_c6);
    return 0;

    }

    if (viPino3 == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" Engenharia");
    delay_ms(2000);
    //move motor para andar terreo
    MovimentaElevador(166,1,2,83);
    viAndar = 0;
    viPino3 = 0;
    output_low(pin_c5);
    return 0;

    }

    //Mostra contador de segundos
    if(viContador == 125){
    viSegundos++;
    viContador = 0;
    lcd_gotoxy(1,2);
    printf(lcd_putc, " Comercial -&gt; %i",viSegundos);
    }

    //Se desligar o sistema retorna para o MAIN()
    if(input(PIN_B4) == 0){

    return 0;

    }

    if ((input(PIN_A1) == 1) &amp; (input(PIN_A2) == 0)){

    lcd_putc("\f Descendo para...");
    lcd_gotoxy(1,2);
    lcd_putc(" R.H.");
    //move motor para andar 1
    MovimentaElevador(83,1,0,0);
    viAndar = 1;
    return 0;

    }

    if ((input(PIN_A1) == 0) &amp; (input(PIN_A2) == 1)){

    lcd_putc("\f Descendo para...");
    lcd_gotoxy(1,2);
    lcd_putc(" Engenharia");
    //move motor para andar terreo
    MovimentaElevador(166,1,2,83);
    viAndar = 0;
    return 0;

    }

    if ((input(PIN_A1) == 1) &amp; (input(PIN_A2) == 1)){

    lcd_putc("\f Descendo para...");
    lcd_gotoxy(1,2);
    lcd_putc(" R.H.");
    //move o motor para o andar 1
    MovimentaElevador(84,1,0,0);
    viAndar = 1;
    return 0;
    }

    if (input(PIN_A4) == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" R.H.");
    //move o motor para o andar 1
    MovimentaElevador(84,1,0,0);
    viAndar = 1;
    viPino4 = 0;
    return 0;

    }

    if (input(PIN_A3) == 1){

    lcd_putc("\f Chamada para...");
    lcd_gotoxy(1,2);
    lcd_putc(" Engenharia");
    //move o motor para o andar terreo
    MovimentaElevador(167,1,2,83);
    viAndar = 0;
    viPino3 = 0;
    return 0;

    }

    //viTempoControle = viTempoControle + 1;

    if(viSegundos == 30){

    lcd_putc("\f Descendo...");
    lcd_gotoxy(1,2);
    lcd_putc("Tempo Esgotado");
    MovimentaElevador(167,1,2,83);
    viAndar = 0;
    return 0;
    }

    }//FIM WHILE

    }//FIM FUNÇÃO vFuncAndar_2

    //Programa Principal
    void main(){

    //------- Codigo gerado pelo Compilador
    setup_adc_ports(NO_ANALOGS);
    setup_adc(ADC_OFF);
    setup_psp(PSP_DISABLED);
    setup_spi(SPI_SS_DISABLED);
    //Configura timer0 para clock interno e prescaler dividido por 64
    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64);
    set_timer0(131);//inicia o timer 0 em 131
    enable_interrupts(global | int_timer0);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1);
    setup_comparator(NC_NC_NC_NC);
    setup_vref(FALSE);
    //--------------------------------------

    //Definindo as porta do MCU
    set_tris_b(0b00010000);//Coloca o pino RB4 como entrada e os outros pino RB como saida
    set_tris_a(0b11111111);//Coloca todos os pino RA como entrada
    set_tris_e(0b00000000);//Coloca todos os pino RE como Saida
    set_tris_c(0b00000000);//Coloca todos os pinos RC como saida

    //Definido estado dos pinos
    output_b(0b00000000);//todos os pinos de saida da porta b desligados
    //output_e(0b00000000);
    //output_c(0b00000000);
    //output_low(pin_b5);//Deixa desligado o Backlite do LCD

    //Iniciliaza o LCD
    lcd_init();
    vaPinosPassado[0] = 0;
    vaPinosPassado[1] = 0;
    vaPinosPassado[2] = 0;
    vaPinosPassado[3] = 0;
    vaPinosPassado[4] = 0;
    vaPinosPassado[5] = 0;
    vaPinosPassado[6] = 0;
    ControlaDisplay(vaPinosPassado);

    //Loop infinito do Programa
    while(true){

    if (input(PIN_B4) == 1){//Sistema ligado

    //output_high(PIN_B5);//Liga o BackLith do LCD

    if (viAndar == 0){

    vFuncAndar_T();

    }

    if (viAndar == 1){

    vFuncAndar_1();

    }

    if (viAndar == 2){

    vFuncAndar_2();

    }

    }else{
    //Caso o pino de ativação do sistema estive desligado inicializa/desliga o sistema

    vaPinosPassado[0] = 0;
    vaPinosPassado[1] = 0;
    vaPinosPassado[2] = 0;
    vaPinosPassado[3] = 0;
    vaPinosPassado[4] = 0;
    vaPinosPassado[5] = 0;
    vaPinosPassado[6] = 0;
    ControlaDisplay(vaPinosPassado);

    switch(viAndar){

    case 0:
    lcd_putc("\f ");//Apaga se tiver alguma coisa escrita no LCD
    output_low(pin_c7);
    output_low(pin_c6);
    output_low(pin_c5);
    viPino3 = 0;
    viPino4 = 0;
    viPino5 = 0;
    break;

    case 1:
    lcd_putc("\f Desligando...");
    MovimentaElevador(82,1,0,0);
    lcd_putc("\f");//Apaga se tiver alguma coisa escrita no LCD
    viAndar = 0;
    output_low(pin_c7);
    output_low(pin_c6);
    output_low(pin_c5);
    viPino3 = 0;
    viPino4 = 0;
    viPino5 = 0;
    break;

    case 2:
    lcd_putc("\f Desligando...");
    MovimentaElevador(167,1,0,0);
    lcd_putc("\f");//Apaga se tiver alguma coisa escrita no LCD
    viAndar = 0;
    output_low(pin_c7);
    output_low(pin_c6);
    output_low(pin_c5);
    viPino3 = 0;
    viPino4 = 0;
    viPino5 = 0;
    break;

    }//SWITCH

    }//FIM ELSE PIN_B4

    }//FIM WHILE PRINCIPAL

    }//FIM Função MAIN

    [/sourcecode]



     



    Abaixo segue o layout do simulador, Design Elevador - SDM II



     



    Abaixo o layout do circuito impresso, Placa Circuito Impresso do elevador O final da historia foi a aprovação direta para o próximo período e mais conhecimento. Abaixo deixo os arquivos a serem compilados e testados. Acesso aos arquivos



    Abaixo segue um video com o funcionamento do elevador http://www.youtube.com/watch?v=n49V2sRLX9k