Ir ao conteúdo
  • Cadastre-se

mister nintendo

Membro Pleno
  • Posts

    1.092
  • Cadastrado em

  • Última visita

posts postados por mister nintendo

  1. O mais correto é que fale para ele que ha erros no código, e que ele faça as alterações. Dei uma olhada no código e o que ha na maioria é erros por falta de chaves, parêntesis e afins. Isto só pode ser corrigido por quem sabe precisamente a lógica do funcionamento.

    Corrigir alguns erros de sintaxe é relativamente fácil, complicado é corrigir erros mantendo a lógica de quem fez o projeto, sem ter muita base sobre o projeto é complicado. Fiz umas alterações no código e ele compila sem erros no MikroC, mas duvido funcionar hahahaha. Realmente o certo é você ir falar com o dono para que ele revise o projeto.

     

    Spoiler
    
    // 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;
     // End LCD module connections
     //DS1307 RTC Interfacing with PIC16F877A
     sbit I2C1_Scl at RC3_bit;
     sbit I2C1_Sda at RC4_bit;
     sbit I2C1_Scl_Direction at TRISC3_bit;
     sbit I2C1_Sda_Direction at TRISC4_bit;
     //I2C via software with PIC16F877A - via hardware deu erro para ler o Chip FM
     sbit Soft_I2C_Scl at RD2_bit;
     sbit Soft_I2C_Sda at RD3_bit;
     sbit Soft_I2C_Scl_Direction at TRISD2_bit;
     sbit Soft_I2C_Sda_Direction at TRISD3_bit;
     // End Software I2C connections
    
    // Botoes de sintonia
     #define BUTTON_DOWN (PORTD.F0 == 0) //search down
     #define BUTTON_UP (PORTD.F1 == 0) //search up
     #define BUTTON_SET2 (PORTD.F4 == 0)
     #define BUTTON_SET1 (PORTD.F5 == 0)
     #define BUTTON_SNOOZE (PORTD.F7 == 0)
     #define mem_fm_qtd 25 //quantidade de posicoes de memoria para estacoes
     #define tempo_exposicao 50 // tempo exposicao da temperatura
     #define tempo_exposicao2 100 // tempo exposicao data
    
    //Range de Frequencias Europa
     #define FREQ_HIGH 108
     #define FREQ_LOW 87.5
    
    //nivel do sinal simbolo
     #define nivel_clear Lcd_Chr(1,1,' '); Lcd_Chr(1,2,' '); Lcd_Chr(1,3,' '); Lcd_Chr(1,4,' ')
     #define rele_on PORTB.F7 = 1
     #define rele_off PORTB.F7 = 0
     //define functions
     void Display_Temperature(unsigned int temp2write, unsigned int linha);
     void Sintoniza_freq(float frequex); //sintoniza frequ fixa
     void Le_freq(); //ler o chip FM carregando as variaveis
     void display_freq(float freqrep); //mostra frequencia
     void display_sinal(); // mostr ao nivel do sinal
     void recup_freq(int freq_addr, int sint_yn); //recupera freq da eprom e 0=nao sintoniza / 1=sintoniza
     void grava_Freq(int freq_addr); //grava 2 bytes da pll no eprom
     void display_mem(short int mem_fm); // mostra a frequencia de uma determ posic memoria =1,2,3,4,5
     void acerta_relogio (unsigned short xtipo);
    
    void write_ds1307(unsigned short address,unsigned short w_data); //escreve hora
     unsigned short read_ds1307(unsigned short address); //le hora
     unsigned char BCD2UpperCh(unsigned char bcd); //usada no relogio
     unsigned char BCD2LowerCh(unsigned char bcd); //usada no relogio
     void holdx(); // testa tempo de pressao na tecla - vai para ajste alarme ou ajuste hora
     void alarme(); //ajusta alarme
    
    //char bcd_to_bin(char bcd);
     //void checa_alarm();
     //end define functions
    
    //variaveis do termometro
     unsigned char *tempC = "000.0";
     unsigned int tempinC;
     unsigned long temp_value;
     unsigned char txt[15];
    
    //Variaveis do FM
     char frequencyH=0;
     char frequencyL=0;
     int frequencyB;
     long int frequency=0;
     char buffer[5];
     float freq_available=0;
     float freq_available2=0;
     short int showtime; //showtime variavel para shift no display : data x temp
     unsigned int cnt;
     short int flag_exp; //flag para shift display data x temper
     short int niv; //nivel do sinal
      short int niv2;
       short int niv4;
        short int niv12;
         short int niv8;
          short int address;
     short int st_flag; //informacao de stereo
     short int freq_eprom1; //byte1 da freq recuperado da eprom
     short int freq_eprom2; //byte2 da freq recuperado da eprom
     float freq_now;
     int memoria_fm;
     int hold_bt; //contador para apertar e segurar o botao - set hora
     int temp_min; //variaveis temps alarme
     int temp_hour; //variaveis temps alarme
    
    //variaveis de acerto de relogio
     unsigned short xchar; //dois digitos do valor (hora, mes, dia..) para a funcao de acerto do rlogio
    
    //variaveis do relogio
     //unsigned int sec;
     unsigned short int minute;
     unsigned short int hour;
     unsigned short int day;
     unsigned short int date;
     unsigned short int month;
     unsigned short int year;
     unsigned char time[9];
     unsigned char ddate[9];
     unsigned char ddate2[9]; //data temporaria para ajuste de hora
    
    //variaveis do alarme
     unsigned short a_hour;
     unsigned short a_min;
     unsigned short cnt2;
     unsigned short xalarme; //alarme 0 = alarme off, 1, 2, 3 = qtd do snooze
     bit in_alarm; // se 1 o alarme esta acionado se 0 o alarme nao esta acionado
    
    void main()
     {
    
    TRISB = 0; // PORTB saida do display lcd
    
    //termometro porta analogicas
     ADCON1 = 0b10000000; // 1- opcao osc, 0- left justif, 00-void, 0000 - vref+=vdd vref-=vss todas as portas an = A analogicasA
     TRISA = 0b00110011; //ra0/an0 e ra1/an1 inputs lm35
     TRISD =0xFF; // porta de sera input dos botoes
     CMCON = 0x07; // Disable Comparators
    
    Lcd_Init(); // Initialize LCD
     Lcd_Cmd(_LCD_CLEAR); // Clear LCD display
     Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
    
    I2C1_Init(32768); //Inicia o DS1307 I2C e define a frequencia do xtal - xtal do tipo de relogio
    
    Soft_I2C_Init();
     //Delay_ms(50);
    
    //recupera e sintoniza ultima frequencia sintonizada
     recup_freq(0x00, 1);
     //Delay_ms(500);
     Le_freq(); //le freque inicial
     freq_now=freq_available2;
     display_freq(freq_now); //display frequencia
    
    //teste do relogio
     //================================
    
    write_ds1307(0,0x00);
    
    //================= loop principal - inicio =================//
     //================= loop principal - inicio =================//
     //================= loop principal - inicio =================//
    
    memoria_fm = 1;
     showtime = 1; //controla tempo de exibicao da hora x temperatura
     flag_exp = 0;
     in_alarm = 0; //alarme nao esta acionado
    
    //le informacoes do alarme - hora, min, e snooze
     //a_hour= EEPROM_Read(0xAA); // posicoes de memoria para hora e minuto
     //a_min= EEPROM_Read(0XAF);
     while(1)
     {
     temp_value = ADC_Read(0); // le o sensor numero 1
     temp_value = temp_value*5000;//1077; //1168;
     tempinC = temp_value/1000;
     tempinC = tempinC*10;
    
    if(showtime >= tempo_exposicao) if(showtime < tempo_exposicao2) //controle tempo de exposicao da hora x temperatura { VDelay_ms(15); if(flag_exp == 1) { Lcd_Out(2,1," "); Lcd_Chr(2,3,223); //imprime o grau celcius e o C Lcd_Chr(2,4,'C'); Display_Temperature(tempinC,2); flag_exp =0; //tratamento impressao do dia da semana ddate2[6] = BCD2UpperCh(day); ddate2[7] = BCD2LowerCh(day); ddate2[8] = '\0'; if(ddate2[7] == '1') {Lcd_Chr(2, 6, 'D');Lcd_Chr(2, 7, 'o');Lcd_Chr(2, 8, 'm');} if(ddate2[7] == '2') {Lcd_Chr(2, 6, 'S');Lcd_Chr(2, 7, 'e');Lcd_Chr(2, 8, 'g');} if(ddate2[7] == '3') {Lcd_Chr(2, 6, 'T');Lcd_Chr(2, 7, 'e');Lcd_Chr(2, 8, 'r');} if(ddate2[7] == '4') {Lcd_Chr(2, 6, 'Q');Lcd_Chr(2, 7, 'u');Lcd_Chr(2, 8, 'a');} if(ddate2[7] == '5') {Lcd_Chr(2, 6, 'Q');Lcd_Chr(2, 7, 'u');Lcd_Chr(2, 8, 'i');} if(ddate2[7] == '6') {Lcd_Chr(2, 6, 'S');Lcd_Chr(2, 7, 'e');Lcd_Chr(2, 8, 'x');} if(ddate2[7] == '7') {Lcd_Chr(2, 6, 'S');Lcd_Chr(2, 7, 'a');Lcd_Chr(2, 8, 'b');} } showtime++; } else { showtime= 1; } Delay_ms(50); //Acerto de Estacoes de FM //le hora e imprime //======================= //sec=read_ds1307(0); // read second minute=read_ds1307(1); // read minute hour=read_ds1307(2); // read hour day=read_ds1307(3); // read day date=read_ds1307(4); // read date month=read_ds1307(5); // read month year=read_ds1307(6); // read year time[0] = BCD2UpperCh(hour); time[1] = BCD2LowerCh(hour); time[2] = ':'; time[3] = BCD2UpperCh(minute); time[4] = BCD2LowerCh(minute); time[5] = '\0'; ddate[0] = BCD2UpperCh(date); ddate[1] = BCD2LowerCh(date); ddate[2] ='.'; ddate[3] = BCD2UpperCh(month); ddate[4] = BCD2LowerCh(month); ddate[5] ='.'; ddate[6] = BCD2UpperCh(year); ddate[7] = BCD2LowerCh(year); ddate[8] = '\0'; // checa alarme liga rele a_min= EEPROM_Read(0XAF); a_hour= EEPROM_Read(0xAA); xalarme= EEPROM_Read(0XB2); temp_min = minute; //conversoes de hora minuto temp_min = ((temp_min>>4)&0x0f)*10 + (temp_min&0x0f); //bcd to dec
     temp_hour = hour;
     temp_hour = ((temp_hour>>4)&0x0f)*10 + (temp_hour&0x0f); //bcd to dec
    
     if (xalarme >0) //alarme on - snooze maior que zero
     {
     if (temp_hour == a_hour && temp_min== a_min && !in_alarm) //dispara alarme
     {
     in_alarm = 1;
     rele_on;
     write_ds1307(7,0x10);
     xalarme--; //snooze menos 1
     if (xalarme== 59) {a_min=0; a_hour++; if (a_hour > 23) a_hour = 0;} //ajuste estouros
    
     EEPROM_Write(0xAA, a_hour); //regrava alarme
     EEPROM_Write(0xAF, a_min);
     EEPROM_Write(0xB2, xalarme);
     in_alarm =0; // rehabilita alarme
     }
     }
    
    
     if (xalarme >0) Lcd_Chr(2, 11, 'a'); else Lcd_Chr(2, 11, ' ');//indicador de alarme ligado
    
    if(BUTTON_SNOOZE){ write_ds1307(7,0x00); PORTB.F7 = ~PORTB.F7; Vdelay_ms(500);} // botao snooze
     Lcd_Out(2,12,time);
    
     if(showtime < tempo_exposicao) //controle tempo de exposicao da data x temperatura { if(flag_exp == 0) { Lcd_Out(2,1," "); Lcd_Out(2,1,ddate); flag_exp =1; } showtime++; } if(BUTTON_DOWN) //search down { while(BUTTON_DOWN) // incrementa sem sintonizar { freq_now = freq_now - 0.1; display_freq(freq_now); VDelay_ms(50); } Sintoniza_freq(freq_now); VDelay_ms(100) ; Le_Freq(); } if(BUTTON_UP) //search up { while(BUTTON_UP) // incrementa decrem sem sintonizar { freq_now = freq_now + 0.1; display_freq(freq_now); VDelay_ms(50); } Sintoniza_freq(freq_now); VDelay_ms(100) ; Le_Freq(); } if(BUTTON_SET1) //menu de memorizacao de estacoes { hold_bt = 0; // pressionar e segurar o botao de SET- ajuste de hora holdx(); //ajuste de hora e alarme if (hold_bt > 800) // ajuste de hora
     {
     write_ds1307(0,0x80); //write sec stop oscilator
     acerta_relogio(2); //hour
     acerta_relogio(1); //minute
     acerta_relogio(4); //date
     acerta_relogio(5); //month
     acerta_relogio(6); //year
     acerta_relogio(3); //day
     write_ds1307(0,0x00); //Reset second to 0 sec. and start Oscillator
     }
    
    if (hold_bt > 440)
    cnt=0;
     memoria_fm = 1;
     display_mem(memoria_fm);
    
    while(cnt<550)
     {
     VDelay_ms(5); // COMENTADO PARA LIBERAR MEMORIA
     // if(BUTTON_DOWN) //decresce memoria
     // {
     // VDelay_ms(15) ;
     // cnt=0;
     //while(BUTTON_DOWN) // debounce button
     //{
     // memoria_fm = memoria_fm -2;
     // if (memoria_fm mem_fm_qtd) memoria_fm=1;
     display_mem(memoria_fm);
     VDelay_ms(100) ;
    
    //}
    
    if(BUTTON_SET2) //memoriza estação
     {
     VDelay_ms(15) ;
     //while(BUTTON_SET2)
     //{
     recup_freq(0x00,0); //recupera a frequencia atual atualiza variaveis
     Delay_ms(500);
     Le_freq(); // le frequencia do FM e atualiza variaveis
     grava_Freq(0x00+(memoria_fm+1));
     cnt=1000;
     //}
     }
     cnt++;
     }
    
    Lcd_Cmd(_LCD_CLEAR);
     /*
     if (cnt == 1001) // saiu pois memorizou a estacao = mantem estacao e grava na memoria a mesma
     {
     Lcd_Cmd(_LCD_CLEAR);
     recup_freq(0x00,1); //recupera a frequencia atual atualiza variaveis
     freq_now=freq_available2;
     display_freq(freq_now); //display frequencia
     Le_freq(); // le frequencia do FM e atualiza variaveis
     }
     if (cnt == 550) //saiu por time out = sintoniza a estacao corrente da memoria
     {
     Lcd_Cmd(_LCD_CLEAR);
     display_freq(freq_now); //display frequencia
     Le_freq(); // le frequencia do FM e atualiza variaveis
     }
     */
    
     //end do if de set1 - memoriza estacoes
     if(BUTTON_SET2) //browse estacoes memorizadas
     {
    
    cnt=0;
     display_mem(memoria_fm);
    
    while(cnt<150)
     {
    
     VDelay_ms(15) ;
     if(BUTTON_DOWN) //acresce memoria
     {
     VDelay_ms(15) ;
     cnt=0;
     //while(BUTTON_DOWN) // debounce button
     // {
     memoria_fm = memoria_fm -2;
     if (memoria_fm && mem_fm_qtd) memoria_fm=1;
     display_mem(memoria_fm);
     VDelay_ms(100) ;
     recup_freq(0x00+(memoria_fm+1),1); //recupera a frequencia atual atualiza variaveis
     freq_now=freq_available2;
     display_freq(freq_now); //display frequencia
     Le_freq(); // le frequencia do FM e atualiza variaveis
     Sintoniza_freq(freq_now);
    
    //}
     }
    
    cnt++;
     }
      display_sinal(); // mostr ao nivel do sinal
     } //end do if de set2 - browse estacoes
    
    } //end while
     //================= loop principal - final =================//
     //================= loop principal - final =================//
     //================= loop principal - final =================//
     } // end main
    
    void Display_Temperature(unsigned int temp2write, unsigned int linha) {
     if (temp2write/10000)// convert Temp to characters// 48 is the decimal character code value for displaying 0 on LCD
     tempC[0] = temp2write/10000 + 48;
     else tempC[0] = ' ';
     tempC[1] = (temp2write/1000)%10 + 48; // Extract tens digit
     tempC[2] = (temp2write/100)%10 + 48; // Extract ones digit
     tempC[4] = (temp2write/10)%10 + 48; // Extract tens digit
     Lcd_Chr(linha,1,tempC[1]); // print temperature on LCD
     Lcd_Chr(linha,2,tempC[2]);
     }
    
    void Sintoniza_freq(float frequex) { // Set frequencia fixa no FM
    
    if (frequex < FREQ_LOW) { frequex = FREQ_HIGH; freq_now=FREQ_HIGH; } if (frequex > FREQ_HIGH)
     {
     frequex = FREQ_LOW;
     freq_now=FREQ_LOW;
     }
    
    frequency=frequex*1000000; //starting frequency 89.7 novafm
     frequencyB=(4*(frequency+225000))/32768; //valor decimal da pll
     frequencyH=frequencyB>>8; // desloca 8 bytes e pega entao o primeiro byte = 00110010 - decimal 50
     frequencyL=frequencyB&0XFF; // pega o 2nd byte faz(AND) com 00000000 11111111 -> resultado 10000010 - dec 130
     Soft_I2C_Start();
     Soft_I2C_Write(0xC0); //endereço do chip FM - write mode
     Soft_I2C_Write(frequencyH); //byte1
     Soft_I2C_Write(frequencyL); //byte2
     Soft_I2C_Write(0xB0); //byte3
     Soft_I2C_Write(0x10); //byte4
     Soft_I2C_Write(0x00); //byte5
     Soft_I2C_Stop();
    
    grava_Freq(0x00); //grava 1o e 2o bytes com a frequencia sintonizada
     //0x00 e 0x01 sao os enderecos para gravacao da ultima estacao
    
    }
    
    void Le_Freq() //atualiza variaveis de frequ e variaveis de sinal, fm
     {
     Soft_I2C_Start();
     Soft_I2C_Write(0xC1);
     buffer[0] = Soft_I2C_Read(1);
     buffer[1] = Soft_I2C_Read(1);
     buffer[2] = Soft_I2C_Read(1);
     buffer[3] = Soft_I2C_Read(1);
     buffer[4] = Soft_I2C_Read(1);
     Soft_I2C_Stop();
    
    Delay_ms(50);
     freq_available=(buffer[0]&0x3F)<<4; // valor numerico do nivel do sinal
     display_sinal(); // mostr anivel do sinal
     //flag de stereo - acende o led
     st_flag = buffer[2]>>7;
     if (st_flag ==0) {Lcd_Chr(1,15,' ');Lcd_Chr(1,16,' ');}
     else {Lcd_Chr(1,15,'F');Lcd_Chr(1,16,'m');}
    
    }
    
    void display_freq(float freqrep)
     {
     long int i;
     if (freqrep < FREQ_LOW) { freqrep = FREQ_HIGH; freq_now=FREQ_HIGH; } if (freqrep > FREQ_HIGH)
     {
     freqrep = FREQ_LOW;
     freq_now= FREQ_LOW;
     }
    
    i= (freqrep*1000000)-30000; //soma 50k para acertar arredondamento
    
    longToStr(i, txt);
    
    Lcd_Chr(1,5,txt[2]);
     Lcd_Chr(1,6,txt[3]);
     Lcd_Chr(1,7,txt[4]);
     Lcd_Chr(1,8,'.');
     Lcd_Chr(1,9,txt[5]);
     Lcd_Out(1,10, "Mhz");
     }
     void display_sinal() //imprime nivel do sinal graficamente
     {
     nivel_clear;
     if (niv=3 && niv4 && niv8 && niv12 ) {nivel_clear;Lcd_Chr(1,1,'o');Lcd_Chr(1,2,'o');Lcd_Chr(1,3,'o');Lcd_Chr(1,4,'o');}
    
    }
     void grava_Freq(int freq_addr) // Grava frequencia - enderecos da 877a 0x00 - 0xFF (256bytes)
     {
     EEPROM_Write(freq_addr, frequencyH);
     EEPROM_Write(freq_addr+1, frequencyL);
     }
     void recup_freq(int freq_addr, int sint_yn) //recupera frequencia DA MEMORIA e sintoniza a mesma
     // 1 = le bytes da eprom e sintoniza , 0 = apenas le os bytes da eprom
     {
    
    frequencyH= EEPROM_Read(freq_addr);
     frequencyL= EEPROM_Read(freq_addr+1);
    
    if (sint_yn== 1)
     {
     Soft_I2C_Start();
     Soft_I2C_Write(0xC0); //endereço do chip FM - write mode
     Soft_I2C_Write(frequencyH); //byte1
     Soft_I2C_Write(frequencyL); //byte2
     Soft_I2C_Write(0xB0); //byte3
     Soft_I2C_Write(0x10); //byte4
     Soft_I2C_Write(0x00); //byte5
     Soft_I2C_Stop();
     }
    
    }
     void display_mem(short int mem_fm)
     {
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Chr(2,1,'M');
     Lcd_Chr(2,2,'e');
     Lcd_Chr(2,3,'m');
     inttostr(mem_fm,txt);
     Lcd_Out(2, 8, txt);
    
    recup_freq(0x00+(mem_fm+1), 0); //memoria 1
    
    if (frequencyL == 0xFF) //memoria sem estacao gravada
     {
     Lcd_Chr(1,5,'-');
     Lcd_Chr(1,6,'-');
     Lcd_Chr(1,7,'-');
     Lcd_Chr(1,8,'.');
     Lcd_Chr(1,9,'-');
     Lcd_Out(1,10, "Mhz");
     }
     else //memoria COM estacao gravada
     {
    
    freq_available=((frequencyH< 0xD0));
     I2C1_Wr(address);
     I2C1_Repeated_Start();
     I2C1_Wr(0xd1);
     I2C1_Rd(0);
     I2C1_stop();
     }
     }
     void write_ds1307(unsigned short address,unsigned short w_data)
     {
     I2C1_Start(); // issue I2C start signal
     I2C1_Wr(0xD0); // send byte via I2C (device address + W)
     I2C1_Wr(address); // send byte (address of DS1307 location)
     I2C1_Wr(w_data); // send data (data to be written)
     I2C1_Stop(); // issue I2C stop signal
     }
     //manipulacao de tipos para o relogio
     unsigned char BCD2UpperCh(unsigned char bcd)
     {
     return ((bcd >> 4) + '0');
     }
    
    //manipulacao de tipos para o relogio
     unsigned char BCD2LowerCh(unsigned char bcd)
     {
     return ((bcd & 0x0F) + '0');
     }
    void alarme()
    {
    
    //Lcd_Cmd(_LCD_CLEAR);
     //Delay_ms(5000);
     a_hour= EEPROM_Read(0xAA); // posicoes de memoria para hora e minuto
     a_min= EEPROM_Read(0XAF);
     xalarme= EEPROM_Read(0XB2);
    
    if (a_hour == 0xFF) a_hour = 0; //se posicao de memoria vazia - zera variaveis
     if (a_min == 0xFF) a_min = 0;
     if (xalarme == 0xFF) xalarme = 0;
    
    Lcd_Cmd(_LCD_CLEAR);
    
    cnt2 = 0;
    
    while(cnt2 < 100) { cnt2++; inttostr(a_hour,ddate2); Lcd_Chr(1, 8, ddate2[4]); Lcd_Chr(1, 9, ddate2[5]); Lcd_Chr(1, 10, ':'); inttostr(a_min,ddate2); Lcd_Chr(1, 11, ddate2[4]); Lcd_Chr(1, 12, ddate2[5]); inttostr(xalarme,ddate2); Lcd_Chr(1, 1, 'A');Lcd_Chr(1, 2, 'l');Lcd_Chr(1, 3, ':'); Lcd_Chr(1, 5, ddate2[4]); Lcd_Chr(1, 6, ddate2[5]); if(BUTTON_DOWN) { cnt2=0; a_hour++; Delay_ms(150); if (a_hour > 23) a_hour = 0;
     inttostr(a_hour,ddate2);
     Lcd_Chr(1, 8, ddate2[4]);
     Lcd_Chr(1, 9, ddate2[5]);
     }
    
    if(BUTTON_UP)
     {
     cnt2=0;
     a_min++;
     Delay_ms(150);
     if (a_min > 60) a_min = 0;
     inttostr(a_min,ddate2);
     Lcd_Chr(1, 10, ddate2[4]);
     Lcd_Chr(1, 11, ddate2[5]);
     }
     if(BUTTON_SET2)
     {
     cnt2=0;
     xalarme++;
     Delay_ms(150);
     if (xalarme > 3) xalarme = 0;
     inttostr(xalarme,ddate2);
     Lcd_Chr(1, 1, 'A');Lcd_Chr(1, 2, 'l');Lcd_Chr(1, 3, ':');
     Lcd_Chr(1, 5, ddate2[4]);
     Lcd_Chr(1, 6, ddate2[5]);
    
    }
     in_alarm =0; // rehabilita alarme
     EEPROM_Write(0xAA, a_hour);
     EEPROM_Write(0xAF, a_min);
     EEPROM_Write(0xB2, xalarme);
     }
     }
    
    //acerta relogio - grava novo valor
    void acerta_relogio (unsigned short xtipo)
    {
    
    unsigned short xlimite;
    unsigned short xchart;
    
    Lcd_Cmd(_LCD_CLEAR);
    
    xchart = 0;
    
    if (xtipo==2) {Lcd_Out(1, 1, "Hora:");xlimite=23;}
    if (xtipo==1) {Lcd_Out(1, 1, "Min:");xlimite=59;}
    if (xtipo==4) {Lcd_Out(1, 1, "Dia:");xlimite=31;}
    if (xtipo==5) {Lcd_Out(1, 1, "Mes:");xlimite=12;}
    if (xtipo==6) {Lcd_Out(1, 1, "Ano:");xlimite=20;}
    if (xtipo==3) {Lcd_Out(1, 1, "Semana:");xlimite=7;}
    
    for(;;)
    {
    
    inttostr(xchart,ddate2);
    
    Lcd_Chr(1, 10, ddate2[4]);
    Lcd_Chr(1, 11, ddate2[5]);
    //Lcd_Out(2, 1, ddate2);
    
    if(BUTTON_UP) // advance hour
    {
    VDelay_ms(150) ;
    xchart++;
    if (xchart>xlimite) xchart=0;
    }
    
    if(BUTTON_SET2) // valid
    {
    VDelay_ms(550) ;
    write_ds1307(xtipo,dec2bcd(xchart)); //write hour
    break ; // exit loop
    }
    }
    }
    void holdx()
    {
    
    while(BUTTON_SET1) //hold botão de SET1 - ajuste de hora
     {
     hold_bt++;
    
    if (hold_bt == 440) Lcd_Out(2, 1, "Alarme ");
    
    if (hold_bt == 800) Lcd_Out(2, 1, "Hora ");
    
    VDelay_ms(5);
     }
     }

     

  2. @Mulder_Fox

     

    estou com um problema bem estranho, desde que baixei e instalei a ultima versão do MPLAB, a v8.92, o compilador não gera mais as configurações, eu coloco pra não setar pelo código, e sim pelos checkbox que tem em um menu, como sempre fiz, mas o compilador não gera mais as configurações no hexadecimal.... você sabe algo a respeito, como corrigir isto e tal.... já desinstalei e re-instalei, mas continua com o mesmo bug

     

    vlewwwww

  3. pra você fazer o que você quiser, me parece que é só substituir esta parte no código pela função que você quer executar.....

     

     /* With a new cardnumber, show it. */Serial.println(" ");Serial.println("Card found");serNum0 = rfid.serNum[0];serNum1 = rfid.serNum[1];serNum2 = rfid.serNum[2];serNum3 = rfid.serNum[3];serNum4 = rfid.serNum[4];//Serial.println(" ");Serial.println("Cardnumber:");Serial.print("Dec: ");        Serial.print(rfid.serNum[0],DEC);Serial.print(", ");        Serial.print(rfid.serNum[1],DEC);Serial.print(", ");        Serial.print(rfid.serNum[2],DEC);Serial.print(", ");        Serial.print(rfid.serNum[3],DEC);Serial.print(", ");        Serial.print(rfid.serNum[4],DEC);Serial.println(" ");Serial.print("Hex: ");        Serial.print(rfid.serNum[0],HEX);Serial.print(", ");        Serial.print(rfid.serNum[1],HEX);Serial.print(", ");        Serial.print(rfid.serNum[2],HEX);Serial.print(", ");        Serial.print(rfid.serNum[3],HEX);Serial.print(", ");        Serial.print(rfid.serNum[4],HEX);Serial.println(" ");//buzzeranalogWrite(3,20);delay(500);analogWrite(3,0); 

     

    ela fica no código onde eu tentei destacar e coloquei umas setas......

     

     /*** Read a card using a mfrc522 reader on your SPI interface* Pin layout should be as follows (on Arduino Uno):* MOSI: Pin 11 / ICSP-4* MISO: Pin 12 / ICSP-1* SCK: Pin 13 / ISCP-3* SS: Pin 10* RST: Pin 9** Script is based on the script of Miguel Balboa.* New cardnumber is printed when card has changed. Only a dot is printed* if card is the same.** @version 0.1* @author Henri de Jong* @since 06-01-2013*/#include <SPI.h>#include <RFID.h>#define SS_PIN 10#define RST_PIN 9RFID rfid(SS_PIN, RST_PIN); int buzzPin = 3;// Setup variables:int serNum0;int serNum1;int serNum2;int serNum3;int serNum4;void setup(){ Serial.begin(9600);SPI.begin();rfid.init();}void loop(){if (rfid.isCard()) {if (rfid.readCardSerial()) {if (rfid.serNum[0] != serNum0&& rfid.serNum[1] != serNum1&& rfid.serNum[2] != serNum2&& rfid.serNum[3] != serNum3&& rfid.serNum[4] != serNum4) {------------->/* With a new cardnumber, show it. */                     Serial.println(" ");                     Serial.println("Card found");                     serNum0 = rfid.serNum[0];                     serNum1 = rfid.serNum[1];                     serNum2 = rfid.serNum[2];                     serNum3 = rfid.serNum[3];                     serNum4 = rfid.serNum[4];                     //Serial.println(" ");                     Serial.println("Cardnumber:");                     Serial.print("Dec: ");                             Serial.print(rfid.serNum[0],DEC);                     Serial.print(", ");                             Serial.print(rfid.serNum[1],DEC);                     Serial.print(", ");                             Serial.print(rfid.serNum[2],DEC);                     Serial.print(", ");                             Serial.print(rfid.serNum[3],DEC);                     Serial.print(", ");                             Serial.print(rfid.serNum[4],DEC);                     Serial.println(" ");                     Serial.print("Hex: ");                             Serial.print(rfid.serNum[0],HEX);                     Serial.print(", ");                             Serial.print(rfid.serNum[1],HEX);                     Serial.print(", ");                             Serial.print(rfid.serNum[2],HEX);                     Serial.print(", ");                             Serial.print(rfid.serNum[3],HEX);                     Serial.print(", ");                             Serial.print(rfid.serNum[4],HEX);                     Serial.println(" ");                     //buzzer                     analogWrite(3,20);                     delay(500);                     analogWrite(3,0); <----------------------} else {/* If we have the same ID, just write a dot. */Serial.print(".");}}}rfid.halt();}  

     

    substitua ai a função que você quer fazer que me parece que pode dar certo

     

    flowwww

  4. Vamos la cara.

     

     

     

     o pino 6 (PORTA4) desse pic não altera seu estado de 0 para 1

     

    o que acontece com este pino é que ele é do tipo OPEN DRAIN, ou seja, ele tem apenas o transistor conectado ao negativo, e não um conectado ao negativo e outro ao positivo, fazendo assim que ele só tenha a capacidade de drenar a corrente por esse pino, e não fornecer a corrente, que aconteceria quando ele estivesse em 1, de modo que pra você poder fornecer a corrente, "mandar 1 no pino", você precisa colocar um resistor externo ligado entre o VCC e o seu pino, tipo esta ligação aqui.

     

    http://upload.wikimedia.org/wikipedia/commons/a/a6/Open_Collector_Pull_Up.png

     

    a parte dentro do "quadrado" é o interior do pic, ai o resistor é o que você vai implementar no circuito

     

     

     

     

     isso quer dizer que eu não posso manipular valores maiores de 255?

     

    Não, só que pra mexer com valores maiores de 255 você precisa começar a associar bytes, pra poder formar valores maiores, mas não se preocupe, você usa C, o compilador faz isso automaticamente pra você, basta apenas você declarar a variável do tipo certo, que vá até valores maiores de 255, que o compilador faz o resto, no caso você já fez isto, declarou como INT, e ela vai de -32.768 até 32.767

     

     

     

     

     Na realidade para mim bit é cada perna do microcontrolador, não entendi a relação deles com esse valor de 0 a 255

     

    O que acontece é que o microcontrolador enxerga tudo como bytes, e pra ele não existe diferença entre os bytes, é tudo tratado como bytes, passiveis de soma, subtrações, rolagens, ou quaisquer outras operações lógicas. O que acontece é que associado a alguns bytes ha funções especiais, como são os ports, que são nossos pinos externos, mas para o microcontrolador ele enxerga como byte. O que aconteceria + OU - é que cada a bit do byte dos ports temos transistores ligados neles, e esses transistores é que estão ligados aos pinos, "cada bit controla 2 transistores", que alteram os valores dos pinos.... é claro que digo isto  A GROSSO MODO, ha todo um circuito mais complexo envolvendo tudo, mas pra entender é bom e a grosso modo até que esta "correto".... se você perceber pela explicação, o PIC continuara enxergando como um byte normal, mas como esse byte esta associado a transistores ele tem um efeito externo, que é manipular os ports.....

     

    flowwww

  5. Cara, um colega nosso do fórum fez este tutorial, o dele é pra ensinar a base pra começar a mexer no RFID, mas pelo que vi o código é bem completo e pode te ajudar em alguma coisa....

     

    http://forum.clubedohardware.com.br/forums/topic/1061005-mini-tutorial-rfid-mikroc/

     

    de qualquer forma eu cito ele aqui pra ter uma maior chance de ele ver seu tópico e te ajudar, já que faz um tempinho que não vejo ele por aqui :P  :P ....

     

     

    @LuizGBarrio =D

     

    flowww

  6. Aqui na faculdade que faço tem um projeto deste... Foi um colega meu o responsável por faze-lo, o projeto era criar imagens a partir de ultra-som... ele usava apenas 1 sensor, e variava a peça de posição para conseguir fazer uma imagem da peça.... não tenho muitos detalhes, só sei disto que falei.... Ele é um cara extremamente inteligente e disse que era MUITO difícil, por isso só fez por 1 ano e depois abandonou para outros... então ha uma bela caminhada pra você ai....

     

    flowww

  7. Olha cara, nunca vi isto na vida, mas essa formula das forças ai é a Lei dos Senos..... Tente entender geometricamente o que esta acontecendo que talvez você possa assimilar melhor esse lamy ai.... sempre me ajuda....

     

    flowwww

  8. Deste jeito está errado.

    O regulador precisa de pelo menos 3V acima da tensão de saída.

    Ainda tem que levar em conta a queda de tensão que as baterias terão quando estiverem perto da descarga total. 

     

    O regulador PWM que indiquei é bem melhor.

    De qualquer forma já dá alto rendimento.

    12V serie excelente. 

    Veja num exemplo hipotético:

    Sabemos que o LM7805 precisa de pelo menos 8V na entrada para dar os 5V da saída.

     

    Para uma corrente de 1A, a potência dissipada em calor seria de 3W.

    A potencia de entrada será de 8W 

    A potência de saída será de 5W

    Isso dá perdas de 37%, pois 8W que é a potencia de entrada menos 37% é igual a 5W.

    O rendimento será de 63% que é adequado para uma fonte linear.

     

    Já o regulador PWM, dá perdas de no máximo 10%

    Usa esse regulado então =D ..... eu aconselhei mais pelo fato de ter 12V na entrada ser um desperdício.... aconselhei mais para colocar em paralelo e ganhar capacidade de carga, pra durar mais.... =D

     

    flowww

  9. Creio que um jeito mais eficiente de utilizar essas 10 pilhas é colocar 5 pilhas em série, em paralelo com outro conjunto de 5 em série... assim você teria 6V de saída, não perderia muito com aquecimento dos componentes tipo 7805, e sua corrente de saída duplicaria para 4.000mAh, o que te daria uma autonomia bem maior....

     

    flowww

  10. como ja  foi dito  só tratei a  parte  do ci 4073   para  devido funcionamento pois  encontrei problema   sem os resistores o transistor  realmente não é preciso  mas   repito não sei  se é a versão  do  pro-teus mas diretamente  não funciona   pelo menos  no meu

     realmente alguns são bugados.... já havia acontecido comigo coisas assim, precisar colocar um transistor onde não é necessário na vida real por bug no proteus =S

     

    flowww

  11. cara, o que foi montado errado é a sua lógica de reset, não tem nenhum problema com o CI, também não precisa de resistores nem de transistores........ eu fiz uma lógica aqui que deu certo, entra no link ai e clica na imagem pra aumentar ela....

     

    https://imageshack.com/i/exTWH3MWj

     

    flowwww

     

     

     

    Cara, vi um detalhe aqui, depois que mandei a mensagem com meu circuito.....

     

    sua lógica até da certo, mas o que você fez de errado é que as entradas da porta AND que você deveria ligar na unidade você ligou na dezena, e as entradas que você deveria ligar na dezena você ligou na unidade, ou seja, você inverteu a ligação das entradas da porta AND

     

    O CI no qual você deve ligar as saídas F e G nas entradas da porta AND é o CI da unidade.......... e o CI que você deve ligar apenas a saída G na entrada da porta AND é o da dezena..... foi isto que você inverteu

     

    mas mesmo assim não precisa nem de resistor nem de transistor.... de uma olhada no meu circuito pra ver la como pode ser a ligação.... e outro detalhe é que você não conectou a saída da porta AND no master clear de um dos CI's

     

    flowwww

  12. last_volume é uma constante, é um valor que você define e o usa sempre, neste caso é o 10...

    ai no seu código ao invés de você escrever no seu código toda hora o numero 10, você coloca last_volume, ai se for mudar só precisa mudar la em cima na definição e não precisa mudar o código inteiro de no novo pela mudança do valor

     

    na familia PIC a eeprom aguenta um milhão de ciclos de escrita.

     

    flowwww

  13. Então, a pergunta não foi por este motivo....

     

    Perguntei pois fiquei imaginando a dificuldade de gerenciar 8 PWM's por software, que código pesado e dedicado não deve ser, acabamos de ver em um outro tópico que fazer apenas 1 PWM de 24KHz já é praticamente impossível com um pic 12F629 oscilando a 4MHz, ai esta foi minha pergunta, qual a frequência máxima que chega este projeto ai....

     

    flowww

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!