Отговори на тема  [ 3 мнения ] 
MSP430 проблеми при дебъгване 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Юни 09, 2012 12:23 am
Мнения: 146
Местоположение: София/Стара Загора
Мнение MSP430 проблеми при дебъгване
Здравейте отдавана не съм писал във форума. Пробвам един от тия сензори dht11 за влажност и температура с MSP430g2231 (това е един от чиповете с които ланчпада на Тексас идва). Намиран един код в нета човека твърди че работи със всички MSP-ta и по-специално с това. Копирам кода в CodeComposer, коплирам лоадва и всичко на пръв поглед е ток и жица. Викам да дебъгна програмата поне да схвана как работи.
Нека за сега сега се абстрахираме от другите нередности в кода, интересуваме точно този ред :
Код:
(txdata & 1) ? (CCTL0 &= ~OUTMOD2) : (CCTL0 |=  OUTMOD2);

OUTMOD2 в федър файла е дефинирано като
Код:
#define OUTMOD2                (0x0080)       /* Output mode 2 */

което е 1000 0000. Предвид реда в единия случай битове 7-5 ще се CCTL0 &= 0111 1111 а другият
ще са CCTL0 |= 1000 0000 . Само че след като изпълнявам стъпка по стъпка програмата и предишното им състояние е било 000 те се установяват в 101(OUTMOD_5), което не знам как става. Помислих че може да има забранени комбинации и контролера автоматично да ги сетва но не намерих информация за да потвърдя тази моя теза. Някакви идеи от мсп мастърите във форума?
Код:
#include <msp430g2231.h>
#include <stdlib.h>

volatile unsigned txdata = 0;         //

#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer0_A0(void)
{
    if(txdata) {
        (txdata & 1) ? (CCTL0 &= ~OUTMOD2) : (CCTL0 |=  OUTMOD2); // set/reset TA or toggle
        txdata >>= 1;
        CCR0 += 104;
    } else {
        CCTL0 &= ~CCIE;
    }
}

void putc(const char c)
{
    while(CCTL0 & CCIE);
    txdata = 0x0200 | (c << 1);
    CCR0 = TAR + 16;
    CCTL0 = OUTMOD0 | CCIE;
}

void print(const char *s)
{
    while(*s) putc(*s++);
}

void print_hex_digit(unsigned n)
{
    putc("0123456789ABCDEF"[n & 0x0F]);
}

void print_hex_byte(unsigned n)
{
    print_hex_digit(n >> 4);
    print_hex_digit(n);
}

void print_dec2(int n)
{
    // Print 2 decimal digits  0 to 99
    const div_t d = div(n, 10);
    if(d.quot) putc('0' + d.quot);
    putc('0' + d.rem);
}

int read_dht(unsigned char *p)
{
                                                                // Note: TimerA must be continuous mode (MC_2) at 1 MHz
    const unsigned b = BIT4;                                    // I/O bit
    const unsigned char *end = p + 6;                           // End of data buffer
    register unsigned char m = 1;                               // First byte will have only start bit
    register unsigned st, et;                                   // Start and end times
                                                                //
    p[0] = p[1] = p[2] = p[3] = p[4] = p[5] = 0;                // Clear data buffer
                                                                //
    P1OUT &= ~b;                                                // Pull low
    P1DIR |= b;                                                 // Output
    P1REN &= ~b;                                                // Drive low
    st = TAR; while((TAR - st) < 18000);                        // Wait 18 ms
    P1REN |= b;                                                 // Pull low
    P1OUT |= b;                                                 // Pull high
    P1DIR &= ~b;                                                // Input
                                                                //
    st = TAR;                                                   // Get start time for timeout
    while(P1IN & b) if((TAR - st) > 100) return -1;             // Wait while high, return if no response
    et = TAR;                                                   // Get start time for timeout
    do {                                                        //
        st = et;                                                // Start time of this bit is end time of previous bit
        while(!(P1IN & b)) if((TAR - st) > 100) return -2;      // Wait while low, return if stuck low
        while(P1IN & b) if((TAR - st) > 200) return -3;         // Wait while high, return if stuck high
        et = TAR;                                               // Get end time
        if((et - st) > 110) *p |= m;                            // If time > 110 us, then it is a one bit
        if(!(m >>= 1)) m = 0x80, ++p;                           // Shift mask, move to next byte when mask is zero
    } while(p < end);                                           // Do until array is full
                                                                //
    p -= 6;                                                     // Point to start of buffer
    if(p[0] != 1) return -4;                                    // No start bit
    if(((p[1] + p[2] + p[3] + p[4]) & 0xFF) != p[5]) return -5; // Bad checksum
                                                                //
    return 0;                                                   // Good read
}

void main(void)
{
    unsigned char dht[6];                           // Data from DHT11
    int err;                                        //
    unsigned n;                                     //
                                                    //
    WDTCTL = WDTPW | WDTHOLD;                       // Disable watchdog reset
    DCOCTL = 0;                                     // Run at 1 MHz
    BCSCTL1 = CALBC1_1MHZ;                          //
    DCOCTL  = CALDCO_1MHZ;                          //
    CCTL0 = OUT;                                    // Setup serial tx I/O
    P1SEL = BIT1;                                   //
    P1DIR = BIT1;                                   //
    TACTL = TASSEL_2 | MC_2;                        // TimerA SMCLK, continuous
    __enable_interrupt();                           //
                                                    //
    for(;;) {                                       // for-ever
        while(CCTL0 & CCIE);                        // Wait for any serial tx to finish
        err = read_dht(dht);                        // Read DHT11
        if(err) {                                   // If error...
            print("Error -");                       //
            putc('0' - err);                        //
            print("\r\n");                          //
        } else {                                    // No error...
            for(n = 0; n < sizeof(dht); ++n) {      // Show hex data
                print_hex_byte(dht[n]);             //
                putc(' ');                          //
            }                                       //
            print(" ");                             //
            print_dec2(dht[1]);                     // Show humimidy
            print(" RH  ");                         //
            print_dec2(dht[3]);                     // Show temperature
            print(" C\r\n");                        //
        }                                           //
        __delay_cycles(1000000);                    // Wait a while
    }                                               //
}


Нед Юли 17, 2016 10:59 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: MSP430 проблеми при дебъгване
CCTL0 = OUTMOD0 | CCIE

_________________
Warriors of the Night, ASSEMBLER!!!


Пон Юли 18, 2016 12:18 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Юни 09, 2012 12:23 am
Мнения: 146
Местоположение: София/Стара Загора
Мнение Re: MSP430 проблеми при дебъгване
Цитат:
CCTL0 = OUTMOD0 | CCIE


Ето къде бил ключът за палатката. Така си е. Минава преди това през този ред. Макар че снощи като го дебъгвах (може леко да ми се е спало :D ) преди да премини през

(txdata & 1) ? (CCTL0 &= ~OUTMOD2) : (CCTL0 |= OUTMOD2);

тия битове се си бяха 000. Както и да, е ще го сложа в графата необясними паранормални явление.


Пон Юли 18, 2016 7:48 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 3 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни