Хочу настроить отправку данных (просто цифры) с компьютера на МК и обратно по COM-порту. Подскажите где можно скачать готовый проект для WinAVR ?
проблема в получении данных с компьютера ! ! !
отправку я настроил всё работает. а при получении данных МК как будто зависает. не могу понять в чем дело.
1. Denis800 - 08 Ноября, 2011 - 12:15:09 - перейти к сообщению
2. cjA - 08 Ноября, 2011 - 18:01:05 - перейти к сообщению
буфер наверное, комп ждет +-12, а МК только 3.3 выдает
(Добавление)
Оно?
http://easyelectronics.ru/avr-uc...cherez-uart.html
не winavr, конечно но может поможет
(Добавление)
Оно?
http://easyelectronics.ru/avr-uc...cherez-uart.html
не winavr, конечно но может поможет
3. Denis800 - 08 Ноября, 2011 - 18:19:47 - перейти к сообщению
как раз на компьютер я всё отлично передаю !
я не могу передать с компа на Мегу16.
микросхему согласования уровня MAX232AEPE я использую !
иначе бы не получилось !
т.е. в одну сторну у меня идет а в другую нет !
мне бы какой нибудь проект, я бы из него выковырнул то что мне надо !
я не могу передать с компа на Мегу16.
микросхему согласования уровня MAX232AEPE я использую !
иначе бы не получилось !
т.е. в одну сторну у меня идет а в другую нет !
мне бы какой нибудь проект, я бы из него выковырнул то что мне надо !
4. cjA - 08 Ноября, 2011 - 18:33:55 - перейти к сообщению
показывайте что вы там заливаете на МК, вот просто уверен что где то бит забыли поднять потому он и не просыпается когда ему сигнал приходит.
(Добавление)

(Добавление)
чебы не получилось? пять проводков и два стабилитрона, им можно и МК прошивать и туда-сюда общаться
5. Denis800 - 09 Ноября, 2011 - 12:01:25 - перейти к сообщению
Вот сам модуль, его смысл: при загрузке МК зажигаем светодиод 2, потом пауза светодиод 3, при получении символа зажигаем все 8 светодиодов порта А. и отвечаем компьютеру цирой "1".
//***************************************************************************
#include <avr/io.h>
#include <avr/interrupt.h>
#include "usart.h"
#include "lcd_lib.h"
int main( void )
{
unsigned char sym;
DDRA = 255;
PORTA = 2;
_delay_ms(500);
USART_Init();
PORTA = 4;
_delay_ms(500);
USART_Init();
//LCD_Init();
sei();
//LCD_SendString("uart:");
while(1){
sym = USART_GetChar(); //читаем буфер
if (sym){ //если что-то приняли, то
PORTA = 255;
_delay_ms(1000);
USART_SendChar('1'); //отвечаем компу "Ok "
//USART_SendChar('k');
//USART_SendChar(' ');
}
}
return 0;
}
модуль usart.c
#include "usart.h"
//однобайтный буфер
volatile unsigned char usartRxBuf = 0;
//инициализация usart`a
void USART_Init(void)
{
UBRRH=0;
UBRRL=74; //скорость обмена 9600 бод
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //разр. прерыв при приеме, разр приема, разр передачи.
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //размер слова 8 разрядов
}
//отправка символа по usart`у
void USART_SendChar(unsigned char sym)
{
while(!(UCSRA & (1<<UDRE)));
UDR = sym;
}
//прием символа по usart`у в буфер
ISR(USART_RX_vect)
{
usartRxBuf = UDR;
}
//чтение буфера
unsigned char USART_GetChar(void)
{
unsigned char tmp;
ATOMIC_BLOCK(ATOMIC_FORCEON)
{
tmp = usartRxBuf;
usartRxBuf = 0;
}
return tmp;
}
при включении получается так: зажигается светодиод 2, потом 3, и так будт пока я не отправлю что то с компьютера, при отправке любого символа, на компьютер "1" не возвращается, и сам МК как будто "зависает" и выглядит это так: постоянно как будто в цикле (которого нет) зажигается светодиод 2 потом 3, и так длиться бесконечно, откуда берется такое чудо мне не понятно ! ! !
P.S. если мой микроконтроллер прошить простенькой прошивкой для отправки символов на компьютер, то компьютер всё принимает ! это я написал для того чтобы подтвердить что всё исправно, и информация с МК на компьютер идёт, а обранто нет !
//***************************************************************************
#include <avr/io.h>
#include <avr/interrupt.h>
#include "usart.h"
#include "lcd_lib.h"
int main( void )
{
unsigned char sym;
DDRA = 255;
PORTA = 2;
_delay_ms(500);
USART_Init();
PORTA = 4;
_delay_ms(500);
USART_Init();
//LCD_Init();
sei();
//LCD_SendString("uart:");
while(1){
sym = USART_GetChar(); //читаем буфер
if (sym){ //если что-то приняли, то
PORTA = 255;
_delay_ms(1000);
USART_SendChar('1'); //отвечаем компу "Ok "
//USART_SendChar('k');
//USART_SendChar(' ');
}
}
return 0;
}
модуль usart.c
#include "usart.h"
//однобайтный буфер
volatile unsigned char usartRxBuf = 0;
//инициализация usart`a
void USART_Init(void)
{
UBRRH=0;
UBRRL=74; //скорость обмена 9600 бод
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //разр. прерыв при приеме, разр приема, разр передачи.
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //размер слова 8 разрядов
}
//отправка символа по usart`у
void USART_SendChar(unsigned char sym)
{
while(!(UCSRA & (1<<UDRE)));
UDR = sym;
}
//прием символа по usart`у в буфер
ISR(USART_RX_vect)
{
usartRxBuf = UDR;
}
//чтение буфера
unsigned char USART_GetChar(void)
{
unsigned char tmp;
ATOMIC_BLOCK(ATOMIC_FORCEON)
{
tmp = usartRxBuf;
usartRxBuf = 0;
}
return tmp;
}
при включении получается так: зажигается светодиод 2, потом 3, и так будт пока я не отправлю что то с компьютера, при отправке любого символа, на компьютер "1" не возвращается, и сам МК как будто "зависает" и выглядит это так: постоянно как будто в цикле (которого нет) зажигается светодиод 2 потом 3, и так длиться бесконечно, откуда берется такое чудо мне не понятно ! ! !
P.S. если мой микроконтроллер прошить простенькой прошивкой для отправки символов на компьютер, то компьютер всё принимает ! это я написал для того чтобы подтвердить что всё исправно, и информация с МК на компьютер идёт, а обранто нет !
6. Denis800 - 09 Ноября, 2011 - 12:03:03 - перейти к сообщению
вот вам проект на WinAWR
7. Denis800 - 26 Ноября, 2011 - 18:27:28 - перейти к сообщению
неужели никто не поделиться ссылкой на готовый проект ?
я остальное всё сделаю сам !
подскажите как принять данные по USART на МК с обычного компа ? проект с
http://chipenable.ru/index.php/f...sons-winavr.html
не работает.
я остальное всё сделаю сам !
подскажите как принять данные по USART на МК с обычного компа ? проект с
http://chipenable.ru/index.php/f...sons-winavr.html
не работает.
8. cjA - 28 Ноября, 2011 - 20:55:11 - перейти к сообщению
попробовать перевернуть МК от клавы?
просто не знаю зачем мне их столько? раз она может на комп посылать, может может и обратно?
(Добавление)
а согласование уровней? мах232 или как там?
комп понимает МК, а МК комповские +-12V не понимает, для него все это еденица.
(Добавление)
ну вот нужно было мах распаять так чтоб можно было и так и наоборот пдсоеденить. Может второй порт бракованый, кто знает.
не очень понимаю в Си, но помоему это не будет работать...
просто не знаю зачем мне их столько? раз она может на комп посылать, может может и обратно?
(Добавление)
Denis800 пишет:
и информация с МК на компьютер идёт, а обранто нет !
а согласование уровней? мах232 или как там?
комп понимает МК, а МК комповские +-12V не понимает, для него все это еденица.
(Добавление)
ну вот нужно было мах распаять так чтоб можно было и так и наоборот пдсоеденить. Может второй порт бракованый, кто знает.
Denis800 пишет:
usartRxBuf = UDR;
не очень понимаю в Си, но помоему это не будет работать...
9. Роботов - 28 Ноября, 2011 - 21:59:40 - перейти к сообщению
cjA пишет:
не очень понимаю в Си, но помоему это не будет работать...
"Солженицына я не читал, но его творчество осуждаю..."(с)
10. cjA - 01 Декабря, 2011 - 22:46:32 - перейти к сообщению
Роботов
ирония тут не уместна. нигде не сказано что внешний доступ к этому регистру разрешен UDR
Может в Си это автоматически делается, тогда простите.
ирония тут не уместна. нигде не сказано что внешний доступ к этому регистру разрешен UDR
Может в Си это автоматически делается, тогда простите.
11. Роботов - 01 Декабря, 2011 - 23:00:02 - перейти к сообщению
cjA пишет:
нигде не сказано что внешний доступ к этому регистру разрешен
В даташите сказано. и пример на Си приведён. Читайте.
cjA пишет:
Может в Си это автоматически делается, тогда простите.
Делается
12. cjA - 02 Декабря, 2011 - 18:57:15 - перейти к сообщению
Роботов пишет:
Делается
Вот почему я и не люблю Си, в нем слишком много делается автоматически.(в асме все входы по резету закрыты, кроме самого резета)
А если у меня на портД другие датчики навешаны? (эт я утрирую...)
Хотя уже близок к тому чтобы дописать свой последний код на асме (очень тягомотно полкило кода на асме) и выбрать повыше язык...
13. Denis800 - 03 Декабря, 2011 - 12:53:15 - перейти к сообщению
микросхему MAX232 я естественно подключил с самого начала.
порт COM - работает, я с него прошиваю программатором Громова этот самый микроконтроллер !
если я замкну ножки МК 14 и 15 (просто отверткой или проводком), то на компьютер вернётся всё что я отправил на МК, значит вся электрическая цепочка исправна !
проблема в программе, то что я ничего не могу принять на МК, а отправляется только по одному символу ! ! !
порт COM - работает, я с него прошиваю программатором Громова этот самый микроконтроллер !
если я замкну ножки МК 14 и 15 (просто отверткой или проводком), то на компьютер вернётся всё что я отправил на МК, значит вся электрическая цепочка исправна !
проблема в программе, то что я ничего не могу принять на МК, а отправляется только по одному символу ! ! !
14. Роботов - 03 Декабря, 2011 - 14:22:45 - перейти к сообщению
Согласно даташита приём должен выглядеть так:
У вас же строки "ждать полученых данных" нет. Может в этом проблемма?
(Добавление)
Организуйте цикл, и отправляйте сколько угодно символов.
CODE:
unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) );
/* Get and return received data from buffer */
return UDR;
}
unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) );
/* Get and return received data from buffer */
return UDR;
}
У вас же строки "ждать полученых данных" нет. Может в этом проблемма?
(Добавление)
Denis800 пишет:
а отправляется только по одному символу ! ! !
Организуйте цикл, и отправляйте сколько угодно символов.