Untitled
unknown
plain_text
3 years ago
7.8 kB
5
Indexable
#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; } }
Editor is loading...