Перейти до змісту
  • ХАРД
  • ATmega8 проблема с USART


    Рекомендовані повідомлення

    Не нашол соотвецтвующей ветки по микроконтроллёрам, так шо выбачяйте

    (самое интересное куда её переместят :dntknw00: (не смешно) )

     

    Мне нужно чтоб один МК передавал состояние 8 кнопок и значение с двух АЦП(режим 8 бит) по одному проводу другому МК по УСАРТу.

    Написал код для обеих МК, разрешил прерывания, но в PROTEUSе не вижу положительных результатов.

    Прикрепил исходники(WinAVR) и HEX код для обеих МК и проэк в PROTEUS

     

    Подскажыте что делаю не так!!!? :blink:

    Посилання на коментар
    Поділитись на інші сайти

    Не нашол соотвецтвующей ветки по микроконтроллёрам, так шо выбачяйте

    (самое интересное куда её переместят :dntknw00: (не смешно) )

     

    Мне нужно чтоб один МК передавал состояние 8 кнопок и значение с двух АЦП(режим 8 бит) по одному проводу другому МК по УСАРТу.

    Написал код для обеих МК, разрешил прерывания, но в PROTEUSе не вижу положительных результатов.

    Прикрепил исходники(WinAVR) и HEX код для обеих МК и проэк в PROTEUS

     

    Подскажыте что делаю не так!!!? :blink:

     

    дело в том шо шото не то с микро контроллером ето 100%

     

    попробуй другой

    ато там бывает проводники к ножкам микроконтроллера горят от так и получается шо шото не пашет :wink:

    КоСмоСссссСССсСССсССССССссссс

    Посилання на коментар
    Поділитись на інші сайти

    Чувак ты гониш!Какие ножки?

    Я ж написал что в ПРОТЭУСЕ рарботаю! На железе не пробовал - нету смысла!

    Пока в симуляторе не будет всё чётко паять не буду.

    Ты хоть бы скачал исходники перед тем как отвечать!

    Проблема именно в программе...вродь глобальные прерывания разрешил но передаётся только первый байт :cry2:

    Забыл сказать Протэус ругается что не сконфигурирован какойто регистр...

    хз шо оно хочет

    ПОМОГИТЕ!!! уже неделю парюсь над этим

    Посилання на коментар
    Поділитись на інші сайти

    Обьясняю...

    Мне надо передать 3 байта данных...

    Алгоритм такой...

     

    для передающего МК:

    клепаем щётчик байтов

    записуем в буфер УСАРТа первый байт...передаём...срабатывает прерывание по окончанию передачи байта...

    в прерывании с помощью щётчика передаём второй байт а потом третий..

    выходим с прерывания и получаем новые значения с АЦП и состояния кнопок...

    и так по кругу...

     

    для принимающего:

    в бесконечном цыкле проверяем заполненя буфера УСАРТа..

    Если чтото приняло записуем его в одну переменую...

    Срабатывает прерывание по окончанию приёма в котором мы получаем подряд второй третий байт...

     

    вот так вот, но почемуто оно не пашет! :resent00:

    Змінено користувачем Томатный
    Посилання на коментар
    Поділитись на інші сайти

    Тебе в другой форум надо. Поищи в нете, там много тематических форумов. Тут врятли тебе кто-то поможет.
    Посилання на коментар
    Поділитись на інші сайти

    Тебе в другой форум надо. Поищи в нете, там много тематических форумов. Тут врятли тебе кто-то поможет.

     

    Там никто нечё не шарит - уже пробовал.

    http://www.radiokot.ru/forum/viewtopic.php?t=5530

    (тупо сам с собой разговариваю на форумах)

    Вы моя последняя надежда :blink:

    Посилання на коментар
    Поділитись на інші сайти

    Там никто нечё не шарит - уже пробовал.

    http://www.radiokot.ru/forum/viewtopic.php?t=5530

    (тупо сам с собой разговариваю на форумах)

    Вы моя последняя надежда :blink:

     

    Про остальные форумы ничего сказать не могу.

    Но в Бп я уверен на 100%, тут тебе не помогут.

    Попробую специфическую литературу почитать, может там что-то есть.

    Посилання на коментар
    Поділитись на інші сайти

    Переделал прогу, уже должна работать...

    Проблема решается тем что они не решается :D

    Вобщим надо только в железе проверять и подстраивать, симулятор ничем не поможет в данном случае.

    Осталось только поехать на базар и купить второй МК, одлин уже есть и спаять ету всю фигню...

     

    А вобще эта идея одностороней передачи по одному каналу нужна для того, чтобы зделать устройство радиоуправления используя апаратные средства МК (в усарте уже есть проверка на ошибки и вся такая фигня) и не морочить себе голову с самопальной програмной реализации формирования пакета и кодирования.

     

    Будут какието результаты - отпишусь.

    Всем спасибо за внимание :biggrin: :bye:

    Посилання на коментар
    Поділитись на інші сайти

    Короче всё прекрасно работает! Зделал уже...
    Посилання на коментар
    Поділитись на інші сайти

    • 4 тижня через...

    Короче всё прекрасно работает! Зделал уже...

     

    респект что зделал, только не пойму в чём была ошыбка и вобще что ето такое (сорри за оффтоп) :pardon00:
    Посилання на коментар
    Поділитись на інші сайти

    респект что зделал, только не пойму в чём была ошыбка и вобще что ето такое (сорри за оффтоп) :pardon00:

     

    Ошибка была в ДНК :biggrin:

    Не правильно настроил УСАРТ бо по началу содрал готовый код с даташита, а там оказуется не правильно.

    Потом сам во всём разобрался, переписал и запахало.

     

    Вообще это связь двух контролеров по одному каналу в одном направлении по протоколу RS-232, будет применяться в радиоуправлении.

    Количество команд дискретных и пропориональных любое - зависит от прошивки МК :)

    Отак от круто, осталось только модули радиоприёмника и радиопередатчика купить :)

    Посилання на коментар
    Поділитись на інші сайти

    Ошибка была в ДНК :biggrin:

    Не правильно настроил УСАРТ бо по началу содрал готовый код с даташита, а там оказуется не правильно.

    Потом сам во всём разобрался, переписал и запахало.

     

    Вообще это связь двух контролеров по одному каналу в одном направлении по протоколу RS-232, будет применяться в радиоуправлении.

    Количество команд дискретных и пропориональных любое - зависит от прошивки МК :)

    Отак от круто, осталось только модули радиоприёмника и радиопередатчика купить :)

     

    Вопрос немного не по теме: а можешь выложить куда-то PROTEUS?

    Посилання на коментар
    Поділитись на інші сайти

    Я не с сети - не могу кинуть

    Могу дать ссылку в инете - 45 Мб

    У вас в сети есть у ENLAN, прийдётся сильно попросить у него :)

    Посилання на коментар
    Поділитись на інші сайти

    Я не с сети - не могу кинуть

    Могу дать ссылку в инете - 45 Мб

    У вас в сети есть у ENLAN, прийдётся сильно попросить у него :)

     

    Да я вчера залил Proteus 7.1 SP2, ImageCraft ICCv7, AVRStudio4.13, поэтому уже не нужно... :smile:

    Посилання на коментар
    Поділитись на інші сайти

    Да я вчера залил Proteus 7.1 SP2, ImageCraft ICCv7, AVRStudio4.13, поэтому уже не нужно... :smile:

     

    Что планируешь делать с этим всем?
    Посилання на коментар
    Поділитись на інші сайти

    Что планируешь делать с этим всем?

     

    AVRStudio4.13 - лабы.

    ImageCraft ICCv7 - программировать МК (С++ лучше знаю, чем ассемблер)

    Proteus 7.1 SP2 - собственно, эмулировать схему (чтобы не распаивать в железе. а то один Мк уже пришлось выбросить из-за установки немного не того значения фьюз-бита :) )

    Посилання на коментар
    Поділитись на інші сайти

    Я юзвю PROTEUS 7.2, WinAVR(на C++ пишу) и PonyProg(для прошивки МК) :smile:
    Посилання на коментар
    Поділитись на інші сайти

    • 4 тижня через...

    Но в Бп я уверен на 100%, тут тебе не помогут.

    Це легко виправити. Достатньо мені почати сюди частіше зазирати, причому якось так боком-боком, щоб весь інший форум не бачити, а то втечу, як зі скайнету :beee0000:

     

    p.s[0] Зараз не маю часу читати всю тему, перший день після відпустки на роботі, треба щось і зробити :biggrin:

    Ввечері з дому подивлюся.

    p.s[1] Працюю саме в WinAVR, ніякими симуляторами не користуюся (хіба що в AVRstudio якусь математику перевіряю або такти рахую, і то зрідка), тому по симуляторам нічого не скажу.

    Змінено користувачем avreal

    Самотнє сонце

    пригортає тигра

    та пестить метелика.

    Посилання на коментар
    Поділитись на інші сайти

    Експериментальним шляхом встановлено, що ти, імовірніше за все, користувався WinAVR-20060421 з оптимізацією на розмір, але без ключа -mcall-prologues (ще дужча оптимізація на розмір, але реальний ефект дає на великих програмах). Можливо, якимось іншим, але 99% що цим :smile:

    Порадив би перейти на WinAVR-20070525, він в більшості випадків генерує трохи кращий код, але для нього треба трохи уважніше писати (трохи краще знаючи мову С :wink: ).

    Якщо неохота тягти з інтернету - викласти можу, але лише в скайнетівському sDC (якщо це маэ сенс).

     

    Всі коментарі стосується другого архіву, з восьмого посту цієї теми.

     

    #include <avr/interrupt.h>
    #include <avr/signal.h>
    Зараз з цих двох файлів треба використовувати один - avr/interrupt.h

    signal.h давно застарілий і насправді перенаправляє компілятор на avr/interrupt.h, тобто реально

    ти включив цей файл двічі. Це не страшно, але навіщо?

     

    SIGNAL(SIG_UART0_TRANS)
    Аналогічно - рекомендується перейти з SIGNAL на ISR, те ж саме, і SIGNAL ще є в файлі interrupt.h новіших версій avr-gcc, але його позначено як застарілий і в якийсь момент він може пропасти.

    Але важливо не це, а те, що у atmega8 немає вектора SIG_UART0_TRANS, є вектор

    SIG_UART_TRANS (у меги8 лише один USART). WinAVR при компіляції має видати попередження "misspelled signal handler". Функція обробки преривання скомпілюється, але не буде прив'язана до потрібного вектора, а на тому векторі, як і на всіх незадіяних, буде встановлено ловушку - перехід на __bad_interrupt.

    От тут і біда - перший байт ти передаєш в main() записом в UDR і він передається.

    А преривання не відпрацьовує, бо реально вектор кінця передачі направлено в ловушку _bad_interrupt, яка робить перехід на нульову адресу і програма починає виконуватися спочатку, знову, зрештою, передаючи лише один байт з трьох потрібних.

    В ініціалізації USART теж помилка є, але вона не головна.

     

    Ще одне "до речі" - вже досить давно разом зі "старими" іменами векторів вигляду SIG_... існують нові, такі ж, як у компілятора IAR, для даного вектора - USART_TXC_vect.

     

    void pause(unsigned long p) {
    	unsigned long i;
    	for (i=p; i > 0; i--);
    }
    А ось тут може чекати великий облом. Справа в тому, що змінна i ніяк не використовується, в циклі нічого не робиться - "на виході" у цієї функції нічого немає. Так, вона "виробляє" затримку, але з точки зору стандарту С вона таки нічого не робить. По стандарту оптимізатор компілятора має повне право викинути цей цикл, зробивши фактично

    void pause(unsigned long p) { }
    І якщо WinAVR-20060421 ще таку оптимізацію не робить, то всі новіші версії - роблять і затримка реально буде дуже мала - лише на виклик порожньої функції, або її зовсім не буде (зоптимізується навіть виклик функції, бо вона однак "нічого не робить").

     

    Аналогічно з

    int foo() {
    	int i, j;
    	for( i=0, j = 1; i < 5; ++i)  j *= 2;
    	return i;
    }
    він має право зробити
    int foo() {   return 32; }

    Це можна "вилікувати" словом volatile, яке забороняє "занадто оптимізовувати" роботу зі зімінною.

    void pause(unsigned long p) {
    	volatile unsigned long i;
    	for (i=p; i > 0; i--);
    }
    Але краще використовувати готові функції
    #define F_CPU 4000000UL
    #include <util/delay.h>
    void pause() { _delay_ms(1.5); } // затримка півтори мілісекунди
    Час затримки має бути константою, може бути з плаваючою точкою, бо всі обчислення робляться на етапі компіляції.

    Обмеження на максимальний час залежить від тактової частоти контроллера, це описано в документації. Для 4МГц максимальна затримка буде 262144/4000 = 65,536 мілісекунди.

     

    void USART_Init(unsigned int baud) {
      UCSRC = 0;
      UBRRH = (unsigned char)(baud>>8);
      UBRRL = (unsigned char)baud;
      UCSRB = (1<<TXEN)|(1<<TXCIE);
      UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
    }
    Тут не використана формула UBRR = Fosc / 16 / BAUD - 1. В документації не так "неправильно", як "необережно" - спочатку правильно написано, як розраховувати значення для UBRR, а потім через пару сторінок в прикладах аргумент функції USART_Init названо baud, а треба було б baud_divider, щоб не плутати народ.

    Я так зрозумів, ти це й сам помітив :smile:

    Але це лише дало якусь "дурнувату" швидкість передачі і все, на непередачу другого та третього байту це не могло вплинути.

     

    Є ще деякі дрібні зауваження на тему "як краще відразу звикнути робити" або "як зробити програму трохи меншою в пам'яті" (ця програма легко скорочується з більше 700 до менше 600 байтів і її текст теж стає коротший і зрозуміліший), але це якщо продовження розмови когось зацікавить.

     

    ImageCraft ICCv7 - программировать МК (С++ лучше знаю, чем ассемблер)

    А хіба ImageCraft вже підтримує С++?

    Наче ж він лише C, та й то не впевнений, що він навіть стандарт C99 мови C підтримує повністю.

    Таке зкомпілює?

     

    int sum( int sy, int sx, int a[sy][sx]) {
    	int temp = 0;
    
    	for( int y = 0; y < sy; ++y )
    		for( int x = 0; x < sx; ++x)
    			temp += a[y][x];
    
    	return temp;
    }
    Хоча стандарт 99-го року саме на мову C може і мікрософтівський повністю не підтримувати, вони могли давно плюнути на чистий C, зосередившись на C++ та C#

    Самотнє сонце

    пригортає тигра

    та пестить метелика.

    Посилання на коментар
    Поділитись на інші сайти

    спасибо за замечания!

    плохо что я щас это забросил, по тому что в железе нет возможности попробовать...

    а кстати симулятором зря не пользуешся, это очень удобно

     

    Кстати не подскажешь какието хорошие магазинчики(в Киеве) где можно было бы купить разьёмы всевозможные и радиомодули? :dntknw00:

    Посилання на коментар
    Поділитись на інші сайти

    Кстати не подскажешь какието хорошие магазинчики(в Киеве) где можно было бы купить разьёмы всевозможные и радиомодули? :dntknw00:

     

    караваевы дачи ))

    "Software is like sex - it's better when it's free" © Linus Torvalds.

    Связь - она как воздух, пока не испортишь - никто не заметит

    Подумаешь.. я еще и на машинке вышивать умею.. крестиком )

     

    306192005.png

    Посилання на коментар
    Поділитись на інші сайти

    там нифига нема :dntknw00:

    был недавно в "Радиодетали" - у них даж панелек на 28Pin под Atmega8 нема

    Змінено користувачем Томатный
    Посилання на коментар
    Поділитись на інші сайти

    а кстати симулятором зря не пользуешся, это очень удобно

    :smile:

    Ну, у нас трохи різні підходи і "трохи" різний досвід.

     

    Я просто продивився твій код і побачив невідповідність імені вектора конкретному контроллеру і помилку в ініціалізації UART, на це пішло навряд чи набагато більше часу, ніж треба, щоб запустити симулятор і завантиажити в нього проект. Тобто для простих речей мені симулятор непотрібен.

    А складні в них не так і просто просимулювати.

    Щоб це було ефективно з точки зору саме перевірки роботи програми (а не перевірки правильності розуміння документації автором програми) - треба, щоб симулятор підтримував якиусь скриптову мову і на ній написати купу тестів, що імітують поведінку "реального світу". А де гарантія, що ці тести самі будуть написані правильно, що зімітують якісь критичні для програми ситуації? Тобто ці тести однак треба уважно писати і "симулювати" головою, виправляти в них помилки під час одночасного тестування програми тестами і тестів - програмою. Тобто це добрячий шмат роботи, який економічно вигідний лише на досить великих програмах або в ситуації, коли помилка при налагоджуванні програми "в залізі" дуже дорого коштує (довго потім уламки будинку розрібати :wink:).

     

    От для навчання новачків - інша справа :)

     

    До речі, про критичні для програми ситуації. Уявімо собі, що десь на межі приймач "не почув" один байт (або не один, а будь-яка кількість, некратна трьом). У тебе просто змістяться по кругу всі наступні байти, кнопки підуть у приймачі замість якогось каналу пропорційного регулювання, інший пропорційний сигнал піде замість кнопок... Або прийшла якась перешкода і зіпсувала байт - приймач отримає і виконає неправильну команду. Я повторюся, але щоб побачити це в симуляторі, треба знати, що таке можливо. А якщо знати - то і без симулятора зрозуміла реакція програми - я б відразу присав якийсь "пакетний" протокол з визначеними межами пакетів і з контрольною сумою.

    Чи ти розраховуєш на радіоканал, який бере на себе всі ці проблеми, тобто на радіомодем?

     

    Ще приклад - от у ATtiny13 її watchdog timer вміє працювати в режимі, коли він спочатку видає преривання, а в наступний період, якщо він не був знову в цей режим переведений - робить reset.

    Ну так от можна в симуляторі прогнати програму і все працюватиме, але потім взяти і прошити fuse WDTON - "постійно ввімкнений watchdog", тоді режим преривання не вмикається, зафіксовано режим system reset незалежно від того, що записано у WDTCR. І якщо симулятор не вміє симулювати програму з урахуванням fuses - можна отримати масу задоволення в дусі "ну так у симуляторі працює, а в залізі - ні, мабуть, мікросхема бракована" :)

    І таких ситуацій - "в симуляторі працює, в залізі ні" або навіть "в симуляторі ніяк не працювало, плюнув, зашив - в залізі працює" (тобто просто помилка в симуляторі) - валом, час від часу на різних форумах виникають подібні запитання від людей, які занадто довіряють симуляторам.

     

    p.s. якшо шо - питай, я тобі і без симулятора відповім :)

    єдине, що не гарантую, то це відповідь в той же день, бо я сюди не кожен день заглядатиму.

     

     

    Кстати не подскажешь какието хорошие магазинчики(в Киеве) где можно было бы купить разьёмы всевозможные и радиомодули?

    Про модулі не скажу, а панельки, мікросхеми і різну дрібноту беру на кардачах - палатка Imrad на вході, пав.№9В, пав.18 (там десь лівіше пластикові корпуси, а правіше - панельки/штекери/гнізда/...).

    Хоча у мене якийсь запас панельок звичайно валяється, бо я по одній не беру, хай краще лежить, ніж бігти треба. Та й не соромлюся зробити панельку на 28, поставивши поруч на 20 та на 8 або 14 + 14.

    Самотнє сонце

    пригортає тигра

    та пестить метелика.

    Посилання на коментар
    Поділитись на інші сайти

    Естествено симуляторам доверять нельзя на 100% Но использовать их очень удобно

    Скопмилировал и сразу посмотрел как оно работает вместо того чтоб по 10 раз перепрошивать контролер, даже если взять пример вывода на матричный ЖКИ - в симуляторе сразу посмотришь как отображается картинка или интерфейс, не понравилось опять подправил и сразу видишь результат.

    Кстати Proteus очень серьезный симулятор и особых глюков не наблюдалось, ещё такого не было что проект в симуляторе не совпадал с проектом в железе (вплоть до яркости светодиодов)

     

    :biggrin: На щёт моей программы. Я во первых недавно только начал этим заниматсья...на щёт имени функций прерываний я уже разобрался и то что если оборвать цепь то всё перемешается я тоже знаю...

    думаю первые 4 байта зделать адрес пакета остальные 4 байта даных, приёмник это всё склеивать будет.

    Ну и всю эту муть на радиомодуль...думаю обработки ошибок усартом хватит?

    Из радиомодулей думаю найти RR10-433 и TRFQ1-433...помоему в СЭА Електроникс найти заказать можно

    p.s. якшо шо - питай, я тобі і без симулятора відповім :)

    єдине, що не гарантую, то це відповідь в той же день, бо я сюди не кожен день заглядатиму.

    Спасибо а ты как и где этому всему научился? :)
    Посилання на коментар
    Поділитись на інші сайти

    Естествено симуляторам доверять нельзя на 100% Но использовать их очень удобно

    Так я ж і кажу за різні підходи. Я і без симулятора не перешиваю по 10 разів після дрібних правок, якщо на прогоні в залізі помітив "дрібне щось не те" - підправив та й усе, в наступний раз буде видно. Можу декілька днів писати не зашиваючи програму і бути відносно впевненим у результаті :)

     

    Спасибо а ты как и где этому всему научился? :)

    "Если долго мучиться, что-нибудь получится". Просто давно цим займаюся.

    О, аналогію знайшов!

    Швея-початківець після кожних двох стьожків вішатиме роботу на манекен і дивитиметься - чи не накосячила. І радітиме манекену, у якого форми-розміри можна настроїти, руки згинаються і піднімаються і т.п.

    А досвідчена обійдеться замірами і однією приміркою на клієнті. Не тому, що симулятори манекени погані, а тому, що вони їй непотрібні. Ну, для дуже вередливого клієнта - декількома примірками, але манекен тут точно не допоможе.

     

    Ти краще глянь на цей клас: http://portveshok123.nm.ru/

     

    Якщо хто не зрозумів - це пародія на http://avr123.nm.ru/

    Змінено користувачем avreal

    Самотнє сонце

    пригортає тигра

    та пестить метелика.

    Посилання на коментар
    Поділитись на інші сайти

    ×
    ×
    • Створити...

    Важлива інформація

    Використовуючи цей сайт, Ви погоджуєтеся з нашими Умови використання, Політика конфіденційності, Правила, Ми розмістили cookie-файлы на ваш пристрій, щоб допомогти зробити цей сайт кращим. Ви можете змінити налаштування cookie-файлів, або продовжити без зміни налаштувань..