Untitled

mail@pastecode.io avatar
unknown
plain_text
2 years ago
7.8 kB
1
Indexable
Never
#include <msp430x14x.h>
#include <stdlib.h>
#include "portyLcd.h"
#include "lcd.h"
#define B1 BIT4&P4IN
#define DALLAS BIT7
#define WE 0
#define PORT_1Wire DALLAS
#define SET_1Wire P1DIR |= DALLAS;P1OUT |= DALLAS
#define CLEAR_1Wire P1DIR |= DALLAS;P1OUT &= ~DALLAS
unsigned int cntr;
int wait_flag=0;
int dalvalue=0;
int button =0;
int empty =1;

int bit_is_clear(int a, int b){
    P1DIR &= ~DALLAS;
    return !(P1IN & DALLAS);
}
int bit_is_set(int a, int b){
    P1DIR &= ~DALLAS;
    __delay_cycles(80);
    return P1IN & DALLAS;
}
int bit_is_set2(int a, int b){
    P1DIR &= ~DALLAS;
    return P1IN & DALLAS;
}
unsigned char RESET_PULSE(void){
    unsigned char PRESENCE;
    CLEAR_1Wire;    //ustawiamy magistrale w poziom niski
    __delay_cycles(4000); // >480us
SET_1Wire;     //ustawiamy magistrale w poziom wysoki
    __delay_cycles(240); //oczekiwanie na ustawienie linii w stan niski przez DS 15-60us
    //sprawdzamy poziom linii (czy w stanie niskim)
if(bit_is_clear(PORT_1Wire, WE)) PRESENCE=1;
else PRESENCE=0;

    //1-odebrano bit PRESENCE, 0- stan nieaktywnooci
    __delay_cycles(3840); //odczekanie rzez mastera 480us i spr. czy DALLAS podciagnal magistrale
    //sprawdzamy posiom linii (czy ustawiona)
if(bit_is_set(PORT_1Wire, WE)) PRESENCE=1;
    else PRESENCE=0;
    return PRESENCE; //zwracamy wartosc do funkcji
}

void send(char bit){
CLEAR_1Wire; //ustawienie w stan niski magistralii
    __delay_cycles(40);
    if(bit==1)    {
        SET_1Wire;   // zwolnienie magistralii - wyslanie jedynki
    }
    __delay_cycles(640); // przetrzymanie - wyslanie zera
    SET_1Wire;
}

unsigned char read(void){
    unsigned char PRESENCE=0;
CLEAR_1Wire; //ustawienie w stan niski DQ
    __delay_cycles(16); //odczekanie 2us
    SET_1Wire; //zwolnienie magistrali
__delay_cycles(120); //delay 15us
    if(bit_is_set2(PORT_1Wire, WE))  PRESENCE=1;
else PRESENCE=0;         //odbior jedynki lub zera
return(PRESENCE);
}

void send_byte(char wartosc){
unsigned char i; //zmienna licznikowa
    unsigned char pom; //zmienna pomocnicza

    for(i=0; i<8; i++)    {
        pom=wartosc>>i;//przesuniecie bitowe w prawo
        pom &=0x01; //skopiowanie bitu do zmiennej pomocniczej
        send(pom); //wyslanie bitu na magistrale
}
    __delay_cycles(800); //odczekanie 100us
}

char read_byte(void){
unsigned char i; // zmienna licznikowa
    unsigned char wartosc =0; //zczytywana wartosc

    for(i=0; i<8; i++) //petla wykonywana 8 razy    
    {
if (read()) wartosc|=0x01<<i;
__delay_cycles(120); //odczekanie 15us

    }
    return(wartosc); //zwrot wartosci do funkcji
}

void cel(){
  int tab[8]={0,0,10,21,17,10,4,0};
  SEND_CMD(CG_RAM_ADDR);
  for(int i=0;i<8;i++)
    SEND_CHAR(tab[i]);
}


int main(void){
  
    unsigned char sprawdz_impuls;
    char temp1=0,temp2=0;
    int temp;
    
    
unsigned int k;

    WDTCTL=WDTPW + WDTHOLD;
    
    InitPortsLcd();                  
    InitLCD();                        
    clearDisplay();  
    
    //Mierzenie temperatury wewnetrznej
    ADC12CTL0 = ADC12ON | REFON | SHT0_15;	// wlaczenie rdzenia i generatora napiecia odniesienia oraz wybór napiecia odniesienia
    ADC12CTL1 = SHP | CSTARTADD_0;   	// próbkowanie impulsowe, wynik skladany w ADC12MEM0
    ADC12MCTL0 = INCH_10 | SREF_1;   	// kanal 10, zródlo napiecia odniesienia – wewnetrzny generator 1,5 V
    
    for(k = 0; k < 0x3600;   k++);    	// czas na ustabilizowanie generatora napiecia odniesienia
    clearDisplay();                   
    clearDisplay();                   
    CCR0 = 50000;                  	// ustala nowy okres licznika
    TACTL = TASSEL_2 | ID_3 | MC_1;   	// zródlo taktowania SMCLK dzielone przez 8, tryb UP
    CCTL0 = CCIE;      			// uaktywnienie przerwania od TACCR0
    _BIS_SR(GIE);      			// wlaczenie przerwan
    ADC12CTL0 |= ENC;  			// uaktywnienie konwersji
    
int i;


    BCSCTL1 |= XTS;                       // ACLK = LFXT1 = HF XTAL 8MHz
    do
    {
        IFG1 &= ~OFIFG;                     // Czyszczenie flgi OSCFault
        for (i = 0xFF; i > 0; i--);         // odczekanie
    }
    while ((IFG1 & OFIFG) == OFIFG);    // dopóki OSCFault jest ci1gle ustawiona

    BCSCTL1 |= DIVA_0;                    // ACLK=8 MHz
    BCSCTL2 |= SELM0 | SELM1;             // MCLK= LFTX1 =ACLK

for(;;)
{
	dalvalue = 0;
	button =1;
	empty =0;
              
	sprawdz_impuls=RESET_PULSE(); //impuls resetu
	if(sprawdz_impuls==1)            
	{
		send_byte(0xCC); //SKIP ROM
		send_byte(0x44); //CONVERT T
		for(k=0; k<9; k++)__delay_cycles(600000); //odczekaj 750ms - czas konwersji
		sprawdz_impuls=RESET_PULSE(); //wyslanie impulsu reset
		send_byte(0xCC); //SKIP ROM
		send_byte(0xBE); //READ SCRATCHPAD

		temp1=read_byte(); //odczytanie LSB
		temp2=read_byte(); //odczytanie MSB

		sprawdz_impuls=RESET_PULSE(); //zwolnienie magistrali

		float temp=0; //zmienna do obliczen
		temp=(float)(temp1+(temp2*256))/16; //obl. temp
                

        if(temp>=0)
		{ 
          clearDisplay();
          SEND_CMD(DD_RAM_ADDR2);
          SEND_CHAR((int)(temp/10)+48);
          SEND_CHAR((int)(temp)%10+48);
          SEND_CHAR('.');
          SEND_CHAR((int)(temp*10)%10+48);
          //cel();  
          //SEND_CMD(DD_RAM_ADDR2+5);
          SEND_CHAR('C');
          __delay_cycles(16000);
		}

                
        if(temp < 0)
		{
                  
			clearDisplay();
		    temp *= -1; 
		    SEND_CMD(DD_RAM_ADDR2);
        
	        if((int)(temp/10)+48==0)
			{
				SEND_CMD(DD_RAM_ADDR2);
				SEND_CHAR('-'); 
				SEND_CHAR((int)(temp/10)+48);
				SEND_CHAR((int)(temp)%10+48);
				SEND_CHAR('.');
				SEND_CHAR((int)(temp*10)%10+48);
				SEND_CHAR('C');
				__delay_cycles(16000);
			}
			else
			{
				SEND_CHAR('B');
				SEND_CHAR('R'); 
				SEND_CHAR('A'); 
				SEND_CHAR('K'); 
				SEND_CHAR(' '); 
				SEND_CHAR('D'); 
				SEND_CHAR('A'); 
				SEND_CHAR('L'); 
				SEND_CHAR('L'); 
				SEND_CHAR('A'); 
				SEND_CHAR('S');
				dalvalue=1;
			}
		}
	}
	else //jezli nie wykryto PRESENCE_PULSE
	{
		clearDisplay();
		SEND_CMD(DD_RAM_ADDR+0x00);
		SEND_CHAR('B');
		SEND_CHAR('R');
		SEND_CHAR('A');
		SEND_CHAR('K');
		SEND_CMD(DD_RAM_ADDR2);
		SEND_CHAR('P');
		SEND_CHAR('O');
		SEND_CHAR('L');
		SEND_CHAR('A');
		SEND_CHAR('C');
		SEND_CHAR('Z');
		SEND_CHAR('E');
		SEND_CHAR('N');
		SEND_CHAR('I');
		SEND_CHAR('A');
                
		while(sprawdz_impuls!=1)
		{
			sprawdz_impuls=RESET_PULSE();
		}
		clearDisplay();
	}
        

        
        ADC12CTL0 |= ADC12SC;       	// start konwersji
        while((ADC12CTL1 & ADC12BUSY) == ADC12BUSY);	// czekanie na koniec konwersji
        temp=(int)(ADC12MEM0*1.0318-2777.4647)*10;

        empty =0;
        if(wait_flag==0 && empty==0 && dalvalue==0)
        {
         SEND_CMD(DD_RAM_ADDR); 
        //SEND_CHAR(' ');
        SEND_CHAR('T');
        SEND_CHAR('E');
        SEND_CHAR('M');
        SEND_CHAR('P');
        SEND_CHAR('E');
        SEND_CHAR('R');
        SEND_CHAR('A');
        SEND_CHAR('T');
        SEND_CHAR('U');
        SEND_CHAR('R');
        SEND_CHAR('A');
        wait_flag=0;
        }
        else if(empty==1){
        SEND_CHAR('N');
        SEND_CHAR('O');
        SEND_CHAR(' ');
        SEND_CHAR('D');
        SEND_CHAR('A');
        SEND_CHAR('T');
        SEND_CHAR('A');
        }
        
   
    }
}



#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A(){
    if(++cntr == 10) {
        _BIC_SR_IRQ(LPM0_bits);
cntr = 0;
    }
}