Jump to content

Search the Community

Showing results for tags 'avr'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Вопрос-Ответ. Для начинающих
    • Песочница (Q&A)
    • Дайте схему!
    • Школьникам и студентам
    • Начинающим
    • Паяльник TV
    • Обсуждение материалов с сайта
    • Competition 2019
  • Радиоэлектроника для профессионалов
    • Световые эффекты и LED
    • Роботы и модели на ДУ-управлении
    • Автоматика
    • Самодельные устройства к компьютеру
    • Программное обеспечение
    • Автомобильная электроника
    • Системы охраны и наблюдения. Личная безопасность
    • Питание
    • Электрика
    • Промышленная электроника
    • Ремонт
    • Металлоискатели
    • Измерительная техника
    • Мастерская радиолюбителя
    • Сотовая связь
    • Спутниковое ТВ
    • КВ и УКВ радиосвязь
    • Жучки
    • Телефония и фрикинг
    • Высокое напряжение
    • Идеи и технологии будущего
    • Справочная радиоэлементов
    • Литература
    • Разное
  • Аудио
    • FAQ, Технологии и компоненты
    • Для начинающих
    • Источники звука
    • Предусилители, темброблоки, фильтры
    • Питание аудио аппаратуры
    • Усилители мощности
    • Акустические системы
    • Авто-аудио
    • Ламповая техника
    • Гитарное оборудование
    • Прочее
  • Микроконтроллеры
  • Товары и услуги
  • Разное
  • Переделки's ATX->ЛБП
  • Переделки's разные темы
  • Киловольты юмора's Юмор в youtube
  • Радиолюбительская доска объявлений exDIY's Надежность и группы продавцов

Blogs

There are no results to display.

There are no results to display.

Marker Groups

  • Пользователи форума

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


ICQ


Skype


Интересы


Город


Сфера радиоэлектроники


Оборудование

Found 354 results

  1. Здесь будут помещаться различные примеры кода и прочего обсуждаемого в других темах. Также скидывайте сюда любую полезную информацию по AVR микроконтроллерам Он-лайн книга: "Книга по программированию микроконтроллеров AVR (ассемблер)" Atmel AVR4027: Tips and Tricks to Optimize Your C Code for 8-bit AVR Microcontrollers: Atmel AVR4027 (Оптимизация кода от Atmel).pdf
  2. Здравствуйте. Затеялся собрать анализатор спектра на светодиодах, 20x20 светодиодов, МК ATMEGA328P. Долго ломал голову, как переключать столбцы без использования МК, дабы его не загружать.И вот что у меня получилось. Набросал тестовую прошивку для теста в протеусе. При инилизации подается импульс на вторую ножку U4a, и на предпоследнем столбце. Думал сетку сделать на 5 сдвиговых регистрах (как раз 40 сигнальных линий), но боюсь мощности МК не хватит для обработки FFT и вывода на матрицу, будет подвисать. Кто что думает по поводу схемы? бегущая строка.pdsprj Natali_2012_program.hex
  3. Oldnaf

    Codevisionavr

    Здравствуйте, извините если что где коряво написано, мы люди начинающие и просим помощи. Первое, программатор у меня «PROTTOSS AVR910 USB Programmer» Второе, пользуем программой «CodeVisionAVR» точнее «CodeVisionAVR Evaluation V2.03.9» На компе стоит ХР. Все установили строго по инструкции, комп нашел программатор, установил дрова с диска, комп все сделал, в «устройства» появился мой программатор, на COM4. Установил программу «CodeVisionAVR Evaluation V2.03.9» запустил, программатор программа видит. Выкладываю все настройки которые нашел в программе (фото 1; 2; 3;) выставил фьюзы как было рекомендовано в статье, схему из которой собираю (правда в статье написано что фьюзы выставлялись в «ПониПрог» ). Далее все начинаю делать по учебнику: 1- Фото 1-1 загружаю HEX файл 2- Фото 2-1 нажимаю на «Флеш» для заливки в контроллер и………………. 3- Фото 3-1 выдает такой результат. Контроллер Atmega8 Что я только не пробывал и стереть и верифицировать, результат один и тотже- фото 3-1. Братцы, помогите пожалуйста, чтото я делаю не так, может где галочку не поставил или поставил зря, может что с фьюзами намудрил, хотя в статье именно так и написано. А может какую другую программу посоветуете для прошивки, которая работает с данным программатором. До этого какимто не понятным образом, умудрился прошить Attiny 2313 для пробы (Правда тоже были пляски с бубном, в виде перебора COM портов), поморгал светодиодами и забил. Вот сейчас понадобилось прошить контроллер и фига с маслом. С PICами както попроще, AVR пока не дается, а хотца научится, говорят они поинтереснее.
  4. Извечный вопрос не дает покоя. Кто и на чем все же предпочитает вести работу с контроллерами? Лично я как научился работать на С, так и не могу перейти на Assembler, да и не очень то хочется это делать. Какие все же преимущества и недостатки, окромя понятности и не очень понятности?
  5. делаю диплом, в схеме у меня микроконтроллер PIC16F688 и мне нужно его заменить на ATmega. Не могу найти похожий
  6. Здравствуйте, надеюсь я задаю вопрос в правильном разделе. Дело в том, что у меня есть очень стойкое желание разработать свой металлодетектор по принципу индуктивного баланса (такой как quasar, крот, кощей-20 и.т.д.). В качестве обработчика планирую использовать Arduino или AVR. Уже прочитал все роботы Колоколова, Щедрина, литературу по цифровой обработке сигналов и прочую дремучую ерунду. Теперь у меня в голове куча информации, которую я никак не могу сложить в нужный пазл. В итоге получается, что знания в этом направлении ничем не отличаются от знаний пятиклассника. Но желание заняться построением металлодетекторов всё сильнее и поэтому обращаюсь к специалистам этого форума (md4u.ru мне не помог). Может кто-либо на пальцах объяснить принцип работы всей системы подобных устройств? Начиная от структурной схемы и заканчивая обработкой сигналов в МК (вычисление тангенса, определение фазового сдвига и т.д.). Думаю данная тема поможет таким как я, а нас очень много. Кто знает, может в результате совместных усилий получится прибор, не уступающий коммерческим. Повторюсь, хочется узнать всё подноготную построения IB-металлоискателей. Совет собрать уже готовый не есть для меня интересным. Заранее всем благодарен!!!
  7. Здравствуйте ! подскажите , какую лучше библиотеку использовать (и где ее взять) для управления i2c atmega8 в atmel studio 7 . задача - управлять atmega8 по i2c , цап PCF8591T . понимаю , в интернете много примеров и библиотек , но хотелось бы пример максимально простой и точно рабочий . т.к. пока что все мои попытки не привели к успеху ... то Atmel Studio 7 при компиляции ругается на несуществующий файл ( к примеру - "stream.h") при использовании библиотеки i2c , то еще какие то грабли .
  8. Ох... Сколько бессонных ночей и трудовых дней потребовалось, чтобы завершить работу, которую прилагаю к этой записи... Вот отсюда можно скачать (просто распакуйте архив и запустите exe-шник): https://cloud.mail.ru/public/Co2R%2F3YxQDjR1P Что это? Это - система создания скриптов для моего плейера световых эффектов. Сложно рассказать в двух словах, что это и зачем, но если пойти и почитать по ссылке, какое-то представление получить можно. Ну и несколько картинок для интриги: Если звезды зажигают, значит, это кому-нибудь нужно? Если программы пишут - что это значит? P.S. Понимаю, что прошу слишком многого, но очень хотелось бы получить какую-то обратную связь по поводу этого проекта...
  9. В общем есть небольшая тривиальная задача - сделать свитюльку. Контроллер управляет светодиодиками, цвета меняются, людишки довольны. Схема проста: Attiny44a -> 2n3904 x3 -> RGB-светодиод. Собрал, протестил, всё норм, но! Как только в коде я использую функцию задержки - _delay_ms (util/delay.h) - контроллер повисает! #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { // Input/Output Ports initialization // Port A initialization // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit3=In Bit2=Out Bit1=In Bit0=In DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit3=T Bit2=0 Bit1=T Bit0=T PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Non-Inverted PWM // Timer Period: 0,031875 ms // Output Pulse(s): // OC0A Period: 0,031875 ms Width: 0 us // OC0B Period: 0,031875 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Ph. correct PWM top=0x00FF // OC1A output: Non-Inverted PWM // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 0,031875 ms // Output Pulse(s): // OC1A Period: 0,031875 ms Width: 0 us // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-11: Off MCUCR=(0<<ISC01) | (0<<ISC00); GIMSK=(0<<INT0) | (0<<PCIE1) | (0<<PCIE0); // USI initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<ADC1D) | (0<<ADC2D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); unsigned char VL_OCR0A = 0, VL_OCR0B = 0, VL_OCR1A = 0; OCR0A = 0; OCR0B = 0; OCR1A = 0; while(1) { _delay_ms( 100 ); VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } } Т.е. если указать задержку в начале цикла, то светодиод не светится вообще. Если задержку убрать - светодиод немного подсвечивает всеми цветами. while(1) { _delay_ms( 100 ); // <--- ЗАДЕРЖКА --- VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } Где я накосячил? З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает
  10. Сайт Паяльник открывает обучающий видеокурс по AVR-микроконтроллерам. В этой теме "обратной связи" будем постепенно добавлять новые видеоролики с нашего канала. Здесь можно задавать вопросы, давать рекомендации, критиковать, оставлять отзывы и пожелания, а также запросы на тему будущих видеоуроков. Ведет видеокурс наш форумчанин kobzar. Профиль пользователя на сайте cxem.net. Там же финансовые реквизиты для тех, кто пожелает финансово отблагодарить автора данного видеокурса Подписка на YouTube канал Краткий обзор сред разработки для различных микроконтроллеров на сайте: http://cxem.net/software/soft_mcu.php Внимание начинающим! Перед тем, как задавать вопросы не по теме видеоуроков, прочитать: Статьи по МК для начинающих Книга по программированию микроконтроллеров AVR Также, здесь же на форуме рядом с этой темой смотрите прикрепленные темы: для начинающих, по языку Си и т.д. Все вопросы не по видеокурсу задавайте только там. С этой темы подобные вопросы удаляются Кракозябры вместо русских букв Ребята - спешу сообщить что найден метод борьбы с кракозябрами вместо русских символов, при работе с ЖК. Дело в том, что у некоторых из вас, проект создается в кодировке UTF-8, а наша библиотека работает только с ср1251 Фикс: 1.Открываем проект 2. File - Advanced Save Options 3. Вместо кодировки UTF-8 выбираем Cyrillic(Windows) - cp1251 Сохраняем, сохраняем проект - компилируем! Добавлено 12.01.16 : Изменённые версии библиотеки lcd_5110 : От COKPOWEHEU - Ссылка на пост , Ссылка на github
  11. Добрый день. Экспериментирую с платой TP4056 и MK ATmega8, конкретнее - пытаюсь собрать простенькое зарядное устройство с выводом параметров при зарядке/разрядке на АЦП МК. Для измерения тока нашел ACS712. Думаю, что получится выводить ток при зарядке (т.е. когда идет питание на TP4056 и нагрузка отключена) и при разрядке (питание выключено, нагрузка подключена). Нагрузка - резистор. Возникла проблема с измерением напряжения на АКБ. Вернее, проблема с отсутствием идей как это сделать. Может какую-нибудь схему делителя напряжения нужно сделать? Прошу помочь советом. Схему из пэинта прилагаю. Спасибо.
  12. Есть ли жизнь на Марсе, нет ли её там - науке это не известно. Наука пока не в курсе дела. Есть ли жизнь в экосистеме AVR? Или эти мамонты уже вымерли, уступив более теплокровным ARM? По-моему, для неленивого энтузиаста экосистема AVR предоставляет еще множество возможностей. Не смотря на 8 бит и достаточно скромные характеристики, жизнь там не только существует, но и довольно эффектно развивается. На видео - небольшая (как кредитка) игрушечка, реализованная на attiny85... Напомню: всего 6 ног, 8К flash и 512 байт RAM. Вот так-то...
  13. Добрый день! От товарища поступила просьба собрать на ардуино (либо изготовить плату на avr) детектор короткого замыкания. Есть у него на производстве ряд БП 12в 2квт и десяток потребителей на каждом, таких блоков порядка сотни, и поступила "хотелка" навесить на каждый БП ардуину (питание будет отдельное независимое) которая будет посылать по wifi уведомление когда будет возникать КЗ в блоке/потребителе (важна возможность определения именно КЗ). Опыта нет, первое что пришло в голову это: 1) мониторить потерю напряжения 12в на БП (при КЗ блок уходит в защиту) 2) при потере напряжения 12в подавать напряжение 3.3в от питания МК с управлением через ключ от ножки МК на "+" питания БП и переход на пп.3 3) ноль от БП подключить к АЦП МК и замерять: если 0в то все норм и КЗ нет (поломка блока без КЗ либо отключение от сети 220в), если на АЦП будет 3.3в то имеем КЗ и отправляем уведомление. Т.к. опыта схемотехники почти нет, прошу помощи по схеме в даже в мелочах
  14. Здравствуйте, только начинаю изучать программирование мк. Я уже задавал этот вопрос в моих прошлых схемах мне отвечали что-то типа "любой стабилизрованый источник постоянного напряжения", или кидали схему такого источника. Можно назвать мне конкретное устройство? В общем то что я смогу забить в гугл и приписать купить. Я уже больше двух месяцев жду пока мне придут с aliexpress детали для маленького лабараторного блока, но этот вариант может разбиться о кривизну моих рук. Хочу просто купить такой источник и наконец заняться непосредственно МК.
  15. Доброго времени суток. Пытаюсь разобраться с обработкой энкодера на внешних прерываниях. Нашел пример опроса - сравнения по прерыванию таймера. Но вгонять контроллер в прерывание 500-1000 раз в секунду мне кажется не очень удачным решением, если энкодер будет использоваться редко. На easyelectronics нашел алгоритм обработки энкодера при помощи прерываний: Если настраиваем прерывание по восходящему фронут, то прерывание будет генерироваться только каждый 4 щелчок энкодера (при вращении в одну сторону). Или я что-то не понимаю? На ассемблере примеров реализации не нашел.
  16. Здравствуйте, только начал изучать программирование микроконтроллеров. В учебнике есть схема, но она не учитывает питание и землю. Скажите правильно ли я её дополнил. И еще дополнительный вопрос. Что можно использовать как источник постоянного питания на 5В? Из не дорогого и того, что можно купить в Казани. Знаю, что лучший вариант - лабораторный БП, но они дорогие.
  17. Здравствуйте! Сразу скажу что мои познания в схемотехнике стремятся к нулю, так что прошу отнестись с пониманием. Увлекся как то я всякими штуками на ардуино и это привело к тому, что я захотел сделать машинку на радиоуправлении. Почитал/посмотрел в интернете и составил свою схему (см. фото). Казалось бы что могло пойти не так, но при питании от 12в при вращении двигателя сервопривод начинает отклоняться на определенный угол. Ставил керамику на двигатель, заземлял корпус и ничего не помогло. Как то после попыток справить все способами из интернета сидел, размышлял и чисто по приколу поставил диод 1N4007 между выходом шим с МК и землей. Не знаю как оно работает, но дергаться сервопривод стал меньше и дергается теперь только под средней нагрузкой. На этом мои знания и идеи заканчиваются, прошу помощи разобраться в чем проблема. Немного о схеме. Мозг - AtMega328P, питается от стабилизатора L7805ABV (5В 1,5А), от него же питается серва. Передатчик NRF24L01+ запитан от LD1117AL-3,3, драйвер двигателя TB6612FNG. Двигатель пока что работает не от шим, а от 5в. Запускал без пульта программно на газ + поворот и глюки оставались, так что с передатчиком проблема не связана. Всем заранее спасибо.
  18. Все так же думаю о создании подобия отладочной платы для avr'ок, и надумал, чтобы на ней и МК бы прошивался по ISP, а после и общение наладить между компьютером и МК по UART'у. По отдельности проблем никаких нет, а вот совместить одно с другим - не уверен. Я не знаю, будет ли присутствие USBtoUART'а негативно влиять на программирование МК, или будет ли программатор влиять на МК во время передачи данных по UART. При этом, конечно, необходимо подключить все напрямую на постоянной основе и желательно (очень) по 1 USB порту. Могли бы вы подсказать как это возможно сделать, и возможно ли вообще?
  19. Всем привет! Начал разбираться с протоколом TWI(I2C) на авр, а именно atmega 8. Почитал статьи на изиэлектроник, написал обработку на прерываниях(подсматривая в пример), чтобы вникнуть. Начал тестить в протеус иии... Неизвестная бага не дает мне покоя. Старт производит, адрес слэйва передает(с битом на запись), адрес нужной ячейки передает, а уже при записи пишет ерунду, все время одно и то же, первый 0x00, второй 0xff, потом стоп(стоп запланирован) и какие бы байты я не писал в обработчике, передает 2 одинаковых 00 и ff... Ошибок не выдает, я поставил флаг на ошибки(1 на ноге), в нужное подпрерывание попадает ровно столько раз, сколько надо(тое ставил флаги туда), да и ставил флаги в другие обработчики прерываний(в которые не надо попадать в данном случае), но все норм. Я скину сюда часть кода, эквиваленты, озу нужные, макрос на отправку, и обработчики прерываний, которые используются для отправки байтов. Пишите, если нужна будет доп информация. Кстати, все прогнал по трассировщику в студии, просто сделал rcall на нужную последовательность обработчиков .equ F_CPU = 8000;частота процессора .equ i2c_sarp = 0b00000000 // Start-Addr_R-Read-Stop Это режим простого чтения. Например из слейва или из епрома с текущего адреса .equ i2c_sawp = 0b10000000 // Start-Addr_W-Write-Stop Это режим простой записи. .equ i2c_sawsawp = 0b10000001 // Start-Addr_W-WrPageAdr-Write-Stop Это режим с предварительной записью нужного адреса страницы в 1 байт а потом запись .equ i2c_saw2sawp = 0b10000011 // Start-Addr_WrPageAdrH-WrPageAdrL-Write-Stop Это режим с предварительной записью нужного адреса страницы в 2 байт а потом запись .equ i2c_sawsarp = 0b00000001 // Start-Addr_W-WrPageAdr-rStart-Addr_R-Read-Stop Это режим с предварительной записью нужного адреса страницы в 1 байт а потом чтение .equ i2c_saw2sarp = 0b00000011 .DSEG ;"******" - нужно вносить изменения в основном цикле!!!!!! I2C_SlaveAdres: .byte 1;регистр с адресом слэйва****************** I2C_busy: .byte 1; байт флага занятости шины и2с 1-занято! 0-свободно! I2C_ERR: .byte 1;байт для ошибок I2C_DO: .byte 1;задание, читать или записывать, 2 байта адрес или 1?********** I2C_LOW_ADRES: .byte 1;младший байт адреса ячейки для чтения/записи(если адрес однобайтовый, то младший единственный)******** I2C_HIGH_ADRES: .byte 1;старший байт адреса ячейки для чтения/записи*************** I2C_KOL_BYTE: .byte 1; сколько байт нужно прочесть или записать? писать количетсво!!!!*********** I2C_BUFER: .byte 5; байты, которые хотим пропихнуть************* I2c_ADRES_BUFER_IN: .byte 2;младший и старший байты адреса начала буфера данных для приема!*************** I2C_ADRES_BUFER_OUT: .byte 2;младший и старший байты адреса начала буфера данных для отправки!**************** I2C_INDEX_DATA: .byte 1;размер смещения,т.е. сколько байт уже отправлено, вначале отправки должен ранвться 0! TWSI:;перрывание i2c PUSHF;р16 и sreg в стэк PUSH R17;в стек PUSH R18 PUSH R0;в стек PUSH R30;в стек PUSH R31;в стек CLR R0;нужен 0 LDI ZH,HIGH(TWI_TABLE);заносим в индексную пару адрес таблицы причины прерывания и2с LDI ZL,LOW(TWI_TABLE);и младший байт UIN R16,TWSR;кода прерывания в р16 LSR R16;сдвиг влево LSR R16;еще LSR R16;и еще ADD ZL,R16;прибавляем значение к адресу таблицы ICALL;переходим на причину прерывания POP R31;достаем из стека z пару POP R30; POP R0;р0 из стека POP R18 POP R17;р17 из стека POPF;достаем р16 и sreg RETI;выход из прерывания TWI_TABLE:;таблица прерываний RJMP TWI_0x00;0x00 Bus Fail Автобус сломался… эээ в смысле аппаратная ошибка шины. Например, внезапный старт посреди передачи бита. RJMP TWI_0x08;0x08 Start Был сделан старт. Теперь мы решаем что делать дальше, например послать адрес ведомого RJMP TWI_0x10;0x10 ReStart Был обнаружен повторный старт. Можно переключиться с записи на чтение или наоборот. От логики зависит. RJMP TWI_0x18;0x18 SLA+W+ACK Мы отправили адрес с битом записи, а в ответ получили ACK от ведомого. Значит можно продолжать. RJMP TWI_0x20;0x20 SLA+W+NACK Мы отправили адрес с битом записи, а нас послали NACK. Обидно, сгенерим ошибку или повторим еще раз. RJMP TWI_0x28;0x28 Byte+ACK Мы послали байт и получили подтверждение, что ведомый его принял. Продолжаем. RJMP TWI_0x30;0x30 Byte+NACK Мы послали байт, но подтверждение не получили. Видимо ведомый уже сыт по горло нашими подачками или он захлебнулся в данных. ;Либо его ВНЕЗАПНО посреди передачи данных украли инопланетяне. RJMP TWI_0x38;0x38 Collision А у нас тут клановые разборки — пришел другой мастер, ;по хамски нас перебил, да так, что мы от возмущения аж заткнулись. Ничего I’l be back! До встречи через n тактов! RJMP TWI_0x40;0x40 SLA+R+ACK Послали адрес с битом на чтение, а ведомый отозвался. Хорошо! Будем читать. RJMP TWI_0x48;0x48 SLA+R+NACK Крикнули в шину «Эй ты, с адресом ХХХ, почитай нам сказки» А в ответ «Иди NACK!» ;В смысле на запрос адреса с битом чтения никто не откликнулся. Видимо не хотят или заняты. Также может быть никого нет дома. RJMP TWI_0x50;0x50 Receive Byte Мы приняли байт. И думаем что бы ответить ведомому. ACK или NACK. RJMP TWI_0x58;0x58 Receive Byte+NACK Мы приняли байт от ведомого и сказали ему «иди NACK!» И он обиженый ушел, освободив шину. TWI_0x10: ;повторный старт TWI_0x08:;произвели старт! LDS R16,I2C_SlaveAdres;адрес слэйва LDS R17,I2C_DO;что нужно, запись или чтение? CPI R17,0 BRNE TWI_0x10_WR ORI R16,1<<0 TWI_0x10_WR: OUT TWDR,R16;отправляем адрес слейва по шине и2с OUTI TWCR,0<<TWEA|0<<TWSTA|0<<TWSTO|1<<TWEN|1<<TWIE|1<<TWINT ;флаг преывания, блок тви и разрешаем прерывания ;TWINT флаг прерывания ;TWEA 1-ACK, 0-NACK ;TWSTA 1-start, 0-no start ;TWSTO 1-stop ;TWEN блок TWI включен ;TWIE - разрешаем прерывания TWI RET;выход из подпрерывания TWI_0x18:;подтверждение после посылки байта адреса и бита записи LDS R16,I2C_DO;загружаем тех задание в регистр SBRS R16,0;проверяем, нужно ли нам только записать байт? если да, то переход БЕЗ АДРЕСОВ! RJMP TWI_0x18_sawp;чтение тут невозможно! т.к. на чтении будет другое подпрерывание SBRC R16,0;проверяем, а не нужно ли нам послать адрес ячейки? в которую хотим писать RJMP TWI_0x18_sawsawp;если нужно , то переход. Адрес ячейки состоит из одного байта! соответственно младшего ;если ничего не подошло, значит нужно отправить адрес состоящий из двух байт ;передачу начинаем со старшего байта, затем просто в тех задании поправим на пересылку оставшегося младшего байта LDS R17,I2C_HIGH_ADRES;загружаем старший байт ANDI R16,~(1<<0);обнуляем первый бит тех задания, тем самым переводим его на отправку еще одного байта адреса(младшего) STS I2C_DO,R16 OUT TWDR,R17;загружаем старший байт адреса в тви RET;выход из подпрерывания TWI_0x18_sawsawp:;ЭТО КЛОООООН!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Запись только младшего байта адреса LDS R17,I2C_LOW_ADRES;загружаем младший байт адреса ячейки слейва DEC R16;первращаем sawsawp/sawsarp в просто в sawp или sarp!!!, т.е. загружаем в задание только запись! нужный байт адреса мы уже отослали! теперь только запись/чтение STS I2C_DO,R16 ;закидываем в задания OUT TWDR,R17;загружаем адрес ячейки в тви для записи OUTI TWCR,0<<TWEA|0<<TWSTA|0<<TWSTO|1<<TWEN|1<<TWIE|1<<TWINT; передача младшего байта адреса! RET;выход из подпрерывания TWI_0x18_sawp:;ЭТО КЛОООООН!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! запись самих байтов ;(сюда я вставлял счетчик, сколько раз здесь бывает процессор, и все сходится) LDS R16,I2C_KOL_BYTE;считываем, сколько байт нам нужно записать???? LDS R18,I2C_INDEX_DATA;счетчик, сколько байт скинули CP R16,R18; кончились байты то? BREQ TWI_0x18_STOP;если да, то переход и СТОП!!!! говорим слейву: хватит братан, но передаем последний байт) LDS ZL,I2C_ADRES_BUFER_OUT //младший байт адреса буфера данных озу, откуда брать байты на отправку LDS ZH,I2C_ADRES_BUFER_OUT+1 //старший байт адреса буфера данных озу, откуда брать байты на отправку ADD ZL,R18;прибавляем к адресу количество байт, которые отправили ADC ZH,R0 INC R18;увеличиваем счетчик на 1 STS I2C_INDEX_DATA,R18;отправляем в озу LD R17,Z;берем один из.. байтов по адресу индексной пары ;(сюда я вставлял строчку LDI R17,1 но отправляет в итоге не одни 1, а опять таки 00 и ff) OUT TWDR,R17;отправляем в регистр для передачи OUTI TWCR,0<<TWEA|0<<TWSTA|0<<TWSTO|1<<TWEN|1<<TWIE|1<<TWINT ;передача очередного байта данных! RET;выход из подпрерывания TWI_0x18_STOP:;СТОПЭ братан слейв,наелся ты байтов, отдохни ЭТО КЛОООН!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! STS I2C_busy,R0;освобождаем линию тви OUTI TWCR,1<<TWEA|0<<TWSTA|1<<TWSTO|1<<TWEN|1<<TWIE|1<<TWINT ;запись ОКОНЧЕНА! RET;выход из подпрерывания TWI_0x28: LDS R16,I2C_DO;и так, м ыздесь потому что: 1-отправили адрес и нужна запись байтов в ячейки ;2- отправили адрес и нужно чтение и 3 - отправили старший байт памяти, нужно отправить младший. CPI R16,i2c_sawp;нужна запись? BREQ TWI_0x18_sawp;переход SBRC R16,0;нужно записать оставшийся младший байт? RJMP TWI_0x18_sawsawp;переход! ;а иначе повторный старт!!!! OUTI TWCR,1<<TWEA|1<<TWSTA|0<<TWSTO|1<<TWEN|1<<TWIE|1<<TWINT ;повторный старт, т.к. чтение! RET;выходи из подпрерывания .MACRO I2C_OUT;НУЖНО ПРЕДВАРИТЕЛЬНО ЗАКИНУТЬ ОТПРАВЛЯЕМЫЕ ДАННЫЕ В И2С БУФЕР!!! ;0-адрес слейва, младший байт = 0!!! ; 1-запись или чтение? если с адресом, то сколькибитный? ;2-младший байт адреса регистра слэйва ;3-старший байт адреса регистра слейва(если не нужен, то 0) ;4-сколько байт нужно записать, прочитать? ;5-какая скорость передачи нужна? ;6-откуда брать байты? CLR R16 STS I2C_INDEX_DATA,R16 LDI R16,1 STS I2C_BUSY,R16 OuTI I2C_SlaveAdres,@0 //OUTI TWAR,@0;заружаем адрес слэйва LDI R16,@1;загружаем задание STS I2C_DO,R16 .if @3>0x00 LDI ZL,LOW(@2);адрес регистра слэйва для приема/передачи LDI ZH,HIGH(@3) STS I2C_LOW_ADRES,ZL STS I2C_HIGH_ADRES,ZH .else LDI ZL,LOW(@2) STS I2C_LOW_ADRES,ZL .endif LDI R16,@4;загружаем значение количества байт для приема/передачи STS I2C_KOL_BYTE,R16 OUTI TWSR,0<<TWPS1|0<<TWPS0;предделитель 1 LDI R16,((F_CPU/@5)-16)/2;расчетскорости приема/передачи данных UOUT TWBR,R16 LDI ZL,LOW(@6) LDI ZH,HIGH(@6) STS I2C_ADRES_BUFER_OUT,ZL STS I2C_ADRES_BUFER_OUT+1,ZH OUTI TWCR,1<<TWINT|1<<TWEA|1<<TWSTA|0<<TWSTO|1<<TWEN|1<<TWIE;запуск! отправляем старт! ;TWINT флаг прерывания ;TWEA 1-ACK, 0-NACK ;TWSTA 1-start, 0-no start ;TWSTO 1-stop ;TWEN блок TWI включен ;TWIE - разрешаем прерывания TWI .ENDM Тело: OUTI I2C_BUFER,1 OUTI I2C_BUFER+1,2 I2C_OUT 0xA2,i2c_sawsawp,0x03,0,2,200,I2C_BUFER - сюда больше не вернется Main: зацикливание Rjmp main П.С. вот что пишет i2c debuger в протеусе: S A2 A 03 A 00 A FF A P
  20. Помогите правильно подобрать элементы. Ниже я опишу своё понимание точно, что нужно для этой схемы, если там будут ошибки поправьте меня. Мне нужна: 1) Источник питания на 5В 2) Светодиод 3) Резистор. Сопротивление завит от рабочего напряжение светодиода, а рассеивающая мощность от тока от источника. 4) Кнопка 5) Земля? 6) 2 конденсатора на 2 нф 7) Кварцовый генератор на 4 МГц Вопросы у меня насчет питания: 1) Что использовать как источник питания 2) Как подключать? Вижу куда + подключать, а куда -? 3) Как питается контроллер 4) Почему если подать в PB.0 единицу, светодиод потухнет?
  21. Здравствуйте, только начал свой путь в программировании микроконтроллеров. Прошу советов в целом и ответов на вопросы в частности(они ниже). 1) Какие книги читать? По порядку от начального уровня и далее. Я сейчас читаю книгу Белова А. В. "Микроконтроллеры AVR. От азов программирования до создания практических устройств". 2) Какие программы использовать? В целом, не знаю какие вообще нужны программы для этого дела. Я сижу на Lunux, но могу и с вириальной машины запускать. 2.1) Можно ли для написания программы использовать C++? я немного знаю C, но сильно хуже чем C++. 3) Можно ли обойтись без покупки реальных схем и инструментов? Хотя бы по первой. Понятно дело, что если развиваться в этом направлении, то без этого не обойтись. Но есть ли такая программа в которой можно собрать схему, в ней в микроконтроллер загрузить программу и посмотреть как она работает?
  22. Здравствуйте, почитав ответы на предыдущий вопрос понял, что эффективнее всего будет изучать программирование МК купив себе этот самый МК. Но тогда возникает следующий вопрос: Что и где покупать ? Я неработающий студент, поэтому хотелось бы несильно дорого. Локация - Казань.
  23. Здравствуйте ! Я захотел поставить Bascom AVR на компьютер , но при установке возникли ошибки. Может у вас есть идея как помочь ?
  24. Как к схеме подключить батарею для питания схемы и usb разъём для зарядки батареи , а так же была возможность связи с пк через usb. И пожалуйста нарисуйте это на схеме что бы было видно как все подключено Схема
  25. Здравствуйте , я хотел прошить AVR программатором STK500 . Но оказалось , чтобы Bascom IDE прошивать им , необходим STK500.exe . Пожалуйста посмотрите , не лежит ли он где-нибудь у вас . Заранее спасибо
×
×
  • Create New...