Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


Закрытая тема
Опции темы
Непрочитано 19.02.2013, 00:47   #11
Frensis777
Прописка
 
Аватар для Frensis777
 
Регистрация: 15.03.2009
Сообщений: 162
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
Frensis777 на пути к лучшему
По умолчанию Re: UART к PC на CodeVision

вот код с кодевижн по обработке прерывания прихода символа в усарт
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif


тут функция самого прерывания и функция гетчара
так вот в курсе 123авр фрагмент
#asm("cli")
--rx_counter;
#asm("sei")
описан(http://forum.cxem.net/z5.htm)но я его в корне не пойму....зачем и смысл останалиать прерыания потом его заново запускать....непойму...


так тут написано что прерыания блокируютса из за того что цытирую...


"-----
Так как мы считали символ из буфера нужно уменьшить число символов в нем подлежащих считыванию.

#asm("cli") // запретить прерывания глобально
--rx_counter; // вычесть 1 из rx_counter
#asm("sei") // разрешить прерывания глобально

Обратите внимание что перед декрементом мы запрещаем прерывания, а после прерывания включаем опять.

Зачем ? Вот фо ??? воскликнул бы англоязычный читатель ...

А затем, что в обработчике прерывания есть инкремент rx_counter - и если на декременте возникнет прерывание мы можем зациклится в этом месте программы и получить ошибку в числе символов в буфере.

"----
....получаетса что они останалиают прерыания только для того чтоб непомешать декрименту....но а смысл если когда произойдет прерывание то по его окончанию всеравно декримент выполнится, ведь прерывание не портит функции --rx_counter если выполняется в тот жэ момент
Реклама:
Frensis777 вне форума  
Непрочитано 19.02.2013, 09:56   #12
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: UART к PC на CodeVision

1. Ссылка нечитаема.
2. Для того, чтобы англичанин заткнулся, русскому почитать про атомарность.
3. Опытными людьми не рекомендовано обучение по "..123...". Цитировать оттуда тем более.
4. Модераторами всех подобных форумов рекомендовано фрагменты кодов обрамлять специально придуманными для этой цели тегами. Элементарное уважение к читающим.
Сами посмотрите:
Код:
#asm("cli") // запретить прерывания глобально
--rx_counter; // вычесть 1 из rx_counter
#asm("sei") // разрешить прерывания глобально
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
Сказали "Спасибо" ut1wpr
whoim (19.02.2013)
Непрочитано 19.02.2013, 10:16   #13
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: UART к PC на CodeVision

Fogtech, я не увидел никаких модификаторов для хранения данных во флеш, но во входе параметра в функцию передачи у вас не указано что это указатель.
Вот как работает в атмел студио:
Код:
//отправка byte в порт модема
void gsm_send_byte(uint8_t chr)
{
	while (!(USARTC0.STATUS & USART_DREIF_bm));
	USARTC0.DATA = chr;
}
//отправка строки в порт модема
void gsm_send_str(const char *str)
{
	while(*str)
		gsm_send_byte(*(str++));
}
//отправка _P_ строки в порт модема
void gsm_send_str_P(char *str)
{
	while(pgm_read_byte(str))
		gsm_send_byte(pgm_read_byte(str++));
}
Вызов
Код:
gsm_send_str("test");
gsm_send_str_P(PSTR("test"));
whoim вне форума  
Непрочитано 19.02.2013, 10:21   #14
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: UART к PC на CodeVision

Сообщение от Fogtech Посмотреть сообщение
Прошу подсказать как должна выглядеть функция регулярной отправки
о, как раз в моем посте работает на xmega A4. Прием засовываем в прерывание:
Код:
ISR(USARTC0_RXC_vect)
{	
	uint8_t _char = USARTC0.DATA; //получим данные
  //...запихнем фкуда нибудь
}
Прерывание надо разрешить вместе с приемом и отправкой
Код:
USARTC0.CTRLB = USART_RXEN_bm | USART_TXEN_bm;
	USARTC0.CTRLA =	USART_RXCINTLVL_HI_gc; // Enable Receive Complete, TransmitComplete, RegisterEmpty Interrupt(Low Level)
Да и в общем то, настроить baud и все..
whoim вне форума  
Непрочитано 19.02.2013, 11:16   #15
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: UART к PC на CodeVision

To: fogtech
Ваша проблема не в конкретной функции, а в отработке логики программы.
Много неясного. Прием любого байта по usart можно считать сигналом к разрешению передачи данных? Или это должен быть какой-то конкретный байт-признак? Или Совокупность байтов (команда). В любом случае вы не должны себе позволять такую роскошь, как ожидание байта в цикле ничегонеделания. Переходите на прием по прерыванию от готовности приемника. В обработчике взведите некий флаг, типа "байт принят".
Далее. Не совсем ясно, что вы собрались передать. Судя по выхваченному из контекста примеру, вы собрались выливать некий массив. Учитывая низкую скорость передачи (9600) у вас опять непозволительная роскошь - передавать байт с зависанием на ожидание опустошения буфера. И в этом случае лучше передавать поток данных по прерываниям от готовности передатчика. Работа по прерываниям детально и со вкусом описана на просторах инета. Найти это - ваша задача. Не забывайте, что взведенный в прерывании по приему флаг необходимо сбросить вне прерывания.
Это все справедливо, если у вас процесс передачи будет длительным по времени. Также зависит от характера фоновой задачи и насыщенности ее событиями и их приоритетами. Ничего этого не раскрыто, посему можно предположить, что у вас просто "практикум". Тогда элементарно отрабатывайте умение принимать и передавать по прерываниям. Это почти целая наука.
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
Непрочитано 19.02.2013, 11:36   #16
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: UART к PC на CodeVision

ut1wpr, дополню очень хорошее изложение: отдельным важным аспектом является организация буфера данных и работа с ним. Мне советовали поизучать прием "Кольцевой Буфер". Очень классный пример (да что там - минилиба) есть в примерах от LUFA, RingBuffer. Можно просто брать на вооружение. Сам еще толком не пробовал, некуда пока приткнуть. Но использовал как есть с примером в конвертере uart/cdc.
whoim вне форума  
Непрочитано 19.02.2013, 12:27   #17
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: UART к PC на CodeVision

Сообщение от whoim Посмотреть сообщение
ut1wpr, дополню очень хорошее изложение: отдельным важным аспектом является организация буфера данных и работа с ним. Мне советовали поизучать прием "Кольцевой Буфер". Очень классный пример (да что там - минилиба) есть в примерах от LUFA, RingBuffer. Можно просто брать на вооружение. Сам еще толком не пробовал, некуда пока приткнуть. Но использовал как есть с примером в конвертере uart/cdc.
Либу применять следует только после того, когда поймешь и разберешься, что и как происходит в ее кишочках. Иначе становишься простым заложником этой либы (вернее, ее автора). Лучше, все-таки самому понять про прием по прерываниям. А как организовывать буфер приема - это уже зависит от конкретных индивидуальных условий. Не стоит считать кольцевой буфер наиболее удачным и повсеместно его использовать. Повторяю, задача определяет все, в том числе и тип примененного буфера.
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
Непрочитано 19.02.2013, 17:23   #18
Fogtech
Частый гость
 
Регистрация: 29.01.2013
Сообщений: 31
Сказал спасибо: 13
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
Fogtech на пути к лучшему
По умолчанию Re: UART к PC на CodeVision

Спасибо всем ответившим за то, что подтолкнули на правильные идеи. Думал что эту тему смогу с наскока одолеть, но не тут уж было. Придется еще почитать об прерываниях.

Цель моих зысканий в настройке обмена данных между ПК и МК. То есть у меня есть этакой терминал который на данный момент нажатием кнопки зажигает определенные светодиоды, а также отображает значение АПЦ. Позже через эту программу должны отображаться значения нескольких измерений (АЦП), а также посылаться изменения для разных переменных внутри МК.
Fogtech вне форума  
Непрочитано 19.02.2013, 17:57   #19
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: UART к PC на CodeVision

Сообщение от Fogtech Посмотреть сообщение
Спасибо всем ответившим за то, что подтолкнули на правильные идеи. Думал что эту тему смогу с наскока одолеть, но не тут уж было. Придется еще почитать об прерываниях.

Цель моих зысканий в настройке обмена данных между ПК и МК. То есть у меня есть этакой терминал который на данный момент нажатием кнопки зажигает определенные светодиоды, а также отображает значение АПЦ. Позже через эту программу должны отображаться значения нескольких измерений (АЦП), а также посылаться изменения для разных переменных внутри МК.
Вам надо определится с пониманием, что такое есть "событие". Понять их хронологию (привязку во времени по отношению одного к другому), оценить, какие события должны вызывать какие действия. И только потом перейти к разрисовке блок-схемы (алгоритмике) программы. В самом конце этих шагов должно стоять написание собственно программы. У вас этот пункт выкарабкался на первое место.
Понимаю, у вас нет уверенности, что вы сможете реализовать тот или иной программный блок. В таких случаях просто придумайте себе задачу попроще, в которой этот блок будет задействован без взаимодействия с остальными, отладьте его раз и навсегда и больше к нему не возвращайтесь. Таким образом у вас в базе ваших знаний (в голове, то есть) будет накапливаться все больше готовых ВАШИХ СОБСТВЕННЫХ пониманий и решений. Из которых вы потом будете складывать кубики вашей программы.
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
Непрочитано 19.02.2013, 23:56   #20
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: UART к PC на CodeVision

Сообщение от ut1wpr Посмотреть сообщение
Либу применять следует только после того, когда поймешь и разберешься, что и как происходит в ее кишочках. Иначе становишься простым заложником этой либы (вернее, ее автора). Лучше, все-таки самому понять про прием по прерываниям. А как организовывать буфер приема - это уже зависит от конкретных индивидуальных условий. Не стоит считать кольцевой буфер наиболее удачным и повсеместно его использовать. Повторяю, задача определяет все, в том числе и тип примененного буфера.
ну я сначала свое написал, очередь с кучей трудозатрат на пропихивание снизу вверх при изъятии. Потом уже разжевали тут - мучай указатели и не таскай байтики почем зря Применил это же при работе с буфером в виде файла на сдммц, потом наткнулся и разобрался.
whoim вне форума  
Закрытая тема

Закладки

Метки
atxmega128a1, string, strlen, uart, xmega128-a1 xplained


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CodeVision urry Микроконтроллеры, АЦП, память и т.д 72 28.11.2011 19:22
Ищу пример uart для mega в codevision code-by Микроконтроллеры, АЦП, память и т.д 2 04.01.2011 12:20
ошибка в CodeVision vitecd Микроконтроллеры, АЦП, память и т.д 4 30.05.2010 14:42
CodeVision AVR 123abcdefg Микроконтроллеры, АЦП, память и т.д 1 19.10.2009 16:18
CodeVision 1.25.3 Vrungel Proteus, KiCAD и другие ECAD 40 16.03.2007 16:30


Часовой пояс GMT +4, время: 15:20.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot