/**************************************************************
        Schemat podłączeń programowanego układu
                       +----v----+
                 MCLR [| 1     28|] VDD
                      [| 2     27|] VSS
                      [| 3     26|] RB15 -> DB4        
       TC1047A -> AN2 [| 4     25|] RB14 -> DB5
                      [| 5     24|] RB13 -> DB6
                      [| 6     23|] 
                      [| 7     22|] RB11 -> DB7
                  VSS [| 8     21|] RB10 -> RS
       (8 MHz) / OSCI [| 9     20|] VCAP/VDDCORE
               \ OSCO [|10     19|] DISVREG
                      [|11     18|] RB9 -> EN
                      [|12     17|] 
                  VDD [|13     16|]  
                      [|14     15|] 
                       +---------+
                     PIC24FJ64GB002
***************************************************************/
#include <p24Fxxxx.h>
//definiujemy szybkość oscylatora dla funkcji __delay_
#define FCY 16000000UL 
//biblioteka z funkcjami __delay_us i __delay_ms
#include <libpic30.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>


//ustawienia bitów konfiguracyjnych
//1. 
//FWDTEN_OFF - Watchdog wyłączony
//JTAGEN_OFF - JTAG wyłączony
_CONFIG1(FWDTEN_OFF & JTAGEN_OFF)
//2.
//FNOSC_PRIPLL - układ taktowany zewnętrznym oscylatorem z pętlą PLL
//POSCMOD_XT - częstotliwość taktowania oscylatora 8 MHz
//PLLDIV_DIV2 - konieczność podzielenia przez 2 dla modułu USB PLL
_CONFIG2(FNOSC_PRIPLL & POSCMOD_XT & PLLDIV_DIV2)
//////////////////////////////////////
#define TRIS_RS_LCD   TRISBbits.TRISB10
#define TRIS_EN_LCD   TRISBbits.TRISB9
#define TRIS_DB4_LCD  TRISBbits.TRISB15
#define TRIS_DB5_LCD  TRISBbits.TRISB14
#define TRIS_DB6_LCD  TRISBbits.TRISB13
#define TRIS_DB7_LCD  TRISBbits.TRISB11

#define RS_LCD   LATBbits.LATB10
#define EN_LCD   LATBbits.LATB9
#define DB4_LCD  LATBbits.LATB15
#define DB5_LCD  LATBbits.LATB14
#define DB6_LCD  LATBbits.LATB13
#define DB7_LCD  LATBbits.LATB11

#include "lcd.h"
//////////////////////////////////////
char tablica[16];				//tablica danych
//tablice znakowe dla funkcji LCD
char napis1[] = "Temperatura:";	//12 znaków
char napis2[] = "     ";		//5 znaków  
char napis3[] = {' ', 223, 'C'};//3 znaki


int main()
{
	int wynikADC;
	float wynikF, wynikC, wynikU;

	/////////////////////////////////////////////////////
	AD1PCFGL = 0xFFFB;			//konfiguracja linii cyfrowych (AN2 - analogowe)

	/////////////////////////////////////////////////////
	//uruchomienie wyświetlacza LCD//////////////////////
	WlaczLCD();					//inicjalizacja wyświetlacza LCD
	WyswietlLCD(napis1, 12);	//wyświetl napis "Temperatura:"

	/////////////////////////////////////////////////////
	//konfiguracja modułu ADC
	AD1CON1bits.SSRC = 7;		//czas próbkowania sterowany modułem, 
								//konwersja uruchamiana automatycznie
	AD1CHSbits.CH0SA = 2;		//wejście analogowe AN2
	AD1CON3bits.SAMC = 0x1F;	//czas próbkowania = 31 TAD
	AD1CON3bits.ADCS = 2;		//czas TAD = 3 TCY
	AD1CON2bits.VCFG = 0;		//napięcie odniesienia AVDD, AVSS
	AD1CON1bits.ADON = 1;		//włącz przetwornik

	/////////////////////////////////////////////////////
	//nieskończona pętla
	for(;;)						
	{
		AD1CON1bits.SAMP = 1;	//włącz próbkowanie
		//czekaj na koniec konwersji 
		//(uruchomiona automatycznie po skończeniu próbkowania)
		while (!AD1CON1bits.DONE);
		wynikADC = ADC1BUF0;	//odczytaj wynik
		wynikF = wynikADC;
		wynikF *= 330.0;
		wynikF /= 1023.0;
		wynikF -= 50.0;
		//rozdziel wynik na część całkowitą (wynikC) i ułamkową (wynikU)
		wynikU = modff(wynikF, &wynikC);
		//wyświetlimy 1 cyfrę części ułamkowej
		wynikU *= 10.0;
		//wyodrębnij część całkowitą
		wynikU = floorf(wynikU);
		//czyść fragment wyświetlacza
		UstawKursorLCD(2, 1);	//wiersz 2 kolumna 1
		WyswietlLCD(napis2, 4);
		UstawKursorLCD(2, 1);	//wiersz 2 kolumna 1
		//wyświetl część całkowitą
		wynikADC = (int)wynikC;
		itoa(tablica, wynikADC, 10);
		WyswietlLCD(tablica, strlen(tablica));
		//wyświetl przecinek
		Wyslij_do_LCD(',');
		//wyświetl część ułamkową (1 cyfra)
		wynikADC = (int)wynikU;
		utoa(tablica, wynikADC, 10);
		WyswietlLCD(tablica, 1);
		//wyświetl napis "^C"
		WyswietlLCD(napis3, 3);		
		__delay_ms(500);
    }
}
