Страница 39 из 386

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

Добавлено: Сб сен 03, 2011 23:25:19
vitalik_1984
lix писал(а):

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

x=0x24;
PORTB &= 0x80;
PORTB = x & 0x80;
Правильно написать

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

x=0x7f;
PORTB |= нужные_данные & x;
иначе сначала при
PORTB &= 0x80;
остается старший бит, если установлен
а потом устанавливаются по маске 00100100 биты 2ой и 5й.
ведь 0x24=00100100

Обновление:И то даже не устанавливаются, там же в порту нули останется просто старший бит, если был установлен.

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

Добавлено: Вс сен 04, 2011 08:49:53
lix
ога. ошибся.

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

Добавлено: Пн сен 05, 2011 15:33:43
alexey6522
Помогите разобраться :( У меня есть программа написанная на C++ builder которая отправляет строку на COM порт. С ее помощью я на порт посылаю один символ, скажем это будет 1, в протеусе при симуляции он принимается нормально как HEX число 31, либо DEC это уже 49 в зависимости от заданных параметров

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

itoa(что, куда, кодировка);
НО ЕСЛИ Я ОТПРАВЛЯЮ СТРОКУ с компа '1234', получается сумбур в виде, для HEX 4915338243 и для DEC кодировки 319926f3, самое смешное что первый символ соответствует первому переданному символу всегда!!! Что делать?
А вообще должно получиться что-то типа 31323334 или 49505152

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

Добавлено: Пн сен 05, 2011 15:45:57
urry
Из Вашего сообщения неясно, что принимает неправильно .
Проект на протеусе с виртуальным ком портом ? Или живое железо ?

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

Добавлено: Пн сен 05, 2011 16:04:53
alexey6522
С компа передается нормально, виртуальный порт тоже работает нормально, так как конектюсь своей прогой к терминалу принимается и передается нормально, а вот на мое устройство в протеусе принимается плохо если отправляю строку, а если просто один символ то все нормально, видимо при передачи или при приеме строка состоящая более 1 байта кодируется, а раскодировать не могу.
Пример: отправил я 1234, а получил 319926f3, может так и должно быть, но как мне эту строку расшифровать?

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

Добавлено: Пн сен 05, 2011 16:34:35
urry
ничего не нужно расшифровывать - так и идет. Проверьте на совпадение скоростей, ошибку уарта при вычислении скорости для заданной частоты кварца, проверьте, 1 бит стоповый у Вас или полтора - 2, сделайте паузу при выдаче на ком порт, там на миллисекунду остановите поток после выдачи очередного байта - возможно, Вы что-то длинное делаете в самом прерывании и оно не успевает раздуплиться, наконец, сделайте контроль ошибок в самом проекте на мк.

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

Добавлено: Пн сен 05, 2011 16:42:23
alexey6522
Да, дело было в стоповом бите!! Спасибо :)

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

Добавлено: Пн сен 05, 2011 20:06:40
alexey6522
Вот установил я глобальное прерывание sli() если есть байты на прием, то основная программа останавливается и выполняется подпрограмма. Мне нужно все полученные байты занести в массив, а потом с помощью функции atoi преобразовать в long
Пример:

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

char USART_Receive(void)
{
  while ( !(UCSRA & (1<<RXC)) ); 
  return UDR;
//----------------------------
ISR(USART_RXC_vect)
{
  signed char s=0;
  s=USART_Receive();
}

int main(void)
{
sei();//устанавливаем бит глобального разрешения прерываний 
while(1)
{
какая-то программа, выполн. до прерывания, а потом опять продолжаем
....
}
}
}

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

Добавлено: Вт сен 06, 2011 05:42:27
BerZerK-ku
alexey6522 писал(а):Вот установил я глобальное прерывание sli() если есть байты на прием, то основная программа останавливается и выполняется подпрограмма. Мне нужно все полученные байты занести в массив, а потом с помощью функции atoi преобразовать в long
Можно сделать так:

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

volatile char cRx = 0;
volatile char cnt = 0;
volatile char cMas[20];
long lNumber;

ISR(USART_RXC_vect)
{
  cMas[cnt] = UDR;
  if (cMas[cnt] = 0x00) cRx = 1;
  cnt++;
}

int main(void)
{
/* Настройка периферии */
sei();//устанавливаем бит глобального разрешения прерываний
while(1)
{
  if (cRx)
  {
    lNumber = atol(cMas);
    cnt = 0;
    cRx = 0;
  }
какая-то программа, выполн. до прерывания, а потом опять продолжаем
....
}
}

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

Добавлено: Вт сен 06, 2011 08:11:49
Hispanus
Не получается инициализировать интерфейс SPI в PCWHD (компилятор CSS PIC) для pic 16f628a - не подскажите, как назначить его ножкам соответсвующий режим работы и почему у меня не работают функции setup_spi, write_spi, read_spi..вроде компилятор их поддерживает, а они не определяются...может быть есть альтернативные варианты? :)

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

Добавлено: Вт сен 06, 2011 08:23:25
urry
BerZerK-ku, так, собственно, делать нежелательно.
1. Представьте, что Вы зацепили половину пакета - в этом случае программа навеки собьется - она спокойно будет брать вторую половину из следующего пакета и так далее.
2.Нужно обязательно обрабатывать ошибки приема - пропуск стопового бита, переполнение буфера.

Я здесь уже советовал делать синхронизацию начала пакета по времени - если в течении некоторого времени нет прерывания по приему, таймер сбрасывает счетчик начала пакета в 0. Т.е. мы зацепили полпакета, сбросили таймер при приеме очередного байта, дальше пауза между пакетами - таймер сбрасывает счетчик в 0 и принятая информация - полпакета - отбрасывается, потому что счетчик не досчитал до 4 или сколько там байт. Следующий пакет приходит правильный.

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

Добавлено: Вт сен 06, 2011 11:26:33
BerZerK-ku
urry писал(а):1. Представьте, что Вы зацепили половину пакета - в этом случае программа навеки собьется - она спокойно будет брать вторую половину из следующего пакета и так далее.
2.Нужно обязательно обрабатывать ошибки приема - пропуск стопового бита, переполнение буфера.
1. Повнимательнее посмотрите программу и вспомните что такое строка.
2. Согласен, без проверок не обойтись. Но тогда еще надо добавить контрольную сумму, чтобы увеличить уверенность в правильно принятой посылке. И простейший пример из нескольких строк превратится в кучу функций.

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

Добавлено: Вт сен 06, 2011 12:00:57
urry
:)
1.неубедительно, потому что Вы не проводите контроль за заполнением массива - и, если опять- же захватите первых полпакета, скажем, с размером полного пакета 16 байт, куда он будет писать ? Правильно, куда угодно после 20 байт массива.
2. Я как бы против "простейших примеров" - лучше выкладывать полный код (кучу функций), пусть разбираются.
По крайней мере, стараюсь так делать. А то молодежь решит, что обработка исключений - это лишнее.

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

Добавлено: Вт сен 06, 2011 15:22:47
rus-us
Подскажите, пожалуйста, новичку по CVAVR + C.

Допустим, имеем такой код:

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

void make1(void) {
...
// 5 секунд
}

void make2(void) {
...

}

while (0) {
          make1();
          make2();
    };
Получается, в данном случае, основной цикл останавливается, пока не выполнится функция make1()?
Возможно ли в АВР + Си запускать какой то код в фоне, или в отдельном потоке?

Спасибо!

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

Добавлено: Вт сен 06, 2011 17:41:01
Мастер Ломастер
rus-us писал(а):Возможно ли в АВР + Си запускать какой то код в фоне, или в отдельном потоке?
да, возможно. в фоне - по прерываниям, например, от таймера. в виде отдельного "потока" - если применять одну из доступных RTOS или "почти RTOS"

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

Добавлено: Вт сен 06, 2011 22:18:49
vitalik_1984
rus-us писал(а): Получается, в данном случае, основной цикл останавливается, пока не выполнится функция make1()?

Спасибо!
если перед make1() сделать запись sei(); то возможно.
Ну конечно же прерывания от таймера и их обработка тоже нужны.

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

Добавлено: Вт сен 06, 2011 22:40:08
rus-us
Мастер Ломастер писал(а):да, возможно. в фоне - по прерываниям, например, от таймера. в виде отдельного "потока" - если применять одну из доступных RTOS или "почти RTOS"
Спасибо!

RTOS - понятно.

Насчет прерываний.
Есть какие-то ограничения/рекомендации на код в прерываниях?

Допустим, нужно проверять состояние ног МК не реже 1 сек.
В основном цикле получается минимум 5 сек.

А вот такой вариант программы допускается?

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

прерывание по времени(1секунда){
       проверяем состояние ноги1;
       проверяем состояние ноги2;
       .....
       проверяем состояние ногиN;
       
       // на сработавшую ногу ставим флаг
       // который обрабатываем в основном цикле.
        
}


void make1(void) {
...
// 5 секунд
}


while (0) {
          make1();

          еще какие-то действия;

    };

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

Добавлено: Вт сен 06, 2011 22:50:56
Мастер Ломастер
rus-us писал(а):А вот такой вариант программы допускается?
допускаться-то допускается, однако пока вы там 5 секунд что-то будете делать, флаги, которые вы выставили в прерывании кто будет анализировать? если задержка в реакции на эти флаги допустима - все нормально. но по-хорошему либо make1() надо делать по кусочкам в основном цикле, либо внутри нее делать анализ флагов время от времени... есть и другие варианты :)

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

Добавлено: Вт сен 06, 2011 23:11:45
rus-us
Мастер Ломастер писал(а):допускаться-то допускается, однако пока вы там 5 секунд что-то будете делать, флаги, которые вы выставили в прерывании кто будет анализировать? если задержка в реакции на эти флаги допустима - все нормально. но по-хорошему либо make1() надо делать по кусочкам в основном цикле, либо внутри нее делать анализ флагов время от времени... есть и другие варианты :)
Мне главное не упустить изменения на ногах. Анализ флагов можно будет оптимизировать, с этим проблем не будет :)

П.С. какие другие варианты? :)

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

Добавлено: Ср сен 07, 2011 04:39:07
Hispanus
Есть ли возможность программной реализации spi в мк, в котором он аппаратно не реализован (pic16f628a). Если есть, как будет выглядеть инициализация его выводов?...компилятор pic c compile..перелопатил весь интернет и ничего не нашёл.