Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdio.h"
- #include "stdlib.h"
- #include "display.h"
- #include "addons.h"
- #include<msp430x14x.h>
- #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
- /* Pozycja, na której wypisywana jest temperatura:
- * ---,----*C -85,XXXX*C ... 127.XXXX*C
- * Jest to pozycja pierwszego myślnika na powyższym przykładzie
- * POS w granicach 0x00 ... 0x06 */
- #define POS 0x03
- #define DEBUG 1
- void defineChars() {
- /* Definicja symbolu stopnia, znak o numerze 0x00 */
- SEND_CMD(0x40); SEND_CHAR(0x07); SEND_CMD(0x41); SEND_CHAR(0x05); SEND_CMD(0x42); SEND_CHAR(0x07);
- SEND_CMD(0x43); SEND_CHAR(0x00); SEND_CMD(0x44); SEND_CHAR(0x00); SEND_CMD(0x45); SEND_CHAR(0x00);
- SEND_CMD(0x46); SEND_CHAR(0x00); SEND_CMD(0x47); SEND_CHAR(0x00);
- /* Definicja znaków używanych przy debugowaniu */
- if (DEBUG) {
- // zero podkreślone, znak numer 0x01 //
- SEND_CMD(0x48); SEND_CHAR(0x04); SEND_CMD(0x49); SEND_CHAR(0x0E); SEND_CMD(0x4A); SEND_CHAR(0x0A);
- SEND_CMD(0x4B); SEND_CHAR(0x0A); SEND_CMD(0x4C); SEND_CHAR(0x0E); SEND_CMD(0x4D); SEND_CHAR(0x04);
- SEND_CMD(0x4E); SEND_CHAR(0x00); SEND_CMD(0x4F); SEND_CHAR(0x1F);
- // jeden podkreślone, znak numer 0x02 //
- SEND_CMD(0x50); SEND_CHAR(0x04); SEND_CMD(0x51); SEND_CHAR(0x0C); SEND_CMD(0x52); SEND_CHAR(0x04);
- SEND_CMD(0x53); SEND_CHAR(0x04); SEND_CMD(0x54); SEND_CHAR(0x04); SEND_CMD(0x55); SEND_CHAR(0x04);
- SEND_CMD(0x56); SEND_CHAR(0x00); SEND_CMD(0x57); SEND_CHAR(0x1F);
- // zero nadkreślone, znak numer 0x03 //
- SEND_CMD(0x58); SEND_CHAR(0x1F); SEND_CMD(0x59); SEND_CHAR(0x00);
- SEND_CMD(0x5A); SEND_CHAR(0x04); SEND_CMD(0x5B); SEND_CHAR(0x0E); SEND_CMD(0x5C); SEND_CHAR(0x0A);
- SEND_CMD(0x5D); SEND_CHAR(0x0A); SEND_CMD(0x5E); SEND_CHAR(0x0E); SEND_CMD(0x5F); SEND_CHAR(0x04);
- // jeden nadkreślone, znak numer 0x04 //
- SEND_CMD(0x60); SEND_CHAR(0x1F); SEND_CMD(0x61); SEND_CHAR(0x00);
- SEND_CMD(0x62); SEND_CHAR(0x04); SEND_CMD(0x63); SEND_CHAR(0x0C); SEND_CMD(0x64); SEND_CHAR(0x04);
- SEND_CMD(0x65); SEND_CHAR(0x04); SEND_CMD(0x66); SEND_CHAR(0x04); SEND_CMD(0x67); SEND_CHAR(0x04);
- }
- SEND_CMD(DD_RAM_ADDR);
- }
- /* Inicjalizacja przed wysłaniem komendy ROM */
- unsigned char resetPulse() {
- P1DIR |= BIT7; // port Dallas ustawiany w tryb wyjściowy
- 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 wyjściowy
- P1OUT |= BIT7; // ustawiamy magistrale w poziom wysoki
- __Delayx1us(60); // odczekaj 30 us
- P1DIR &= ~BIT7; // port Dallas ustawiany w tryb wejściowy
- if (! (P1IN & BIT7)) // odebrano sygnał presence(0)
- ;
- else // nie odebrano sygnału presence
- return 1; // warto, czy nie kontynuować? - raczej nie znaleziono urządzenia
- __Delayx1us(470); // odczekaj 470µs
- if(P1IN & BIT7) // sprawdzamy czy DS podciągnął magistralę
- return 0; // tak - inicjalizacja wykonana poprawnie
- else
- return 2; // nie - inicjalizacja nie powiodła się
- }
- /* Wysyła do układu pojedynczy bit */
- void send(unsigned char bit) {
- P1DIR |= BIT7; // magistrala w trybie wyjściowym
- P1OUT &= ~BIT7; // zero na wyjście
- __Delayx1us(5); // odczekanie 5us (nie za mało?)
- if (bit==1) { // wysylana 1
- P1OUT |= BIT7; // jedynka na wyjście
- }
- __Delayx1us(80); // odczekanie (lub też wysłanie zera)
- P1OUT |= BIT7; // jedynka na wyjście
- }
- /* Odbiera z układu pojedynczy bit */
- unsigned char read() {
- P1DIR |= BIT7; // magistrala w trybie wyjściowym
- P1OUT &= ~BIT7; // zero na wyjście
- __Delayx1us(2); // odczekanie 2us
- P1OUT |= BIT7; // jedynka na wyjście
- __Delayx1us(2); // odczekanie 2us
- P1DIR &= ~BIT7; // port ustawiany na tryb wejściowy
- if (P1IN & BIT7) // odebrano jedynkę
- return 1;
- else return 0; // odebrano zero
- }
- /* Wysyła cały bajt do układu */
- void send_byte(unsigned char wartosc) {
- unsigned char i; // zmienna licznikowa
- unsigned char pom; // zmienna pomocnicza
- for(i=0; i!=8; i++) { // wysyłanie kolejnych bitów bajtu począwszy od LSB
- pom = wartosc>>i; // przesunięcie bitowe w prawo
- pom &= 0x01; // skopiowanie JEDNEGO BITU do zmiennej pomocniczej
- send(pom); // wysłanie bitu na magistrale
- }
- __Delayx1us(100); //odczekanie 100us
- }
- /* Odczytuje z układu jeden bajt */
- 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); // jeśli odczytano jedynkę
- __Delayx1us(15); // odczekanie 15us
- }
- return wartosc; // zwrot wartosci do funkcji
- }
- /* Ustaw linię DQ w poziom wysoki. Potrzebne na czas konwersji temperatury,
- * w trybie zasilania pasożytniczego. */
- void pullUpDQ() {
- P1DIR |= BIT7; // magistrala w trybie wyjściowym
- P1OUT |= BIT7; // jedynka na wyjście
- }
- int main() {
- WDTCTL = WDTPW | WDTHOLD;
- IE1 |= WDTIE; // aktywuje przerwania NMI
- _EINT(); // odblokowanie przerwań
- InitOsc2(8, 1); // MCLK=8MHz, ACLK=1MHz
- InitLCD();
- InitPorts2();
- STATUS_LED_OFF;
- //~ for (i = 0; i != 5; i++) {
- //~ SEND_CHAR(i+'0');
- //~ __Delayx1ms(500);
- //~ }
- //~ while(1) {
- //~ P1DIR |= BIT7; // magistrala w trybie wyjściowym
- //~ P1OUT &= ~BIT7; // zero na wyjście
- //~ __Delayx1ms(500);
- //~ __Delayx1ms(500);
- //~ P1DIR |= BIT7; // magistrala w trybie wyjściowym
- //~ P1OUT |= BIT7; // 1 na wyjście
- //~ __Delayx1ms(500);
- //~ __Delayx1ms(500);
- //~ }
- defineChars();
- //~ SEND_CMD(CUR_HOME);
- //~ unsigned char i=0;
- //~ while (1) {
- //~ if ((B1) == 0) {
- //~ if (i == 0x10) {i = 0x40; SEND_CMD(DD_RAM_ADDR2);}
- //~ SEND_CHAR(0x01);
- //~ i++;
- //~ while ((B1) == 0) __Delayx1ms(1);
- //~ __Delayx1ms(10);
- //~ }
- //~ if ((B2) == 0) {
- //~ if (i == 0x10) {i = 0x40; SEND_CMD(DD_RAM_ADDR2);}
- //~ SEND_CHAR(0x02);
- //~ i++;
- //~ while ((B2) == 0) __Delayx1ms(1);
- //~ __Delayx1ms(10);
- //~ }
- //~ if ((B3) == 0) {
- //~ if (i == 0x10) {i = 0x40; SEND_CMD(DD_RAM_ADDR2);}
- //~ SEND_CHAR(0x03);
- //~ i++;
- //~ while ((B3) == 0) __Delayx1ms(1);
- //~ __Delayx1ms(10);
- //~ }
- //~ if ((B4) == 0) {
- //~ if (i == 0x10) {i = 0x40; SEND_CMD(DD_RAM_ADDR2);}
- //~ SEND_CHAR(0x04);
- //~ i++;
- //~ while ((B4) == 0) __Delayx1ms(1);
- //~ __Delayx1ms(10);
- //~ }
- //~ }
- CHAR_DD('-', POS);
- printString("--,----");
- SEND_CHAR(0x00);
- SEND_CHAR('C');
- unsigned char t, spr=0, msb=0, lsb=0, prevMSB=0xFF, prevLSB=0xFF, calk;
- unsigned short ulam;
- while (1) {
- 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
- pullUpDQ(); // pull up DQ line to high level (parasite power mode)
- __Delayx1ms(500); // wait (passive) 750 ms (exactly 768ms)
- __Delayx1ms(250); //
- spr = resetPulse(); // make initialization of DS18B20
- if (spr != 0) {
- SEND_CMD(CUR_HOME);
- printString(" [2] Failed ("); SEND_CHAR(spr+'0'); SEND_CHAR(')');
- __Delayx1ms(500); // wait passive 1,5 s
- __Delayx1ms(500); //
- __Delayx1ms(500); //
- SEND_CMD(CUR_HOME);
- printString(" ");
- CHAR_DD('-', POS);
- printString("--,----");
- SEND_CHAR(0x00);
- SEND_CHAR('C');
- continue;
- }
- 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();
- if ((prevLSB != lsb) || (prevMSB != msb)) {
- //~ SEND_CMD(DD_RAM_ADDR2);
- //~ printByte(msb);
- //~ SEND_CHAR(' ');
- //~ printByte(lsb);
- prevLSB = lsb;
- prevMSB = msb;
- calk = lsb >> 4;
- calk += (msb & 0x07) << 4;
- if (msb & 0x80) { // ujemna temperatura, zamiana części całkowitej temperatury z kodu U2 na NKB
- calk ^= 0x7F;
- //calk++;
- ulam = (lsb & 0x08) ? 0 : 5000; // temperatura ujemna, jedynki części ułamkowej
- ulam += (lsb & 0x04) ? 0 : 2500; // interpretuj jak zera
- ulam += (lsb & 0x02) ? 0 : 1250;
- ulam += (lsb & 0x01) ? 0 : 625;
- }
- else {
- ulam = (lsb & 0x08) ? 5000 : 0; // temperatura dodatnia, jedynki części ułakmkowej
- ulam += (lsb & 0x04) ? 2500 : 0; // interpretuj jako jedynki
- ulam += (lsb & 0x02) ? 1250 : 0;
- ulam += (lsb & 0x01) ? 625 : 0;
- }
- if (calk < 10) { // część całkowita jednocyfrowa
- // ponieważ w U2 mamy +0=0x00 i -0=0xFF dodatkowy warunek:
- // (część całkowita != 0) lub (część ułamkowa != 0)
- CHAR_DD(' ', POS); SEND_CHAR((msb & 0x80) && (calk || ulam) ? '-' : ' '); // w zależności czy ujemna/dodatnia temp
- SEND_CHAR(calk+'0');
- }
- else {
- if (calk < 100) { // część całkowita dwucyfrowa
- CHAR_DD(((msb & 0x80) ? '-' : ' '), POS); // w zależności czy ujemna/dodatnia temp
- SEND_CHAR(calk/10+'0');
- SEND_CHAR(calk%10+'0');
- }
- else { // część całkowita trzycyfrowa (tylko dodatnie wartości)
- //CHAR_DD(((msb & 0x80) ? '-' : ' '), 0x02); // w zależności czy ujemna/dodatnia temp
- t = calk/100;
- CHAR_DD(t+'0', POS);
- calk -= 100 * t;
- SEND_CHAR(calk/10+'0');
- SEND_CHAR(calk%10+'0');
- }
- }
- t = ulam / 1000;
- CHAR_DD(t+'0', POS+4);
- ulam -= t * 1000;
- t = ulam / 100;
- SEND_CHAR(t+'0');
- ulam -= t * 100;
- SEND_CHAR(ulam/10+'0');
- SEND_CHAR(ulam%10+'0');
- // wypisz binarnie uzyskaną temperaturę w drugiej linii wyświetlacza
- if (DEBUG) {
- CHAR_DD( ((msb&0x80)>>7)+1, 0x40);
- SEND_CHAR(((msb&0x40)>>6)+1);
- SEND_CHAR(((msb&0x20)>>5)+1);
- SEND_CHAR(((msb&0x10)>>4)+1);
- SEND_CHAR(((msb&0x08)>>3)+1);
- SEND_CHAR(((msb&0x04)>>2)+3);
- SEND_CHAR(((msb&0x02)>>1)+3);
- SEND_CHAR( (msb&0x01) +3);
- SEND_CHAR(((lsb&0x80)>>7)+3);
- SEND_CHAR(((lsb&0x40)>>6)+3);
- SEND_CHAR(((lsb&0x20)>>5)+3);
- SEND_CHAR(((lsb&0x10)>>4)+3);
- SEND_CHAR(((lsb&0x08)>>3)+1);
- SEND_CHAR(((lsb&0x04)>>2)+1);
- SEND_CHAR(((lsb&0x02)>>1)+1);
- SEND_CHAR( (lsb&0x01) +1);
- }
- }
- }
- else { // inicjalizacja DS18B20 nie powiodła się
- SEND_CMD(CUR_HOME);
- printString(" [1] Failed ("); SEND_CHAR(spr+'0'); SEND_CHAR(')');
- __Delayx1ms(500); // wait passive 1,5 s
- __Delayx1ms(500); //
- __Delayx1ms(500); //
- SEND_CMD(CUR_HOME);
- printString(" ");
- CHAR_DD('-', POS);
- printString("--,----");
- SEND_CHAR(0x00);
- SEND_CHAR('C');
- }
- }
- }
- /*
- * Autorzy:
- * Dariusz Mikołajczuk
- * Sylwester Leszczyński */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement