Ir ao conteúdo
  • Cadastre-se

test man*~

Membro Pleno
  • Posts

    571
  • Cadastrado em

  • Última visita

Tudo que test man*~ postou

  1. 1) Sobre a mensagem de erro do CCS: http://www.ccsinfo.com/faq.php?page=interrupts_disabled Repare que a comunicação acontece baseada no tempo então se uma interrupção ocorrer durante a comunicação (provavelmente ocorrerá pois a comunicação é extremamente lenta) a comunicação falhará e o escravo não receberá o dado corretamente, pior ainda, o mestre ou o escravo pode travar em alguma das função 'while', essa é a desvantagem de não haver um linha para o clock Se fosse algo por hardware beleza você carregaria o valor e o hardware o enviaria, como não é, você deverá desabilitar as interrupções antes de de escrever ou ler algo do escravo. --- 2) Sim, se você mudar o pino (do escravo) não funcionará mesmo, como eu disse em algum dos posts anteriores... Repare que o escravo usa interrupção externa (que é um pino fixo) se você colocar em outro a interrupção não ocorre e o escravo se quer notará que o mestre tentou se comunicar, quando isso ocorre a função ler ou escrever retornará o valor 1 para indicar que o escravo não respondeu. Para não usar a interrupção externa seria necessário o escravo verificar a cada 200mS (no máximo) se o mestre está tentado se comunicar... Alterando o código dá para fazer isso... Quanto ao hardware não funcionar... Qual a velocidade do oscilador e a configuração (XT, HS... PLL, CPUDIV) que você está usando no hardware real? Como não tenho um PIC12F1840 não é possível eu montar o hardware real para fazer o teste minha única ideia é algum erro nos FUSES referentes ao oscilador.
  2. Vixi xD, foi falha minha (fiz o código muito tarde HEHE), o mestre estava esperando o escravo indicar o término da escrita na EEPROM mas não esta esperando ele liberar a linha... E isso estava causando problema... Segue o novo código: http://www.4shared.com/rar/b4ySljv6ce/18F2550_12F1840_ONEW.html? Linha adicionada: // Espera o escravo colocar a linha em low para indicar que que a // escrita na EEPROM terminou. while(pino_one_wire) {} //espera o escravo liberar a linha while(!pino_one_wire) {} // <<--- ESTA LINHA FOI ADICIONADA Uma coisa... Se você escrever 'zero' ou 'um' em um pino (registrador LATX ou PORTX) o sinal só irá para o valor escrito após o pino ser colocado como saída... Qualquer coisa posta ai (enquanto ainda tenho tempo )
  3. Os endereços dos registradores variam de família para família... Você pode ver os endereços na "TABLE 5-1: SPECIAL FUNCTION REGISTER MAP" do datasheet do PIC18F2550. Ficaria assim: #bit pino_one_wire = 0xF81.3 // bit 3 do registrador PORTB (PORTB.3)#bit direcao_one_wire = 0xF93.3 // bit 3 do registrador TRISB (TRISB.3) Repare que o pino só irá para zero quando ele for saída (TRISB.3 = 0) caso contrário (TRISB.3 = 1) ele ficará como entrada (alta impedância) e flutuará para para nível alto por causa do PULL-UP.
  4. Ai está o código, o 12F está operando a 32MHz (8MHz TCY) se essa frequencia for abaixa o código provavelmente apresentará erro, mas se você quiser eliminar o erro conseguirá alterando o código... Outra coisa, a comunicação é extremamente lenta ~100Hz (repare o quadrado vermelho na figura), você conseguirá aumentar essa frequência alterando o código ou entendendo ele e criando um novo... Não há uma verificação de erro, então nada garante que o valor enviado foi igual ao recebido... O escravo usa interrupção externa pino RA2...O código foi muito mas muito pouco testado HEHE!! A comunicação ficou como eu disse acima. O mestre coloca a linha em nível baixo por 200mS e então a libera; O escravo confirma a sua rpesença levando a linha para o nível baixo por 10mS e então a libera; O mestre envia 1 bit indicando a operação (escrita ou leitura); E então envia 1 byte indicando o endereço; Se a operação for de escrita envia um byte com o valor a ser escrito; Se a operação for de leitura libera a linha e aguarda o escravo enviar o valor; para representar um bit com o valor 1 é enviado um pulso 2mS em nível baixo e 6mS em nível alto. para representar um bit com o valor 0 é enviado um pulso 6mS em nível baixo e 4mS em nível alto. Esse PIC possui DAC em? Só faltou o zero crossing detector Imagem: Mestre: #include <16F628A.h>#FUSES PUT //Power Up Timer#FUSES NOMCLR //Master Clear pin used for I/O#FUSES BROWNOUT //Reset when brownout detected#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O#FUSES NOCPD //No EE protection#FUSES NOPROTECT //Code not protected from reading#use delay(internal=4MHz)#define LED PIN_B0#define DELAY 500/******************************************************************************/// O código precisa dos bits dos registradores TRIS e PORT referente ao pino.#bit pino_one_wire = 0x06.4 // bit 4 do registrador PORTB (PORTB.4)#bit direcao_one_wire = 0x86.4 // bit 4 do registrador TRISB (TRISB.4)#include <EEPROM_ONE_WIRE.c>/******************************************************************************/void main(){ unsigned int valor_lido1, valor_lido2, valor_lido3, status; inicializar_one_wire(); status = escrever_eeprom_onewire(0, 8); // Escreve 8 na posição 0 da EEPROM do escravo escrever_eeprom_onewire(1, 5); // Escreve 5 na posição 1 da EEPROM do escravo escrever_eeprom_onewire(2, 2); // Escreve 2 na posição 2 da EEPROM do escravo //if(status == 1) // significa que o escravo não respondeu ao chamdo do mestre // Lendo o valor armezenado na posição 0 da EEPROM do escravo valor_lido1 = ler_eeprom_onewire(0, status); // Lendo o valor armezenado na posição 1 da EEPROM do escravo valor_lido2 = ler_eeprom_onewire(1, status); // Lendo o valor armezenado na posição 0 da EEPROM do escravo valor_lido3 = ler_eeprom_onewire(2, status); //if(status == 1) // significa que o escravo não respondeu ao chamdo do mestre while(true) { output_low(LED); delay_ms(DELAY); output_high(LED); delay_ms(DELAY); }} Escravo: #include <12F1840.h>#device ADC=10#FUSES PUT //Power Up Timer#FUSES NOMCLR //Master Clear pin used for I/O#FUSES NOPROTECT //Code not protected from reading#FUSES NOCPD //No EE protection#FUSES NOBROWNOUT //No brownout reset#FUSES NOCLKOUT //I/O function on OSC2#FUSES NOIESO //Internal External Switch Over mode disabled#FUSES NOFCMEN //Fail-safe clock monitor disabled#FUSES NOWRT //Program memory not write protected#FUSES NOSTVREN //Stack full/underflow will not cause reset#FUSES BORV19 //Brownout reset at 1.9V#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O#use delay(internal=32MHz)#define LED PIN_A0#define DELAY 500#bit pino_one_wire_escrita = 0X10C.2 // Para escrever LATA.2#bit pino_one_wire_leitura = 0x00C.2 // PARA ler PORTA.2#bit direcao_one_wire = 0x08C.2 // TRISA bit 2 para mudar a direção do pino#define _input 1#define _output 0#define _low 0#define _high 1#define _escrita 1#define _leitura 0#INT_EXTvoid EXT_isr(void) { unsigned int16 _aux = 0; unsigned int _i, _address = 0, _value = 0, _value_read = 0; short _operacao; pino_one_wire_escrita = _low; // Prepara o pino com o valor 0 while(!pino_one_wire_leitura) {} // Espera o mestre liberar a linha delay_ms(1); direcao_one_wire = _output; // Coloca zero na linha para indicar ao mestre // que este escravo está presente delay_ms(10); // Deixa em baixo por 10mS direcao_one_wire = _input; // Libera o barramento while(pino_one_wire_leitura) {} // Espera o mestre iniciar o envio do bit de comando // Pegando o bit de comando do { delay_us(1); _aux++; }while(!pino_one_wire_leitura); // Conta o tempo em que a linha ficou em nível baixo if(_aux < 2001) { // menor que 2mS (2000uS) é igual a 1 recebido, operação de escrita _operacao = _escrita; } else { // maior que 2mS é igual a 0 recevido, operação de leitura _operacao = _leitura; } // Pegando o endereço da Operação _aux = 0; for(_i = 0; _i < 8; _i++) { while(pino_one_wire_leitura) {} // Espera a linha ser colocada em zero do { delay_us(1); _aux++; }while(!pino_one_wire_leitura); // Conta o tempo em que a linha ficou em nível baixo if(_aux < 2001) { // menor que 2mS (2000uS) é igual a 1 recebido bit_set(_address, _i); // então seta o bit correspondente. } // A variável _address é iniciada com zero então não há a necessidade de zerar // o bit caso o valor recebido for zero. _aux = 0; } if(_operacao == _escrita) { // Pega o valor a ser escrito no endereço enviado pelo mestre _aux = 0; for(_i = 0; _i < 8; _i++) { while(pino_one_wire_leitura) {} // Espera a linha ser colocada em zero do { delay_us(1); _aux++; }while(!pino_one_wire_leitura); // Conta o tempo em que a linha ficou em nível baixo if(_aux < 2001) { // menor que 2mS (2000uS) é igual a 1 recebido bit_set(_value, _i); // então seta o bit correspondente. } // A variável _value é iniciada com zero então não há a necessidade de zerar // o bit caso o valor recebido for zero. _aux = 0; } write_eeprom (_address, _value); direcao_one_wire = _output; // Coloca a linha em zero para indicar que a escrita terminou delay_us(5); direcao_one_wire = _input; } else { // Se a operação for de leitura _value_read = read_eeprom(_address);// Lê o valor armazenado na posição _address delay_ms(20); // Espera o mestre se preparar para o recebimento for (_aux = 0; _aux < 8; _aux++) { if(bit_test(_value_read, _aux)) { // Verifica o bit a ser enviado se for 1 direcao_one_wire = _output; // Pino em nível baixo 0 delay_ms(2); // por 2mS (bit 1) direcao_one_wire = _input; // Pino em nível alto 1 delay_ms(8); // por 8mS } else { // Se for 0 direcao_one_wire = _output; // Pino em nível baixo 0 delay_ms(6); // por 6mS (bit 0) direcao_one_wire = _input; // Pino em nível alto 1 delay_ms(4); // por 4mS } } }} void main(){ direcao_one_wire = _input; ext_int_edge(H_TO_L); // Necessário para o código funcionar corretamente enable_interrupts(INT_EXT); // habilita a interrupção externa - Interrupção na transição de ALTO para BAIXO enable_interrupts(GLOBAL); // habilita todas as interrupções //Example blinking LED program while(true) { output_low(LED); delay_ms(DELAY); output_high(LED); delay_ms(DELAY); }} Download: http://www.4shared.com/rar/6f4eiBSzba/ONE-WIRE_PIC_PIC.html?
  5. @Rogerio Fiorotti Vou fazer o exemplo... Depois posto aqui para você! Não vai ficar aquela coisa bonitona mas deve funcionar... O @Isadora Ferraz disse o nome da comunicação... 1-WIRE... https://pt.wikipedia.org/wiki/One_wire Se você ler o datasheet do DHT22 entenderá como o protocolo funciona. http://www.adafruit.com/datasheets/DHT22.pdf Depois posto o código.
  6. Tenho um código com comunicação I2C entre PICS (o Slave funciona da mesma forma que o DS1307 em termos de recebimento e envio de dados), porém são usados dois fios/pinos. Para um único fio talvez seja legal fazer algo que funcione como o DHT11... Daí o mestre poderia enviar 1 bit para o comando (ler ou escrever) + 1 byte para o endereço onde a operação vai ocorrer Se for escrita + 1 byte com o dado; Se for leitura o mestre libera a linha (pino como entrada) e aguarda o Slave enviar o byte... Poderia ser usado um resistor de PULL-UP assim ambos os PICS apenas colocam a linha em nível baixo (nível alto = pino como entrada) evitando curto. Eu estou meio na correria, poderia fazer o exemplo mas acho que quando sobrar tempo você já terá resolvido o problema Qual compilador você está usando?
  7. Que isso cara, sem problemas =) Eu também UHauHauHauhUAHuHAuhA... Quebre a cabeça ai, qualquer coisa poste aqui que tentarei ajudá-lo... Se você tiver problemas com a comparação do horário para acionamento da carga tente convertê-lo para segundos, tipo: Carga será acionada de 07:04:58 à 07:05:02 (horário fixo como você quer)07:04:58 = 25498 segundos 07:05:02 = 25502 segundos Assim: if((horario_atual_segundos >= 25498) && (horario_atual_segundos <= 25502)) { liga_carga} else { desliga_carga }
  8. @Isadora Ferraz Sim, por isso sugeri o DS3231 pois ele possui Crystal interno com compensação de temperatura assim as chances do Crystal ser de má qualidade (igual ao que veio junto com o meu DS1307) é menor ... Eu acho que o @ianfreitas já está bem familiarizado com o DS1307, repare este tópico: http://forum.clubedohardware.com.br/forums/topic/955455-c%C3%B3digo-para-pic-18f2550-ds1307/ Ele disse que não possuía a biblioteca mas talvez ele achou que ela só poderia ser usada com o PIC18F2550... A biblioteca usada naquele tópico foi retirada do mesmo lugar da que foi postada aqui.
  9. Neste código o PIC pega a data e o horário do DS1307 e faz nada com os valores (se comparado com o seu esquemático eu inverti o SCL e o SDA) #include <12F629.h> #FUSES PUT //Power Up Timer #FUSES NOMCLR //Master Clear pin used for I/O #FUSES BROWNOUT //Reset when brownout detected #FUSES NOPROTECT //Code not protected from reading #FUSES NOCPD //No EE protection #FUSES NOWDT #FUSES INTRC_IO #use delay(clock=4MHz) #use I2C(master, scl=PIN_A0, sda=PIN_A1, slow) // I2C Mestre, 100KHz (slow) #define LED PIN_A5 #define DELAY 500 #include<DS1307.c> void main() { unsigned int segundo, minuto, hora, dia, mes, ano, dia_da_semana; while(true) { ds1307_set_date_time(10,9,15,7,5,46,13); // Atualiza o DS1307 para data 10/09/2011 (domingo - 7) // e a hora para 05:46:13 // Atualizar apenas uma vez, a bateria manterá o DS1307 contando o tempo. ds1307_get_date(dia, mes, ano, dia_da_semana); // Lêa o dia mês e ano do DS1307 ds1307_get_time(hora, minuto, segundo); // Lê a hora minuto e sefgundo do DS1307 output_low(LED); delay_ms(DELAY); output_high(LED); delay_ms(DELAY); } } Tenho uma biblioteca pra o DS1307 mas foi feita para barramentos I2C com mais de um mestre (gasta mais memória) então resolvi usar esta aqui: https://www.ccsinfo.com/forum/viewtopic.php?t=23255 Download do código (CCS 5.046) e do arquivo para simulação no proteus (7.10): http://www.4shared.com/rar/Y_P5bWpOba/DS1307_PIC12F629.html? Edit: O DS3231 possui um oscilador interno e é mais preciso, além disso ele possui 2 alarmes (se não me engano) assim o PIC poderia ficar de boa e só executaria algo quando o DS3231 gerasse o pulso de alarme... Ele também possui um sensor de temperatura Tenho um DS1307 (do ebay) que adiantou 7~8 minutos em uma semana (mesmo eu tendo retirado o circuito de recarga da bateria), sei que o problema é com o oscilador, mas...
  10. Qual compilador você está usando? Use o I2C por software... Você já tem a biblioteca?
  11. O pino RC3 não está disponível no PIC18F4550... Ou eu estou confundindo as coisas? (Vusb) Quando for escrever em um pino tente usar o registrador LATX para evitar problemas com de Read Modify Write...
  12. Este é um código para HMC5883L (Magnetômetro / Bússola) com o CCS C, como ele (HMC5883L) dá para medir a intensidade e direção do campo magnético terrestre e assim determinar o norte magnético. Com o norte magnético, sabendo a declinação magnética no local, é possível determinar o norte geográfico. O código foi testado (não muito) com o PIC18F4550. Código para teste: #include <18F4550.h>#device ADC=10#FUSES NOFCMEN // Fail-safe clock monitor disabled#FUSES NOIESO // Internal External Switch Over mode disabled#FUSES NOPUT // Disable Power Up Timer#FUSES BROWNOUT // Reset when brownout detected#FUSES BORV27 // Brownout reset at 2.7V#FUSES NOVREGEN // USB voltage regulator disabled#FUSES NOPBADEN // PORTB pins are configured as digital I/O on RESET#FUSES NOLPT1OSC // Timer1 configured for higher power operation#FUSES MCLR // Master Clear pin enabled#FUSES STVREN // Stack full/underflow will cause reset#FUSES NOLVP // No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O#FUSES NOXINST // Extended set extension and Indexed Addressing mode disabled (Legacy mode)#FUSES NOPROTECT // Code not protected from reading#FUSES NOCPB // No Boot Block code protection#FUSES NOCPD // No EE protection#FUSES NOWRT // Program memory not write protected#FUSES NOWRTC // Configuration registers not write protected#FUSES NOWRTB // Boot block not write protected#FUSES NOWRTD // Data EEPROM not write protected#FUSES NOEBTR // Memory not protected from table reads#FUSES NOEBTRB // Boot block not protected from table reads#FUSES NOICPRT#use delay(internal=8MHz)#use rs232(baud=115200, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8, stream=PORT1)/*-----------------------------------------------------------------------------*/#use i2c(Master, Fast, sda=PIN_B0, scl=PIN_B1, force_hw)// Fast = 400 000KHz | Se for I2C por software force_sw#include <HCM5883L.c>/*-----------------------------------------------------------------------------*/#byte OSCCON = 0xFD3#byte MCU_TRISD = 0xF95#byte MCU_LATD = 0xF8C#bit SCS1 = OSCCON.1#bit SCS0 = OSCCON.0#bit MCU_TRISD1 = MCU_TRISD.1#bit LED = MCU_LATD.1int resultado_self_teste, status;signed int16 eixo_x, eixo_y, eixo_z; float x_micro_tesla, y_micro_tesla, z_micro_tesla, intensidade_total, inclinacao, azimute;void main() { SCS1 = 1; MCU_TRISD1 = 0; // PD1 como saída LED = 1; // Inicia com LED desligado. status = self_test_HCM5883L(resultado_self_teste); if(status == 1) printf("\fSelf test nao realizado sensor nao detectado.\n\n\r"); else if(status == 2) printf("\fSelf test nao realizado atualizacao dos data out registers demorou mais que o normal.\n\n\r"); else { // status == 0 printf("\fSelf Test.\n\r>Teste positivo:\n\r"); if(!bit_test(resultado_self_teste, 0))// bit 0 = resultado do teste positivo printf("Eixo X passou - "); // para o eixo X. Se for 0 = passou. else // 1 significa não passou. printf("Eixo X nao passou - "); if(!bit_test(resultado_self_teste, 1))// bit 1 = resultado do teste positivo printf("Eixo Y passou - "); // para o eixo Y. Se for 0 = passou. else // 1 significa não passou. printf("Eixo Y nao passou - "); if(!bit_test(resultado_self_teste, 2))// bit 2 = resultado do teste positivo printf("Eixo Z passou."); // para o eixo Z. Se for 0 = passou. else // 1 significa não passou. printf("Eixo Z nao passou."); printf("\n\n\r>Teste negativo:\n\r"); if(!bit_test(resultado_self_teste, 3))// bit 2 = resultado do teste negativo printf("Eixo X passou - "); // para o eixo X. Se for 0 = passou. else // 1 significa não passou. printf("Eixo X nao passou - "); if(!bit_test(resultado_self_teste, 4))// E assim por diante. printf("Eixo Y passou - "); else printf("Eixo Y nao passou - "); if(!bit_test(resultado_self_teste, 5)) printf("Eixo Z passou.\n\n\r"); else printf("Eixo Z nao passou.\n\n\r"); } // Ajusta o ganho do sensor de acordo com a intensidade do campo no local. status = ajustar_ganho_HCM5883L(); // A biblioteca usa três variáveis globais que guardam o conteúdo // dos registradores Configuration Register A, Configuration Register B e // Mode Register. As variáveis são: _configuration_rega_shadow, // _configuration_regb_shadow e _mode_register_shadow. if(status == 0) printf("Ganho ajustado para %u", _configuration_regb_shadow>>5); else if(status == 1) printf("Ganho nao ajustado, sensor nao detectado."); else if(status == 2) printf("Ganho nao ajustado, atualizacao dos data out registers demorou mais que o normal."); else //status == 3 printf("Ganho nao ajustado, instensidade do campo fora do range do instrumento."); // Configura o sensor para fazer a média de 8 medições, fazer uma medição // a cada 133mS (7.5Hz) e operação contínua (assim que termina uma conversão // ele inicia outra). status = configurar_HCM5883L(_samples_averaged_8 | _data_rate_7_5HZ | _continuous_meass_mode); if(status == 0) printf("\n\n\rConfiguracao realizada 8 amostras - 7.5Hz - Op. continua."); else // status == 1 printf("\n\n\rConfiguracao nao realizada, sensor nao detectado."); delay_ms(10000); // Usado quando o sensor é configurado para _single_meass_mode em vez // de _continuous_meass_mode /*status = iniciar_conversao_HCM5883L(); if(status == 1) printf("\n\nzrSensor nao detectado.");*/ while(true) { LED=!LED; // Lendo a medição de cada eixo /*status = ler_HCML5883L(eixo_x, eixo_y, eixo_z); if(status == 0) printf("\fX: Ld% - Y: Ld% - Z: Ld%."); else // status == 1 printf("\fsensor nao detectado.");*/ // É possível desprezar a variável status (para as outras funções também): ler_HCML5883L(eixo_x, eixo_y, eixo_z); printf("\fHX: %Ld | HY: %Ld | HZ: %Ld", eixo_x, eixo_y, eixo_z); // Convertendo os valores medidos para micro Tesla valores_brutos_para_microtesla(eixo_x, eixo_y, eixo_z, x_micro_tesla, y_micro_tesla, z_micro_tesla); printf("\n\rX: %.1fuT | Y: %.1fuT | Z: %.1fuT", x_micro_tesla, y_micro_tesla, z_micro_tesla); // Calculando a intensidade do campo intensidade_total = calcular_intensidade_total(x_micro_tesla, y_micro_tesla, z_micro_tesla); printf("\n\rIntensidade do campo: %.1fuT", intensidade_total); // Calculando a inclinação magnética inclinacao = calcular_inclinacao(eixo_x, eixo_y, eixo_z); printf("\n\rInclinacao: %.1f graus", inclinacao); // Calculando o azimute, para uma declinação magnética de -22.3° // http://www.magnetic-declination.com/ // X e Y devêm estar na posição horizontal. // O eixo X é a referencia. azimute = calcular_azimute(eixo_x, eixo_y, -22.3); printf("\n\rAzimute: %.1f graus | ", azimute); if ((azimute >= 22.5) && (azimute < 67.5)) printf("NORDESTE"); else if ((azimute >= 67.5) && (azimute < 112.5)) printf("LESTE"); else if ((azimute >= 112.5) && (azimute < 157.5)) printf("SUDESTE"); else if ((azimute >= 157.5) && (azimute < 202.5)) printf("SUL"); else if ((azimute >= 202.5) && (azimute < 247.5)) printf("SUDOESTE"); else if ((azimute >= 247.5) && (azimute < 292.5)) printf("OESTE"); else if ((azimute >= 292.5) && (azimute < 337.5)) printf("NOROESTE"); else printf("NORTE"); delay_ms(250); // para 7.5Hz o sensor faz uma medição a cada 134mS // mas se a medição anterior não foi lida ele não atualiza // os registradores com os novos valores. } } Palavras de configuração para a função "configurar_HCM5883L": _samples_averaged_1 // Uma única amostra _samples_averaged_2 // Média de 2 amostras _samples_averaged_4 // Média de 4 amostras _samples_averaged_8 // Média de 8 amostras _data_rate_0_75HZ // 0.75Hz _data_rate_1_5HZ // 1.5Hz_data_rate_3HZ // 3Hz _data_rate_7_5HZ // 7.5Hz _data_rate_15HZ // 15Hz _data_rate_30HZ // 30Hz _data_rate_75HZ // 75Hz _continuous_meass_mode // Termina uma medição e inicia outra _single_meass_mode // Termina uma medição e vai para o modo inativo_idle_mode // Modo inativo Teste: Download do código: http://www.4shared.com/rar/6EYF8d2Mce/PIC18F4550_HMC5883L_CCS.html?
  13. Não sei se isso resolverá o sel problema, mas está ai hehe... //setup_adc(ADC_CLOCK_INTERNAL); // Se não me engano, caso o 18F2550 estiver operando a mais de 1MHz // não dá para usar o oscilador RC interno como TAD. setup_adc(ADC_CLOCK_DIV_8); // Para 10MHz (8 TOSC) E talvez isso também ajude. //v=read_adc(); v=(float)read_adc(); : : //a=read_adc(); a=(float)read_adc();
  14. Se alarme = 1 e cadeira = 1 independente do resto dispara alarme será LOW (alarme desativado eu imagino), alarme será zero e disparo_tempo também. Repare o trecho abaixo. if ((alarme == 1) && (cadeira == 1)) { if (disparo_tempo == 0) { disparo_tempo = millis(); } else { if ((millis() - disparo_tempo) >= 1000) { digitalWrite(dispara_alarme, HIGH); } else { digitalWrite(dispara_alarme, LOW); } } digitalWrite(dispara_alarme, LOW); // AQUI <---- alarme = 0; // AQUI <---- disparo_tempo = 0; // AQUI <----} Outra coisa, isto: if ((millis() - disparo_tempo) >= 1000) nunca será verdadeiro, pois disparo_tempo é atualizado e logo após zerado... Ai é atualizado novamente e então zerado... Entendeu?
  15. @Fabiano.araujo talvez o delay foi necessário por causa do FUSE IESO Internal/External Oscillator Switchover bit... Aquele negócio de Two-Speed Start-up...
  16. Talvez assim funcione... void keypadEvent(KeypadEvent eKey){ switch (keypad.getState()){ // Condição switch... case PRESSED: // Se precionado algum botão... Serial.print("Digitado: "); // Aparecera no Serial Monitor, Digitado: "X". Serial.println(eKey); // Armazena numero digitado na variável eKey. switch (eKey){ // Pressionando "C" confirma se a senha foi digitado corretamente. case 'C': guessPassword(); break; // A qualquer momento que o 'D' for digitado o rele será desativado // assim a senha não poderá conter a letra 'D'... case 'D': // <--- ADICIONADO digitalWrite(4, LOW); // Desativa o rele. <--- ADICIONADO Serial.println("Rele desativado... "); password.reset(); // Limpa digitos digitados anteriormente <--- ADICIONADO break; default: password.append(eKey); } }}:::void guessPassword(){// Informa no Serial Monitor "Verificando, aguarde...". Serial.print("Verificando, aguarde... "); if (password.evaluate()){ // Informa no Serial Monitor "Acionando rele...". Serial.println("Acionando rele... "); digitalWrite(4, HIGH); // Ativa o rele. // Comentando para não desligar o rele após passados 2 seundos... <--- RETIRADO //delay(2000); // Rele fica acionado por 2 segundos e depois... <--- RETIRADO //digitalWrite(4, LOW); // Desativa o rele. <--- RETIRADO password.reset(); // Apaga a senha. } else{ digitalWrite(4, LOW); Serial.println("Senha Invalida !"); password.reset(); // Apaga a senha. }}
  17. Entendo... Você pode postar uma foto/imagem desse adaptador USB<>Serial? Se ele for USB<>Serial TTL não há a necessidade de usar o MAX232.
  18. Se não me engano os pinos 14 e 13 (do MAX232) foram ligados de forma incorreta. Pino 14 do MAX232 (PIC TX) -> Pino 2 do conetor (Computador RX)Pino 13 do MAX232 (PIC RX) -> Pino 3 do conector (Computador TX) Dê uma olhada no datasheet para confirmar...
  19. Mais uma Poderia adicionar algo para enviar sequencias I2C, algo assim: S 0x90 # 0x00 # 0x40 # 0x25 # P Onde está o # seria o ACK ou NACK que foi recebido durante o envio. Também para receber: S 0x91 # recebido1 ACK recebido2 ACK recebido3 ACK ... recebidoN NACK P Daí de alguma forma o usuário diria a quantidade de bytes que ele quer ler. Um I2C scanner, como este no help: http://avrhelp.mcselec.com/index.html?using_the_i2c_protocol.htm seria legal também... No caso ele funcionaria sem o outro mestre (mestre real) estar conectado e funcionando.
  20. Talvez, um visualizador SPI? A velocidade é muito alta né?
  21. Entendi, eu estava achando que os dados eram perdidos mas eles continuam na próxima linha . (mesmo com os arquivos substituídos não consigo simular, mas não há problema algum...) Saquei, vou aprender só o basicão mesmo (botão + led, pisca led + timer, contador + 7 seg., etc.) só para conhecer mesmo! Beginner's introduction to AVR assembler language: http://www.avr-asm-tutorial.net/avr_en/ --- Terminei o código para o TMP101 (sensor de temperatura 9~12 bits I2C com função de alerta), não sei... Mas acho que ele não é um componente famoso (um amigo que me deu) mas vou postar o código aqui, quem sabe? Talvez um dia pode ser útil para alguém. O bom dele é que a temperatura não fica variando constantemente, às vezes até parece que ele estragou e está medindo sempre a mesma temperatura hehe... Obrigado por me apresentar os AVR's Paulo @aphawk e também pelo tutorial... PS.: Perto do que você está fazendo (osciloscópio/logic analyzer/) este código não é nada (dá até vergonha de postar, mas é a vida né?) Código: '$sim$regfile = "m2560def.dat"$crystal = 16000000 $hwstack = 40$swstack = 22 ' Pior caso é a função "Configura_limites_tmp1 ' 01" são passados 3 parâmetros + 6 variáveis ' locais = 9 | 9*2=18 | 18+4=22 (Help).$framesize = 43 ' Pior caso função é a função "Configura_ ' limites_tmp101" 24 bytes conversion buffer ' + 8 bytes (4 integer) + 3 bytes + 8 bytes ' (2 single) total de 43. '----------------------------- Configurando periféricos ------------------------------'$lib "I2C_TWI.LBX" ' Será usado I²C por hardwareConfig Twi = 400000 ' 400KHz SCL (Fast I2C) Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0Open "com1:" For Binary As #1 ' Será usado USART 0 (Pinos TXD0 e RXD0) '------------------------------ Declaração de variáveis ------------------------------'Dim Temperatura As Single , Temperatura_string As String * 7 ' -XXX.X\0 '---------------------------- Inicialização de variáveis -----------------------------' '------------------------- Configuração da direção dos pinos -------------------------'Config Pinb.7 = Output ' Pino B7 como saída '----------------------------------- Nomeando pinos ----------------------------------'Led0 Alias Portb.7 ' Led0 conectado ao PB7 '------------------------ Inicialização dos estados dos pinos ------------------------'Led0 = 0 ' Inicializa o pino do Led0 com 0 '----------------------------- Declaração de constantes ------------------------------' '------------------------------------ Sub-rotinas ------------------------------------'Config Submode = New$include "tmp101.bas" '--------------------------------- Código principal ----------------------------------'' Inicializa o TMP no modo 12 bits (0,0625°C resolução), Alerta_ativo_alto / Modo_interrupção figura 11' datasheet (TI), Shutdown desligado assim que uma medição termina o TMP inicia outra, Add0_ground ' operação realizada no TMP que está com o pino Add0 ligado ao GND. Call Inicializa_tmp101(tmp_12_bits , Faltas_consecutivas_2 , Alerta_ativo_alto , Modo_interrupcao , Shutdown_desligado , Add0_ground) ' Seta como limite inferior -19.2 e superior 31.5°C, tmp Add0_ground operação realizada no TMP que ' está com o pino Add0 ligado ao GND.Call Configura_limites_tmp101( -19.2 , 31.5 , Add0_ground) ' Iniciar a conversão, deve ser usado quando o Shutdown está ligado.'Call Inicia_conversao(add0_ground) ' Inicia a conversão'Waitms 321 ' Espera o término da conversão 12 bits'Call Ler_temperatura_tmp101(temperatura , Add0_ground) ' Lê o resultado da conversão Do Led0 = Not Led0 Waitms 320 ' No modo 12 bits o TMP realiza uma ' leitura a cada 320mS. Call Ler_temperatura_tmp101(temperatura , Add0_ground) ' Ler a ultima temperatura medida pelo ' TMP que está com o pino Add0 no GND. Temperatura_string = Fusing(temperatura , "#.#") ' Apenas um número após a vírgula. Print #1 , Chr(12) ; "T: " ; Temperatura_string ; "gC" ; ' Chr(12) Form feed \f - Limpa o ' hyperterminal -> "\fT: XXX.XgC". nopLoop '-------------------------------------------------------------------------------------'End As palavras de configuração para serem usadas nas chamadas das funções estão definidas no arquivo "tmp101.bas". Código com o arquivo tmp101.bas: http://www.4shared.com/rar/16kGjj66ba/TMP101_ATmega2560_CCO.html?
  22. O esquema no proteus não está no anexo. EDIT: Está lá... P, Vai dar para deslocar a tela para a direita? Muito TOP, eu vou montar um pra mim... Muito show, você só conecta e vê o fluxo de dados no BUS... Nem precisa de um PC. @alexandre.mbm, verdade... Estou animando a aprender o assembly dos AVRs
  23. E não é que funcionou! O PICkit 2 gravou o ATmega2560 , legal isso. Agora sei para o que serve o pino AUX do PICkit 2 Mais um uso para o PICkit 2... Logic analyzer, USB <> Serial e agora gravador para AVR. Eu já tinha visto o AVR Dragon gravar um PIC usando aquele stand alone do PICkit 3... http://blog.zakkemble.co.uk/avrdudess-a-gui-for-avrdude/ http://www.expkits.com/?s=avrisp.htm --- Você está certo... 100% certo HEHE. Valeu!

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!