Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
14.03.2007, 18:21
|
|
Прописка
Регистрация: 13.02.2005
Сообщений: 250
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
WIN AVR
есть код:
Код:
|
#include ‹avr/io.h›
#include ‹avr/interrupt.h›
#include ‹avr/signal.h›
#include ‹avr/delay.h›
#define inp(p) (p)
#define outp(b,p) ((p)=(b))
#define pgm_read_byte(addr) *((__flash unsigned char*)(addr))
#define pgm_read_word(addr) *((__flash unsigned short*)(addr))
//typedef __flash char prog_char;
#define F_CPU 4000000 /* 4 МГц */
#define UART_BAUD_RATE 9600 /* 9600 бод */
#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16l)-1)
typedef unsigned char u08;
typedef char s08;
typedef unsigned short u16;
typedef short s16;
/* uart globals */
static volatile u08 *uart_data_ptr;
static volatile u08 uart_counter;
SIGNAL(SIG_UART_TRANS)
/* обработчик прерывания UART txd готов */
{
uart_data_ptr++;
if (--uart_counter)
UDR = *uart_data_ptr; /* записать байт в буфер данных */
}
SIGNAL(SIG_UART_RECV)
/* обработчик прерывания "прием завершен" */
{
register char led;
led = UDR; /* прочитать байт из буфера данных UART */
PORTB = ~led; /* отобразить полученный байт на светодиодах, */
/* подключенных к порту B */
}
void uart_send(u08 *buf, u08 size)
/* send buffer ‹buf› to uart */
{
if (!uart_counter) {
/* записать первый байт в буфер данных */
uart_data_ptr = buf;
uart_counter = size;
outp(*buf, UDR);
}
}
void uart_init(void)
/* инициализировать UART */
{
/* разрешить прерывания RxD/TxD */
UCR = (1‹‹RXCIE)|(1‹‹TXCIE)|(1‹‹RXEN)|(1‹‹TXEN);
/* установить скорость */
UBRR = (u08)UART_BAUD_SELECT;
}
//---------Функция проверки нажатия кнопки----------- =14
unsigned char key (unsigned char s)
{ if (bit_is_clear(PIND,s))
{ _delay_loop_2(12500);
if (bit_is_clear(PINB,s))
{ return (0);
}
}
return (1);
}
int main(void)
{
DDRB = 0xff; /* все линии порта В на вывод */
PORTB = 0x00; /* зажечь светодиоды */
DDRB &= 0xDF;
uart_init();
sei(); /* разрешить прерывания */
while(1) { /* бесконечный цикл */
if (key(6))
{
if (key(6)) while(1) {if (!key(6))break; }
uart_send("kuku", 5);
}
uart_send("hallo", 6);
}
} |
есть библиотеки, вроже все работает, но обясните мне, можт я недоганяю чегото,... вроде читал ДШ на 90S2313, но недоганяю структуру приема и отправки байта через УАРТ,
для отправки я так понял надо прописать в переменную UDR записать то что надо, но как запустить передачу, я непонимаю, зачем здесь прерывания на передачу даных, на прием - понятно - пришли даные - идет прерывание - "забирай свои даные", но вот как с передачей с контроллера на ПК - ... ???, обясните, пжалуста... для непонятливого
__________________
Що згорить - то не зігниє!
(c)ChiP
|
|
|
|
14.03.2007, 21:11
|
|
Частый гость
Регистрация: 14.09.2005
Сообщений: 34
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Цитата:
|
...для отправки я так понял надо прописать в переменную UDR записать то что надо, но как запустить передачу, я непонимаю, зачем здесь прерывания на передачу даных, на прием - понятно - пришли даные - идет прерывание - "забирай свои даные", но вот как с передачей с контроллера на ПК ...
|
"Запускать" передачу никак особо не надо. Если у Вас
вывод TX настроен на передачу, то после того как байт
отправлен в ячейку UDR он (байт) сразу из ячейки UDR
попадает в сдвиговый регистр UART и начинает отправлятся
через вывод TX.
И если Вам надо отправить только 2 байта сразу,
(или 3, в зависимости есть ли буфер UDR у данного микроконтроллера), или отправлять байты очень редко,
заведомо реже чем тратиться времени на пересылку одного байта,
то можно обойтись без прерываний.
Но если Вам надо отправить группу байт, то каждый следующий
байт ложить в ячейку UDR можно только когда из нее ушел предыдущий.
Так как отправка байта через UART происходит очень долго,
по сравнению с временем пересылки его в ячейку UDR,
то если Вы всю свою группу байт отправите в UDR не дожидаясь,
прерывания то почти вся группа не будет отправлена. Так как
следующий байт затирает предыдущий. И будут отправлены первые
2 или 3 байта и, по моему, последний.
Поэтому, чтобы отправить группу байт,
требуется использовать прерывания. Причем, по моему,
лучше использовать прерывание не по окончанию передачи TXC,
как в Вашей програмке,
а по опустению (опустошению) буфера (UDR Empty) UDRE.
В WinAVR это SIGNAL(SIG_UART_DATA)
(ищем в "...C:/WinAVR/doc/avr-libc/avr-libc-user-manual/group__avr__interrupts.html")
Хотя по прерыванию передача UART окончена
SIGNAL(SIG_UART_TRANS), по моему, будет работать также.
Просто это прерывание хорошо использовать для полудуплексной
связи (например RS-485). По этому прерыванию надо отпустить линию после того, как вся группа байт
отправлена (а отправка группы шла по прерыванию
SIGNAL(SIG_UART_DATA) ).
____________
Александр
2007 03 14
|
|
|
|
14.03.2007, 21:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Цитата:
|
...для отправки я так понял надо прописать в переменную UDR записать то что надо
|
Вот так - avr123.nm.ru/z4.htm
и так - avr123.nm.ru/z5.htm
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
15.03.2007, 11:13
|
|
Прописка
Регистрация: 13.02.2005
Сообщений: 250
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Огромное спасибо - Laksus!!!! честь и хвала земликам!
АВР 123 - я вашы уроки читал, толк там есть. но чтобы его уловить, надо фильтровать всякую чехню которая там есть (не в обиду)
и кстати 485 - как из 232 сделать 485, ведь в 232 есть один провод передачи и один приема, а в 485 два провода, по одному сигнал положытельный по другому тот же сигнал, но отрецательный, и еще терзает вопрос - как повесить на одну линию 485 больше чем одно устройство?, как они распазнавать будут что енто им сигнал пришел, ну и конечно как с приемом - передачей????
__________________
Що згорить - то не зігниє!
(c)ChiP
|
|
|
|
15.03.2007, 11:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207
Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)
|
Сообщение от chipic128
|
и кстати 485 - как из 232 сделать 485, ведь в 232 есть один провод передачи и один приема, а в 485 два провода, по одному сигнал положытельный по другому тот же сигнал, но отрецательный, и еще терзает вопрос - как повесить на одну линию 485 больше чем одно устройство?, как они распазнавать будут что енто им сигнал пришел, ну и конечно как с приемом - передачей????
|
Здесь на KAZUS.RU есть ответы на многие вопросы:
Современные микросхемы драйверов RS-485 фирмы MAXIM
https://kazus.ru/articles/330.html
Правильная разводка сетей RS-485
https://kazus.ru/articles/213.html
Последовательный интерфейс RS-485
https://kazus.ru/articles/211.html
Обрежьте жирок с RS-485
https://kazus.ru/articles/200.html
|
|
|
|
15.03.2007, 11:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
кы485 по-русски в низу http://avr123.nm.ru/z4.htm
по-аглицки на - analog.com ad485 и там же апноуты.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
15.03.2007, 11:57
|
|
Прописка
Регистрация: 13.02.2005
Сообщений: 250
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
все енто высокии материи - как с RX, TX т.е. 2 и 3 ножек СОМ порта перейти на два проводка?
можт я и неправ в кое чем, то Вы не обижайтесь!
__________________
Що згорить - то не зігниє!
(c)ChiP
|
|
|
|
15.03.2007, 12:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207
Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)
|
Сообщение от chipic128
|
все енто высокии материи - как с RX, TX т.е. 2 и 3 ножек СОМ порта перейти на два проводка?
можт я и неправ в кое чем, то Вы не обижайтесь!
|
Если на пальцах:
Нужна микросхема драйвера RS-485 (приемопередатчик).
Она с физического уровня RS-232 формирует физические уровни RS-485.
Дальше к этим двум проводкам можно подключать много RS-485 приемопередатчиков параллельно.
Драйверы не осуществляют адресацию.Пакет попадает на все приемники. Логика приемников определяет как обрабатывать данные и как решать проблемы коллизий.
Статьи на KAZUS.RU советую таки прочитать.
|
|
|
|
15.03.2007, 12:37
|
|
Прописка
Регистрация: 13.02.2005
Сообщений: 250
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Цитата:
|
Нужна микросхема драйвера RS-485 (приемопередатчик).
Она с физического уровня RS-232 формирует физические уровни RS-485.
|
значит на одну с микросхем MAX предложеных в таблице на вход ее подаем с контроллера ТХ а на выходной порт макса РХД? я правильно понял, и таким способом, если подключать к ентим двум проводкам только по одному приемо передатчику с каждой сторони - можно получить просто километровый удлинитель СОМ порта?
А если нужно обеденить несколько устройств, то надо уже в самом контроллере делать какую-то адресацию.
правильно ли я понял?
__________________
Що згорить - то не зігниє!
(c)ChiP
|
|
|
|
15.03.2007, 13:07
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
адресацию делает контроллер.
Правильно подключать так:
КОМ порт - max232 - max485 - двухпроводная сеть до 32 устройств.
max232 или его аналог нужен чтоб сделать ТТЛ(CMOS) уровни с которыми работает max485.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:37.
|
|