Мелкие вопросы по МК и ПЛИС.
- Vergilium
- Грызет канифоль
- Сообщения: 260
- Зарегистрирован: Ср фев 13, 2008 14:41:32
- Откуда: Украина, Николаев
Здраствуйте и извените что повторяюсь. Пытаюсь передать в МК строку (массив символов) через UART но нефига не получается. В нете смотрел, везде примеры приема только одного байта и все. Главное передавать строки я научился, этого в сети хватает.
Помогите пожалуйста, ткните носом или может книгу какуето посоветуете.
PS програмирую на WinAVR, MK Atmega16
Помогите пожалуйста, ткните носом или может книгу какуето посоветуете.
PS програмирую на WinAVR, MK Atmega16
Немного нервов и девайс готов
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Ну, строка состоит из отдельных байтов. Вам надо не "принимать строку", а формировать её из нескольких принятых байт. Если Вы опишите задачу (бегущая строка и т. д. ) то ответ Вы получите значительно быстрее.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
- Vergilium
- Грызет канифоль
- Сообщения: 260
- Зарегистрирован: Ср фев 13, 2008 14:41:32
- Откуда: Украина, Николаев
Именно бегущая строка. Принимаю массив и вывожу на LED матицы.
Одну букву выводить могу а вот как сформировать строку. вот это для мения непонятно. Понятно, что каждый принятый байт засовывать в элемент массива, но как это сделать еще не понимаю, это же не присвоешь просто так.
Одну букву выводить могу а вот как сформировать строку. вот это для мения непонятно. Понятно, что каждый принятый байт засовывать в элемент массива, но как это сделать еще не понимаю, это же не присвоешь просто так.
Немного нервов и девайс готов
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Придется и мне повториться - я же давал ссылку, где посмотреть, и что? Что там не подошло?Vergilium писал(а):извените что повторяюсь.
Приведенный тобой исходник не должен вообще ничего принимать по USART, так как в нем USART отключен! (функция usart_init() объявлена, но не вызывается)
Далее - обработчик прерывания зачем-то пишет принятый байт всегда в первый элемент массива simbol.
Еще - обработка принятой информации (ну, допустим, что она-таки будет принята, после некоторых исправлений) ведется только один раз, после начала работы м/к - в цикл while(1) эта обработка не включена, то есть принятые через USART байты ни к каким изменениям не приведут.
Наконец, цикл, объявленный как "for (i=0; i<=arr_size;i++)" будет перебирать не только массив simbol, но и еще один байт, за пределами массива.
Задание размеров массивов сделано нелогично - это будет отдельная головная боль при отладке.
Все ошибки, кроме первой, пока никак не сказываются на поведении м/к - они "заработают" только когда ты включишь USART и разберешься с побайтовым приемом строки в массив simbol[5], а не в его первый элемент.
Пока так.
Впрочем, нет - не всё ещё. Как я понимаю, никаких сдвиговых регистров в схеме нет и столбец светодиодов предполагается поджигать из порта А - так? Но тогда вот эта инструкция - "PORTA = count;" также ошибочна, поскольку в порт А будет выводиться не бегущая единичка, а двоичная фигня.
- Vergilium
- Грызет канифоль
- Сообщения: 260
- Зарегистрирован: Ср фев 13, 2008 14:41:32
- Откуда: Украина, Николаев
Хочу извенится за тугодумство, просто все в голове пермишалось, этот институт да ище и МК освоить хочу, вобщем запутался.
Но сейчас разобрался и все работает, и даже вроде правильно. На этом конечно мои вопросы не закончились. Так как поиски хорошей книженки мне результатов не дали буду спрашивать и надоедать.
Сразу прошу не ругатся за тупые вопросы но ответы на них не нашел.
Во первых: что имеится ввиду когда встречаю символы в коде << или >>, например "1<<EEWE" и почему просто не присвоить регистру значение;
Во вторых: встречалось "UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1)" что здесь за операции, имеется ввиду не собственно что эта строка выполняет, а логические операции |= и просто |;
Вот еще все в куче "I2C_DDR&=~(1<<SDA_LN);" что это делает "&=~(1<<".
Заранее спасибо.
Но сейчас разобрался и все работает, и даже вроде правильно. На этом конечно мои вопросы не закончились. Так как поиски хорошей книженки мне результатов не дали буду спрашивать и надоедать.
Во первых: что имеится ввиду когда встречаю символы в коде << или >>, например "1<<EEWE" и почему просто не присвоить регистру значение;
Во вторых: встречалось "UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1)" что здесь за операции, имеется ввиду не собственно что эта строка выполняет, а логические операции |= и просто |;
Вот еще все в куче "I2C_DDR&=~(1<<SDA_LN);" что это делает "&=~(1<<".
Заранее спасибо.
Немного нервов и девайс готов
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Vergilium писал(а):Хочу извенится за тугодумство, просто все в голове пермишалось, этот институт да ище и МК освоить хочу, вобщем запутался.
Но сейчас разобрался и все работает, и даже вроде правильно. На этом конечно мои вопросы не закончились. Так как поиски хорошей книженки мне результатов не дали буду спрашивать и надоедать.Сразу прошу не ругатся за тупые вопросы но ответы на них не нашел.
Во первых: что имеится ввиду когда встречаю символы в коде << или >>, например "1<<EEWE" и почему просто не присвоить регистру значение;
Во вторых: встречалось "UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1)" что здесь за операции, имеется ввиду не собственно что эта строка выполняет, а логические операции |= и просто |;
Вот еще все в куче "I2C_DDR&=~(1<<SDA_LN);" что это делает "&=~(1<<".
Заранее спасибо.
<< и >> это операции сдвига на n влево и в право, при чём пустоты после сдвига заполняются нулями, т.е. 1<<EEWE это значит что число 0b00000001 (это 1 в десятичной) мы сдвигаем влево на EEWE (определено в #define на какое-то число) число раз. Напремер, если EEWE это 5 то получим 0b00000001<<5 = 0b00100000
Если будет 0b00000001>>5 то это даст 0, а если 0b01000000>>5 то будет 0b00000010.
А нужно это собсно для операций |= &= ^= (это побитовые операции или, и, исключающее или, между переменной к которой присвается результат и правой частью)... Например, есть у нас переменная AAA с содержанием 0b00100010. Нам нужно зажечь 1 и 7 бит. Для это выполняем такую фичу AAA |= (1<<0)|(1<<6);
Происхотит тут вот что, для начала производятся сдвиги, в результате получается: AAA |= 0b00000001|0b01000000;
Затем выполняется побитовое или: AAA |= 0b01000001;
Теперь выполняется побитовое или с присвоением результата левому операнду, т.е. эта операция аналогична AAA = AAA|0b01000001; Ну а т.к. AAA = 0b00100010, то получается AAA = 0b00100010|0b01000001; что при выполнении побитового или получается AAA = 0b01100011;
Всё... 1 и 7 биты включены. А чтобы выключить теперь 2 и 6 биты то нам тут надо применить побитовое и. Здесь ~ - видимо побитовое не (никогда не использовал - я плохой программист!
AAA &= ~((1<<1)|(1<<5));
Что тут происходит, ну с (1<<1)|(1<<5) подробности опустим, т.к. только что это описывал, результатом будет 0b00100010, получаем AAA &= ~(0b00100010);
Теперь применяется побитовое не, результатом будет AAA &= 0b11011101;
Ну, а затем применяется побитовое и, между AAA и 0b11011101:
AAA = AAA & 0b11011101;
Это у нас AAA = 0b01100011 & 0b11011101; Выполняем побитовое и, получаем AAA = 0b01000001;
Вот. Если разобраться, то всё просто.
Последний раз редактировалось IfoR Сб сен 19, 2009 04:58:18, всего редактировалось 1 раз.
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Vergilium писал(а): почему просто не присвоить регистру значение;
Присвоить значение можно, и многие так делают. Другое дело разбираться в коде трудно, что включил, что нет? С подобным же стилем программиования все какна ладони: установили бит URSEL в 1, значит будет передано в регистр UCSRC.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Stalker46 писал(а):и всегда ли надо в схему выводы для программирования отводить через резисторы в 10К?
я например просто вывел их на штыри... без резисторов.
Я цепляю, не смотря на наличие внутренних, резисторы на 5В (подтяжка). Что касается работы схемы, то возникают сомнения в целесообразности подобного подключения. Если линия будет работать на цифру - можно не обеспечить логического нуля. На своих платах завел 2 правила:
1) Либо не подключать нагрузку выходами к выводам ISP;
2) Либо, если край как надо, ставить джампера. На время программирования они изымаются и обвязка не влияет.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
вот как я подключил. МОжно ли так или некорректно?
- Вложения
-
- image_146853425[14].JPG
- (95.46 КБ) 432 скачивания
Не умеешь - не берись, но не взявшись не научишься...
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Смелое утверждение.IfoR писал(а):<< и >> это операции сдвига на n влево и в право, при чём пустоты после сдвига заполняются нулями, ...
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Yellow Tiger писал(а):функции с необъявленным типом имеют тип void
Неужели всё же int? Каюсь.
Yellow Tiger писал(а):Не следует забывать о наличии знакового бита, размножение которого заполнит освобождающиеся биты единицами
Ну, это только при сдвиге вправо... Ну и вобщем-то примеры приводились для положительного числа.
Ну а так, тоже согласен, а то я всё пытался вспомнить, когда там 1 появляются. )
Да и со static я что-то намудрил... Для объявления внешних переменный используется extern. static, же не делает переменную глобальной, но намертво фиксирует её в памяти, и она не удаляется после выполнения блока. Если блок выполняется ещё раз, то значение этой переменной сохраняются...
Вообщем, надо ещё раз пробежать справочник по c, а то что-то давно к компилятору не подходил...
