Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
sermux
Родился
Сообщения: 7
Зарегистрирован: Пт сен 14, 2012 13:24:34

Re: Вопросы по С/С++ (СИ)

Сообщение sermux »

Доброго времени суток! Подскажите как мне сделать на msp430g2553 так, чтобы посылая через uart определенный символ скажем цифру 1 порт 1.0 менял свое значение.
Ни как не могу разобраться.....

пытался делать на основе примера кода работы с uart но ни чего не вышло......
может кто привести пример кода или дать ссылку на учебник....
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Вопросы по С/С++ (СИ)

Сообщение Gudd-Head »

Перед отправкой каждого байта просматривать содержимое буфера УАПП, и при совпадении с символом дрыгать ногой. Так?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
sermux
Родился
Сообщения: 7
Зарегистрирован: Пт сен 14, 2012 13:24:34

Re: Вопросы по С/С++ (СИ)

Сообщение sermux »

именно так!
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Вопросы по С/С++ (СИ)

Сообщение спящий »

Опять вылазиет ошибка,компиляция нормальная ,а вот создавать файл нехочет(
Вложения
Безымянный.GIF
(80.17 КБ) 275 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
sermux
Родился
Сообщения: 7
Зарегистрирован: Пт сен 14, 2012 13:24:34

Re: Вопросы по С/С++ (СИ)

Сообщение sermux »

уже помогли разобраться в соседней ветке). выкладываю код. может понадобится кому.
посылаем символы A B и тд в uart с пк. контроллер включает по 1 ножки соответственно. A p1.0 B p1.3 и тд.

Код: Выделить всё

//******************************************************************************
//  MSP430G2xx2 Demo - Timer_A, Ultra-Low Pwr UART 9600 Echo, 32kHz ACLK
//
//  Description: Use Timer_A CCR0 hardware output modes and SCCI data latch
//  to implement UART function @ 9600 baud. Software does not directly read and
//  write to RX and TX pins, instead proper use of output modes and SCCI data
//  latch are demonstrated. Use of these hardware features eliminates ISR
//  latency effects as hardware insures that output and input bit latching and
//  timing are perfectly synchronised with Timer_A regardless of other
//  software activity. In the Mainloop the UART function readies the UART to
//  receive one character and waits in LPM3 with all activity interrupt driven.
//  After a character has been received, the UART receive function forces exit
//  from LPM3 in the Mainloop which configures the port pins (P1 & P2) based
//  on the value of the received byte (i.e., if BIT0 is set, turn on P1.0).

//  ACLK = TACLK = LFXT1 = 32768Hz, MCLK = SMCLK = default DCO
//  //* An external watch crystal is required on XIN XOUT for ACLK *// 
//
//               MSP430G2xx2
//            ----------
//        /|\|              XIN|-
//         | |                 | 32kHz
//         --|RST          XOUT|-
//           |                 |
//           |   CCI0B/TXD/P1.1|-------->
//           |                 | 9600 8N1
//           |   CCI0A/RXD/P1.2|<--------
//
//  D. Dang
//  Texas Instruments Inc.
//  December 2010
//  Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
//******************************************************************************

#include "msp430g2452.h"

//----------
// Hardware-related definitions
//----------
#define UART_TXD   0x02                     // TXD on P1.1 (Timer0_A.OUT0)
#define UART_RXD   0x04                     // RXD on P1.2 (Timer0_A.CCI1A)

//----------
// Conditions for 9600 Baud SW UART, SMCLK = 1MHz
//----------
#define UART_TBIT_DIV_2     (1000000 / (9600 * 2))
#define UART_TBIT           (1000000 / 9600)

//----------
// Global variables used for full-duplex UART communication
//----------
unsigned int txData;                        // UART internal variable for TX
unsigned char rxBuffer;                     // Received UART character

//----------
// Function prototypes
//----------
void TimerA_UART_init(void);
void TimerA_UART_tx(unsigned char byte);
void TimerA_UART_print(char *string);

//----------
// main()
//----------
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;               // Stop watchdog timer

    DCOCTL = 0x00;                          // Set DCOCLK to 1MHz
    BCSCTL1 = CALBC1_1MHZ;
    DCOCTL = CALDCO_1MHZ;

    P1OUT = 0x00;                           // Initialize all GPIO
    P1SEL = UART_TXD + UART_RXD;            // Timer function for TXD/RXD pins
    P1DIR = 0xFF & ~UART_RXD;               // Set all pins but RXD to output
    P2OUT = 0x00;
    P2SEL = 0x00;
    P2DIR = 0xFF;

    __enable_interrupt();
   
    TimerA_UART_init();                     // Start Timer_A UART
    TimerA_UART_print("INIT UART\r\n");
    TimerA_UART_print("READY.\r\n");
   
    for (;;)
    {
        // Wait for incoming character
         __bis_SR_register(LPM0_bits);
       
        // Update board outputs according to received byte
        if (rxBuffer =='A') P1OUT |= 0x01; else P1OUT &= ~0x01;    // P1.0
        if (rxBuffer =='B') P1OUT |= 0x08; else P1OUT &= ~0x08;    // P1.3
        if (rxBuffer =='C') P1OUT |= 0x10; else P1OUT &= ~0x10;    // P1.4
        if (rxBuffer =='D') P1OUT |= 0x20; else P1OUT &= ~0x20;    // P1.5
        if (rxBuffer =='E') P1OUT |= 0x40; else P1OUT &= ~0x40;    // P1.6
        if (rxBuffer =='F') P1OUT |= 0x80; else P1OUT &= ~0x80;    // P1.7
        if (rxBuffer =='J') P2OUT |= 0x01; else P2OUT &= ~0x01;    // P2.0
        if (rxBuffer =='I') P2OUT |= 0x08; else P2OUT &= ~0x08;    // P2.3
        if (rxBuffer =='G') P2OUT |= 0x10; else P2OUT &= ~0x10;    // P2.4
        if (rxBuffer =='K') P2OUT |= 0x20; else P2OUT &= ~0x20;    // P2.5
        if (rxBuffer =='L') P2OUT |= 0x40; else P2OUT &= ~0x40;    // P2.6
        if (rxBuffer =='M') P2OUT |= 0x80; else P2OUT &= ~0x80;    // P2.7
       
       
        // Echo received character
        TimerA_UART_tx(rxBuffer);
    }
}
//----------
// Function configures Timer_A for full-duplex UART operation
//----------
void TimerA_UART_init(void)
{
    TACCTL0 = OUT;                          // Set TXD Idle as Mark = '1'
    TACCTL1 = SCS + CM1 + CAP + CCIE;       // Sync, Neg Edge, Capture, Int
    TACTL = TASSEL_2 + MC_2;                // SMCLK, start in continuous mode
}
//----------
// Outputs one byte using the Timer_A UART
//----------
void TimerA_UART_tx(unsigned char byte)
{
    while (TACCTL0 & CCIE);                 // Ensure last char got TX'd
    TACCR0 = TAR;                           // Current state of TA counter
    TACCR0 += UART_TBIT;                    // One bit time till first bit
    TACCTL0 = OUTMOD0 + CCIE;               // Set TXD on EQU0, Int
    txData = byte;                          // Load global variable
    txData |= 0x100;                        // Add mark stop bit to TXData
    txData <<= 1;                           // Add space start bit
}

//----------
// Prints a string over using the Timer_A UART
//----------
void TimerA_UART_print(char *string)
{
    while (*string) {
        TimerA_UART_tx(*string++);
    }
}
//----------
// Timer_A UART - Transmit Interrupt Handler
//----------
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer_A0_ISR(void)
{
    static unsigned char txBitCnt = 10;

    TACCR0 += UART_TBIT;                    // Add Offset to CCRx
    if (txBitCnt == 0) {                    // All bits TXed?
        TACCTL0 &= ~CCIE;                   // All bits TXed, disable interrupt
        txBitCnt = 10;                      // Re-load bit counter
    }
    else {
        if (txData & 0x01) {
          TACCTL0 &= ~OUTMOD2;              // TX Mark '1'
        }
        else {
          TACCTL0 |= OUTMOD2;               // TX Space '0'
        }
        txData >>= 1;
        txBitCnt--;
    }
}     
//----------
// Timer_A UART - Receive Interrupt Handler
//----------
#pragma vector = TIMER0_A1_VECTOR
__interrupt void Timer_A1_ISR(void)
{
    static unsigned char rxBitCnt = 8;
    static unsigned char rxData = 0;

    switch (__even_in_range(TA0IV, TA0IV_TAIFG)) { // Use calculated branching
        case TA0IV_TACCR1:                        // TACCR1 CCIFG - UART RX
            TACCR1 += UART_TBIT;                 // Add Offset to CCRx
            if (TACCTL1 & CAP) {                 // Capture mode = start bit edge
                TACCTL1 &= ~CAP;                 // Switch capture to compare mode
                TACCR1 += UART_TBIT_DIV_2;       // Point CCRx to middle of D0
            }
            else {
                rxData >>= 1;
                if (TACCTL1 & SCCI) {            // Get bit waiting in receive latch
                    rxData |= 0x80;
                }
                rxBitCnt--;
                if (rxBitCnt == 0) {             // All bits RXed?
                    rxBuffer = rxData;           // Store in global variable
                    rxBitCnt = 8;                // Re-load bit counter
                    TACCTL1 |= CAP;              // Switch compare to capture mode
                    __bic_SR_register_on_exit(LPM0_bits);  // Clear LPM0 bits from 0(SR)
                }
            }
            break;
    }
}
//----------

Реклама
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Вопросы по С/С++ (СИ)

Сообщение спящий »

Подскажите как вывести по UARTу слово,8000000Гц,где ошибка почему невыводится?

#include <stdio.h>
#include <mega48.h>
#include <delay.h>
#include <string.h>




void main() {
// 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
UCSR0A=0x00;
UCSR0B=0x08;
UCSR0C=0x86;

// USART Baud rate: 9600 для 4 MHz
UBRR0H=0x00;
UBRR0L=0x51;

while(1)
{printf("TEST UART\r\n"); //Печатаем текст
}
}
Реклама
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Re: Вопросы по С/С++ (СИ)

Сообщение __Alexander »

Мимо проходя. 0x51 это надо не в hex, это в десятичном. просто = 51;
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Вопросы по С/С++ (СИ)

Сообщение спящий »

изменил - непомогло.
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Re: Вопросы по С/С++ (СИ)

Сообщение __Alexander »

Ну тогда последнее это в UCSR0C запишите просто 0x06, т.е. 0x86 (UMSELxx) - reserved. Если не поможет, то я ушел, т.к. в CV не шарю, а регистры будут настроены правильно.
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Вопросы по С/С++ (СИ)

Сообщение спящий »

Подскажите кто разбирается в AVR STUDIO GCC где взять
INCLUDE mega48.h , delay.h и т.д?
Вложения
Безымянный.GIF
(76.92 КБ) 301 скачивание
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: Вопросы по С/С++ (СИ)

Сообщение a_skr »

установить WinAVR, что Вам и предлагают в сообщении.
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Вопросы по С/С++ (СИ)

Сообщение спящий »

Пробую написать декодер RC5:сначало идет прерывание по into 2 раза,записывается переменая для таймера(период импульса),делается прерывание на 1/4 импульса,и дальше на полные имульсы.Проблема в том что в протеусе показано что прерывания на 1/4 имульса длится дольше чем весь период импульса(выделил красным цветом),вроде изменение переменной небыло.


Спойлер#include <stdio.h>
#include <mega48.h>
#include <delay.h>
#include <string.h>
#include <io.h>


int i,dlina_impulsa_L,dlina_impulsa_H,m,chislo,lol;



void main() {
DDRD.2=0;
DDRB=255;
DDRC=255;

// 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
UCSR0A=0x00;
UCSR0B=0x18;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x33;




printf("pechataem kod\r\n"); //Печатаем текст

//Настройка прерываний по INTO
EICRA=0x00;
EIMSK=0x01;
EIFR=0x01;



//Настройка прерывания по CTC
TCCR1A=0;
TCCR1B=0x0A;
TIMSK1=(0<<1); //OCIA1A прерывание
OCR1AH=0x00;
OCR1AL=0x00;
TCNT1H=0x00;
TCNT1L=0x00;


#asm("sei")
while (1)
{;
if(m==13)
{
putchar(chislo) ;

}
else {}

}
}


interrupt [EXT_INT0] void ext_int0_isr(void)
{ //прерывание по INTO

if(i==0)
{ TCNT1H=0x00;
TCNT1L=0x00;
i=1;
}
else
{ i=0;
dlina_impulsa_L=TCNT1L;
dlina_impulsa_H=TCNT1H;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=dlina_impulsa_H/4;
OCR1AL=dlina_impulsa_L/4; полпериода имульса

TIMSK1=(1<<1);//разрешаем OCIA1A прерывание
EIMSK=(0<<0);//запрещаем прерывание по INTO


}
}



interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
if (m<14)
{

OCR1AH=dlina_impulsa_H;
OCR1AL=dlina_impulsa_L;период импульса


TCNT1H=0x00;
TCNT1L=0x00;
m++;
lol=PIND.2; //считываем с порта значения
chislo=chislo+lol;
chislo=chislo<<1; //сдвиг числа(запись 13 символов)

}
else
{TCNT1L=0x00;
TCNT1H=0x00;

TIMSK1=(0<<1);//запрещаем OCIA1A прерывание
EIMSK=(1<<0);//разрешаем прерывание по INTO
EIFR=0xff; //убираем флаг по INTO,чтобы небыло ранее прерывание
m=0;
}
}
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Если я на С делаю так: из ф-ции A, вызываю ф-цию B, потом из ф-ции B, вызываю ф-цию A, и так по кругу много раз..... Это нормально? Или если много раз так делать то стек прорвет?.... (по аналогии с асмом)
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение ploop »

Порвёт.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Грызу структуры.....

Надо структуру при старте устройства загрузить из EEPROM, а при программировании сохранить в EEPROM.....
Как сделать указатель на структуру?

Я сейчас делаю так:

Код: Выделить всё

   IICMemReadData (&StructEE.FirstOnDevice, 0, (char) sizeof (StructEE));
(Загрузка в структуру из 0-го адреса EEPROM, длина блока равна длине структуры.)
Но при этом у меня по другому не получается, только получается указать адрес первого элемента структуры..... при этом если потом я вставлю до этого первого элемента еще один элемент, то программа не будет правильно работать.....

Так вот, как сделать указатель на структуру, без упоминания элементов структуры?????
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Вроде было уже это решили функцией sizeof(структура)
то есть нулевой массив вам уже получилось передать, дальше читаем до конца структуры с полученным размером.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Нужно в аргументе ф-ии принимать указатель не на структуру, а на unsigned char, и в самой ф-ии перебирать все байты по этому указателю, смещая его.
А передавать в ф-ию указатель, явно приводя его к указателю на байт

Код: Выделить всё

IICMemReadData( (unsigned char *)&StructEE.FirstOnDevice, 0, sizeof (StructEE) );
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение avreal »

shads писал(а):Так вот, как сделать указатель на структуру, без упоминания элементов структуры?????
Вот так и писать имя структуры:

Код: Выделить всё

    IICMemReadData ((unsigned char)&StructEE, 0, (char) sizeof (StructEE)); 
Только несколько советов по дороге:
Избегайте использовать «просто char» (это о параметре длины). Я уже где-то тут писал, что char — единственный из целочисленных типов, имеющий три варианта, два с определенной знаковостью (unsigned char, signed char) и один с неопределенной (char). Если для int записи signed int и «просто» int означают одно и то же, то для char — нет. В зависимости от компилятора и его настроек он может быть как знаковым, так и беззнаковым. Даже если используемые числа влязят в диапазон 0..127, знаковый char может увеличить размер кода там, где он будет приводится к 16-битным целым.
Даже если компилятор позволяет явно галочкой или ключиком задать «знаковость» char — лучше не привыкайте. Используйте char только там, где нужны именно символы. Если нужно 8-битное число, то лучше #include <stdint.h> (в avr-gcc автоматом подключается через avr/io.h) и uint8_t.

Функции записи/чтения блока лучше объявить принимающими void*:

Код: Выделить всё

uint8_t IICMemReadData (void *pdata, uint16_t ee_addr, uint8_t len)
{
    uint8_t *ptr = (uint8_t*)pdata;
    // И дальше работаем с указателем ptr
} 
Если указатель в функции объявть как uint8_t* (unsigned char*), то тогда в каждом вызове придётся делать приведение:

Код: Выделить всё

    IICMemReadData ((uint8_t*)&Config_A, CONFIG_A_ADDR, sizeof(Config_A));
    IICMemReadData ((uint8_t*)&Config_B, CONFIG_B_ADDR, sizeof(Config_B)); 
а плюсов никаких не будет. К void* приведение делается автоматически и молча, а к нужному типу для работы с EEPROM лучше привести в одном месте прямо в функциях чтения/записи.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

avreal писал(а):несколько советов по дороге:
Спасибо!
Вы как всегда развернуто и глубоко копаете. Вот и тут, где я тока ступил (не в смысле "ступил", а в смысле "ступил" - от слова "поступь" :) ), благодаря вашим советам, уже сложилось какое-то представление о структурах да стиле написания.....
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Вопросы по С/С++ (СИ)

Сообщение спящий »

подскажите как

printf("CMD1 proshlo uspeshno ",temp,"\r\n");
и
putchar(array[i]);


чтобы temp,array передавалось в виде числа а не в ACSS коде,
Ответить

Вернуться в «Разные вопросы по МК»