Страница 39 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб сен 03, 2011 23:25:19
vitalik_1984
Правильно написать
иначе сначала при
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 в зависимости от заданных параметров
НО ЕСЛИ Я ОТПРАВЛЯЮ СТРОКУ с компа '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..перелопатил весь интернет и ничего не нашёл.