Este blog estava a muito tempo parado, mas hoje resolvi postar aqui a solução para um problema que me tirou de combate quase três dias.
Estou testando e implementando o JasperServer na empresa em que trabalho como alternativa free ao Microsoft Reporting Services.
Tudo ocorreu bem nos testes no ambiente de desenvolvimento (leia-se localhost).
Criei um relatório que acessa uma base Oracle e um acessando uma outra base de dados SQL Server.
No ambiente de desenvolvimento estava usando o JasperServer 3.7.0 e para isso eu instalei o MySQL, o Tomcat 6 e rodei os arquivos Ant do JasperServer para gerar o .war que depois instalei no Tomcat. Tudo isso rodando com a versão 1.6.0_20 do JDK.
Para o ambiente de produção o JDK já era mais atual, o 1.6.0_21 e o JavaServer também era mais atual, a versão 3.7.1 que é uma distribuição all-in-one com o Tomcat 5.5, MySQL, etc.
Ai começaram meus problemas! :)
O relatório que eu desenvolvi para SQL Server não funcionava em produção acusando o seguinte erro:
org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.UnsupportedClassVersionError: Bad version number in .class file
Bati cabeça atrás do erro fazendo várias perguntas nas listas do RIOJUG, Sou Java, RSJUG, etc e fazendo muitos despachos para Pai Google e a conclusão apontada era que a versão do JDK que foi compilado o relatório era diferente da versão do JDK em produção.
Lá fui eu atualizar o JDK no ambiente de desenvolvimento e o erro persistia em produção.
Até, que um camarada em uma lista de discussão deu a dica para eu checar se o Tomcat estava realmente usando o JDK que eu queria que ele usasse.
Comecei a catar o usuário e senha para acessar a área administrativa do Tomcat 5.5 que vem na distribuição do JasperServer 3.7.1 e não achei o arquivo tomcat-users.xml no diretório C:\Program Files\JasperServer-ce-3.7.1\apache-tomcat\conf, então fui ver como o bat jasperctl (C:\Program Files\JasperServer-ce-3.7.1\jasperctl.bat) inicializa o Tomcat e achei a seguinte pérola:
set JAVA_HOME= C:\Program Files\JasperServer-ce-3.7.1\java
set JRE_HOME= C:\Program Files\JasperServer-ce-3.7.1\java
Opa! O cara está apontando para um JDK e uma JRE que não é a que eu instalei no servidor, e ela está desatualizada! Beleza, foi só trocar os valores para apontar para os locais certos que o relatório passou a funcionar. ;)
Aqui está como ficou.
set JAVA_HOME=C:\Program Files\Java\JDK1.6.0_21
set JRE_HOME=C:\Program Files\Java\JRE6
Fica a dica.
segunda-feira, setembro 27, 2010
sexta-feira, julho 02, 2010
Simulação de um semáforo de trânsito com Arduino
Vídeo demostrando a simulação de um semáforo de trânsito com Arduino.
Hoje dia de jogo da seleção brasileira na copa do mundo da África, dia de folga, dia de arrancar os cabelos com a desclassificação e de aprender mais e mais sobre o meu novo brinquedinho, meu Arduino.
Como eu já tinha demonstrado antes aqui no blog, eu já tinha feito algumas brincadeiras com PICs, escrevendo código em Assembly. Mas tem muita coisa que realmente é chato nisso, como ficar trabalhando com os malditos registradores da linguagem, estouro de timer, estouro de variáveis, bit clear, etc. Então fui fazer meu semáforo no Arduino que eu ganho mais ;)
A idéia era simular o que vemos nas ruas. Para isso consideremos duas hipotéticas avenidas chamadas A e B.
O programa inicia liberando o tráfego de veículos (LED verde) na avenida A e bloqueando-o na avenida B (LED vermelho). O que se segue é o que conhecemos bem: sinal amarelo na avenida A, sinal vermelho na avenida A e verde na B e depois o contrário, amarelo na avenida B, vermelho na avenida B e verde na A novamente.
O vídeo está no YouTube para quem quiser ver. Eis a URL: http://www.youtube.com/watch?v=-bUbkyEs3CM
E aqui o código fonte:
/******************************************************************************;
; Processor: ATMEGA328 ;
; Function : This circuit simulates a typically operation of a traffic light. ;
; There is two sets of LEDs, one representing an hypothetical ;
; avenue "A" and the other set representing an hypothetical avenue ;
; "B". When the program starts the traffic on avenue "A" will be ;
; released and the traffic will be stopped on avenue "B". ;
; After 3s the traffic will be stopped on avenue "A" and will be ;
; released on avenue "B". Before this change, the alert light ;
; (yellow LED) will appear turned on for 1,5s on avenue's "A" ;
; traffic light. After this operation the circle will be reversed. ;
; Hardware : Arduino Duemilanove and an protoboard ;
; Filename : main.pde ;
; Author : Jean J. Míchel;
; Website : http://www.jeanjmichel.blogspot.com ;
; Credit : ;
;******************************************************************************/
//Traffic light of avenue A
int avenueARed = 12;
int avenueAYellow = 11;
int avenueAGreen = 10;
//Traffic light of avenue B
int avenueBRed = 2;
int avenueBYellow = 3;
int avenueBGreen = 4;
void setup() { //This section will be performed just
pinMode(avenueARed ,OUTPUT); //once after the Arduino be energized
pinMode(avenueAYellow ,OUTPUT); //and sets the orientation of ATmega
pinMode(avenueAGreen ,OUTPUT); //ports
pinMode(avenueBRed ,OUTPUT);
pinMode(avenueBYellow ,OUTPUT);
pinMode(avenueBGreen ,OUTPUT);
}
void openAvenueA() { //Method for release the traffic on
digitalWrite(avenueARed ,LOW); //avenue A
digitalWrite(avenueAYellow ,LOW);
digitalWrite(avenueAGreen ,HIGH);
}
void closeAvenueA() { //Method for stop the traffic on
digitalWrite(avenueARed ,HIGH); //avenue A
digitalWrite(avenueAYellow ,LOW);
digitalWrite(avenueAGreen ,LOW);
}
void prepareToCloseAvenueA() { //Method to display the warning light
digitalWrite(avenueAYellow ,HIGH); //on avenue A
}
void openAvenueB() { //Method for release the traffic on
digitalWrite(avenueBRed ,LOW); //avenue B
digitalWrite(avenueBYellow ,LOW);
digitalWrite(avenueBGreen ,HIGH);
}
void prepareToCloseAvenueB() { //Method to display the warning light
digitalWrite(avenueBYellow ,HIGH); //on avenue B
}
void closeAvenueB() { //Method for stop the traffic on
digitalWrite(avenueBRed ,HIGH); //avenue B
digitalWrite(avenueBYellow ,LOW);
digitalWrite(avenueBGreen ,LOW);
}
void loop() { //This method will be performed over
openAvenueA(); //and over again as long as the
closeAvenueB(); //Arduino has energized
delay(3000);
prepareToCloseAvenueA();
delay(1500);
closeAvenueA();
openAvenueB();
delay(3000);
prepareToCloseAvenueB();
delay(1500);
closeAvenueB();
}
Marcadores:
arduino,
eletronic,
eletrônica,
semáforo
quinta-feira, julho 01, 2010
Arduino Duemilanove
Arduino Duemilanove.
Depois de 22 dias de espera chegou meu Arduino Duemilanove que comprei no eBay (veio da China), mas por apenas US$ 12.00 valeu a pena a espera.
Comei cogitando a idéia de montar o meu Arduino em casa, para isso comecei a procurar os esquemas e o desenho da placa para uma versão não SMD. Só achei uma versão serial, e eu queria mesmo a USB.
Então fui procurar onde comprar um Arduino aqui no Brasil, e cogitei a versão "extendida" dele, da Globalcode, chamado Program-ME, mas por hora o meu orçamento não me permite desembolsar R$ 190.00 em um brinquedinho que eu posso nem mesmo gostar tanto assim, abandoná-lo e voltar para os PICs da Microchip que venho brincando e tenho o suporte de um colega de trabalho que conhece muito a respeito.
Então o negócio foi apelar para o Mercado Livre e lojas do ramo de eletrônica, mesmo assim um Arduino não sairia por menos de R$ 80.00. Deu aquele estalo e fui olhar o eBay, e lá encontrei um leilão começando em US$ 1.00 de um Arduino Duemilanove, bem o que eu queria ;), e arrematei por US$ 12.00. Coloca aí mais US$ 9.00 de frete internacional e temos um Arduino Duemilanove por R$ 37.00 ;)
Demorou mas chegou. Veio o Arduino mais o cabo USB. Eu já tinha baixado a IDE (acesse aqui para baixar) e lido alguns tutoriais bem simples, além de ter visto o pessoal da Globalcode aloprando com o Program-ME criando robôs, usando displays, etc.
Apenas ontem que tive tempo de testar o bichinho. Muito simples de usar, fio espertar o Arduino na USB e o Windows 7 já o detectou numa boa, depois foi colocar o código na IDE, compilar, fazer o up load para o Arduino, colocar o LED nas portas certas e ver o resultado ;) Foi este meu primeiro exemplo.
Primeira montagem.
Recomendo a todos que tem o espírito "Professor Pardal" e gostam de ver as coisas acontecendo, etc.
Em breve posto mais coisas que irei fazendo até chegar no Daileon =P
Marcadores:
arduino,
china,
ebay,
eletrônica,
globalcode,
led,
program-me
quarta-feira, junho 30, 2010
Problemas com o blog
Estou editando o layout do blog por isso está tudo desconfigurado. Peço um pouco de paciência, em alguns dias eu resolverei o problema.
Fotos do meu último experimento
Aí estão as fotos da montagem do meu último experimento (nada científico) com o PIC 16F628A da Microchip.
Mas não se anime, pois não está funcionando :(
Vou dar uma debugada depois, com calma, pois no Proteus está funcionando. Devo ter feito alguma barberagem na hora de montar, sei lá.
O que acontece é que quando o botão é pressionado os dois LEDs vermelhos apagam e o verde não liga.
Eis as fotos:
Mas não se anime, pois não está funcionando :(
Vou dar uma debugada depois, com calma, pois no Proteus está funcionando. Devo ter feito alguma barberagem na hora de montar, sei lá.
O que acontece é que quando o botão é pressionado os dois LEDs vermelhos apagam e o verde não liga.
Eis as fotos:
Marcadores:
16F268A,
assembly,
eletronic,
eletrônica,
microchip,
microcontrolador,
pic
quarta-feira, junho 09, 2010
Mais um experimento com PIC 16F628A e Assembly
Seguindo a minha saga pelo mundo dos microcontroladores, hoje fiz mais um exemplo em Assembly usando o PIC 16F628A da Microchip.
A brincadeira é permutar entre o acendimento de um ou outro LED via chave táctil.
O fluxo do programa é este:
Aqui estão as imagens da simulação do circuito feita no Proteus:
Circuito desligado.
Circuito ligado.
Chave pressionada.
E aqui está o código Assembly:
;******************************************************************************;
; Processor: PIC16F628 at 4 MHz using internal RC oscillator ;
; Function : When the circuit is energized two LEDs will turn on, the power ;
; indicator and LED_D1. Every time the button is pressed the LED_D1 ;
; will turn off and the LED_D2 will turn on, the opposite occurs ;
; when the button is released, turning off the LED_D2 and turning ;
; on the LED_D1 again. ;
; Hardware : Protoboard ;
; Filename : main.asm ;
; Author : Jean J. Míchel <jeanjmichel-at-gmail.com> ;
; Website : http://www.jeanjmichel.blogspot.com ;
; Credit : ;
;******************************************************************************;
; Wiring diagram +-/\/\/--|>|--o GND ;
; +---v---+ | R2 LED_PWR ;
; -<|º 1 |>--+ ;
; -<| 6 |>----/\/\/--|>|--o GND ;
; -<| F |>--+ R3 D1 ;
; -<| 6 |>- | ;
; -<| 2 |>- +-/\/\/--|>|--o GND ;
; -<| 8 |>- R4 D2 ;
; -<| A |>- ;
; -<| |>--+----o¯o----o VDD 5v ;
; +-------+ | R1 ;
; +---/\/\/---o GND ;
;******************************************************************************;
#include <p16f628a.inc>
list p=16f628a
ERRORLEVEL 0, -302;, -224, -302, -305, -207
__config (_INTOSC_OSC_NOCLKOUT & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_OFF)
#define select_bank0 bcf STATUS,RP0
#define select_bank1 bsf STATUS,RP0
#define LED_PWR PORTA,1
#define LED_D1 PORTA,0
#define LED_D2 PORTA,7
#define BUTTON PORTB,4
org 0x00
goto setup ;Perform the initial settings ;
main btfsc BUTTON ;Monitors the action of the button;
goto turn_on_d2 ;Turns on LED_D2 ;
goto turn_on_d1 ;Turns on LED_D1 ;
turn_on_d1 bcf LED_D2 ;Turns off LED_D2 ;
bsf LED_D1 ;Turns on LED_D1 ;
goto main
turn_on_d2 bcf LED_D1 ;Turns off LED_D1 ;
bsf LED_D2 ;Turns on LED_D2 ;
goto main
setup select_bank1
movlw B'00000000' ;Defines all pins of the PORTA ;
movwf TRISA ;registrator as output ;
movlw B'00010000' ;Defines all pins of the PORTB ;
movwf TRISB ;registrator as output except the ;
;the pin 4 - push button ;
bsf PCON, OSCF ;Sets 16F628 to operate at 4MHz ;
select_bank0
movlw 0x07
movwf CMCON ;Turns off the comparator ;
clrf PORTA ;Clears all pins of the PORTA ;
;registrator ;
clrf PORTB ;Clears all pins of the PORTB ;
;registrator ;
bsf LED_PWR ;Turns on LED_PWR - power LED ;
goto main ;Loop forever ;) ;
end
Enjoy!
A brincadeira é permutar entre o acendimento de um ou outro LED via chave táctil.
O fluxo do programa é este:
Aqui estão as imagens da simulação do circuito feita no Proteus:
Circuito desligado.
Circuito ligado.
Chave pressionada.
E aqui está o código Assembly:
;******************************************************************************;
; Processor: PIC16F628 at 4 MHz using internal RC oscillator ;
; Function : When the circuit is energized two LEDs will turn on, the power ;
; indicator and LED_D1. Every time the button is pressed the LED_D1 ;
; will turn off and the LED_D2 will turn on, the opposite occurs ;
; when the button is released, turning off the LED_D2 and turning ;
; on the LED_D1 again. ;
; Hardware : Protoboard ;
; Filename : main.asm ;
; Author : Jean J. Míchel <jeanjmichel-at-gmail.com> ;
; Website : http://www.jeanjmichel.blogspot.com ;
; Credit : ;
;******************************************************************************;
; Wiring diagram +-/\/\/--|>|--o GND ;
; +---v---+ | R2 LED_PWR ;
; -<|º 1 |>--+ ;
; -<| 6 |>----/\/\/--|>|--o GND ;
; -<| F |>--+ R3 D1 ;
; -<| 6 |>- | ;
; -<| 2 |>- +-/\/\/--|>|--o GND ;
; -<| 8 |>- R4 D2 ;
; -<| A |>- ;
; -<| |>--+----o¯o----o VDD 5v ;
; +-------+ | R1 ;
; +---/\/\/---o GND ;
;******************************************************************************;
#include <p16f628a.inc>
list p=16f628a
ERRORLEVEL 0, -302;, -224, -302, -305, -207
__config (_INTOSC_OSC_NOCLKOUT & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_OFF)
#define select_bank0 bcf STATUS,RP0
#define select_bank1 bsf STATUS,RP0
#define LED_PWR PORTA,1
#define LED_D1 PORTA,0
#define LED_D2 PORTA,7
#define BUTTON PORTB,4
org 0x00
goto setup ;Perform the initial settings ;
main btfsc BUTTON ;Monitors the action of the button;
goto turn_on_d2 ;Turns on LED_D2 ;
goto turn_on_d1 ;Turns on LED_D1 ;
turn_on_d1 bcf LED_D2 ;Turns off LED_D2 ;
bsf LED_D1 ;Turns on LED_D1 ;
goto main
turn_on_d2 bcf LED_D1 ;Turns off LED_D1 ;
bsf LED_D2 ;Turns on LED_D2 ;
goto main
setup select_bank1
movlw B'00000000' ;Defines all pins of the PORTA ;
movwf TRISA ;registrator as output ;
movlw B'00010000' ;Defines all pins of the PORTB ;
movwf TRISB ;registrator as output except the ;
;the pin 4 - push button ;
bsf PCON, OSCF ;Sets 16F628 to operate at 4MHz ;
select_bank0
movlw 0x07
movwf CMCON ;Turns off the comparator ;
clrf PORTA ;Clears all pins of the PORTA ;
;registrator ;
clrf PORTB ;Clears all pins of the PORTB ;
;registrator ;
bsf LED_PWR ;Turns on LED_PWR - power LED ;
goto main ;Loop forever ;) ;
end
Enjoy!
Marcadores:
16F268A,
assembly,
eletronic,
eletrônica,
microchip,
microcontrolador,
pic
segunda-feira, junho 07, 2010
Pequeno jogo em JavaScript
Estava lendo o material do blog Elétron Livre sobre um dojo de programação com o Program-ME, onde o pessoal da Globalcode criou uma réplica do jogo Genius.
Parei para pensar como seria o algoritmo (sem antes ler o deles claro) e comecei a esboçar em JavaScript algo parecido.
Quando inicializa a tela são sorteados quatro números inteiros e positivos, esses números aparecem por 1,5 segundo nos quatro campos dispostos em forma de matriz 2x2 na tela e depois são apagados.
Ao jogador resta preencher os quatro campos novamente com os valores correspondente a cada um deles antes exibido. No final ao pressionar o único botão da tela, as respostas do usuário são confrontadas com os números sorteados e exibido o resultado indicando se o jogador acertou ou não a combinação de números.
Segue uma seqüência de imagens do jogo:
Números sorteados.
Hora de jogar :-)
Conferindo meu chute.
Jogar novamente?
Agora sim!
Jogar novamente?
Bye-bye
Claro que isso é uma bobeira, e para simular corretamente o jogo Genius eu deveria ter usado imagens nas cores que o jogo utilizava e não campos numéricos, mas como fiz isso somente para ver como seria... ta ai o resultado. :-) Foi uma hora de almoço gasta em nome da ciência :-)
Para aumentar a dificuldade bastas mudar o tempo em que permanecem exibidos os números sorteados.
Eis o fonte da página:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Untitled</title>
<script language="JavaScript" type="text/javascript">
<!--
var ramdom = new Array();
var answers = new Array();
var ports = new Array();
function allocate() {
ports[0] = document.getElementById("portA");
ports[1] = document.getElementById("portB");
ports[2] = document.getElementById("portC");
ports[3] = document.getElementById("portD");
for(i = 0; i < 4; i++) {
ramdom[i] = Math.floor(Math.random()* 11);
ports[i].value = ramdom[i];
}
setTimeout(clearForm, 1500);
ports[0].focus();
}
function clearForm() {
for(i = 0; i < 4; i++) {
ports[i].value = "";
}
}
function checkAnswers() {
var result = true;
var tryAgain;
for(i = 0; i < 4; i++) {
answers[i] = ports[i].value;
if(answers[i] != ramdom[i]) {
result = false;
}
}
var message = "Ramdom numbers: " + ramdom + "\n" +
"Your answers: " + answers
if(result) {
alert("You win! :-) \n\n" + message);
}
else {
alert("You lose! :-( \n\n" + message);
}
tryAgain = prompt("Do you would like play again?", "Type Y or N");
if(tryAgain == "Y") {
allocate();
}
else {
document.getElementById("gameForm").style.display = "none";
document.getElementById("message").style.display = "block";
}
}
//-->
</script>
</head>
<body>
<div id="gameForm">
<input type="text" id="portA" name="portA" size="2" />
<input type="text" id="portB" name="portB" size="2" /> <br/>
<input type="text" id="portC" name="portC" size="2" />
<input type="text" id="portD" name="portD" size="2" /> <br/><br/>
<input type="button" id="check" name="check" value="Check my answers!" onclick="checkAnswers()" />
</div>
<div id="message" style="display: none;">
<p>Thanks for play my game! :-)</p>
</div>
<script>
allocate();
</script>
</body>
</html>
Parei para pensar como seria o algoritmo (sem antes ler o deles claro) e comecei a esboçar em JavaScript algo parecido.
Quando inicializa a tela são sorteados quatro números inteiros e positivos, esses números aparecem por 1,5 segundo nos quatro campos dispostos em forma de matriz 2x2 na tela e depois são apagados.
Ao jogador resta preencher os quatro campos novamente com os valores correspondente a cada um deles antes exibido. No final ao pressionar o único botão da tela, as respostas do usuário são confrontadas com os números sorteados e exibido o resultado indicando se o jogador acertou ou não a combinação de números.
Segue uma seqüência de imagens do jogo:
Números sorteados.
Hora de jogar :-)
Conferindo meu chute.
Jogar novamente?
Agora sim!
Jogar novamente?
Bye-bye
Claro que isso é uma bobeira, e para simular corretamente o jogo Genius eu deveria ter usado imagens nas cores que o jogo utilizava e não campos numéricos, mas como fiz isso somente para ver como seria... ta ai o resultado. :-) Foi uma hora de almoço gasta em nome da ciência :-)
Para aumentar a dificuldade bastas mudar o tempo em que permanecem exibidos os números sorteados.
Eis o fonte da página:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Untitled</title>
<script language="JavaScript" type="text/javascript">
<!--
var ramdom = new Array();
var answers = new Array();
var ports = new Array();
function allocate() {
ports[0] = document.getElementById("portA");
ports[1] = document.getElementById("portB");
ports[2] = document.getElementById("portC");
ports[3] = document.getElementById("portD");
for(i = 0; i < 4; i++) {
ramdom[i] = Math.floor(Math.random()* 11);
ports[i].value = ramdom[i];
}
setTimeout(clearForm, 1500);
ports[0].focus();
}
function clearForm() {
for(i = 0; i < 4; i++) {
ports[i].value = "";
}
}
function checkAnswers() {
var result = true;
var tryAgain;
for(i = 0; i < 4; i++) {
answers[i] = ports[i].value;
if(answers[i] != ramdom[i]) {
result = false;
}
}
var message = "Ramdom numbers: " + ramdom + "\n" +
"Your answers: " + answers
if(result) {
alert("You win! :-) \n\n" + message);
}
else {
alert("You lose! :-( \n\n" + message);
}
tryAgain = prompt("Do you would like play again?", "Type Y or N");
if(tryAgain == "Y") {
allocate();
}
else {
document.getElementById("gameForm").style.display = "none";
document.getElementById("message").style.display = "block";
}
}
//-->
</script>
</head>
<body>
<div id="gameForm">
<input type="text" id="portA" name="portA" size="2" />
<input type="text" id="portB" name="portB" size="2" /> <br/>
<input type="text" id="portC" name="portC" size="2" />
<input type="text" id="portD" name="portD" size="2" /> <br/><br/>
<input type="button" id="check" name="check" value="Check my answers!" onclick="checkAnswers()" />
</div>
<div id="message" style="display: none;">
<p>Thanks for play my game! :-)</p>
</div>
<script>
allocate();
</script>
</body>
</html>
Marcadores:
adivinhação,
genius,
javascript,
jogo
sábado, junho 05, 2010
Eletrônica - micro controlador Microchip 16F628A + Assembly [fotos]
Tinha ficado devendo as fotos do meu experimento com o PIC 16F628A da Microchip, bem aqui estão elas:
Ficou bem legal, funcionou conforme o simulado, mas dei algumas mancadas na hora de construir o circuito, falta de prática :-D.
Ficou bem legal, funcionou conforme o simulado, mas dei algumas mancadas na hora de construir o circuito, falta de prática :-D.
Marcadores:
16f628A,
assembly,
eletronic,
eletrônica,
micro controladores,
microchip,
microcontroller,
pic,
protoboard
terça-feira, junho 01, 2010
Eletrônica - micro controlador Microchip 16F628A + Assembly
Quem, assim como eu, trabalha com TI está acostumado a ver sistemas transformando informações em informações =P, ou seja, dados vem daqui e vão para lá. Isso me deixa um pouco frustrado, pois não construo nada, não vejo nada acontecer, etc. (não me diga que ver um gráfico em um relatório é "ver" as coisas acontecerem em um sistema ;) ) então voltei para os meus primórdios sonhos infantis de construir alguma coisa (na verdade um robô) e para isso invoquei meus conhecimentos de quando tinha 15 anos e estudei na Escola Estadual Técnica Parobé (hoje Centro Tecnológico Estadual Parobé), onde cursei eletrônica.
Junte a vontade de fazer algo "se mexer" a ter um colega com skills do Professor Pardal a muitas conversas sobre automação na hora do almoço e um passeio pela Rua República do Líbano (onde estão as lojas de componentes eletrônicos aqui no Rio de Janeiro) e então terás nas mãos uma protoboard, um punhado de componentes e muita diversão ;)
Comecei leve: um micro controlador da Microchip (16F628A), dois LEDs, um botão e um programa escrito em Assembly. Assembly ao invés de C porque é o mais próximo que podemos chegar de ver os elétrons passando pela placa ;).
A brincadeira é muito simples, mas com ela tive contato com Assembly para micro controladores, o que não conhecia.
Vamos lá, o negócio é ter dois LEDs ligados no PIC, um ficará permanentemente aceso (indicando que o circuito está ligado) e o outro LED ficará desligado até que se pressione o botão, que o ligará.
Eis a simulação do circuito (as imagens podem ser vistas direto no Flickr: http://www.flickr.com/photos/jeanjmichel/sets/72157624156071640/):
Circuito desligado:
Circuito ligado:
Circuito em uso (botão pressionado):
Eis o código Assembly:
;******************************************************************************;
; Processor: PIC16F628 at 4 MHz using internal RC oscillator ;
; Function : Switch on two LEDs. The first LED (D1), conenected to RB0, turns ;
; on when the circuit is energized (power LED), while the second ;
; LED (D2), connected to RA1, just turns on when the push button ;
; (PB1) is pressed. ;
; Hardware : Protoboard ;
; Filename : main.asm ;
; Author : Jean J. Míchel <jeanjmichel-at-gmail.com> ;
; Website : http://www.jeanjmichel.blogspot.com ;
; Credit : Eduardo Bekman ;
;******************************************************************************;
; Wiring diagram ;
; +---v---+ R1 D1 ;
; -<|º 1 |>--/\/\/--|>|--o GND ;
; -<| 6 |>--+ ;
; -<| F |>- +----o¯o----o VDD 5v ;
; -<| 6 |>- | PB1 ;
; D2 R3 -<| 2 |>- | ;
; GND o--|<|--/\/\/--<| 8 |>- +---/\/\/---o GND ;
; -<| A |>- R2 ;
; -<| |>- ;
; +-------+ ;
; ;
;******************************************************************************;
#include <p16f628a.inc>
list p=16f628a
ERRORLEVEL 0, -302;, -224, -302, -305, -207
__config (_INTOSC_OSC_NOCLKOUT & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_OFF)
#define select_bank0 bcf STATUS,RP0
#define select_bank1 bsf STATUS,RP0
#define BUTTON PORTA,0
#define LED_D1 PORTA,1
#define LED_D2 PORTB,0
org 0x00
goto setup ;Perform the initial settings ;
main btfsc BUTTON ;Monitors the action of the button;
goto turn_on_led ;Turns on LED_D1 ;
goto turn_off_led ;Turns off LED_D1 ;
turn_on_led bsf LED_D1 ;Turns on LED_D1 ;
goto main
turn_off_led bcf LED_D1 ;Turns off LED_D1 ;
goto main
setup select_bank1
movlw B'00000001' ;Defines all pins of the PORTA ;
movwf TRISA ;registrator as output except ;
;pin 0 - push button ;
movlw B'00000000' ;Defines all pins of the PORTB ;
movwf TRISB ;registrator as output ;
bsf PCON, OSCF ;Sets 16F628 to operate at 4MHz ;
select_bank0
movlw 0x07
movwf CMCON ;Turns off the comparator ;
clrf PORTA ;Clears all pins of the PORTA ;
;registrator ;
clrf PORTB ;Clears all pins of the PORTB ;
;registrator ;
bsf LED_D2 ;Turns on LED_D2 - power LED ;
goto main ;Loop forever ;) ;
end
Ainda não consegui monta-lo na protoboard para postar fotos e vídeos do projeto funcionando, mas assim que o fizer eu posto.
Junte a vontade de fazer algo "se mexer" a ter um colega com skills do Professor Pardal a muitas conversas sobre automação na hora do almoço e um passeio pela Rua República do Líbano (onde estão as lojas de componentes eletrônicos aqui no Rio de Janeiro) e então terás nas mãos uma protoboard, um punhado de componentes e muita diversão ;)
Comecei leve: um micro controlador da Microchip (16F628A), dois LEDs, um botão e um programa escrito em Assembly. Assembly ao invés de C porque é o mais próximo que podemos chegar de ver os elétrons passando pela placa ;).
A brincadeira é muito simples, mas com ela tive contato com Assembly para micro controladores, o que não conhecia.
Vamos lá, o negócio é ter dois LEDs ligados no PIC, um ficará permanentemente aceso (indicando que o circuito está ligado) e o outro LED ficará desligado até que se pressione o botão, que o ligará.
Eis a simulação do circuito (as imagens podem ser vistas direto no Flickr: http://www.flickr.com/photos/jeanjmichel/sets/72157624156071640/):
Circuito desligado:
Circuito ligado:
Circuito em uso (botão pressionado):
Eis o código Assembly:
;******************************************************************************;
; Processor: PIC16F628 at 4 MHz using internal RC oscillator ;
; Function : Switch on two LEDs. The first LED (D1), conenected to RB0, turns ;
; on when the circuit is energized (power LED), while the second ;
; LED (D2), connected to RA1, just turns on when the push button ;
; (PB1) is pressed. ;
; Hardware : Protoboard ;
; Filename : main.asm ;
; Author : Jean J. Míchel <jeanjmichel-at-gmail.com> ;
; Website : http://www.jeanjmichel.blogspot.com ;
; Credit : Eduardo Bekman ;
;******************************************************************************;
; Wiring diagram ;
; +---v---+ R1 D1 ;
; -<|º 1 |>--/\/\/--|>|--o GND ;
; -<| 6 |>--+ ;
; -<| F |>- +----o¯o----o VDD 5v ;
; -<| 6 |>- | PB1 ;
; D2 R3 -<| 2 |>- | ;
; GND o--|<|--/\/\/--<| 8 |>- +---/\/\/---o GND ;
; -<| A |>- R2 ;
; -<| |>- ;
; +-------+ ;
; ;
;******************************************************************************;
#include <p16f628a.inc>
list p=16f628a
ERRORLEVEL 0, -302;, -224, -302, -305, -207
__config (_INTOSC_OSC_NOCLKOUT & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_OFF)
#define select_bank0 bcf STATUS,RP0
#define select_bank1 bsf STATUS,RP0
#define BUTTON PORTA,0
#define LED_D1 PORTA,1
#define LED_D2 PORTB,0
org 0x00
goto setup ;Perform the initial settings ;
main btfsc BUTTON ;Monitors the action of the button;
goto turn_on_led ;Turns on LED_D1 ;
goto turn_off_led ;Turns off LED_D1 ;
turn_on_led bsf LED_D1 ;Turns on LED_D1 ;
goto main
turn_off_led bcf LED_D1 ;Turns off LED_D1 ;
goto main
setup select_bank1
movlw B'00000001' ;Defines all pins of the PORTA ;
movwf TRISA ;registrator as output except ;
;pin 0 - push button ;
movlw B'00000000' ;Defines all pins of the PORTB ;
movwf TRISB ;registrator as output ;
bsf PCON, OSCF ;Sets 16F628 to operate at 4MHz ;
select_bank0
movlw 0x07
movwf CMCON ;Turns off the comparator ;
clrf PORTA ;Clears all pins of the PORTA ;
;registrator ;
clrf PORTB ;Clears all pins of the PORTB ;
;registrator ;
bsf LED_D2 ;Turns on LED_D2 - power LED ;
goto main ;Loop forever ;) ;
end
Ainda não consegui monta-lo na protoboard para postar fotos e vídeos do projeto funcionando, mas assim que o fizer eu posto.
Marcadores:
16f628A,
assembly,
eletronic,
eletrônica,
micro controladores,
microchip,
microcontroller,
pic,
protoboard
quarta-feira, abril 28, 2010
Glassfish v3 não instala, e agora?
Mistéééééério! E agora Mr. M?
Hoje estava tentando instalar o Glassfish v3 na minha estação de trabalho, que roda Windows XP, e a instalação não concluía, logo que aparecia a apresentação do instalador o mesmo se fechava sozinho.
Google daqui, Google de lá, e nenhum despacho para pai Google me dava à resposta... próximo passo: listas de discussão (RSJUG, RIOJUG, CEJUG, SouJava e JavaSF).
Eis que veio a luz que eu precisava! O Windows estava configurado para português do Brasil e por isso não instalava, foi somente trocar para inglês dos Estados Unidos e a instalação correu normalmente.
Valeu pela dica Alexandre Tavares.
Assinar:
Postagens (Atom)