Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2020
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.00 KB | None | 0 0
  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "LCD.h"
  4. #include "portyLcd.h"
  5. #include "addons.h"
  6. #include<msp430x14x.h>
  7. # define B1 (P4IN&BIT4)
  8.  
  9. #define DALLAS BIT7
  10. #define OUT_DALLAS (P1DIR |= DALLAS)
  11. #define INP_DALLAS (P1DIR &= ~DALLAS)
  12. #define SET_DALLAS (P1OUT |= DALLAS)
  13. #define CLR_DALLAS (P1OUT &= ~DALLAS)
  14.  
  15. #define SKIP_ROM 0xCC
  16. #define CONVERT_T 0x44
  17. #define READ_SCRATCHPAD 0xBE
  18.  
  19. #define POS 0x03
  20. #define DEBUG 1
  21.  
  22. unsigned int i;
  23. int temp;
  24. void LCD(void)
  25. {
  26. //SEND_CMD(DD_RAM_ADDR2);
  27. int cyfra, waga=1;
  28. //clearDisplay();
  29. for(i=0;i<0xfff;i++);//opoznienie
  30. if(temp<0)
  31. {
  32. SEND_CHAR('-');
  33. temp*=-1;
  34. }
  35. if(temp<10)//liczba *10
  36. SEND_CHAR('0');
  37.  
  38. if (temp >= 1000)
  39. {
  40. SEND_CHAR('?');
  41. return;
  42. }
  43. while (waga < temp)
  44. {
  45. waga*=10;
  46. }
  47. while(waga>10)
  48. {
  49. waga/=10;
  50. cyfra = temp / waga;
  51. SEND_CHAR((int)('0'+cyfra));
  52. temp-=cyfra*waga;
  53. }
  54. SEND_CHAR('.');
  55. SEND_CHAR((int)('0'+temp));
  56. }
  57. unsigned char resetPulse()
  58. {
  59. P1DIR |= BIT7; // port Dallas ustawiany w tryb wyjsciowy
  60. P1OUT &= ~BIT7; // ustawiamy magistrale w poziom niski (master Tx reset pulse)
  61.  
  62. __Delayx1us(500); // odczekaj 500 us na odebranie RESET PULSE przez DS
  63.  
  64. P1DIR |= BIT7; // port Dallas ustawiany w tryb wyjsciowy
  65. P1OUT |= BIT7; // ustawiamy magistrale w poziom wysoki
  66.  
  67. __Delayx1us(60); // odczekaj 30 us
  68.  
  69. P1DIR &= ~BIT7; // port Dallas ustawiany w tryb wejsciowy
  70.  
  71. if (! (P1IN & BIT7)); // odebrano sygnal‚ presence(0)
  72. else // nie odebrano sygnalu presence
  73. return 1; // warto, czy nie kontynuowac? - raczej nie znaleziono urzadzenia
  74.  
  75. __Delayx1us(470); // odczekaj 470 µs
  76.  
  77. if(P1IN & BIT7) // sprawdzamy czy DS podciagnal magistrale
  78. return 0; // tak - inicjalizacja wykonana poprawnie
  79. else
  80. return 2; // nie - inicjalizacja nie powiodla sie
  81. }
  82.  
  83. /* Wysyla do ukladu pojedynczy bit */
  84. void send(unsigned char bit) {
  85. P1DIR |= BIT7; // magistrala w trybie wyjsciowym
  86. P1OUT &= ~BIT7; // zero na wyjscie
  87. __Delayx1us(5); // odczekanie 5us (nie za malo?)
  88. if (bit==1) { // wysylana 1
  89. P1OUT |= BIT7; // jedynka na wyjscie
  90. }
  91. __Delayx1us(80); // odczekanie (lub wyslanie zera)
  92.  
  93. P1OUT |= BIT7; // jedynka na wyjscie
  94. }
  95.  
  96. unsigned char read() {
  97. P1DIR |= BIT7; // magistrala w trybie wyjsciowym
  98. P1OUT &= ~BIT7; // zero na wyjscie
  99. __Delayx1us(2); // odczekanie 2us
  100. P1OUT |= BIT7; // jedynka na wyjscie
  101. __Delayx1us(2); // odczekanie 2us
  102. P1DIR &= ~BIT7; // port ustawiany na tryb wejsciowy
  103. if (P1IN & BIT7) // odebrano jedynke
  104. return 1;
  105. else return 0; // odebrano zero
  106. }
  107.  
  108. void send_byte(unsigned char wartosc) {
  109. unsigned char i; // zmienna licznikowa
  110. unsigned char pom; // zmienna pomocnicza
  111.  
  112. for(i=0; i!=8; i++) { // wysylanie kolejnych bitow bajtu poczawszy od LSB
  113. pom = wartosc>>i; // przesuniecie bitowe w prawo
  114. pom &= 0x01; // skopiowanie JEDNEGO BITU do zmiennej pomocniczej
  115. send(pom); // wyslanie bitu na magistrale
  116. }
  117. __Delayx1us(100); //odczekanie 100us
  118. }
  119.  
  120. unsigned char read_byte(void) {
  121. unsigned char i; // zmienna licznikowa
  122. unsigned char wartosc =0; // odczytywana wartosc
  123.  
  124. for(i=0; i!=8; i++) { //petla wykonywana 8 razy
  125. if (read()) wartosc |= (0x01<<i); // jesli odczytano jedynke
  126. __Delayx1us(15); // odczekanie 15us
  127. }
  128. return wartosc; // zwrot wartosci do funkcji
  129. }
  130.  
  131.  
  132. int main()
  133. {
  134. WDTCTL = WDTPW | WDTHOLD;
  135. P4DIR&=~BIT4;
  136. ADC12CTL0=ADC12ON|REFON|SHT0_15; //w3. rdzenia, w3.gen. nap. odniesienia, wybór nap. odniesienia
  137. ADC12CTL1=SHP|CSTARTADD_0; //próbkowanie impulsowe, wynik sk3adany w ADC12MEM0
  138. ADC12MCTL0=INCH_10|SREF_1; //kana3 10, Yród3o nap. odniesienia - wew. generator (1,5V)
  139. for(i=0;i<0x3600;i++);
  140. CCR0=50000; //ustala nowy okres licznika 0,5s
  141. TACTL=TASSEL_2|ID_3|MC_1; //Yród3o taktowania SMCLK, dzielone przez 8,tryb UP
  142. CCTL0=CCIE; //uaktywnienie przerwania od TACCR0 CCIFG
  143. _BIS_SR(GIE); //w3aczenie przerwan
  144.  
  145. ADC12CTL0 |= ENC;
  146.  
  147. P4DIR &=~BIT4;
  148. P2DIR |=BIT1;
  149.  
  150. IE1 |= WDTIE; // aktywuje przerwania NMI
  151. _EINT(); // odblokowanie przerwań
  152. InitOsc2(8, 1); // MCLK=8MHz, ACLK=1MHz
  153. InitLCD();
  154. InitPortsLcd();
  155. InitPorts2();
  156.  
  157. STATUS_LED_OFF;
  158.  
  159. char st[] = {0xc,0x12,0x12,0xc,0x0,0x0,0x0,0x0};
  160.  
  161. SEND_CMD(CG_RAM_ADDR);
  162. for(i=0; i<8; i++) SEND_CHAR(st[i]);
  163.  
  164.  
  165. unsigned char t, spr=0, msb=0, lsb=0, prevMSB=0xFF, prevLSB=0xFF, calk;
  166. unsigned short ulam;
  167. while (1) {
  168. if(B1==0)
  169. {
  170.  
  171. P2OUT &=~BIT1;
  172. //wysylanie cpu
  173. clearDisplay();
  174. SEND_CMD(DD_RAM_ADDR);
  175. __Delayx1ms(500);
  176.  
  177. P2OUT |= BIT1;
  178. __Delayx1ms(10);
  179.  
  180. spr = resetPulse(); // make initialization of DS18B20
  181. if (spr == 0) { // poprawnie wykonano inicjalizacje DS18B20
  182.  
  183. send_byte(SKIP_ROM); // send SKIP ROM command
  184. send_byte(CONVERT_T); // send CONVERT TEMPERATURE command
  185. __Delayx1ms(500); // wait (passive) 750 ms (exactly 768ms)
  186. __Delayx1ms(250); //
  187. spr = resetPulse(); // make initialization of DS18B20
  188. send_byte(SKIP_ROM); // send SKIP ROM command
  189. send_byte(READ_SCRATCHPAD);
  190.  
  191.  
  192. lsb = read_byte();
  193. msb = read_byte();
  194. read_byte(); read_byte(); read_byte(); read_byte(); read_byte(); read_byte(); read_byte();
  195.  
  196.  
  197. prevLSB = lsb;
  198. prevMSB = msb;
  199.  
  200. calk = lsb >> 4;
  201. calk += (msb & 0x07) << 4;
  202.  
  203. //LICZENIE TEMPERATURY
  204. if (!(msb & 0x80)) {
  205. ulam = (lsb & 0x08) ? 5000 : 0;
  206. ulam += (lsb & 0x04) ? 2500 : 0;
  207. ulam += (lsb & 0x02) ? 1250 : 0;
  208. ulam += (lsb & 0x01) ? 625 : 0;
  209. }
  210.  
  211.  
  212. if (calk < 100) { // liczba calkowita dwucyfrowa
  213. CHAR_DD(((msb & 0x80) ? '-' : ' '), POS); // w zaleznosci czy ujemna/dodatnia temp
  214. SEND_CHAR(calk/10+'0');
  215. SEND_CHAR(calk%10+'0');
  216. SEND_CHAR(',');
  217. }
  218.  
  219. t = ulam / 1000;
  220. SEND_CHAR(t+'0');
  221. ulam -= t * 1000;
  222. t = ulam / 100;
  223. SEND_CHAR(t+'0');
  224. SEND_CHAR(0);
  225. SEND_CHAR('C');
  226. P2OUT &=~BIT1;
  227. SEND_CMD(DD_RAM_ADDR2);
  228. SEND_CHAR('C');
  229. SEND_CHAR('P');
  230. SEND_CHAR('U');
  231. SEND_CHAR(' ');
  232. ADC12CTL0 |= ADC12SC; //start konwersji
  233. while((ADC12CTL1&ADC12BUSY)==1); //czekanie na koniec konwersji
  234. temp=ADC12MEM0*1.0318-2777.4647; //wartooa temperatury z dok. 1-miejsce po przecinku
  235. LCD();
  236. __Delayx1ms(500);
  237.  
  238. }
  239.  
  240.  
  241. }
  242. }
  243.  
  244.  
  245. /* else if(spr == 1)
  246. {
  247. clearDisplay();
  248. printString("Nie podloczono");
  249. }
  250.  
  251. else if(spr == 2)
  252. {
  253. clearDisplay();
  254. printString("Zle podloczono");
  255. }*/
  256.  
  257.  
  258. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement