Вопросы по С/С++ (СИ)
Re: Вопросы по С/С++ (СИ)
Доброго времени суток! Подскажите как мне сделать на msp430g2553 так, чтобы посылая через uart определенный символ скажем цифру 1 порт 1.0 менял свое значение.
Ни как не могу разобраться.....
пытался делать на основе примера кода работы с uart но ни чего не вышло......
может кто привести пример кода или дать ссылку на учебник....
Ни как не могу разобраться.....
пытался делать на основе примера кода работы с uart но ни чего не вышло......
может кто привести пример кода или дать ссылку на учебник....
- Реклама
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Вопросы по С/С++ (СИ)
Перед отправкой каждого байта просматривать содержимое буфера УАПП, и при совпадении с символом дрыгать ногой. Так?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Вопросы по С/С++ (СИ)
именно так!
Re: Вопросы по С/С++ (СИ)
Опять вылазиет ошибка,компиляция нормальная ,а вот создавать файл нехочет(
- Вложения
-
- Безымянный.GIF
- (80.17 КБ) 275 скачиваний
Re: Вопросы по С/С++ (СИ)
уже помогли разобраться в соседней ветке). выкладываю код. может понадобится кому.
посылаем символы A B и тд в uart с пк. контроллер включает по 1 ножки соответственно. A p1.0 B p1.3 и тд.
посылаем символы 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;
}
}
//----------
- Реклама
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"); //Печатаем текст
}
}
#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: Вопросы по С/С++ (СИ)
Мимо проходя. 0x51 это надо не в hex, это в десятичном. просто = 51;
Re: Вопросы по С/С++ (СИ)
изменил - непомогло.
- __Alexander
- Потрогал лапой паяльник
- Сообщения: 335
- Зарегистрирован: Вт сен 11, 2007 10:27:08
- Откуда: Киев
Re: Вопросы по С/С++ (СИ)
Ну тогда последнее это в UCSR0C запишите просто 0x06, т.е. 0x86 (UMSELxx) - reserved. Если не поможет, то я ушел, т.к. в CV не шарю, а регистры будут настроены правильно.
Re: Вопросы по С/С++ (СИ)
Подскажите кто разбирается в AVR STUDIO GCC где взять
INCLUDE mega48.h , delay.h и т.д?
INCLUDE mega48.h , delay.h и т.д?
- Вложения
-
- Безымянный.GIF
- (76.92 КБ) 301 скачивание
Re: Вопросы по С/С++ (СИ)
установить WinAVR, что Вам и предлагают в сообщении.
Re: Вопросы по С/С++ (СИ)
Пробую написать декодер RC5:сначало идет прерывание по into 2 раза,записывается переменая для таймера(период импульса),делается прерывание на 1/4 импульса,и дальше на полные имульсы.Проблема в том что в протеусе показано что прерывания на 1/4 имульса длится дольше чем весь период импульса(выделил красным цветом),вроде изменение переменной небыло.
#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;
}
}
Спойлер
#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;
}
}
Re: Вопросы по С/С++ (СИ)
Если я на С делаю так: из ф-ции A, вызываю ф-цию B, потом из ф-ции B, вызываю ф-цию A, и так по кругу много раз..... Это нормально? Или если много раз так делать то стек прорвет?.... (по аналогии с асмом)
Re: Вопросы по С/С++ (СИ)
Порвёт.
Re: Вопросы по С/С++ (СИ)
Грызу структуры.....
Надо структуру при старте устройства загрузить из EEPROM, а при программировании сохранить в EEPROM.....
Как сделать указатель на структуру?
Я сейчас делаю так:
(Загрузка в структуру из 0-го адреса EEPROM, длина блока равна длине структуры.)
Но при этом у меня по другому не получается, только получается указать адрес первого элемента структуры..... при этом если потом я вставлю до этого первого элемента еще один элемент, то программа не будет правильно работать.....
Так вот, как сделать указатель на структуру, без упоминания элементов структуры?????
Надо структуру при старте устройства загрузить из EEPROM, а при программировании сохранить в EEPROM.....
Как сделать указатель на структуру?
Я сейчас делаю так:
Код: Выделить всё
IICMemReadData (&StructEE.FirstOnDevice, 0, (char) sizeof (StructEE));
Но при этом у меня по другому не получается, только получается указать адрес первого элемента структуры..... при этом если потом я вставлю до этого первого элемента еще один элемент, то программа не будет правильно работать.....
Так вот, как сделать указатель на структуру, без упоминания элементов структуры?????
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Вроде было уже это решили функцией sizeof(структура)
то есть нулевой массив вам уже получилось передать, дальше читаем до конца структуры с полученным размером.
то есть нулевой массив вам уже получилось передать, дальше читаем до конца структуры с полученным размером.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Нужно в аргументе ф-ии принимать указатель не на структуру, а на unsigned char, и в самой ф-ии перебирать все байты по этому указателю, смещая его.
А передавать в ф-ию указатель, явно приводя его к указателю на байт
А передавать в ф-ию указатель, явно приводя его к указателю на байт
Код: Выделить всё
IICMemReadData( (unsigned char *)&StructEE.FirstOnDevice, 0, sizeof (StructEE) );- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Вот так и писать имя структуры: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
} Код: Выделить всё
IICMemReadData ((uint8_t*)&Config_A, CONFIG_A_ADDR, sizeof(Config_A));
IICMemReadData ((uint8_t*)&Config_B, CONFIG_B_ADDR, sizeof(Config_B)); Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Re: Вопросы по С/С++ (СИ)
Спасибо!avreal писал(а):несколько советов по дороге:
Вы как всегда развернуто и глубоко копаете. Вот и тут, где я тока ступил (не в смысле "ступил", а в смысле "ступил" - от слова "поступь"
Re: Вопросы по С/С++ (СИ)
подскажите как
printf("CMD1 proshlo uspeshno ",temp,"\r\n");
и
putchar(array[i]);
чтобы temp,array передавалось в виде числа а не в ACSS коде,
printf("CMD1 proshlo uspeshno ",temp,"\r\n");
и
putchar(array[i]);
чтобы temp,array передавалось в виде числа а не в ACSS коде,


