-
Posts
1.092 -
Cadastrado em
-
Última visita
Tipo de conteúdo
Artigos
Selos
Fabricantes
Livros
Cursos
Análises
Fórum
posts postados por mister nintendo
-
-
você pode usar a série de taylor pra calcular um seno ou cosseno
sen(x)= x - x^3/3! + x^5/5! - x^7/7! + x^9/9! .......... (continua dependendo da precisão que você quer)
mas pelo formato da conta da pra ver que um pic demoraria muito tempo pra fazer isso, só de ter que elevar um numero a nona haha, impraticável para seu projeto
flowww
-
matriz de led's
flowwww
- 1
-
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
-
http://www.4shared.com/file/TWPgxQNx/Tutorial_de_Programao_Assembly.html
esse com certeza é o melhor de assembly pra PIC, é de um colega do fórum que manja muito, é muito bom mesmo
flowww
-
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
-
Vamos la cara.
o pino 6 (PORTA4) desse pic não altera seu estado de 0 para 1o 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 255O 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
-
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 ....
flowww
-
@MatheusLPS , se comprar um módulo deste W5100 ou EN28J60 e se comunicar com um PIC, é inviável também você acha? pois é muito complexo...
flowww
-
http://www.axoonmed.com.br/forum/node/4
vê se este tutorial te ajuda, pelo pouco que pesquisei é bem difícil achar material sobre isto
flowwww
-
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
-
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
-
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
-
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
-
aqui esta o datasheet....
http://www.ti.com/lit/ds/symlink/tlc5917.pdf
eu olhei bem por cima então não entendi bem seu funcionamento, mas se for um shift register como o @circuit disse, um CD4094 funcionara bem também.... o ruim é que ele fornece apenas 5mA nas suas saidas
flowwww
- 1
-
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
-
cara, de as especificações desta sua fonte de alimentação do IPHONE, tanto tensão de saída como corrente de saída
flowwww
-
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
-
não cara, esse 1 escrita significa você escrever na memória....
a escrita ocorre quando você da o comando
write_eeprom(LAST_VOLUME,volume);
neste momento o pic escreve o valor determinado na posição determinada.
flowww
- 1
-
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
-
o cara tem um que vai até 200A...
flowwww
-
tem um sensor que faz isto, este aqui
http://www.automalabs.com.br/sensor-de-corrente-acs712/
flowww
-
void main() { o que esta acontecendo? }
é mesmo amigo, você não explicou NADA, não falou qual era o problema, sintomas, não explicou o que o software deveria fazer, não fez nenhuma pergunta, como vamos responder? haha....
flowww
-
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
-
nossa.... que dahora!!!! realmente incrível!!! sera que é laser de impressora aquilo la mesmo?
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
PIC16f877a linguagem c erro, radio pll
em Microcontroladores
Postado
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.
// 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); } }