|
|
  |
Нужен учитель, Если кто-то согласен стать он-лайн учителем, прошу помочь. |
|
|
|
Apr 24 2013, 12:51
|

Участник

Группа: Участник
Сообщений: 63
Регистрация: 28-02-13
Пользователь №: 75 833

|
Цитата(_Артём_ @ Apr 24 2013, 17:09)  Как у вас сейчас программа выглядит? Эхо идёт правильно? В симуляторе не пробовали запускать? Да эхо работает правильно. Но дело в том что когда я его отключаю оно все равно работает :-)
--------------------
Viva la resistance!
|
|
|
|
|
Apr 24 2013, 17:39
|

Участник

Группа: Участник
Сообщений: 63
Регистрация: 28-02-13
Пользователь №: 75 833

|
Цитата(kovigor @ Apr 24 2013, 20:56)  Коротыш на макетной плате м/у RXD и TXD ? да нет ничего не коротит.. что то с кодом кажет не так.. или с настройками блютуз модуля..
--------------------
Viva la resistance!
|
|
|
|
|
Apr 24 2013, 19:25
|

Участник

Группа: Участник
Сообщений: 63
Регистрация: 28-02-13
Пользователь №: 75 833

|
#include <avr/io.h> #include <avr/interrupt.h>
#define FOSC 8000000L//Тактовая частота #define BAUD 9600L //Скорость порта #define MYUBRR FOSC/16/BAUD-1
void USART_Transmit( unsigned char data ); void USART_Init( unsigned int ubrr);
//Обработка прерывания чтения USART ISR(USART_RXC_vect) { int b; b = UDR; USART_Transmit( b ) ;//Отправляем то, что получили }
//Инициализация модуля USART void USART_Init( unsigned int ubrr) { //Задаем скорость работы USART UBRRH = (unsigned char)(ubrr>>8); UBRRL = (unsigned char)ubrr;
UCSRB=(1<<RXEN)|( 1<<TXEN); //разращён прием и передача UCSRB |= (1<<RXCIE); //прерывание при чтении
//URSEL,UMSEL=0 асинхронный,UPM01=0 Parity нет, USBS=0 1 стоп бит,UCSZ012 = 3 8бит данных
UCSRC=(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0);
}
//Функция отправки данных void USART_Transmit( unsigned char data ) { while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема UDR = data; //Начало передачи данных }
int main(void) { USART_Init (MYUBRR); sei();//разрешаем прерывания
while(1)//вечный цикл { }
}
вот это рабочий пример для меги16, тут же меняю порты и регистры для меги8, беру из ДШ, ничего не работает, возвращает все символы. как думаете изза чего?
Сообщение отредактировал David_Ali - Apr 24 2013, 19:26
--------------------
Viva la resistance!
|
|
|
|
|
Apr 25 2013, 04:02
|

Участник

Группа: Участник
Сообщений: 63
Регистрация: 28-02-13
Пользователь №: 75 833

|
Цитата(kovigor @ Apr 25 2013, 00:36)  Или. Например, в телефонных модемах был отключаемый режим эха (echo). Не ваш ли это случай ? При наличии осциллографа проверить эту гипотезу очень просто - достаточно отключить передатчик модуля от приемника МК и на вход приемника модуля подать ваши символы. Если модуль тут же их возвращает (это и покажет осциллограф, но до МК эти возвращенные символы не дойдут), то вопрос оказывается исчерпанным ... В таком случае другие МК тоже не работали бы. А они то работают.
--------------------
Viva la resistance!
|
|
|
|
|
Apr 25 2013, 09:34
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(David_Ali @ Apr 25 2013, 08:02)  В таком случае другие МК тоже не работали бы. А они то работают. ваш последний продемонстрированный код ДОЛЖЕН всегда выдавать принятый символ. если он не выдает этот символ, то увидеть, что программа "работает" попросту невозможно, так как кроме этого ваша программа ничего не делает. есть предложение перестать тратить попусту время всех, кто пытается вам помочь, за счет демонстрации "полноценного" исходника, а не усеченного каким-то способом (я подозреваю, что вы его слегка укорачиваете, прежде чем выложить здесь), причем в варианте "работает" и в варианте "не работает". заниматься догадками о том, что и как вы меняете, что у вас есть "работает", а что нет, нет совершенно никакого желания. P.S. на сколько мне не изменяет память, в WinAVR принято тактовую частоту МК определять макросом F_CPU, а не FOSC... то есть в своей программе вы можете брать уже готовый макрос F_CPU, а не задавать его самостоятельно. кроме того, есть специальный модуль util/setbaud.h, который призван сделать за вас все вычисления констант для настройки модуля USART, рекомендую пользоваться.
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Apr 25 2013, 14:19
|

Участник

Группа: Участник
Сообщений: 63
Регистрация: 28-02-13
Пользователь №: 75 833

|
Цитата(ARV @ Apr 25 2013, 14:34)  ваш последний продемонстрированный код ДОЛЖЕН всегда выдавать принятый символ. если он не выдает этот символ, то увидеть, что программа "работает" попросту невозможно, так как кроме этого ваша программа ничего не делает.
есть предложение перестать тратить попусту время всех, кто пытается вам помочь, за счет демонстрации "полноценного" исходника, а не усеченного каким-то способом (я подозреваю, что вы его слегка укорачиваете, прежде чем выложить здесь), причем в варианте "работает" и в варианте "не работает". заниматься догадками о том, что и как вы меняете, что у вас есть "работает", а что нет, нет совершенно никакого желания.
P.S. на сколько мне не изменяет память, в WinAVR принято тактовую частоту МК определять макросом F_CPU, а не FOSC... то есть в своей программе вы можете брать уже готовый макрос F_CPU, а не задавать его самостоятельно. кроме того, есть специальный модуль util/setbaud.h, который призван сделать за вас все вычисления констант для настройки модуля USART, рекомендую пользоваться. Я не тот код послал. Извините. Приду домой сразу вышлю.
--------------------
Viva la resistance!
|
|
|
|
|
Apr 25 2013, 16:38
|

Участник

Группа: Участник
Сообщений: 63
Регистрация: 28-02-13
Пользователь №: 75 833

|
Цитата(David_Ali @ Apr 25 2013, 19:19)  Я не тот код послал. Извините. Приду домой сразу вышлю. #include <avr/io.h> #include <avr/interrupt.h> #define FOSC 8000000L//Тактовая частота #define BAUD 9600L //Скорость порта #define MYUBRR FOSC/16/BAUD-1 void USART_Transmit( unsigned char data ); void USART_Init( unsigned int ubrr); ISR(USART_RXC_vect) { int b; b = UDR; USART_Transmit( B ); } void USART_Init( unsigned int ubrr) { UBRRH = (unsigned char)(ubrr>>8); UBRRL = (unsigned char)ubrr; UCSRB=(1<<RXEN)|( 1<<TXEN); UCSRB |= (1<<RXCIE); UCSRC=(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0); } void USART_Transmit( unsigned char data ) { while ( !(UCSRA & (1<<UDRE)) ); UDR = data; } int main(void) { char data; PORTB=0x00; DDRB=0xFF; PORTD=0x00; DDRD=0x00; USART_Init (MYUBRR); sei(); while(1) { data=UDR; if(data=='A') { PORTB=0x1; } if(data=='B') { PORTB=0x00; } } } вот это рабочий код на атмега16. на атмега восемь он не работает(естественно я меняю что надо по ДШ на мегу 8). кто знает что там нужно поменять скажите, и объясните почему!!) прошу учить, а не поучать! P.S. GGC AVRом компилирую. потому что код вижн не дает мне хекс файлов, хоть в настройках я и указываю оутпут файлы хексами. и как использовать <util/setbaud.h>??
Сообщение отредактировал David_Ali - Apr 25 2013, 16:57
--------------------
Viva la resistance!
|
|
|
|
|
Apr 25 2013, 17:11
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(David_Ali @ Apr 25 2013, 19:38)  вот это рабочий код на атмега16. на атмега восемь он не работает(естественно я меняю что надо по ДШ на мегу 8). кто знает что там нужно поменять скажите, и объясните почему!!) Что-то вы или не то копипастите, или ещё что... Ваш код не только работать не может, он даже не откомпилируется. Цитата(David_Ali @ Apr 25 2013, 19:38)  ISR(USART_RXC_vect) { int b; b = UDR; USART_Transmit( B ); } Какая такая переменная B? GCC не возражает? Насчёт остального тут (проблемы с определением переменной data). Оптимизатор весь while из main выкинул. тут
|
|
|
|
|
Apr 25 2013, 17:17
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(David_Ali @ Apr 25 2013, 20:38)  вот это рабочий код на атмега16. на атмега восемь он не работает(естественно я меняю что надо по ДШ на мегу 8). кто знает что там нужно поменять скажите, и объясните почему!!) прошу учить, а не поучать! P.S. GGC AVRом компилирую. потому что код вижн не дает мне хекс файлов, хоть в настройках я и указываю оутпут файлы хексами. и как использовать <util/setbaud.h>?? это не рабочий код. если он вдруг ведет себя так, как вы предполагаете, то это свидетельствует только об одном из двух: либо вы даже и не предполагаете, как он должен себя вести, либо чисто случайно все выглядит по-вашему. поясню, почему я так считаю. 1. у вас есть прерывание ПО ПРИЕМУ символа. внутри обработчика этого прерывания вы незамедлительно считываете UDR и выдаете принятое обратно. это называется ЭХО. в терминале вы обязаны получать обратно то, что передали. 2. в основном цикле вы непрерывано и постоянно считываете UDR, при этом абсолютно не заботясь о том, есть там данные или нет. честно говоря, я никогда не интересовался, что будет происходить, если во время приема байта считывать UDR... это порочная практика. но могу предположить, что в меге8 UDR не имеет двойной буфферизации, а в меге16 он буфферизирован. т.е. при наличии двойной буфферизации до тех пор, пока что-то не будет принято, вы считываете НОЛЬ из буфера. если же буферизации нет, то что вы считываете во время приема - я не могу даже предположить (а читать даташит не хочется, лень). 3. итак, у вас есть две точки в программе, где вы НЕЗАВИСИМО считываете UDR. по-вашему, это нормально? приведу пример: по конвейеру едут пирожки, а по бокам конвейера стоят Вася и Петя. вы надеетесь, что им обоим достанется поровну пирожков, но на самом деле это зависит от ловкости каждого. Если Вася более ловкий, то Петя останется голодным, ну возможно, иной раз все-таки что-то и ему перепадет... так вот, обработчик прерывания - это у вас шустрый Вася, а основной цикл - тормоз Петя... вам уже намекали, что нормальная практика - это либо работать с UDR исключительно через прерывания, либо исключительно из основного цикла. но вы решили поступить по-своему. обучение всегда начинается с того, что ученик строго следует наказам учителя, и только освоив учительские методы полностью, может попытаться пойти своим путем. рекомендую и в случае с МК поступать так же точно. P.S. как пользоваться util/setbaud.h, написано в документации к WinAVR. так же можете почитать и мои скромные попытки рассказать об этом: http://www.simple-devices.ru/attachments/a...AVR_02_2011.pdfтак же есть еще немного по родственным темам: http://www.simple-devices.ru/articles/7-so...navr-console-io (тут как раз есть исходники с примером использования setbaud.h).
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Apr 25 2013, 17:28
|

Участник

Группа: Участник
Сообщений: 63
Регистрация: 28-02-13
Пользователь №: 75 833

|
Цитата(ARV @ Apr 25 2013, 22:17)  это не рабочий код. Рабочий!! я его скомпилировал, залил в МК и все работает так как мне надо. как это не рабочий.. Цитата(_Артём_ @ Apr 25 2013, 22:11)  Что-то вы или не то копипастите, или ещё что... Ваш код не только работать не может, он даже не откомпилируется. тутну вы ребята.. мне что видео снять как он компилится?? это раз! во вторых "B" пишу потому что он в смайлик превращается тут, думал профессионалы догадаются, но видимо не догадались что б там маленькое. Цитата(ARV @ Apr 25 2013, 22:17)  P.S. как пользоваться util/setbaud.h, написано в документации к WinAVR. так же можете почитать и мои скромные попытки рассказать об этом: http://www.simple-devices.ru/attachments/a...AVR_02_2011.pdfтак же есть еще немного по родственным темам: http://www.simple-devices.ru/articles/7-so...navr-console-io (тут как раз есть исходники с примером использования setbaud.h). Спасибо за информацию!
--------------------
Viva la resistance!
|
|
|
|
|
Apr 25 2013, 18:06
|

Участник

Группа: Участник
Сообщений: 63
Регистрация: 28-02-13
Пользователь №: 75 833

|
Цитата(ARV @ Apr 25 2013, 22:52)  читайте мои словесные излияния. если описанное мною вам и нужно - я пас, не жалуйтесь. так нормальные программисты не пишут, извините. Не доделанное добро это не есть добро.. Пас есть пас.. Спасибо за все. Сам разберусь.
--------------------
Viva la resistance!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|