Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdio.h"
- #include "stdlib.h"
- #include "LCD.h"
- #include "portyLcd.h"
- #include "addons.h"
- #include<msp430x14x.h>
- # define B1 (P4IN&BIT4)
- #define DALLAS BIT7
- #define OUT_DALLAS (P1DIR |= DALLAS)
- #define INP_DALLAS (P1DIR &= ~DALLAS)
- #define SET_DALLAS (P1OUT |= DALLAS)
- #define CLR_DALLAS (P1OUT &= ~DALLAS)
- #define SKIP_ROM 0xCC
- #define CONVERT_T 0x44
- #define READ_SCRATCHPAD 0xBE
- #define POS 0x03
- #define DEBUG 1
- unsigned int i;
- int temp;
- void LCD(void)
- {
- //SEND_CMD(DD_RAM_ADDR2);
- int cyfra, waga=1;
- //clearDisplay();
- for(i=0;i<0xfff;i++);//opoznienie
- if(temp<0)
- {
- SEND_CHAR('-');
- temp*=-1;
- }
- if(temp<10)//liczba *10
- SEND_CHAR('0');
- if (temp >= 1000)
- {
- SEND_CHAR('?');
- return;
- }
- while (waga < temp)
- {
- waga*=10;
- }
- while(waga>10)
- {
- waga/=10;
- cyfra = temp / waga;
- SEND_CHAR((int)('0'+cyfra));
- temp-=cyfra*waga;
- }
- SEND_CHAR('.');
- SEND_CHAR((int)('0'+temp));
- }
- unsigned char resetPulse()
- {
- P1DIR |= BIT7; // port Dallas ustawiany w tryb wyjsciowy
- P1OUT &= ~BIT7; // ustawiamy magistrale w poziom niski (master Tx reset pulse)
- __Delayx1us(500); // odczekaj 500 us na odebranie RESET PULSE przez DS
- P1DIR |= BIT7; // port Dallas ustawiany w tryb wyjsciowy
- P1OUT |= BIT7; // ustawiamy magistrale w poziom wysoki
- __Delayx1us(60); // odczekaj 30 us
- P1DIR &= ~BIT7; // port Dallas ustawiany w tryb wejsciowy
- if (! (P1IN & BIT7)); // odebrano sygnal‚ presence(0)
- else // nie odebrano sygnalu presence
- return 1; // warto, czy nie kontynuowac? - raczej nie znaleziono urzadzenia
- __Delayx1us(470); // odczekaj 470 µs
- if(P1IN & BIT7) // sprawdzamy czy DS podciagnal magistrale
- return 0; // tak - inicjalizacja wykonana poprawnie
- else
- return 2; // nie - inicjalizacja nie powiodla sie
- }
- /* Wysyla do ukladu pojedynczy bit */
- void send(unsigned char bit) {
- P1DIR |= BIT7; // magistrala w trybie wyjsciowym
- P1OUT &= ~BIT7; // zero na wyjscie
- __Delayx1us(5); // odczekanie 5us (nie za malo?)
- if (bit==1) { // wysylana 1
- P1OUT |= BIT7; // jedynka na wyjscie
- }
- __Delayx1us(80); // odczekanie (lub wyslanie zera)
- P1OUT |= BIT7; // jedynka na wyjscie
- }
- unsigned char read() {
- P1DIR |= BIT7; // magistrala w trybie wyjsciowym
- P1OUT &= ~BIT7; // zero na wyjscie
- __Delayx1us(2); // odczekanie 2us
- P1OUT |= BIT7; // jedynka na wyjscie
- __Delayx1us(2); // odczekanie 2us
- P1DIR &= ~BIT7; // port ustawiany na tryb wejsciowy
- if (P1IN & BIT7) // odebrano jedynke
- return 1;
- else return 0; // odebrano zero
- }
- void send_byte(unsigned char wartosc) {
- unsigned char i; // zmienna licznikowa
- unsigned char pom; // zmienna pomocnicza
- for(i=0; i!=8; i++) { // wysylanie kolejnych bitow bajtu poczawszy od LSB
- pom = wartosc>>i; // przesuniecie bitowe w prawo
- pom &= 0x01; // skopiowanie JEDNEGO BITU do zmiennej pomocniczej
- send(pom); // wyslanie bitu na magistrale
- }
- __Delayx1us(100); //odczekanie 100us
- }
- unsigned char read_byte(void) {
- unsigned char i; // zmienna licznikowa
- unsigned char wartosc =0; // odczytywana wartosc
- for(i=0; i!=8; i++) { //petla wykonywana 8 razy
- if (read()) wartosc |= (0x01<<i); // jesli odczytano jedynke
- __Delayx1us(15); // odczekanie 15us
- }
- return wartosc; // zwrot wartosci do funkcji
- }
- int main()
- {
- WDTCTL = WDTPW | WDTHOLD;
- P4DIR&=~BIT4;
- ADC12CTL0=ADC12ON|REFON|SHT0_15; //w3. rdzenia, w3.gen. nap. odniesienia, wybór nap. odniesienia
- ADC12CTL1=SHP|CSTARTADD_0; //próbkowanie impulsowe, wynik sk3adany w ADC12MEM0
- ADC12MCTL0=INCH_10|SREF_1; //kana3 10, Yród3o nap. odniesienia - wew. generator (1,5V)
- for(i=0;i<0x3600;i++);
- CCR0=50000; //ustala nowy okres licznika 0,5s
- TACTL=TASSEL_2|ID_3|MC_1; //Yród3o taktowania SMCLK, dzielone przez 8,tryb UP
- CCTL0=CCIE; //uaktywnienie przerwania od TACCR0 CCIFG
- _BIS_SR(GIE); //w3aczenie przerwan
- ADC12CTL0 |= ENC;
- P4DIR &=~BIT4;
- P2DIR |=BIT1;
- IE1 |= WDTIE; // aktywuje przerwania NMI
- _EINT(); // odblokowanie przerwań
- InitOsc2(8, 1); // MCLK=8MHz, ACLK=1MHz
- InitLCD();
- InitPortsLcd();
- InitPorts2();
- STATUS_LED_OFF;
- char st[] = {0xc,0x12,0x12,0xc,0x0,0x0,0x0,0x0};
- SEND_CMD(CG_RAM_ADDR);
- for(i=0; i<8; i++) SEND_CHAR(st[i]);
- unsigned char t, spr=0, msb=0, lsb=0, prevMSB=0xFF, prevLSB=0xFF, calk;
- unsigned short ulam;
- while (1) {
- if(B1==0)
- {
- P2OUT &=~BIT1;
- //wysylanie cpu
- clearDisplay();
- SEND_CMD(DD_RAM_ADDR);
- __Delayx1ms(500);
- P2OUT |= BIT1;
- __Delayx1ms(10);
- spr = resetPulse(); // make initialization of DS18B20
- if (spr == 0) { // poprawnie wykonano inicjalizacje DS18B20
- send_byte(SKIP_ROM); // send SKIP ROM command
- send_byte(CONVERT_T); // send CONVERT TEMPERATURE command
- __Delayx1ms(500); // wait (passive) 750 ms (exactly 768ms)
- __Delayx1ms(250); //
- spr = resetPulse(); // make initialization of DS18B20
- send_byte(SKIP_ROM); // send SKIP ROM command
- send_byte(READ_SCRATCHPAD);
- lsb = read_byte();
- msb = read_byte();
- read_byte(); read_byte(); read_byte(); read_byte(); read_byte(); read_byte(); read_byte();
- prevLSB = lsb;
- prevMSB = msb;
- calk = lsb >> 4;
- calk += (msb & 0x07) << 4;
- //LICZENIE TEMPERATURY
- if (!(msb & 0x80)) {
- ulam = (lsb & 0x08) ? 5000 : 0;
- ulam += (lsb & 0x04) ? 2500 : 0;
- ulam += (lsb & 0x02) ? 1250 : 0;
- ulam += (lsb & 0x01) ? 625 : 0;
- }
- if (calk < 100) { // liczba calkowita dwucyfrowa
- CHAR_DD(((msb & 0x80) ? '-' : ' '), POS); // w zaleznosci czy ujemna/dodatnia temp
- SEND_CHAR(calk/10+'0');
- SEND_CHAR(calk%10+'0');
- SEND_CHAR(',');
- }
- t = ulam / 1000;
- SEND_CHAR(t+'0');
- ulam -= t * 1000;
- t = ulam / 100;
- SEND_CHAR(t+'0');
- SEND_CHAR(0);
- SEND_CHAR('C');
- P2OUT &=~BIT1;
- SEND_CMD(DD_RAM_ADDR2);
- SEND_CHAR('C');
- SEND_CHAR('P');
- SEND_CHAR('U');
- SEND_CHAR(' ');
- ADC12CTL0 |= ADC12SC; //start konwersji
- while((ADC12CTL1&ADC12BUSY)==1); //czekanie na koniec konwersji
- temp=ADC12MEM0*1.0318-2777.4647; //wartooa temperatury z dok. 1-miejsce po przecinku
- LCD();
- __Delayx1ms(500);
- }
- }
- }
- /* else if(spr == 1)
- {
- clearDisplay();
- printString("Nie podloczono");
- }
- else if(spr == 2)
- {
- clearDisplay();
- printString("Zle podloczono");
- }*/
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement