DataLogger com PIC18F
Veja também que como o DS1307, comunica-se via I2C e o cartão SD comunica-se via SPI, ambas comunicações utilizam o mesmo pino no microcontrolador. Para facilitar o código, optei por utilizar a função SOFTWARE I2C. Software i2c, é uma emulação da comunicação i2c, utlizando qualquer pino do microcontrolador para essa comunicação.
DOWNLOAD:
Projeto DataLogger: datalogger.rar;
Caso você queira montar esse projeto, não se esqueça que o cartão SD é alimentado com 3.3V, e também os pinos CLK, DI e CS, deve receber tensões de 3.3V.
CóDIGO-FONTE:
- sbit Mmc_Chip_Select at LATC0_bit;
- sbit Mmc_Chip_Select_Direction at TRISC0_bit;
- sbit Soft_I2C_Scl at RC1_bit;
- sbit Soft_I2C_Sda at RC2_bit;
- sbit Soft_I2C_Scl_Direction at TRISC1_bit;
- sbit Soft_I2C_Sda_Direction at TRISC2_bit;
- char temp[16] = "00:00:00;000,0\r";
- short segundos, minutos, horas, dia, date, mes, ano;
- unsigned long adc;
- char filename[11] = "DataXX.csv";//o array nao pode ser maior que 14
- //define os segundos, minutos.. para o ds1307
- void ds1307_write(){
- Soft_i2c_stop();
- Soft_i2c_start();
- Soft_i2c_write(0xD0);
- Soft_i2c_write(0x00);
- Soft_i2c_write(Dec2Bcd(0));//segundos
- Soft_i2c_write(Dec2Bcd(0));//minutos
- Soft_i2c_write(Dec2Bcd(12));//horas
- Soft_i2c_write(Dec2Bcd(1));//dia da semana
- Soft_i2c_write(Dec2Bcd(12));//data
- Soft_i2c_write(Dec2Bcd(3));//mes
- Soft_i2c_write(Dec2Bcd(13));//ano
- Soft_i2c_stop();
- }
- //faz a leitura do ds1307
- void ds1307_read(){
- Soft_i2c_start();
- Soft_i2c_write(0xD0);
- Soft_i2c_write(0x00);
- Soft_i2c_Start();
- Soft_i2c_write(0xD1);
- segundos = Bcd2Dec(Soft_i2c_read(1));
- minutos = Bcd2Dec(Soft_i2c_read(1));
- horas = Bcd2Dec(Soft_i2c_read(1));
- dia = Bcd2Dec(Soft_i2c_read(1));
- date = Bcd2Dec(Soft_i2c_read(1));
- mes = Bcd2Dec(Soft_i2c_read(1));
- ano = Bcd2Dec(Soft_i2c_read(0));
- Soft_i2c_stop();
- }
- //Esta funcao cria um novo arquivo
- void Create_New_File() {
- //cria o arquivo(caso nao exista) com atributo de arquivo e abre-o
- Mmc_Fat_Assign(&filename, 0xA0);
- //define a data de criação do arquivo
- Mmc_Fat_Set_File_Date(ano+2000, mes, date, horas, minutos, segundos);
- Mmc_Fat_Append();//prepara o arquivo para gravação
- Mmc_Fat_Write(temp, 15);//escreve no arquivo
- }
- //Esta função deleta o arquivo
- void Delete_File() {
- Mmc_Fat_Assign(&filename, 0);
- Mmc_Fat_Delete();
- }
- short Test_File_Exist() {
- //como nao definiu nenhum atributo de criação, caso o arquivo exista
- //retorna 1, caso contrario retorna 0
- return Mmc_Fat_Assign("DATA00.csv", 0);
- }
- //abre o arquivo(caso não exista, nao ira ler) e inicia a leitura.
- void Open_File_Read() {
- unsigned long i, size;
- char caracter;
- Mmc_Fat_Assign(&filename, 0);
- Mmc_Fat_Reset(&size);//recupera o numero de caracteres do arquivo
- for (i = 1; i <= size; i++) {
- Mmc_Fat_Read(&caracter);// le um caracter do arquivo
- UART1_Write(caracter);
- }
- }
- void main()
- {
- short i;
- ADC_Init();//inicia o modulo ADC
- ADCON1 = 0B00001110; //define o canal 0 como analogico, o restante como digital.
- Soft_i2c_init();//inicia a comunicação software i2c
- //inicia a comunicação SPI
- SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
- //inicia a comunicaçao com cartão SD
- MMc_Fat_Init();
- //verifica-se se o arquivo ja existe. caso exista cria um novo arquivo com um nome diferente
- for(i=0;i<100;i++)
- {
- filename[4] = (i/10) + 48;
- filename[5] = (i%10) + 48;
- if(Mmc_Fat_Assign(&filename, 0)==0)
- {
- break;
- }
- }
- while(1)
- {
- adc = ADC_Read(0);
- adc = adc * 1000/204;
- temp[9] = (adc/1000) + 48;
- temp[10] = ((adc%1000)/100) + 48;
- temp[11] = (((adc%1000)%100)/10) + 48;
- temp[13] = (((adc%1000)%100)%10) + 48;
- ds1307_read();
- temp[0] = horas/10 + 48;
- temp[1] = horas%10 + 48;
- temp[3] = minutos/10 + 48;
- temp[4] = minutos%10 + 48;
- temp[6] = segundos/10 + 48;
- temp[7] = segundos%10 + 48;
- Create_New_File();
- delay_ms(500);
- }
- }
0 comentários:
Postar um comentário