Advertisement
Guest User

Untitled

a guest
Jan 17th, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.23 KB | None | 0 0
  1.  
  2.  
  3. #include "stdio.h"
  4. #include "stdlib.h"
  5. #include "display.h"
  6. #include "addons.h"
  7. #include<msp430x14x.h>
  8.  
  9.  
  10. #define DALLAS BIT7
  11. #define OUT_DALLAS (P1DIR |= DALLAS)
  12. #define INP_DALLAS (P1DIR &= ~DALLAS)
  13. #define SET_DALLAS (P1OUT |= DALLAS)
  14. #define CLR_DALLAS (P1OUT &= ~DALLAS)
  15.  
  16. #define SKIP_ROM 0xCC
  17. #define CONVERT_T 0x44
  18. #define READ_SCRATCHPAD 0xBE
  19.  
  20. /* Pozycja, na której wypisywana jest temperatura:
  21. * ---,----*C -85,XXXX*C ... 127.XXXX*C
  22. * Jest to pozycja pierwszego myślnika na powyższym przykładzie
  23. * POS w granicach 0x00 ... 0x06 */
  24. #define POS 0x03
  25. #define DEBUG 1
  26.  
  27. void defineChars() {
  28. /* Definicja symbolu stopnia, znak o numerze 0x00 */
  29. SEND_CMD(0x40); SEND_CHAR(0x07); SEND_CMD(0x41); SEND_CHAR(0x05); SEND_CMD(0x42); SEND_CHAR(0x07);
  30. SEND_CMD(0x43); SEND_CHAR(0x00); SEND_CMD(0x44); SEND_CHAR(0x00); SEND_CMD(0x45); SEND_CHAR(0x00);
  31. SEND_CMD(0x46); SEND_CHAR(0x00); SEND_CMD(0x47); SEND_CHAR(0x00);
  32.  
  33. /* Definicja znaków używanych przy debugowaniu */
  34. if (DEBUG) {
  35. // zero podkreślone, znak numer 0x01 //
  36. SEND_CMD(0x48); SEND_CHAR(0x04); SEND_CMD(0x49); SEND_CHAR(0x0E); SEND_CMD(0x4A); SEND_CHAR(0x0A);
  37. SEND_CMD(0x4B); SEND_CHAR(0x0A); SEND_CMD(0x4C); SEND_CHAR(0x0E); SEND_CMD(0x4D); SEND_CHAR(0x04);
  38. SEND_CMD(0x4E); SEND_CHAR(0x00); SEND_CMD(0x4F); SEND_CHAR(0x1F);
  39.  
  40. // jeden podkreślone, znak numer 0x02 //
  41. SEND_CMD(0x50); SEND_CHAR(0x04); SEND_CMD(0x51); SEND_CHAR(0x0C); SEND_CMD(0x52); SEND_CHAR(0x04);
  42. SEND_CMD(0x53); SEND_CHAR(0x04); SEND_CMD(0x54); SEND_CHAR(0x04); SEND_CMD(0x55); SEND_CHAR(0x04);
  43. SEND_CMD(0x56); SEND_CHAR(0x00); SEND_CMD(0x57); SEND_CHAR(0x1F);
  44.  
  45. // zero nadkreślone, znak numer 0x03 //
  46. SEND_CMD(0x58); SEND_CHAR(0x1F); SEND_CMD(0x59); SEND_CHAR(0x00);
  47. SEND_CMD(0x5A); SEND_CHAR(0x04); SEND_CMD(0x5B); SEND_CHAR(0x0E); SEND_CMD(0x5C); SEND_CHAR(0x0A);
  48. SEND_CMD(0x5D); SEND_CHAR(0x0A); SEND_CMD(0x5E); SEND_CHAR(0x0E); SEND_CMD(0x5F); SEND_CHAR(0x04);
  49.  
  50. // jeden nadkreślone, znak numer 0x04 //
  51. SEND_CMD(0x60); SEND_CHAR(0x1F); SEND_CMD(0x61); SEND_CHAR(0x00);
  52. SEND_CMD(0x62); SEND_CHAR(0x04); SEND_CMD(0x63); SEND_CHAR(0x0C); SEND_CMD(0x64); SEND_CHAR(0x04);
  53. SEND_CMD(0x65); SEND_CHAR(0x04); SEND_CMD(0x66); SEND_CHAR(0x04); SEND_CMD(0x67); SEND_CHAR(0x04);
  54. }
  55. SEND_CMD(DD_RAM_ADDR);
  56. }
  57.  
  58. /* Inicjalizacja przed wysłaniem komendy ROM */
  59. unsigned char resetPulse() {
  60. P1DIR |= BIT7; // port Dallas ustawiany w tryb wyjściowy
  61. P1OUT &= ~BIT7; // ustawiamy magistrale w poziom niski (master Tx reset pulse)
  62.  
  63. __Delayx1us(500); // odczekaj 500 us na odebranie RESET PULSE przez DS
  64.  
  65. P1DIR |= BIT7; // port Dallas ustawiany w tryb wyjściowy
  66. P1OUT |= BIT7; // ustawiamy magistrale w poziom wysoki
  67.  
  68. __Delayx1us(60); // odczekaj 30 us
  69.  
  70. P1DIR &= ~BIT7; // port Dallas ustawiany w tryb wejściowy
  71.  
  72. if (! (P1IN & BIT7)) // odebrano sygnał presence(0)
  73. ;
  74. else // nie odebrano sygnału presence
  75. return 1; // warto, czy nie kontynuować? - raczej nie znaleziono urządzenia
  76.  
  77. __Delayx1us(470); // odczekaj 470µs
  78.  
  79. if(P1IN & BIT7) // sprawdzamy czy DS podciągnął magistralę
  80. return 0; // tak - inicjalizacja wykonana poprawnie
  81. else
  82. return 2; // nie - inicjalizacja nie powiodła się
  83. }
  84.  
  85. /* Wysyła do układu pojedynczy bit */
  86. void send(unsigned char bit) {
  87. P1DIR |= BIT7; // magistrala w trybie wyjściowym
  88. P1OUT &= ~BIT7; // zero na wyjście
  89. __Delayx1us(5); // odczekanie 5us (nie za mało?)
  90. if (bit==1) { // wysylana 1
  91. P1OUT |= BIT7; // jedynka na wyjście
  92. }
  93. __Delayx1us(80); // odczekanie (lub też wysłanie zera)
  94.  
  95. P1OUT |= BIT7; // jedynka na wyjście
  96. }
  97.  
  98. /* Odbiera z układu pojedynczy bit */
  99. unsigned char read() {
  100. P1DIR |= BIT7; // magistrala w trybie wyjściowym
  101. P1OUT &= ~BIT7; // zero na wyjście
  102. __Delayx1us(2); // odczekanie 2us
  103. P1OUT |= BIT7; // jedynka na wyjście
  104. __Delayx1us(2); // odczekanie 2us
  105. P1DIR &= ~BIT7; // port ustawiany na tryb wejściowy
  106. if (P1IN & BIT7) // odebrano jedynkę
  107. return 1;
  108. else return 0; // odebrano zero
  109. }
  110.  
  111. /* Wysyła cały bajt do układu */
  112. void send_byte(unsigned char wartosc) {
  113. unsigned char i; // zmienna licznikowa
  114. unsigned char pom; // zmienna pomocnicza
  115.  
  116. for(i=0; i!=8; i++) { // wysyłanie kolejnych bitów bajtu począwszy od LSB
  117. pom = wartosc>>i; // przesunięcie bitowe w prawo
  118. pom &= 0x01; // skopiowanie JEDNEGO BITU do zmiennej pomocniczej
  119. send(pom); // wysłanie bitu na magistrale
  120. }
  121. __Delayx1us(100); //odczekanie 100us
  122. }
  123.  
  124. /* Odczytuje z układu jeden bajt */
  125. unsigned char read_byte(void) {
  126. unsigned char i; // zmienna licznikowa
  127. unsigned char wartosc =0; // odczytywana wartosc
  128.  
  129. for(i=0; i!=8; i++) { //petla wykonywana 8 razy
  130. if (read()) wartosc |= (0x01<<i); // jeśli odczytano jedynkę
  131. __Delayx1us(15); // odczekanie 15us
  132. }
  133. return wartosc; // zwrot wartosci do funkcji
  134. }
  135.  
  136. /* Ustaw linię DQ w poziom wysoki. Potrzebne na czas konwersji temperatury,
  137. * w trybie zasilania pasożytniczego. */
  138. void pullUpDQ() {
  139. P1DIR |= BIT7; // magistrala w trybie wyjściowym
  140. P1OUT |= BIT7; // jedynka na wyjście
  141. }
  142.  
  143. int main() {
  144. WDTCTL = WDTPW | WDTHOLD;
  145. IE1 |= WDTIE; // aktywuje przerwania NMI
  146. _EINT(); // odblokowanie przerwań
  147. InitOsc2(8, 1); // MCLK=8MHz, ACLK=1MHz
  148. InitLCD();
  149. InitPorts2();
  150.  
  151. STATUS_LED_OFF;
  152. //~ for (i = 0; i != 5; i++) {
  153. //~ SEND_CHAR(i+'0');
  154. //~ __Delayx1ms(500);
  155. //~ }
  156. //~ while(1) {
  157. //~ P1DIR |= BIT7; // magistrala w trybie wyjściowym
  158. //~ P1OUT &= ~BIT7; // zero na wyjście
  159. //~ __Delayx1ms(500);
  160. //~ __Delayx1ms(500);
  161. //~ P1DIR |= BIT7; // magistrala w trybie wyjściowym
  162. //~ P1OUT |= BIT7; // 1 na wyjście
  163. //~ __Delayx1ms(500);
  164. //~ __Delayx1ms(500);
  165. //~ }
  166. defineChars();
  167.  
  168. //~ SEND_CMD(CUR_HOME);
  169. //~ unsigned char i=0;
  170. //~ while (1) {
  171. //~ if ((B1) == 0) {
  172. //~ if (i == 0x10) {i = 0x40; SEND_CMD(DD_RAM_ADDR2);}
  173. //~ SEND_CHAR(0x01);
  174. //~ i++;
  175. //~ while ((B1) == 0) __Delayx1ms(1);
  176. //~ __Delayx1ms(10);
  177. //~ }
  178. //~ if ((B2) == 0) {
  179. //~ if (i == 0x10) {i = 0x40; SEND_CMD(DD_RAM_ADDR2);}
  180. //~ SEND_CHAR(0x02);
  181. //~ i++;
  182. //~ while ((B2) == 0) __Delayx1ms(1);
  183. //~ __Delayx1ms(10);
  184. //~ }
  185. //~ if ((B3) == 0) {
  186. //~ if (i == 0x10) {i = 0x40; SEND_CMD(DD_RAM_ADDR2);}
  187. //~ SEND_CHAR(0x03);
  188. //~ i++;
  189. //~ while ((B3) == 0) __Delayx1ms(1);
  190. //~ __Delayx1ms(10);
  191. //~ }
  192. //~ if ((B4) == 0) {
  193. //~ if (i == 0x10) {i = 0x40; SEND_CMD(DD_RAM_ADDR2);}
  194. //~ SEND_CHAR(0x04);
  195. //~ i++;
  196. //~ while ((B4) == 0) __Delayx1ms(1);
  197. //~ __Delayx1ms(10);
  198. //~ }
  199. //~ }
  200.  
  201. CHAR_DD('-', POS);
  202. printString("--,----");
  203. SEND_CHAR(0x00);
  204. SEND_CHAR('C');
  205. unsigned char t, spr=0, msb=0, lsb=0, prevMSB=0xFF, prevLSB=0xFF, calk;
  206. unsigned short ulam;
  207. while (1) {
  208. spr = resetPulse(); // make initialization of DS18B20
  209. if (spr == 0) { // poprawnie wykonano inicjalizacje DS18B20
  210.  
  211. send_byte(SKIP_ROM); // send SKIP ROM command
  212. send_byte(CONVERT_T); // send CONVERT TEMPERATURE command
  213. pullUpDQ(); // pull up DQ line to high level (parasite power mode)
  214. __Delayx1ms(500); // wait (passive) 750 ms (exactly 768ms)
  215. __Delayx1ms(250); //
  216. spr = resetPulse(); // make initialization of DS18B20
  217. if (spr != 0) {
  218. SEND_CMD(CUR_HOME);
  219. printString(" [2] Failed ("); SEND_CHAR(spr+'0'); SEND_CHAR(')');
  220. __Delayx1ms(500); // wait passive 1,5 s
  221. __Delayx1ms(500); //
  222. __Delayx1ms(500); //
  223. SEND_CMD(CUR_HOME);
  224. printString(" ");
  225. CHAR_DD('-', POS);
  226. printString("--,----");
  227. SEND_CHAR(0x00);
  228. SEND_CHAR('C');
  229. continue;
  230. }
  231. send_byte(SKIP_ROM); // send SKIP ROM command
  232. send_byte(READ_SCRATCHPAD);
  233.  
  234.  
  235. lsb = read_byte();
  236. msb = read_byte();
  237. read_byte(); read_byte(); read_byte(); read_byte(); read_byte(); read_byte(); read_byte();
  238.  
  239. if ((prevLSB != lsb) || (prevMSB != msb)) {
  240. //~ SEND_CMD(DD_RAM_ADDR2);
  241. //~ printByte(msb);
  242. //~ SEND_CHAR(' ');
  243. //~ printByte(lsb);
  244. prevLSB = lsb;
  245. prevMSB = msb;
  246.  
  247. calk = lsb >> 4;
  248. calk += (msb & 0x07) << 4;
  249.  
  250.  
  251. if (msb & 0x80) { // ujemna temperatura, zamiana części całkowitej temperatury z kodu U2 na NKB
  252. calk ^= 0x7F;
  253. //calk++;
  254. ulam = (lsb & 0x08) ? 0 : 5000; // temperatura ujemna, jedynki części ułamkowej
  255. ulam += (lsb & 0x04) ? 0 : 2500; // interpretuj jak zera
  256. ulam += (lsb & 0x02) ? 0 : 1250;
  257. ulam += (lsb & 0x01) ? 0 : 625;
  258. }
  259. else {
  260. ulam = (lsb & 0x08) ? 5000 : 0; // temperatura dodatnia, jedynki części ułakmkowej
  261. ulam += (lsb & 0x04) ? 2500 : 0; // interpretuj jako jedynki
  262. ulam += (lsb & 0x02) ? 1250 : 0;
  263. ulam += (lsb & 0x01) ? 625 : 0;
  264. }
  265.  
  266. if (calk < 10) { // część całkowita jednocyfrowa
  267. // ponieważ w U2 mamy +0=0x00 i -0=0xFF dodatkowy warunek:
  268. // (część całkowita != 0) lub (część ułamkowa != 0)
  269. CHAR_DD(' ', POS); SEND_CHAR((msb & 0x80) && (calk || ulam) ? '-' : ' '); // w zależności czy ujemna/dodatnia temp
  270. SEND_CHAR(calk+'0');
  271. }
  272. else {
  273. if (calk < 100) { // część całkowita dwucyfrowa
  274. CHAR_DD(((msb & 0x80) ? '-' : ' '), POS); // w zależności czy ujemna/dodatnia temp
  275. SEND_CHAR(calk/10+'0');
  276. SEND_CHAR(calk%10+'0');
  277. }
  278. else { // część całkowita trzycyfrowa (tylko dodatnie wartości)
  279. //CHAR_DD(((msb & 0x80) ? '-' : ' '), 0x02); // w zależności czy ujemna/dodatnia temp
  280. t = calk/100;
  281. CHAR_DD(t+'0', POS);
  282. calk -= 100 * t;
  283. SEND_CHAR(calk/10+'0');
  284. SEND_CHAR(calk%10+'0');
  285. }
  286. }
  287.  
  288. t = ulam / 1000;
  289. CHAR_DD(t+'0', POS+4);
  290. ulam -= t * 1000;
  291. t = ulam / 100;
  292. SEND_CHAR(t+'0');
  293. ulam -= t * 100;
  294. SEND_CHAR(ulam/10+'0');
  295. SEND_CHAR(ulam%10+'0');
  296.  
  297. // wypisz binarnie uzyskaną temperaturę w drugiej linii wyświetlacza
  298. if (DEBUG) {
  299. CHAR_DD( ((msb&0x80)>>7)+1, 0x40);
  300. SEND_CHAR(((msb&0x40)>>6)+1);
  301. SEND_CHAR(((msb&0x20)>>5)+1);
  302. SEND_CHAR(((msb&0x10)>>4)+1);
  303. SEND_CHAR(((msb&0x08)>>3)+1);
  304. SEND_CHAR(((msb&0x04)>>2)+3);
  305. SEND_CHAR(((msb&0x02)>>1)+3);
  306. SEND_CHAR( (msb&0x01) +3);
  307. SEND_CHAR(((lsb&0x80)>>7)+3);
  308. SEND_CHAR(((lsb&0x40)>>6)+3);
  309. SEND_CHAR(((lsb&0x20)>>5)+3);
  310. SEND_CHAR(((lsb&0x10)>>4)+3);
  311. SEND_CHAR(((lsb&0x08)>>3)+1);
  312. SEND_CHAR(((lsb&0x04)>>2)+1);
  313. SEND_CHAR(((lsb&0x02)>>1)+1);
  314. SEND_CHAR( (lsb&0x01) +1);
  315. }
  316. }
  317. }
  318. else { // inicjalizacja DS18B20 nie powiodła się
  319. SEND_CMD(CUR_HOME);
  320. printString(" [1] Failed ("); SEND_CHAR(spr+'0'); SEND_CHAR(')');
  321. __Delayx1ms(500); // wait passive 1,5 s
  322. __Delayx1ms(500); //
  323. __Delayx1ms(500); //
  324. SEND_CMD(CUR_HOME);
  325. printString(" ");
  326. CHAR_DD('-', POS);
  327. printString("--,----");
  328. SEND_CHAR(0x00);
  329. SEND_CHAR('C');
  330. }
  331. }
  332. }
  333.  
  334. /*
  335. * Autorzy:
  336. * Dariusz Mikołajczuk
  337. * Sylwester Leszczyński */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement