24 сообщения в этой теме

GeloMik    0

 

Я новичок в программировании AVR контроллеров, хотя знаю +/- C++.

Проблема заключается в том, что я не могу написать прошивку к своему маленькому проекту. Используемый мною контроллер - ATTiny45. У него на борту имеется 1 АЦП с выходом на 4 ноги. Нужно, чтобы фактически одновременно брался замер с 3, 4 и 5 порта по АЦП, и при появлении на одном из них МК должен подать 5В на 1 или 2 порты. Источник АЦП AREF. 

Сюда прикреплю схему самого робота, если кого не затруднит помочь написать прошивку, буду очень благодарен :rolleyes:

Безымянный.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
KRAB    4 772

Учись САМ ... и не жди!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
GeloMik    0
Только что, KRAB сказал:

Учись САМ ... и не жди!

Да я бы рад узнавать новое, если бы время не поджимало. Эта тема выпала мне как задание. Дедлайн через 3 дня, поэтому прошу помощи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Dr. West    3 422

Если АЦП один, то это невозможно по определению. Читать все равно придется по очереди каждую ногу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
zeconir    116

@GeloMik Ну, во-первых я не вижу вашей прошивки, пусть и не совсем рабочей. А раз ее нет, то тема должна быть в разделе "Работа". Но черт с ним.

По тексту вопроса:

Вы сами же написали что

23 минуты назад, GeloMik сказал:

У него на борту имеется 1 АЦП с выходом на 4 ноги

А потом хотите

23 минуты назад, GeloMik сказал:

Нужно, чтобы фактически одновременно брался замер с 3, 4 и 5 порта по АЦП

Чукча в логику не мочь?

25 минут назад, GeloMik сказал:

Источник АЦП AREF

Не источник, а опорное напряжение. Подробно гугл знает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
GeloMik    0
1 минуту назад, Dr. West сказал:

Если АЦП один, то это невозможно по определению. Читать все равно придется по очереди каждую ногу.

Я в курсе, но мне нужно сделать так, чтобы delay между измерениями был маленьким.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Dr. West    3 422

Ну так сделай, насколько это возможно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
oldmao    1 474

Ну то есть почитать даташит и посчитать минимальный интервал между опросами АЦП при нужной тактовой частоте - в лом? Здесь очень не любят помогать ленивым студентам. Вот будут самостоятельные телодвижения (прикидочный вариант программы хотя бы), тогда и начнём помогать.

В микроконтроллерной технике одновременности не бывает, МК всё делает последовательно. Точно так же, как и одноядерный процессор в вашем домашнем компьютере. А иллюзия одновременности решения кучи задач - всего лишь из-за того, что они очень быстро переключаются. Тысячи (а бывает - и миллионы) раз в секунду, для человека это кажется одновременным.
Задача включения движка при наличии света прекрасно решается аналоговыми методами, причём одновременность там истинная. ИМХО использовать для подобных задач микроконтроллер - всё равно, что забивать гвозди микроскопом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
AlexLir    0
54 минуты назад, GeloMik сказал:

при появлении на одном из них

Что в данном случае является единицей? АЦП 10bit в результате после считывания будет 0 до 1023. А так считывайте один канал, сохраняйте его значение, потом второй, а затем третий и на основе их делайте вывод.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
KRAB    4 772
3 часа назад, GeloMik сказал:

если бы время не поджимало. Эта тема выпала мне как задание

значит ЕДИНСТВЕННЫЙ ПУТЬ РЕШЕНИЯ - раздел РАБОТА и платить баППло :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 404
4 часа назад, GeloMik сказал:

Нужно, чтобы фактически одновременно брался замер с 3, 4 и 5 порта по АЦП, и при появлении на одном из них

дружише хочется спросить у тебя с логическим мышлением все нормально? какой на...  "появлении 1" для АЦП ????

тебе задали реализовать элементарный шифратор три входа и два выхода на МК , накой ты сюда приплел АЦП???? шо ты им измерять собрался логический 0 или 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
KomSoft    369

А я добавлю, что диоды зенера параллельно моторам включены как-то странно - в прямом включении. Пробьет их вместе с транзисторами сразу после открытия оных. Туда ставят обычный диод и не так.

Изменено пользователем KomSoft
Описятки
  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    34
6 часов назад, GeloMik сказал:

брался замер с 3, 4 и 5 порта по АЦП

Почему надо чтобы брался по АЦП??? Это задание такое или ты сам придумал???

Гораздо проще просто прочитать значение с PINB и на основании значения 3-х битов делать что тебе нужно!

Как раз будет "одновременно"!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
KomSoft    369
57 minutes ago, ruhi said:

Почему надо чтобы брался по АЦП???

Нижний резистор 220 Ом. Фоторезистор обычно килоомы. Там до "1" не дотянет ну никак. Задача поставлена верно - брать с АЦП, а вот  ТС называет это единицей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 404
59 минут назад, KomSoft сказал:

Задача поставлена верно - брать с АЦП

ага, и вместо того чтобы тупо пересчитать делитель, следующей темой будет как/чем посмотреть значения АЦП :i-m_so_happy:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
KomSoft    369

Смотря на кого учится - на программиста или электроника

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 404

где-то я это уже видел... сначала дуринщик долго отправлял ацп на комп, щоб узнать шо он там насчитал и все это для зажечь светодиод при затемнении ФР

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
colorad    451

Одновременно значения можно измерять сделав устройство выборки хранения . 

Чтоб задержка была маленькая между измерениями,  надо тактовую частоту побольше,  а разрядность ацепирования поменьше .

Но здесь этого не надо . Энерция движения робота намного больше, чем энерция измерений при вменяемой тактовой частоте . 

Под 1 вероятно подразумевается некоторый уровень освещенности,  когда надо двигаться .

ТС вероятно учится на нанотехнолога и робототехника . 

Больше мыслей нет .

  • Лайк 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Dr. West    3 422

В схеме вообще куча ошибок. Самое основное - надо увеличить номиналы R5-R7 на два порядка, чтобы не вылавливать милливольты, а работать в полном диапазоне АЦП. (о чём уже писали выше).

Помимо диодов, ещё и С3 неправильно подключен. Если будет собираться рабочая модель, земли силовые и сигнальные полезно развести отдельно и указать это на схеме.

  • Одобряю 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    34
В 22.06.2018 в 16:15, KomSoft сказал:

Там до "1" не дотянет ну никак

Вот ведь, проблема, до единицы дотянуть ...

Все равно, насколько я вижу все схемотехнику обсуждают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Геннадий    1 016

Не 1 там нужна, а уровень максимальной освещенности, чтобы робот нашел источник света. Так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    34
30 минут назад, Геннадий сказал:

Не 1 там нужна, а уровень максимальной освещенности,

Вон оно как ...

Страшное дело :) !

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
KomSoft    369
1 hour ago, ruhi said:

все схемотехнику обсуждают.

Так название сайта и намекает больше на электронику, чем программирование. А если вылетят силовые транзисторы, то программа не поможет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    34
2 часа назад, KomSoft сказал:

А если вылетят силовые транзисторы, то программа не поможет.

У нас есть такие программы ...

Но мы вам о них не расскажем :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: forestdozor
      Здравствуйте!

      Мне нужно измерить длительность импульса. Для этого сначала применял внешнее прерывание, а теперь перешел на режим захвата таймера в Atmega 328.
      Однако сейчас происходит странное: Через определенное таймер просто останавливается. Гугл результатов не дает, ни у кого захват таймера 1 не останавливается.
      Подскажите пожалуйста, что делать?
      Среда разработки CodeVisionAVR v3.12. Сейчас попробовал версию 3.3, толку нет. Не работает. Код максимально упростил, но по прежнему толку ноль.
      Переполнение таймера 0 так же работает отлично, до тех пор, пока что-то не произойдет с прерыванием по захвату. Как только что-то произошло - мк останавливается...
      Может немножко подождать, и увеличить значение счетчика current_timp еще на пару значений... Совсем не знаю что делать.
       
       
      interrupt [TIM1_OVF] void timer1_ovf_isr(void)
      {
      TCNT1H = 0x00;
      TCNT1L = 0x00;
      }
      // Timer1 input capture interrupt service routine
      interrupt [TIM1_CAPT] void timer1_capt_isr(void)
      {
       
             TCNT1H = 0x00;
             TCNT1L = 0x00;           // Это уже уровень танцев с бубном "авось поможет" - не помогает.
         
              current_timp++;          // Все упрощено до максимума. Мне бы он хоть количество периодов для начала...
              
        //  }
      }
      // Прерывание по переполнению первого таймера
      interrupt [TIM0_OVF] void timer0_ovf_isr(void)
      {
      // Обнуление счетного регистра.
      TCNT0=0x00;

          
          counter ++;
          if (counter > 10)
          {
                  lcd_clear();
                  sprintf(buffer,"%d us", current_timp);
                  lcd_gotoxy(0,0);
                  lcd_puts(buffer);
                  counter = 0;
          }
          
          
      }

      // Главный цикл программы
      void main(void)
      {

      #pragma optsize-
      CLKPR=(1<<CLKPCE);
      CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
      #ifdef _OPTIMIZE_SIZE_
      #pragma optsize+
      #endif

      // Port B initialization
      // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
      DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
      // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
      PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
      // Port C initialization
      // Function: Bit6=In Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
      DDRC=(0<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0);
      // State: Bit6=T Bit5=1 Bit4=1 Bit3=1 Bit2=1 Bit1=1 Bit0=1
      PORTC=(0<<PORTC6) | (1<<PORTC5) | (1<<PORTC4) | (1<<PORTC3) | (1<<PORTC2) | (1<<PORTC1) | (1<<PORTC0);
      // Port D initialization
      // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
      DDRD=(1<<DDD7) | (1<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
      // State: Bit7=1 Bit6=1 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
      PORTD=(1<<PORTD7) | (1<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
      // Делители таймера 0 рассчитаны таким образом , что его тактовая частота = 15,625 КГц. Расчет был на применение в схеме семисегментников, но с LCD индикатором будет информативнее.
      TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
      TCCR0B=(0<<WGM02) | (1<<CS02) | (0<<CS01) | (1<<CS00);
      TCNT0=0x00;
      OCR0A=0x00;
      OCR0B=0x00;
       
      // Настройка таймера 1
      TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
      TCCR1B=(1<<ICNC1) | (1<<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;
      // Разрешение прерывания по переполнению таймера 0
      TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);
      // Timer/Counter 1 Interrupt(s) initialization
      TIMSK1=(1<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (1<<TOIE1);
    • Автор: voltex
      Всем привет! Подскажите, пожалуйста, как правильно считать данные с внешней eeprom по шине spi, в данном случае 25LC256.
      Написал код ссылаясь на даташит. Собрал схему в протеусе, подключил spi отладчик и вот что получил в итоге. Так же не могу проверить получается записать данные в память или нет. Весь код прикрепил.
       

      main.c
    • Автор: CUBE
      Не могу запустить асинхронный режим. 
      Ниже будет представлен код которым пытаюсь отладить. Там в 1 коде идёт работа от внутреннего источника таков (стоит 1МГц).  После 5 миганий таймер должен перейти в асинхронный режим и мигать с частотой в 1 Гц. У меня происходит 5 миганий потом ничего. Фьюзы менять пробовал, ничего не дало, сейчас дефолт. Корпус кварца к земле тянуть пробовал - безрезультатно. 
      Возможно что-то в подключении накосячил, если не видно на фото ниже, спрашиваете, нужно будет - нарисую схему. 
      Компилятор Atmel Studio 7
      Шью через Sind Prog 2.1.1 + USBasp 2.0
      Вот код: 
      .macro outi 
       ldi r16, @1 
       out @0, r16 
      .endm 
      .org $000 
      rjmp reset 
      .org $001 
      reti 
      .org $002 
      reti 
      .org $003 
      reti 
      .org $004 
      rjmp timer2_ovf 
      .org $005 
      reti 
      .org $006 
      reti 
      .org $007 
      reti 
      .org $008 
      reti 
      .org $009 
      reti 
      .org $00A 
      reti 
      .org $00B 
      reti 
      .org $00C 
      reti 
      .org $00D 
      reti 
      .org $00E 
      reti 
      .org $00F 
      reti 
      .org $011 
      reti 
      .org $012 
      reti 
      .ORG INT_VECTORS_SIZE 
       
      reset: 
      .equ portout=portd 
      .equ ddrout=ddrd 
      .def led=r17 
      .def mask=r18 
      .def counter=r19 
       outi spl,low(ramend) 
       outi sph,high(ramend) 
       
       outi ddrout, 0xff 
       
       outi tccr2, 0b00000111 
       outi timsk, 1«toie2 
       
        
       
        
       ldi led,1«5 
       ldi mask,1«5 
       sei 
      cycle: 
      cpi counter, 10 
      breq offtim 
       rjmp cycle 
       
      timer2_ovf: 
      inc counter 
       out portout, led 
       eor led, mask 
      reti 
        
      offtim: 
      outi timsk, 0«toie2 
      rjmp asinxron 
       
      asinxron: 
       outi assr, 0b00001000 
      back: 
       in r16, assr 
       cpi r16, 0b00001000 
       brne back 
       
        outi tccr2, 0b00000101 
        outi tcnt2, 0 
        outi ocr2, 0 
        outi timsk, 1«toie2 
       
       
      m1: 
      rjmp m1


      Верх меги на фото слева. 
    • Автор: TheCoolKuid
      Здравствуйте.
      Часто прошивал МК, в один из моментов по программе должна была выставляться единица на 5Б пин. После этого убрал эту функцию, но теперь при включении к питанию МК на любой прошивки пин уходит в ноль и МК не отвечает ни на UART, ни на I2C. Пин не уходит в ноль только на чистом кристалле. Даже если в новой прошивке и слома нет про включение этого пина, он в единице. Может ли это означать, что программная память посыпалась?
      Спасибо.
    • Автор: Alex_Chpook
      Здравствуйте. Делаю бегущую строку на AVR и драйверах max7219 по этой статье. Исходный код есть в конце статьи. 
      Хотел бы доработать устройство чтобы можно было передавать сообщение через Bluetooth модуль HC-05 при помощи Bluetooth terminal. Сам знаю как это можно сделать, т.к. все примеры находил только под Arduino. 
      Прошу помочь кто знает как это  можно реализовать 
  • Сообщения

    • Почему уменьшить-то!? Минимальное выходное напряжение получается при 312 кОмах, переменником уменьшаем сопротивление до 0 - получаем на выходе 230. Запаял параллельно два кондера, теперь лампочка загорается в самом конце положения переменника и опять же резко на 50 вольтах.
    • и не надоело мерить сопротивление нагрузочных резисторов http://www.sdc-semi.com/e/UploadFile/SDC606_EN.pdf 2 нога питания, что там плавает? а что должно быть - от 4,5 до 11  вольт... по второй ноге проверить все электролиты, диод, диод зенера.  5 нога FB 2.5V приходит? проверить TL431, обвязку, там резисторы тоже плывут, электролиты по +5VSB. проверять с выпаиванием, ... а лучше заменить нахрен... меняем микросхему... вдогонку ДГС может уже протух если грелся...
    • Можно и так, но в схеме, по идее, чтобы симистор открылся пораньше, их надо уменьшить ...   Я бы параллельно запаял два конденсатора и проверил. Этим конденсатором грубо подгоняем диапазон регулировки, а уже подстроечником, точно.
    • А если подстроечником увеличить общее сопротивление?
    • Мне кажется, надо поступить так: 1 Представителям управляющей компании посетить вашего соседа и составить акт о порче общедомового имущества. (Два экземпляра один ему, второй управляшке под запись, отказывается,- пригласите свидетелей или отправьте заказным письмом.) 2 Написать ему заказное письмо с просьбой восстановить все за свой счет как было по проекту в течении месяца. (Или любым способом который фиксирует факт получение претензии). 3 В случае невыполнения в указанный срок составить акт о не устранении. 4 Подать в суд с просьбой компенсировать расходы на адвоката и устранения недостатков (В смету по работам включить все: от уборщицы, до аренды оборудования и моральный ущерб). А также об обеспечении допуска работников управляющей компании в жилое помещение для проведения работ. 5 Выиграть суд и прийти с судебными приставами, которые выломают дверь (если он откажется) и позволят вам провести необходимые работы. Кстати, иногда помогает просто намекнуть что вы собираетесь делать...   Так на заметку:  
    • Поставил  конденсатор на 0,05 - эффект обратный! С кондером на 0,1 регулировалось от 65 до 230 (входное 235), с кондером 0,05 - от 150 до 230. Емкость кондера проверял, нагрузка - лампочка 80 ватт.