Ir ao conteúdo
  • Cadastre-se

Fechadura Eletronica pic 18f452 erro No Isis "EECON1" nao inicializa no protobord


MicroSantana

Posts recomendados

Bom ola galera essa é minha primeira vez que que uso o fórum bom vamos la, estou trabalhando com um projeto de TCC Fechadura eletrônica com 2 senhas uma de acesso e outra de coação. a principio usava o pic 16f877A 20MHZ conforme ia acrescentando lógica de programação o bank de memoria de dados do pic não suportou me deu um erro (" IRP bit must be set manualy for indirect to").

Bom enfim achei muito complicado mexer com memoria de banco e decidir usar o 18f452 que tem uma memoria de banco de dados bem maior acrescentei a seguinte rotina no meu projeto alterar senha tanto como a senha acesso como a senha de coação, através de um menu de acesso, contar números de tentativas, que quando passa de 3 tentativas aciona a porta RC4 bom enfim No Isis ele funciona normal, com exeção que me retorna uma mensagem de erro.

"(PIC 18 EEPROM PC=0X0388.Modification of EECON1. whist a read or Write is progress (rd or wr set) is not ambiguous and not supported)"

como dize acima no Isis Funciona Normal quando passo o programa para o pic Real ele não inicializa nem sequer um sinal, ja testei com outra programação de piscar leds e func normalmente. vou postar a programação que so funciona No isis ja estou quase louco sem alternativa :wacko::wacko::wacko::wacko::wacko:

Bem ja ia me esquecendo Uso o MIcro C pro 1.65 ja tentei com otras vesoes mais novas mais não resolveu


short prov[9];
short digi[9];
short cnt = 0;
short cont,erro,opc,cbn;

// Keypad module connections
char keypadPort at PORTD;
// End Keypad module connections

// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

void AcionaPorta(){
portc.rc0 = 1; // manda nivel logico 1 para a porta rc0
portc.RC2 =1;// manda nivel logico 1 para o buzzer
Delay_ms(3000);
portc.rc0= 0; // manda nivel logico 0 para a porta rc0
portc.RC2=0; // manda nivel logico zero para o buzzer
}

void teclado(){
do {
kp = 0;

do

kp = Keypad_Key_Click(); // Store key code in kp variable
while (!kp);

switch (kp) {
case 1: kp = 49; break; // 1
case 2: kp = 50; break; // 2
case 3: kp = 51; break; // 3
case 5: kp = 52; break; // 4
case 6: kp = 53; break; // 5
case 7: kp = 54; break; // 6
case 9: kp = 55; break; // 7
case 10: kp = 56; break; // 8
case 11: kp = 57; break; // 9
case 13: kp = 42; break; // *
case 14: kp = 48; break; // 0
case 15: kp = 35; break; // #
}

if (kp != 42 && kp != 35){ // testa se * foi digitado,
prov[cnt] = kp;
cnt++;
Lcd_Chr(2,cnt,42);
}
else{
if (kp == 42){
if (prov[0]!=0){ //limpa o vetor ate a posição 0 do vetor estiver zerada
Lcd_Chr(2,cnt,32); //caso for limpa lcd
cnt--;
prov[cnt]= 0;
}
}
}
tecla = kp;
portc.rc1= 1; // manda nivel logico 1 temporiza e depois manda nivel logico 0
portc.rc2=1;//manda nivel logico 1 para o buzzer
Delay_ms(90); //porta rc1 fazendo que ao digitar uma numero o led pisca
portc.rc1= 0;
portc.RC2=0;// manda logico 0 para o buzzer

} while (kp !=35);
}
void limpadado(){
tecla=0;
for (tecla=0;tecla<10;tecla++){ // laço para limpar variavel vetor que recebeu o valor Digitado
if (prov[0]!=0){
cnt -- ;
prov[cnt]=0;
}
}
}
void validasenha(){
if (EEPROM_Read(8)== prov[0] && // testa se o modo coação foi ativado
EEPROM_Read(9)== prov[1] &&
EEPROM_Read(10)== prov[2] &&
EEPROM_Read(11)== prov[3] &&
EEPROM_Read(12)== prov[4] &&
EEPROM_Read(13)== prov[5]){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1,"*ACESSO LIBERADO*");
Lcd_Out(2, 1," *MODO COACAO*");
if (cont==0){ // se variavel é igual a zero indica que o modo coação não foi acionado
portc.RC4=1;
cont=1; // variavel recebe 1 para registar que o modo coação ja foi acionado
AcionaPorta(); // chama função para abrir a porta
erro=0; // zera variavel que conta erros
}
else {
Lcd_Out(2,1,"*COACAO DESATIVADO*");
delay_ms(2000);
portc.RC4=0;
cont=0;
AcionaPorta(); // chama função para abrir porta
erro=0; // zera variavel que conta erros
}
limpadado(); // função para limpar dados digitados
}
else{
if (EEPROM_Read(2) == prov[0] && // le o valor da memoria eprom corespondente ao endereço e testa com o valor digitado
EEPROM_Read(3) == prov[1] &&
EEPROM_Read(4) == prov[2] &&
EEPROM_Read(5) == prov[3] &&
EEPROM_Read(6) == prov[4] &&
EEPROM_Read(7) == prov[5]){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1,"*ACESSO LIBERADO*");
lcd_out(2,1," PORTA ABERTA");
AcionaPorta(); //chama a função para abrir a porta
limpadado(); // limpa dados digitados
erro=0; // zera contador de erros quando digita senha certa
}
else{
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1, " *ACESSO NEGADO*");
lcd_out(2,1,"DIGITE NOVAMENTE");
Delay_ms(3000);
limpadado(); // limpa dados digitados
erro++; // a cada erro somo a mais 1 na variavel
if (erro >= 4){ // testa variavel que conta o numeros de tentativas
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1,"+3 DE TENTAVIVAS");
lcd_out(2,1,"CENTRAL ACIONADA");
Delay_ms(3000);
portc.RC4=1; // manda nivel logico alto para a central de segurança
cont=1; //variavel recebe um também para testes logico
erro =0;
}
}
}
}
void alteracoacao(){

Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"*ALTERAR COACAO*"); // imprime para o usuario a opção a selecionar
Lcd_Out(2,1,"*1-SIM *2-NAO");
delay_ms(1500);

do {
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"*1-SIM *2-NAO");
limpadado();
teclado(); // aguarda a o usuario digitar a opção
if (prov[0] == 49){ // se ecolheu 1 aguarda ele digitar a senha at
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1," *SENHA ATUAL*");
limpadado(); // limpa dado que foi digitado anteriormente
delay_ms(2000);
teclado(); // chama função para ler teclado e armazena no vetor
cbn=0;
}
if (EEPROM_Read(8) == prov[0] && // le o valor da memoria eprom corespondente ao endereço e testa com o valor digitado
EEPROM_Read(9) == prov[1] &&
EEPROM_Read(10) == prov[2] &&
EEPROM_Read(11) == prov[3] &&
EEPROM_Read(12) == prov[4] &&
EEPROM_Read(13) == prov[5]){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1," *SENHA CONFERE*"); // imprime a se a senha foi digitada certa
limpadado();
Delay_ms(2000); // temporiza 2 segundos
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"DIG. NOVA SENHA"); // informa para digitar nova senha
Delay_ms(2000);
teclado(); // aguarda a nova senha
if(prov[6]!= 0 || prov[7]!= 0 || prov[8]!= 0){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"MAXIMO 6 DIGITOS");
Lcd_Out(2,1,"TENTE NOVAMENTE");
limpadado();
delay_ms(2000);
continue;
}

digi[0]= prov[0]; // vetor recebe valor digitados
digi[1]= prov[1];
digi[2]= prov[2];
digi[3]= prov[3];
digi[4]= prov[4];
digi[5]= prov[5];
limpadado();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"DIGITE NOVAMENTE"); // informa para digitar novamente
Delay_ms(2000);
teclado();
if(prov[6]!= 0 || prov[7]!= 0 || prov[8]!= 0){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"MAXIMO 6 DIGITOS");
Lcd_Out(2,1,"TENTE NOVAMENTE");
limpadado();
delay_ms(2000);
continue;
}
if (digi[0]== prov[0] && // testa se as senhas estão iguais
digi[1]== prov[1] &&
digi[2]== prov[2] &&
digi[3]== prov[3] &&
digi[4]== prov[4] &&
digi[5]== prov[5]){

EEPROM_Write(8,prov[0]); // armazena os nova senha na memoria eprom valor que esta no vetor
EEPROM_Write(9,prov[1]); // que na função teclado recebeu o valor digitado
EEPROM_Write(10,prov[2]);
EEPROM_Write(11,prov[3]);
EEPROM_Write(12,prov[4]);
EEPROM_Write(13,prov[5]);
EEPROM_Write(14,49); // armazena o valor 1 na memoria eprom, para que na inicialização não regrave a senha
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"SENHA ALTERADA");
Lcd_Out(2,1," COM SUCESSO");
Delay_ms(2000);
limpadado();
opc=1;
break;
}
else {
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"SENHAS DIGITADAS"); // caso na hora de confirmar a senha elas não baterem
Lcd_Out(2,1," *NAO CONFEREM*");
delay_ms(2000);
Lcd_Out(1,1,"TENTE NOVAMENTE");
delay_ms(1500);
limpadado();
continue;
}
if (prov[0]== 50) { // se foi digitado a opção 2
opc = 1; // variavel recebe 1 para não entrar na função verifica senha
limpadado(); // limpa dados digitados
break; // para o laço
}
while(prov[0]!= 49 || prov[0]!=50) { // se foi digitado valor diferentes de 1 e 2
// retorna para a escolha da opção novamente
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"VALOR INVALIDO"); // informa o erro
Lcd_Out(2,1,"DIGI. NOVAMENTE");
Delay_ms(2000);
limpadado();
break;
}
}
} while (1);
}


void alterasenha(){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"*ALTERAR SENHA*"); // imprime para o usuario a opção a selecionar
Lcd_Out(2,1,"*1-SIM *2-NAO");
delay_ms(1500);

do {
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"*1-SIM *2-NAO");
teclado(); // aguarda a o usuario digitar a opção

if (prov[0] == 49){ // se ecolheu 1 aguarda ele digitar a senha at
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1," *SENHA ATUAL*");
limpadado(); // limpa dado que foi digitado anteriormente
delay_ms(2000);
teclado(); // chama função para ler teclado e armazena no vetor
if (EEPROM_Read(2) == prov[0] && // le o valor da memoria eprom corespondente ao endereço e testa com o valor digitado
EEPROM_Read(3) == prov[1] &&
EEPROM_Read(4) == prov[2] &&
EEPROM_Read(5) == prov[3] &&
EEPROM_Read(6) == prov[4] &&
EEPROM_Read(7) == prov[5]){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1," *SENHA CONFERE*"); // imprime a se a senha foi digitada certa
limpadado();
Delay_ms(2000); // temporiza 2 segundos
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"DIG. NOVA SENHA"); // informa para digitar nova senha
Delay_ms(2000);
teclado(); // aguarda a nova senha
if(prov[6]!= 0 || prov[7]!= 0 || prov[8]!= 0){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"MAXIMO 6 DIGITOS");
Lcd_Out(2,1,"TENTE NOVAMENTE");
limpadado();
delay_ms(2000);
continue;
}
digi[0]= prov[0]; // vetor recebe valor digitados
digi[1]= prov[1];
digi[2]= prov[2];
digi[3]= prov[3];
digi[4]= prov[4];
digi[5]= prov[5];
limpadado();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"DIGITE NOVAMENTE"); // informa para digitar novamente
Delay_ms(2000);
teclado();
if(prov[6]!= 0 || prov[7]!= 0 || prov[8]!= 0){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"MAXIMO 6 DIGITOS");
Lcd_Out(2,1,"TENTE NOVAMENTE");
limpadado();
delay_ms(2000);
continue;
}
if (digi[0]== prov[0] && // testa se as senhas estão iguais
digi[1]== prov[1] &&
digi[2]== prov[2] &&
digi[3]== prov[3] &&
digi[4]== prov[4] &&
digi[5]== prov[5]){

EEPROM_Write(2,prov[0]); // armazena os nova senha na memoria eprom valor que esta no vetor
EEPROM_Write(3,prov[1]); // que na função teclado recebeu o valor digitado
EEPROM_Write(4,prov[2]);
EEPROM_Write(5,prov[3]);
EEPROM_Write(6,prov[4]);
EEPROM_Write(7,prov[5]);
EEPROM_Write(1,49); // armazena o valor 1 na memoria eprom, para que na inicialização não regrave a senha
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"SENHA ALTERADA");
Lcd_Out(2,1," COM SUCESSO");
Delay_ms(2000);
limpadado();
opc=1;
break;
}
else {
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"SENHAS DIGITADAS"); // caso na hora de confirmar a senha elas não baterem
Lcd_Out(2,1," *NAO CONFEREM*");
delay_ms(2000);
Lcd_Out(1,1,"TENTE NOVAMENTE");
delay_ms(1500);
limpadado();
continue;
}
}
}

if (prov[0]== 50) { // se foi digitado a opção 2

opc = 1; // variavel recebe 1 para não entrar na função verifica senha
limpadado(); // limpa dados digitados
break; // para o laço
}
while(prov[0]!= 49 || prov[0]!=50) {

Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"VALOR INVALIDO"); // informa o erro
Lcd_Out(2,1,"TENTE NOVAMENTE");
Delay_ms(2000);
limpadado();
break;
}
} while (1);
}

void main() {
if (EEPROM_Read(1)!= 49) {
EEPROM_Write(2,49); // armazena os valores da senha certa no na memoria eprom 1,2,3,4,5,6 de acordo com a tabela ascii
EEPROM_Write(3,50);
EEPROM_Write(4,51);
EEPROM_Write(5,52);
EEPROM_Write(6,53);
EEPROM_Write(7,54);
}
// if (EEPROM_Read(14)!= 49){
EEPROM_Write(8,54); // armazena senha de coação na memoria eprom correnpondente ao seua endereço 6,5,4,3,2,1 de acordo com a tabela ascii
EEPROM_Write(9,53);
EEPROM_Write(10,52);
EEPROM_Write(11,51);
EEPROM_Write(12,50);
EEPROM_Write(13,49);
// }
TRISC = 0b00000000; PORTC = 0b00000000;
cont=0;
Keypad_Init(); // inicializa teclado
Lcd_Init(); //inicializa lcd
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
portc.rc2=1;
Lcd_Out(1,1,"*CENTRO P.SOUZA*"); // mensagem inicial
Lcd_Out(2,2,"BEM VINDO...");
Delay_ms(1800);
portc.rc2= 0;
Delay_ms(100);
portc.rc2=1;
portc.rc1= 1; // faz sequencia de bips ao iniciar
Delay_ms(100);
portc.rc1= 0;
portc.RC2=0;
while (1){
opc=0;
cnt = 0; // para tratamento de erro variavel cnt recebe 0
Lcd_Cmd(_LCD_CLEAR); //limpa lcd
Lcd_Cmd(_LCD_CURSOR_OFF); //desliga cursor do lcd
Lcd_Out(1, 1, "DIGITE A SENHA:");
teclado(); //chama a função para fazer uma varredura no teclado
if (tecla == 35){ // testa se foi press '#'
if (prov[1]== 0){ // testa se não foi digitado algum valor
alterasenha();
opc=1; // variavel recebe um para não entar na função valida senha
}
if (opc == 0){ //
validasenha();
}
if (prov[0]==49){ // Se o vetor recebeu 49 ou seja 1 chama função a para alterar senha da coação
// alteracoacao(); quando valido essa função programa não inicializa
}
}
}
}
short kp, tecla;

Link para o comentário
Compartilhar em outros sites

olha amigo, não analisei o código ainda, então não sei o que pode ser, mas você disse que esta trabalhando com 20MHz, e o titulo é "......protoboard......." ai estão duas coisas que não combinam de modo algum, altas frequências e protoboard! tenta diminuir a frquencia pra sei la.... uns 4MHz, ou monte a placa, ai nela sim coloque tal frequência

flowwww

Link para o comentário
Compartilhar em outros sites

Montei uma placa de teste também da o mesmo erro ja verifiquei tudo e continua ja ate coloquei uma programa de teste de piscar Leds em cada Conjunto de porta (funciona normal), porém quando coloco um programa de teste só pra imprimir para o display porém o programa não funciona na placa, Protobord, porém esse programa de teste funciona normal no Isis, O que se

ra que acontece???

Link para o comentário
Compartilhar em outros sites

Amigão, debuiei seu projeto hoje. Cheguei em casa e fiquei muito tempo aqui tentando caçar o problema. Devo dizer que não achei nenhum problema na logica, até mesmo porque não analisei isso, fiquei analisando as partes funcionais, tipo como estava sendo feita a leitura da keypad, sintaxe das funções, fiquei caçando erros comuns nas programações e nada. Até que comecei a simular no proteus e ver o que virava. No começo seu prograva funcionava normal e depois travava, ai tinha que dar stop no projeto e play novamente, até que vi que era meu proteus que tinha um leve bug na keypad, então substitui tudo por botões e seu programa funcionou perfeitamente, ai me ocorreu que ali no proteus funcionaria sim perfeitamente sem os resistores de pull down mas não fora do proteus, na verdade esse erro fora do proteus é imperdoável mesmo, erro na certa, o pic não funcionaria mas nem que a vaca tussa.

assim é o modo que eu tive que simular

http://imageshack.us/a/img59/166/ummp.jpg

essas são as alterações que você deve fazer no hardware

http://imageshack.us/a/img268/340/z0ok.jpg

perceba que cada pino do portd tem um resistor ligando ao terra

se persistirem os sintomas, ou se já ha esses resistores na sua placa, e você só não os desenhou pra facilitar, nos contate novamente que veremos novamente.

flowwwww

Link para o comentário
Compartilhar em outros sites

Bom de fato não coloquei esses resistores porque no teclado do Isis não aceita ele simplesmente trava mais na minha placa o três resistores estão lá nas 3 colunas, ligado com o terra.

tenho uma mesma versão desse programa bem mais simples só com o controle de acesso com duas senha bem menos lógica, bom o programa funciona normal no pic 16f877A 20MHZ so tem menos lógica não tem tratamento de erro, não tem rotina de alterar a senha. Ele ta No Pic Hardware real rodando sem nenhum problema sem nenhuma diferença do Esquema Elétrico somente com o pic é claro

short kp, tecla;
short prov[9];
short cnt = 0;
short cont;
// Keypad module connections
char keypadPort at PORTD;
// End Keypad module connections

// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

void AcionaPorta(){
portc.rc0 = 1; // manda nivel logico 1 para a porta rc0
portc.RC2 =1;// manda nivel logico 1 para o buzzer
Delay_ms(3000);
portc.rc0= 0; // manda nivel logico 0 para a porta rc0
portc.RC2=0; // manda nivel logico zero para o buzzer
}

void teclado(){
do {
kp = 0;

do

kp = Keypad_Key_Click(); // Store key code in kp variable
while (!kp);

switch (kp) {
case 1: kp = 49; break; // 1
case 2: kp = 50; break; // 2
case 3: kp = 51; break; // 3
case 5: kp = 52; break; // 4
case 6: kp = 53; break; // 5
case 7: kp = 54; break; // 6
case 9: kp = 55; break; // 7
case 10: kp = 56; break; // 8
case 11: kp = 57; break; // 9
case 13: kp = 42; break; // *
case 14: kp = 48; break; // 0
case 15: kp = 35; break; // #
}

if (kp != 42){ // testa se * foi digitado,
prov[cnt] = kp;
cnt++;
Lcd_Chr(2,cnt,42);
}
else{
if (prov[0]!=0){
Lcd_Chr(2,cnt,32); //caso for limpa lcd
cnt--;
prov[cnt]= 0;
}
}
tecla = kp;
portc.rc1= 1; // manda nivel logico 1 temporiza e depois manda nivel logico 0
portc.rc2=1;//manda nivel logico 1 para o buzzer
Delay_ms(90); //porta rc1 fazendo que ao digitar uma numero o led pisca
portc.rc1= 0;
portc.RC2=0;// manda logico 0 para o buzzer

} while (kp !=35);
}
void menu(){
Lcd_Out(1,1,"*ALTERAR SENHA*");
Lcd_Out(2,1,"*1 SIM 2 NAO*");
}

void main() {
Adcon1=1011;
EEPROM_Write(2,49); // armazena os valores da senha certa no na memoria eprom 1,2,3,4,5,6 de acordo com a tabela ascii
EEPROM_Write(3,50);
EEPROM_Write(4,51);
EEPROM_Write(5,52);
EEPROM_Write(6,53);
EEPROM_Write(7,54);

EEPROM_Write(8,54); // armazena senha de coação na memoria eprom correnpondente ao seua endereço 6,5,4,3,2,1 de acordo com a tabela ascii
EEPROM_Write(9,53);
EEPROM_Write(10,52);
EEPROM_Write(11,51);
EEPROM_Write(12,50);
EEPROM_Write(13,49);
trisa.ra0=0;
TRISC = 0b00000000; PORTC = 0b00000000;
cont=0;
Keypad_Init(); // inicializa teclado
Lcd_Init(); //inicializa lcd
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
portc.rc2=1;
Lcd_Out(1,1,"*CENTRO P.SOUZA*");
Lcd_Out(2,2,"BEM VINDO...");
Delay_ms(1600);
portc.rc2= 0;
Delay_ms(100);
portc.rc2=1;
portc.rc1= 1;
Delay_ms(100);
portc.rc1= 0;
portc.RC2=0;
while (1){
cnt = 0; // para tratamento de erro variavel cnt recebe 0
Lcd_Cmd(_LCD_CLEAR); //limpa lcd
Lcd_Cmd(_LCD_CURSOR_OFF); //desliga cursor do lcd
Lcd_Out(1, 1, "DIGITE A SENHA:");
teclado(); //chama a função para fazer uma varredura no teclado
if (tecla == 35){ // testa se foi press '#'
// if (prov[0]== 0){
// menu();
// }
if (EEPROM_Read(8)== prov[0] && // testa se o modo coação foi ativado
EEPROM_Read(9)== prov[1] &&
EEPROM_Read(10)== prov[2] &&
EEPROM_Read(11)== prov[3] &&
EEPROM_Read(12)== prov[4] &&
EEPROM_Read(13)== prov[5]){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1,"*ACESSO LIBERADO*");
Lcd_Out(2, 1," *MODO COACAO*");
if (cont==0){
porta.Ra0=1;
cont=1;
AcionaPorta();
}
else {
// Lcd_Out(2,1,"*COACAO DESATIVADO*");
porta.Ra0=0;
cont=0;
AcionaPorta();
}
tecla=0;
for (tecla=0;tecla<6;tecla++){ // laço para limpar variavel vetor que recebeu o valor Digitado
cnt -- ;
prov[cnt]=0;
}
}
else{
if (EEPROM_Read(2) == prov[0] && // le o valor da memoria eprom corespondente ao endereço e testa com o valor digitado
EEPROM_Read(3) == prov[1] &&
EEPROM_Read(4) == prov[2] &&
EEPROM_Read(5) == prov[3] &&
EEPROM_Read(6) == prov[4] &&
EEPROM_Read(7) == prov[5]){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1,"*ACESSO LIBERADO*");
lcd_out(2,1," PORTA ABERTA");
//portc.RC4=0;
AcionaPorta(); //chama a função para abrir a porta
tecla=0;

for (tecla=0;tecla<6;tecla++){// laço para limpar variavel vetor que recebeu o valor Digitado
cnt -- ;
prov[cnt]=0;
}
}
else{
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1, " *ACESSO NEGADO*");
lcd_out(2,1,"DIGITE NOVAMENTE");
Delay_ms(3000);
tecla = 0;
for (tecla=0;tecla<6;tecla++){ // laço para limpar variavel vetor que recebeu o valor Digitado
cnt -- ;
prov[cnt]=0;
}
}

}

if (tecla == 42){ // testa se '*' foi presionado
Lcd_Chr(2,cnt,32); //caso for limpa lcd digito a digito
cnt--;
prov[cnt]= 0; // mada zero para o vetor que esta o valor digitado
}
}
}
}

Não Acredito Q o teclado eteja Errado se não essa programação não funcionaria, ao não ser que se configure o teclado diferente no pic 18f452

to suspeitando Do clok por acaso você sabe como tem ser o clok do Pic 18f452

Se é igual Ao do 16f877A? To pesquisando. Olhei No data sheet aparentemente são iguais quando se trabalha na Frequência de 20MHZ

post-1065722-13884966864144_thumb.jpg

post-1065722-13884966865034_thumb.jpg

Link para o comentário
Compartilhar em outros sites

cara, só complementado minha fala anterior, os 8 pinos do portd tem que estarem aterrados, a biblioteca do microC trabalha transformando em entrada os pinos na multplexação da leitura do teclado, ou seja apenas um pino do pic fica sendo saída por vez, logo em algum momento todos os pinos ficam flutuando se não tiver os resistores aterrando-os, por isso repito, OS 8 PINOS DO PORTD PRECISAM ESTAR ATERRADOS

quanto ao clock, se você não habilitou o PLL não ha problemas em trabalhar com 20MHz agora se habilitou dará problemas, pois o pic não suportaria tal frequencia

vou analisar mais um pouco o esquema e programa e daqui a pouco falo algo mais se encontrar

flowww

Link para o comentário
Compartilhar em outros sites

acrescentei os resistores na placa em todas portas que está o teclado, bem continua a presentar o mesmo defeito com o pic 18f452, agora com o pic 16f877a no qual esta funcionando o programa mais simples lembra, as vezes falhava quando você apertava um tecla, agora vejo que a resposta melhorou bastante sem falhar nenhuma vez.

Mas com o pic 18f452:confused::confused::wacko::wacko:

Link para o comentário
Compartilhar em outros sites

amigão, você viu o tal do PLL que eu falei. É assim, o PLL é um circuito que multiplica a frequência por 4, mas a velocidade máxima do pic 18f452 é 40MHz, ou seja se você colocar um cristal de 10MHz e habilitar o PLL o pic oscila a 40MHz, sua frequência máxima, e se você colocar um de 20MHz ele deveria oscilar a 80MHz, só que o poc não aguenta essa frequência e acaba não oscilando, ou seja se você colocar um cristal de 20MHz o PLL deve estar desabilitado

para ver, aperte tudo junto, ctrl+shift+E e na área para escolher o oscilador vai ter, entre outros HS e HS WITH PLL, escolha a opção HS

flowww

Link para o comentário
Compartilhar em outros sites

O PLL pra so aparece na hora de gravar, pois eu Uso a placa PICK150 com o software MicroBurn, Na hora De gravar escolhe o Pic a ser programado, em seguida eu escolho o arquivo HEXA, depois configuro Os fuses na Opção Oscilador eu tenho as seguintes configurações de CloK( RC0RA6, HSPLL, ECO2RA6, ECO2CLKOUT, RC, HS, XT, LP), testei com todas as opções sem sucesso, mas usando 20MHZ.

Mas agora q você falou do HSPLL func com 10MHZ vou testar

Link para o comentário
Compartilhar em outros sites

cara só uma pergunta que é meio tonta mas já aconteceu comigo, por um pouco de desatenção. Na hora de recompilar o programa, você re-seleciona o pic que esta usando?

exemplo: você quer testar com o pic 16F877A ai você vai la compila e grava, ai funciona normalmente, então você resolve testar com o 18F452, então você aperta ctrl+shift+E e seleciona o pic 18F452 e compila e grava no pic. ou você simplesmente pega o hexadecimal que você gravou no 16F877A e coloca no 18F452????

e ia esquecendo também, falta essas configurações no seu pic


intcon1=0x00;
intcon2=0x00;
intcon3=0x00;
adcon1=0x06;
adcon0=0x00;

E FALTA A CONFIGURAÇÃO DO TRISE QUE É IMPORTANTÍSSIMA, ele não só cuida do portE como tambem cuida do portd, o portD e o portE estão envolvidos em uma comunicação serial paralela, e sem configurar o trisE o portD não funciona, ja aconteceu isso comigo. A configurção deve seguir o datasheet

n977.th.jpg

mas explicando rapidamente, os bits 3 ATÉ O 7 devem ser 0 (ZERO) e os outros, de 0 até o 2, é configuração normal

flowwww

Link para o comentário
Compartilhar em outros sites

Bom fiz as configurações na programa , testei com hsPLL ativado usando uma frequência de 10MHZ e nada, testei em HS COM 20 MHz e também sem sucesso

notei que ao iniciar que a porta RC2 em que esta um BUZZER ele aciona mas so um pequeno Bip sendo que seria um bip longo, é como se o programa do Pic Tentasse inicializar, mas não inicializa. assim que ligo ele faz isso..:wacko::wacko::wacko:

bom no display fica todo preto, ainda acho que pode ser uma configuração dos fuses na hora de gravar..

Eu uso a Placa PICK150 para gravar o pic 18f452 tenho que fazer uma conversão do arquivo HEXA,essa conversão é so na familia 18f.Acredito q isso altera os fuses do código.fiz uma comparação com os fuses do MIcroC, configurei iGual estava no Microc. mas também sem sucesso:wacko::wacko:

O q Sera???

Link para o comentário
Compartilhar em outros sites

amigão, fiquei sem recursos de te ajudar agora, não imagino o que esta acontecendo, o pic esta bom, funciona em outras funções? Cara só vejo um jeito agora, vou montar o projeto aqui em casa, com o seu esquema, gravar o seu programa no meu pic e testar e ver o que acontece

depois que terminar te aviso o que aconteceu

flowww

cara troca esse pic hahahaha, eu montei e fiz tudo o circuito na real mesmo, e funcionou certinho! estou upando um vídeo escro.... que eu fiz só pra mostrar funcionando mesmo

flowwww

Link para o comentário
Compartilhar em outros sites

aqui esta o vídeo cara, eu não sabia qual era a senha por isso só dava acesso negado! a luzinha acendeu direitinho, é aquela luz amarela que aparece no final do vídeo, dentro do que eu esperava funcionou perfeitamente! não sei a logica se havia erros, pos não sabia exatamente como funcionava, mas funcionou.

aqui esta o video

[ame=http://www.youtube.com/watch?v=2m9eU3O_uHo]20131011 173605 - YouTube[/ame]

não alterei nada do seu código apenas acrescentei essas configurações aqui


intcon=0x00;
intcon1=0x00;
intcon2=0x00;
intcon3=0x00;
adcon1=0x06;
adcon0=0x00;
trise=0x00;

esse foi o código que eu gravei


short kp, tecla;
short prov[9];
short digi[9];
short cnt = 0;
short cont,erro,opc,cbn;

// Keypad module connections
char keypadPort at PORTD;
// End Keypad module connections

// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

void AcionaPorta(){
portc.rc0 = 1; // manda nivel logico 1 para a porta rc0
portc.RC2 =1;// manda nivel logico 1 para o buzzer
Delay_ms(3000);
portc.rc0= 0; // manda nivel logico 0 para a porta rc0
portc.RC2=0; // manda nivel logico zero para o buzzer
}

void teclado(){
do {
kp = 0;

do

kp = Keypad_Key_Click(); // Store key code in kp variable
while (!kp);

switch (kp) {
case 1: kp = 49; break; // 1
case 2: kp = 50; break; // 2
case 3: kp = 51; break; // 3
case 5: kp = 52; break; // 4
case 6: kp = 53; break; // 5
case 7: kp = 54; break; // 6
case 9: kp = 55; break; // 7
case 10: kp = 56; break; // 8
case 11: kp = 57; break; // 9
case 13: kp = 42; break; // *
case 14: kp = 48; break; // 0
case 15: kp = 35; break; // #
}

if (kp != 42 && kp != 35){ // testa se * foi digitado,
prov[cnt] = kp;
cnt++;
Lcd_Chr(2,cnt,42);
}
else{
if (kp == 42){
if (prov[0]!=0){ //limpa o vetor ate a posição 0 do vetor estiver zerada
Lcd_Chr(2,cnt,32); //caso for limpa lcd
cnt--;
prov[cnt]= 0;
}
}
}
tecla = kp;
portc.rc1= 1; // manda nivel logico 1 temporiza e depois manda nivel logico 0
portc.rc2=1;//manda nivel logico 1 para o buzzer
Delay_ms(90); //porta rc1 fazendo que ao digitar uma numero o led pisca
portc.rc1= 0;
portc.RC2=0;// manda logico 0 para o buzzer

} while (kp !=35);
}
void limpadado(){
tecla=0;
for (tecla=0;tecla<10;tecla++){ // laço para limpar variavel vetor que recebeu o valor Digitado
if (prov[0]!=0){
cnt -- ;
prov[cnt]=0;
}
}
}
void validasenha(){
if (EEPROM_Read(8)== prov[0] && // testa se o modo coação foi ativado
EEPROM_Read(9)== prov[1] &&
EEPROM_Read(10)== prov[2] &&
EEPROM_Read(11)== prov[3] &&
EEPROM_Read(12)== prov[4] &&
EEPROM_Read(13)== prov[5]){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1,"*ACESSO LIBERADO*");
Lcd_Out(2, 1," *MODO COACAO*");
if (cont==0){ // se variavel é igual a zero indica que o modo coação não foi acionado
portc.RC4=1;
cont=1; // variavel recebe 1 para registar que o modo coação ja foi acionado
AcionaPorta(); // chama função para abrir a porta
erro=0; // zera variavel que conta erros
}
else {
Lcd_Out(2,1,"*COACAO DESATIVADO*");
delay_ms(2000);
portc.RC4=0;
cont=0;
AcionaPorta(); // chama função para abrir porta
erro=0; // zera variavel que conta erros
}
limpadado(); // função para limpar dados digitados
}
else{
if (EEPROM_Read(2) == prov[0] && // le o valor da memoria eprom corespondente ao endereço e testa com o valor digitado
EEPROM_Read(3) == prov[1] &&
EEPROM_Read(4) == prov[2] &&
EEPROM_Read(5) == prov[3] &&
EEPROM_Read(6) == prov[4] &&
EEPROM_Read(7) == prov[5]){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1,"*ACESSO LIBERADO*");
lcd_out(2,1," PORTA ABERTA");
AcionaPorta(); //chama a função para abrir a porta
limpadado(); // limpa dados digitados
erro=0; // zera contador de erros quando digita senha certa
}
else{
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1, " *ACESSO NEGADO*");
lcd_out(2,1,"DIGITE NOVAMENTE");
Delay_ms(3000);
limpadado(); // limpa dados digitados
erro++; // a cada erro somo a mais 1 na variavel
if (erro >= 4){ // testa variavel que conta o numeros de tentativas
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1,"+3 DE TENTAVIVAS");
lcd_out(2,1,"CENTRAL ACIONADA");
Delay_ms(3000);
portc.RC4=1; // manda nivel logico alto para a central de segurança
cont=1; //variavel recebe um também para testes logico
erro =0;
}
}
}
}
void alteracoacao(){

Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"*ALTERAR COACAO*"); // imprime para o usuario a opção a selecionar
Lcd_Out(2,1,"*1-SIM *2-NAO");
delay_ms(1500);

do {
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"*1-SIM *2-NAO");
limpadado();
teclado(); // aguarda a o usuario digitar a opção
if (prov[0] == 49){ // se ecolheu 1 aguarda ele digitar a senha at
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1," *SENHA ATUAL*");
limpadado(); // limpa dado que foi digitado anteriormente
delay_ms(2000);
teclado(); // chama função para ler teclado e armazena no vetor
cbn=0;
}
if (EEPROM_Read(8) == prov[0] && // le o valor da memoria eprom corespondente ao endereço e testa com o valor digitado
EEPROM_Read(9) == prov[1] &&
EEPROM_Read(10) == prov[2] &&
EEPROM_Read(11) == prov[3] &&
EEPROM_Read(12) == prov[4] &&
EEPROM_Read(13) == prov[5]){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1," *SENHA CONFERE*"); // imprime a se a senha foi digitada certa
limpadado();
Delay_ms(2000); // temporiza 2 segundos
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"DIG. NOVA SENHA"); // informa para digitar nova senha
Delay_ms(2000);
teclado(); // aguarda a nova senha
if(prov[6]!= 0 || prov[7]!= 0 || prov[8]!= 0){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"MAXIMO 6 DIGITOS");
Lcd_Out(2,1,"TENTE NOVAMENTE");
limpadado();
delay_ms(2000);
continue;
}

digi[0]= prov[0]; // vetor recebe valor digitados
digi[1]= prov[1];
digi[2]= prov[2];
digi[3]= prov[3];
digi[4]= prov[4];
digi[5]= prov[5];
limpadado();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"DIGITE NOVAMENTE"); // informa para digitar novamente
Delay_ms(2000);
teclado();
if(prov[6]!= 0 || prov[7]!= 0 || prov[8]!= 0){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"MAXIMO 6 DIGITOS");
Lcd_Out(2,1,"TENTE NOVAMENTE");
limpadado();
delay_ms(2000);
continue;
}
if (digi[0]== prov[0] && // testa se as senhas estão iguais
digi[1]== prov[1] &&
digi[2]== prov[2] &&
digi[3]== prov[3] &&
digi[4]== prov[4] &&
digi[5]== prov[5]){

EEPROM_Write(8,prov[0]); // armazena os nova senha na memoria eprom valor que esta no vetor
EEPROM_Write(9,prov[1]); // que na função teclado recebeu o valor digitado
EEPROM_Write(10,prov[2]);
EEPROM_Write(11,prov[3]);
EEPROM_Write(12,prov[4]);
EEPROM_Write(13,prov[5]);
EEPROM_Write(14,49); // armazena o valor 1 na memoria eprom, para que na inicialização não regrave a senha
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"SENHA ALTERADA");
Lcd_Out(2,1," COM SUCESSO");
Delay_ms(2000);
limpadado();
opc=1;
break;
}
else {
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"SENHAS DIGITADAS"); // caso na hora de confirmar a senha elas não baterem
Lcd_Out(2,1," *NAO CONFEREM*");
delay_ms(2000);
Lcd_Out(1,1,"TENTE NOVAMENTE");
delay_ms(1500);
limpadado();
continue;
}
if (prov[0]== 50) { // se foi digitado a opção 2
opc = 1; // variavel recebe 1 para não entrar na função verifica senha
limpadado(); // limpa dados digitados
break; // para o laço
}
while(prov[0]!= 49 || prov[0]!=50) { // se foi digitado valor diferentes de 1 e 2
// retorna para a escolha da opção novamente
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"VALOR INVALIDO"); // informa o erro
Lcd_Out(2,1,"DIGI. NOVAMENTE");
Delay_ms(2000);
limpadado();
break;
}
}
} while (1);
}


void alterasenha(){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"*ALTERAR SENHA*"); // imprime para o usuario a opção a selecionar
Lcd_Out(2,1,"*1-SIM *2-NAO");
delay_ms(1500);

do {
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"*1-SIM *2-NAO");
teclado(); // aguarda a o usuario digitar a opção

if (prov[0] == 49){ // se ecolheu 1 aguarda ele digitar a senha at
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1," *SENHA ATUAL*");
limpadado(); // limpa dado que foi digitado anteriormente
delay_ms(2000);
teclado(); // chama função para ler teclado e armazena no vetor
if (EEPROM_Read(2) == prov[0] && // le o valor da memoria eprom corespondente ao endereço e testa com o valor digitado
EEPROM_Read(3) == prov[1] &&
EEPROM_Read(4) == prov[2] &&
EEPROM_Read(5) == prov[3] &&
EEPROM_Read(6) == prov[4] &&
EEPROM_Read(7) == prov[5]){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1," *SENHA CONFERE*"); // imprime a se a senha foi digitada certa
limpadado();
Delay_ms(2000); // temporiza 2 segundos
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"DIG. NOVA SENHA"); // informa para digitar nova senha
Delay_ms(2000);
teclado(); // aguarda a nova senha
if(prov[6]!= 0 || prov[7]!= 0 || prov[8]!= 0){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"MAXIMO 6 DIGITOS");
Lcd_Out(2,1,"TENTE NOVAMENTE");
limpadado();
delay_ms(2000);
continue;
}
digi[0]= prov[0]; // vetor recebe valor digitados
digi[1]= prov[1];
digi[2]= prov[2];
digi[3]= prov[3];
digi[4]= prov[4];
digi[5]= prov[5];
limpadado();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"DIGITE NOVAMENTE"); // informa para digitar novamente
Delay_ms(2000);
teclado();
if(prov[6]!= 0 || prov[7]!= 0 || prov[8]!= 0){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"MAXIMO 6 DIGITOS");
Lcd_Out(2,1,"TENTE NOVAMENTE");
limpadado();
delay_ms(2000);
continue;
}
if (digi[0]== prov[0] && // testa se as senhas estão iguais
digi[1]== prov[1] &&
digi[2]== prov[2] &&
digi[3]== prov[3] &&
digi[4]== prov[4] &&
digi[5]== prov[5]){

EEPROM_Write(2,prov[0]); // armazena os nova senha na memoria eprom valor que esta no vetor
EEPROM_Write(3,prov[1]); // que na função teclado recebeu o valor digitado
EEPROM_Write(4,prov[2]);
EEPROM_Write(5,prov[3]);
EEPROM_Write(6,prov[4]);
EEPROM_Write(7,prov[5]);
EEPROM_Write(1,49); // armazena o valor 1 na memoria eprom, para que na inicialização não regrave a senha
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"SENHA ALTERADA");
Lcd_Out(2,1," COM SUCESSO");
Delay_ms(2000);
limpadado();
opc=1;
break;
}
else {
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"SENHAS DIGITADAS"); // caso na hora de confirmar a senha elas não baterem
Lcd_Out(2,1," *NAO CONFEREM*");
delay_ms(2000);
Lcd_Out(1,1,"TENTE NOVAMENTE");
delay_ms(1500);
limpadado();
continue;
}
}
}

if (prov[0]== 50) { // se foi digitado a opção 2

opc = 1; // variavel recebe 1 para não entrar na função verifica senha
limpadado(); // limpa dados digitados
break; // para o laço
}
while(prov[0]!= 49 || prov[0]!=50) {

Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"VALOR INVALIDO"); // informa o erro
Lcd_Out(2,1,"TENTE NOVAMENTE");
Delay_ms(2000);
limpadado();
break;
}
} while (1);
}

void main() {
if (EEPROM_Read(1)!= 49) {
EEPROM_Write(2,49); // armazena os valores da senha certa no na memoria eprom 1,2,3,4,5,6 de acordo com a tabela ascii
EEPROM_Write(3,50);
EEPROM_Write(4,51);
EEPROM_Write(5,52);
EEPROM_Write(6,53);
EEPROM_Write(7,54);
}
// if (EEPROM_Read(14)!= 49){
EEPROM_Write(8,54); // armazena senha de coação na memoria eprom correnpondente ao seua endereço 6,5,4,3,2,1 de acordo com a tabela ascii
EEPROM_Write(9,53);
EEPROM_Write(10,52);
EEPROM_Write(11,51);
EEPROM_Write(12,50);
EEPROM_Write(13,49);
// }
TRISC = 0b00000000; PORTC = 0b00000000;
intcon=0x00;
intcon1=0x00;
intcon2=0x00;
intcon3=0x00;
adcon1=0x06;
adcon0=0x00;
trise=0x00;
cont=0;
Keypad_Init(); // inicializa teclado
Lcd_Init(); //inicializa lcd
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
portc.rc2=1;
Lcd_Out(1,1,"*CENTRO P.SOUZA*"); // mensagem inicial
Lcd_Out(2,2,"BEM VINDO...");
Delay_ms(1800);
portc.rc2= 0;
Delay_ms(100);
portc.rc2=1;
portc.rc1= 1; // faz sequencia de bips ao iniciar
Delay_ms(100);
portc.rc1= 0;
portc.RC2=0;
while (1){
opc=0;
cnt = 0; // para tratamento de erro variavel cnt recebe 0
Lcd_Cmd(_LCD_CLEAR); //limpa lcd
Lcd_Cmd(_LCD_CURSOR_OFF); //desliga cursor do lcd
Lcd_Out(1, 1, "DIGITE A SENHA:");
teclado(); //chama a função para fazer uma varredura no teclado
if (tecla == 35){ // testa se foi press '#'
if (prov[1]== 0){ // testa se não foi digitado algum valor
alterasenha();
opc=1; // variavel recebe um para não entar na função valida senha
}
if (opc == 0){ //
validasenha();
}
if (prov[0]==49){ // Se o vetor recebeu 49 ou seja 1 chama função a para alterar senha da coação
// alteracoacao(); quando valido essa função programa não inicializa
}
}
}
}

esse foi o hexadecimal gerado pelo meu compilador


:1000000012EF06F00000000000EF00F0000000001A
:0A0010000000000000000000F3D71C
:0C001C00A60E0D6E0D2EFED70000120087
:10002800480E0C6E6C0E0D6E0D2EFED70C2EFCD7E6
:0400380000001200B2
:0A003C00030E0D6E0D2EFED712000C
:0A004600210E0D6E0D2EFED71200E4
:1000500002011C6B1E6B1F6B100E206F040E1F5DC8
:100060001DE2F00E836E201D956EE8DFE7DF0F0EB8
:100070008314006E00C01DF200520AE01EC21CF282
:100080001D5304E01D331D9F1C2BFAD7040E1F6F58
:1000900020372091040E1E271F2BE0D71CC200F032
:0200A00012004C
:1000A20002011CBF02D0819601D081861CBD02D004
:1000B200819401D081841CBB02D0819201D08182C3
:1000C2001CB902D0819001D0818012B102D0818806
:1000D20001D08198818AB1DF819A1CB702D08196C2
:1000E20001D081861CB502D0819401D081841CB3D9
:1000F20002D0819201D081821CB102D0819001D0C4
:10010200818012B102D0818801D08198818A95DFE5
:0E011200819A12A102D087DF01D07FDF120098
:1001200097DF00C019F20F0E8314006E02E08BDF20
:08013000FAD719C200F0120019
:0E0138000201129119C21CF2B0DF12811200F6
:1001460010D0800E0201196F1AD0C00E196F17D089
:10015600940E196F14D0D40E196F11D0800E196F2A
:100166000ED002011951010AECE01951020AEDE024
:100176001951030AEDE01951040AEDE0EFD71A050B
:10018600006E1951002600C019F2128100C01CF23F
:0E01960085DF12911BC21CF281DF1281120064
:1001A400A69C14C2A9FFA69EA680A8CF00F01200A8
:1001B4000201086BB3DF00C008F20052FBE025D057
:1001C400310E0201086F46D0320E086F43D0330E51
:1001D400086F40D0340E086F3DD0350E086F3AD00A
:1001E400360E086F37D0370E086F34D0380E086FCC
:1001F40031D0390E086F2ED02A0E086F2BD0300E56
:10020400086F28D0230E086F25D002010851010A77
:10021400D7E00851020AD8E00851030AD8E008518F
:10022400050AD8E00851060AD8E00851070AD8E0C0
:100234000851090AD8E008510A0AD8E008510B0A03
:10024400D8E008510D0AD8E008510E0AD8E0085148
:100254000F0AD8E008512A0A1AE00851230A17E0C5
:10026400090EE16E020EE26E0101BE51E126000E9E
:10027400BEBFFF0EE22208C2E6FFBE2B020E020141
:10028400196FBEC11AF22A0E1B6F5BDF1AD0085118
:100294002A0A17E10951000A14E0020E196FBEC1BF
:1002A4001AF2200E1B6F4DDF0101BE07090EE16E2D
:1002B400020EE26EBE51E126000EBEBFFF0EE22228
:1002C400E66A08C213F282828284050E0B6E910ED6
:1002D4000C6ECF0E0D6E0D2EFED70C2EFCD70B2EF2
:1002E400FAD7000000008292829402010851230A86
:0602F400D8A45ED7120041
:1002FA0010D0800E0201146F1AD0C00E146F17D0DE
:10030A00940E146F14D0D40E146F11D0800E146F83
:10031A000ED002011451010AECE01451020AEDE078
:10032A001451030AEDE01451040AEDE0EFD7150564
:10033A00006E1451002600C014F200C01CF2ACDE9C
:10034A001291186B18511625E96E000E1721EA6EE4
:10035A00EE520BE018511625E96E000E1721EA6ECF
:0E036A00EECF19F2E4DE182BEDD7128112004F
:100378000201136B136B800E1319006E800E0A0AAC
:10038800005C13E20951000A0DE00101BE07090EE5
:10039800E16E020EE26EBE51E126000EBEBFFF0EF8
:0C03A800E222E66A0201132BE6D71200E5
:1003B400A6A202D00000FCD7A69C14C2A9FF15C2B5
:1003C400A8FFA69EA684F2CF00F0F29E550EA76E5B
:1003D400AA0EA76EA68200BE02D0F29E01D0F28EB3
:0403E400A6941200C9
:1003E80082808284990E0B6E310E0C6EA20E0D6EF9
:1003F8000D2EFED70C2EFCD70B2EFAD700008290BC
:0404080082941200C8
:06040C00FF0E956E1200C8
:100412000900F5CFE6FF0006FBE10106F9E1120053
:10042200939A93989390939293949396819A8198A6
:100432008196819481928190F6DDF5DDF4DD8182F1
:100442008180818AFADD819AEEDD818AF6DD819AE8
:10045200EADD818AF2DD819AE6DD8190818AEDDD35
:10046200819AE1DD818AE9DD819A81928186818AA0
:10047200E4DD819AD8DD81968180818ADEDD819AF0
:100482008190818ADADD819ACEDD818AD6DD819AF8
:100492008180818AD2DD819AC6DD8190818ACDDD1B
:1004A200819A8186818481828180818AC6DD819A56
:0804B200BADD02011281120003
:1004BA00080E0201146F71DE000E016E000E09BFF4
:1004CA00FF0E011802E109510018D8A47ED0090EC6
:1004DA00146F63DE000E016E000E0ABFFF0E0118D4
:1004EA0002E10A510018D8A470D00A0E146F55DE22
:1004FA00000E016E000E0BBFFF0E011802E10B5138
:10050A00001863E10B0E146F48DE000E016E000E38
:10051A000CBFFF0E011802E10C51001856E10C0E37
:10052A00146F3BDE000E016E000E0DBFFF0E0118A8
:10053A0002E10D51001849E10D0E146F2EDE000E76
:10054A00016E000E0EBFFF0E011802E10E510018D7
:10055A003CE1010E1C6FA0DD0C0E1C6F9DDD010E2F
:10056A00146F010E156F9C0E166F010E176FC0DE09
:10057A00020E146F010E156F8C0E166F010E176F97
:10058A00B7DE0751000A06E18288010E076F27DFEE
:10059A00066B19D0020E146F010E156F160E166F28
:1005AA00010E176FA5DE660E0B6E760E0C6EC10E6F
:1005BA000D6E0D2EFED70C2EFCD70B2EFAD7829875
:1005CA00076B0DDF066BD3DEC1D0020E146FE5DDBB
:1005DA00000E016E000E09BFFF0E011802E109515B
:1005EA0000185DE1030E146FD8DD000E016E000ED7
:1005FA000ABFFF0E011802E10A51001850E1040E69
:10060A00146FCBDD000E016E000E0BBFFF0E01183A
:10061A0002E10B51001843E1050E146FBEDD000E16
:10062A00016E000E0CBFFF0E011802E10C510018FA
:10063A0036E1060E146FB1DD000E016E000E0DBF1D
:10064A00FF0E011802E10D51001829E1070E146F7F
:10065A00A4DD000E016E000E0EBFFF0E011802E1AE
:10066A000E5100181CE1010E1C6F16DD0C0E1C6FDA
:10067A0013DD010E146F010E156F040E166F010EB5
:10068A00176F36DE020E146F010E156FF50E166F18
:10069A00000E176F2DDEA3DE6ADE066B57D0010E41
:1006AA001C6FFADC0C0E1C6FF7DC010E146F010EC6
:1006BA00156F2A0E166F010E176F1ADE020E146FCF
:1006CA00010E156F5D0E166F010E176F11DE990E72
:1006DA000B6E310E0C6EA20E0D6E0D2EFED70C2E69
:1006EA00FCD70B2EFAD7000042DE062B800E061925
:1006FA00006E800E040A005C29E3010E1C6FCCDC3C
:10070A000C0E1C6FC9DC010E146F010E156F4C0E16
:10071A00166F010E176FECDD020E146F010E156FC6
:10072A003B0E166F010E176FE3DD990E0B6E310E3D
:10073A000C6EA20E0D6E0D2EFED70C2EFCD70B2EB4
:0E074A00FAD700008288010E076F066B1200BE
:10075800010E02011C6FA1DC0C0E1C6F9EDC010E49
:10076800146F010E156FDD0E166F010E176FC1DDC8
:10077800020E146F010E156FED0E166F010E176F36
:10078800B8DD4D0E0B6E190E0C6E4F0E0D6E0D2E44
:10079800FED70C2EFCD70B2EFAD700000000010E56
:1007A8001C6F7BDC0C0E1C6F78DC010E146F010EC5
:1007B800156FBF0E166F010E176F9BDDF7DC095121
:1007C800310AD8A4EFD1010E1C6F67DC0C0E1C6F28
:1007D80064DC010E146F010E156FCE0E166F010E3C
:1007E800176F87DDC5DD660E0B6E760E0C6EC10EBB
:1007F8000D6E0D2EFED70C2EFCD70B2EFAD7D6DC9D
:10080800020E146FCBDC000E016E000E09BFFF0E46
:10081800011802E109510018D8A4C4D1030E146FBD
:10082800BDDC000E016E000E0ABFFF0E011802E1CA
:100838000A510018D8A4B6D1040E146FAFDC000E0C
:10084800016E000E0BBFFF0E011802E10B510018DC
:10085800D8A4A8D1050E146FA1DC000E016E000EFD
:100868000CBFFF0E011802E10C510018D8A49AD150
:10087800060E146F93DC000E016E000E0DBFFF0E06
:10088800011802E10D510018D8A48CD1070E146F7D
:1008980085DC000E016E000E0EBFFF0E011802E18E
:1008A8000E510018D8A47ED1010E1C6F51EC00F037
:1008B8000C0E1C6F51EC00F0010E146F010E156F39
:1008C800A20E166F000E176F14DD52DD660E0B6E4A
:1008D800760E0C6EC10E0D6E0D2EFED70C2EFCD7AB
:1008E8000B2EFAD7010E1C6F51EC00F00C0E1C6F8A
:1008F80051EC00F0010E146F010E156F920E166F79
:10090800000E176FF6DC660E0B6E760E0C6EC10EBF
:100918000D6E0D2EFED70C2EFCD70B2EFAD746DC0B
:100928000F51000A07E11051000A04E11151000AB1
:1009380001E128D0010E1C6F51EC00F00C0E1C6F69
:1009480051EC00F0010E146F010E156F810E166F39
:10095800000E176FCEDC020E146F010E156FB30E6A
:10096800166F000E176FC5DC03DD660E0B6E760E74
:100978000C6EC10E0D6E0D2EFED70C2EFCD70B2E55
:10098800FAD74AD109C2FDF10AC2FEF10BC2FFF142
:100998000CC200F20DC201F20EC202F2E9DC010E35
:1009A8001C6F51EC00F00C0E1C6F51EC00F0010EA6
:1009B800146F010E156FD40E166F000E176F99DCA9
:1009C800660E0B6E760E0C6EC10E0D6E0D2EFED7DA
:1009D8000C2EFCD70B2EFAD7DAEC00F00F51000AD8
:1009E80007E11051000A04E11151000A01E128D081
:1009F800010E1C6F51EC00F00C0E1C6F51EC00F056
:100A0800010E146F010E156FC30E166F000E176FCF
:100A180070DC020E146F010E156F710E166F000E4A
:100A2800176F67DCA5DC660E0B6E760E0C6EC10EBA
:100A38000D6E0D2EFED70C2EFCD70B2EFAD7ECD050
:100A48000101FD510201091969E10101FE5102018B
:100A58000A1964E10101FF5102010B195FE100511C
:100A68000C195CE101510D1959E102510E1956E1B9
:100A7800020E146F09C215F299DC030E0201146FFD
:100A88000AC215F293DC040E0201146F0BC215F2B0
:100A98008DDC050E0201146F0CC215F287DC060E00
:100AA8000201146F0DC215F281DC070E0201146FEA
:100AB8000EC215F27BDC010E0201146F310E156FA8
:100AC80075DC010E02011C6F51EC00F00C0E1C6F5E
:100AD80051EC00F0010E146F010E156F220E166F07
:100AE800000E176F06DC020E146F010E156F150E3F
:100AF800166F000E176F7DEC01F0660E0B6E760E0A
:100B08000C6EC10E0D6E0D2EFED70C2EFCD70B2EC3
:100B1800FAD72EDC010E0101FC6F7FD0010E020115
:100B28001C6F51EC00F00C0E1C6F51EC00F0010E24
:100B3800146F010E156F310E166F000E176F7DECD6
:100B480001F0020E146F010E156F610E166F000E84
:100B5800176F7DEC01F0660E0B6E760E0C6EC10EF3
:100B68000D6E0D2EFED70C2EFCD70B2EFAD7010ECC
:100B7800146F010E156F510E166F000E176F7DEC76
:100B880001F04D0E0B6E190E0C6E4F0E0D6E0D2EE4
:100B9800FED70C2EFCD70B2EFAD700000000BCECB9
:100BA80001F03AD00951320A06E1010E0101FC6F49
:100BB800BCEC01F032D00951310A04E10951320A82
:100BC80001E12AD0010E1C6F51EC00F00C0E1C6FD5
:100BD80051EC00F0010E146F010E156F420E166FE6
:100BE800000E176F7DEC01F0020E146F010E156FE9
:100BF800E50E166F000E176F7DEC01F0660E0B6E9A
:100C0800760E0C6EC10E0D6E0D2EFED70C2EFCD777
:0C0C18000B2EFAD7BCEC01F0C2D5120084
:100C2400ECEC07F0010E0201146FD2EC00F000505E
:100C3400310A29E0020E146F310E156FDAEC01F05F
:100C4400030E0201146F320E156FDAEC01F0040E7C
:100C54000201146F330E156FDAEC01F0050E020178
:100C6400146F340E156FDAEC01F0060E0201146FE6
:100C7400350E156FDAEC01F0070E0201146F360E13
:100C8400156FDAEC01F0080E0201146F360E156FC1
:100C9400DAEC01F0090E0201146F350E156FDAEC6F
:100CA40001F00A0E0201146F340E156FDAEC01F034
:100CB4000B0E0201146F330E156FDAEC01F00C0EFB
:100CC4000201146F320E156FDAEC01F00D0E020101
:100CD400146F310E156FDAEC01F0946A826AF26ACD
:100CE400F26AF16AF06A060EC16EC26A966A02017D
:100CF400076B06EC02F011EC02F0010E1C6F51ECD4
:100D040000F00C0E1C6F51EC00F08284010E146F85
:100D1400010E156F6E0E166F010E176F7DEC01F04C
:100D2400020E146F020E156F7F0E166F010E176FF1
:100D34007DEC01F05C0E0B6E510E0C6E600E0D6EB0
:100D44000D2EFED70C2EFCD70B2EFAD70000829462
:100D5400060E0B6E130E0C6EAD0E0D6E0D2EFED721
:100D64000C2EFCD70B2EFAD700000000828482825E
:100D7400060E0B6E130E0C6EAD0E0D6E0D2EFED701
:100D84000C2EFCD70B2EFAD700000000829282941E
:100D94000101FC6BBE6B010E02011C6F51EC00F0F3
:100DA4000C0E1C6F51EC00F0010E146F010E156F48
:100DB400AE0E166F010E176F7DEC01F0DAEC00F049
:100DC4001351230A11E10A51000A04E1C3DC010EA4
:100DD4000101FC6F0101FC51000A02E15DEC02F02B
:0C0DE40002010951310A00E1D3D7FFD70A
:100FD80010EE15F0E70E006E020E016EF00EF66EC2
:0E0FE8000D0EF76E000EF86E09EC02F012000E
:0D0DF00020434F4D205355434553534F00B2
:0F0DFD0053454E484120414C544552414441001A
:100E0C0053454E484153204449474954414441536A
:010E1C0000D5
:0F0E1D0056414C4F5220494E56414C49444F00CC
:100E2C0054454E5445204E4F56414D454E54450069
:100E3C00202A4E414F20434F4E464552454D2A00E5
:100E4C0054454E5445204E4F56414D454E54450049
:100E5C004D4158494D4F20362044494749544F5332
:010E6C000085
:100E6D004449472E204E4F56412053454E48410090
:100E7D00202A53454E484120434F4E464552452A60
:010E8D000064
:100E8E0054454E5445204E4F56414D454E54450007
:100E9E004D4158494D4F20362044494749544F53F0
:010EAE000043
:100EAF00444947495445204E4F56414D454E5445B0
:010EBF000032
:100EC00054454E5445204E4F56414D454E544500D5
:0F0ED0002020504F52544120414245525441007E
:100EDF002A41434553534F204C4942455241444FB9
:020EEF002A00D7
:100EF1002A434F4143414F204445534154495641B0
:040F0100444F2A002F
:100F0500202A41434553534F204E454741444F2ADC
:010F150000DB
:100F160043454E5452414C204143494F4E41444172
:010F260000CA
:100F27002B332044452054454E544156495641538E
:010F370000B9
:100F3800444947495445204E4F56414D454E544526
:010F480000A8
:100F49002A43454E54524F20502E534F555A412A49
:010F59000097
:0D0F5A0042454D2056494E444F2E2E2E008C
:100F670020202A4D4F444F20434F4143414F2A00F1
:100F77002A41434553534F204C4942455241444F20
:020F87002A003E
:100F890044494749544520412053454E48413A0078
:010F99000057
:0F0F9A002A312D53494D20202A322D4E414F0030
:0F0FA900202A53454E484120415455414C2A00BF
:100FB8002A414C54455241522053454E48412A003B
:0F0FC8002A312D53494D20202A322D4E414F0002
:020000040030CA
:0D000100260C0EFF0180FF0FC00FE00F4026
:00000001FF


pegue ele e salve no bolco de notas com *.HEX e grave no seu pic.

testei em um 18F452 também, e funcionou. diga se ainda houver problemas

flowww

Link para o comentário
Compartilhar em outros sites

ok grato pela ajuda não sei o que estou fazendo de errado deve ser configurações dos fuses na hora de gravar ou o próprio clock, comprei outro pic 18f452 também deu o mesmo erro. Por acaso qual cristal você usou e qual cap de cerâmico : 15pf, 22pf ou 33pf?

A senha no próprio código já diz esta comentado 123456 para acesso 654321 para coação

Por acaso qual placa você usou para gravar o Pic ???

porque dado uma pesquisada na net vi que a placa pick150 que uso não é muito apropriada para o pic 18f452 todo mundo que usa picK150 fala que tem problemas para a família 18f mesmo o fabricante falando que é so fazer uma conversão para um arquivo flx .

Mas vou tentar com o arquivo Hexa Que você me Passou agradecido pela ajuda:D:D

Link para o comentário
Compartilhar em outros sites

o meu gravador é este daqui

http://produto.mercadolivre.com.br/MLB-505572918-gravador-picburner-usb-zif-pic-de-brindesoftwarescd-soft-_JM

o capacitor que esta na minha placa é de 33pF, frequência 10MHz

tenta gravar em um outro gravador então, pode ser nessa conversão, porque eu digo, todos os erros que já deu comigo e que eu imaginava já foram verificados, e nada ainda :(:confused:

vou continuar procurando outros problemas aqui se achar algo posto aqui de novo, e se você tiver algum progresso, ou regresso rsrsrs, avise aqui

flowwww

Link para o comentário
Compartilhar em outros sites

è realmente fiz uns;) teste aqui e nenhum funcionou com 20MHZ, 10MHZ, 8MHZ, 4MHZ e nada ate agora acho que esse meu gravador de pic não é muito eficiente para pic da família 18f, Bom so me resta arrumar uma outra placa.E se não der certo eu vou ter que entregar o TCC com o pic 16f877A fazer o que né mas muito Obrigado pelas dicas foram de muito ajuda ;)

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...