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

GeloMik    0

 

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

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

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

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

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


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

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

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


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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


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

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

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


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

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

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

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


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

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

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

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


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

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

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

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


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

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

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

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

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


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

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

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

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


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

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

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

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

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

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


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

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

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

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


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

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

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

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


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

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

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


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

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

 

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


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

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

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

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

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

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

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

  • Лайк 1

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


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

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

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

  • Одобряю 2

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


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

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

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

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

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


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

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

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


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

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

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

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

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


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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

    • Автор: Alexey104
      Всем привет!
      Возникла следующая проблема:
       
      Есть две ардуины 'Mega2560'. По несчастливому стечению обстоятельств данные платы попали в руки одному чуваку, который, вернув их, заявил, что они перестали работать после того, как он "чисто ради интереса" поковырял на обеих некоторые фьюзы. Есть у меня такой китайский usbasp v2 программатор:
      Подключив данный девайс к ICSP-пинам первой платы, удалось без проблем восстановить на ней загрузчик через стандартную Arduino-IDE, после чего работоспособность платы полностью восстановилась. Но вот при попытке сделать то же самое со второй платой, получаю это:
      Такое же сообщение получаю при попытке зашить загрузчик в неподключенную к программатору ардуину, то есть программатор вообще не видит МК. Плата прекрасно работала до того, как вышеупомянутый товарищ покрутил настройки фьюзов.
       
      Что я пытался предпринять:
      Замыкал пины JP3 программатора, отвечающие за понижение скорости, подключал к ардуине 5V от внешнего источника при прошивке загрузчика, - не помогло.
       
      Поиском пользоваться умею, аналогичную тему тут находил, но там проблема была в том, что парень неверно подключал программатор к контроллеру. В моём же случае всё подключено верно, повторюсь, что загрузчик первой платы этим же программатором был восстановлен успешно.
      Буду рад любым советам касательно того, как восстановить работоспособность платы.
       
       
       
    • Автор: Ru_s
      Здравствуйте. Подскажите пожалуйста, возможно ли на attiny13 реализовать такую штуку. Мне в процессе работы программы нужно поменять режим работы таймера/счетчика с fast PWM на обычный счёт, отсчитать длительный промежуток времени и опять вернутся в режим ШИМ. Т.е. я подаю на ногу сигнал ШИМ и когда он в максимальном значении, я его отключаю, и тупо подаю на ногу высокий лог. уровень. В это время Т/С по идее свободен, и мне надо посчитать время работы выхода на максимальном лог. уровне, при достижении какого-то значения времени нужно перевести т/с обратно в ШИМ. Возможно ли это? И как приблизительно это реализовать
    • Автор: ShimkoMax
      Здравствуйте. Требуется вывести данные температуры и влажности на экран. С LCD дисплеем разобрался, осталось разобраться с SHT21. Постоянно выводит 0 на дисплей:
      Main.c:
      #define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdio.h> #include <stdlib.h> #include "globals.h" #include "LCD_lib.h" #include "twi.h" // I2C #include "sht21.h" int main(void) { I2C_Init(); _delay_ms(100); LCD_init(); char buffer[20]; roomAdrInit(); SHT21_reset(); while(1) { SHT21_reset(); LCD_sendString(itoa((int)get_temperature(), buffer, 10), 4, 0, 0); _delay_ms(1000); } } twi.c:
      #include <avr/io.h> #include "twi.h" void I2C_Init(void) { TWSR = 0; TWBR = 0x20; TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); } void I2C_StartCondition(void) { TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while(!(TWCR & (1<<TWINT))); } void I2C_StopCondition(void) { TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN); } void I2C_SendByte(uint8_t data) { TWDR = data; TWCR = (1<<TWINT) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); } unsigned char I2C_ReadByteAck(void) { TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA); while(!(TWCR & (1<<TWINT))); return TWDR; } unsigned char I2C_ReadByteNak(void) { TWCR = (1<<TWINT) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); return TWDR; } sht21.c:
      #define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #include <stdio.h> #include "twi.h" #include "sht21.h" void SHT21_reset() { unsigned char reg[1]; reg[0]=SHT21_reset_cmd; I2C_StartCondition(); I2C_SendByte(SHT21_i2c_write); I2C_SendByte(*reg); I2C_StopCondition(); _delay_ms(100); } uint16_t checksum(unsigned char data[],uint8_t byte, uint8_t check) { uint8_t crc=0; uint8_t bytectr,bit; for (bytectr=0; bytectr<byte;bytectr++) { crc^=(data[bytectr]); for (bit=8;bit>0;bit--) { if(crc&0x80) { crc=(crc<<1)^polynomial; } else { crc=crc<<1; } } } if (crc!=check) { return 0; } else { return data; } } void write_user_register() { unsigned char reg[3]; reg[0]=user_register_write; reg[1]=0x44; I2C_StartCondition(); I2C_SendByte(SHT21_i2c_write); I2C_SendByte(*reg); I2C_StopCondition(); } uint16_t read_value(uint8_t reg) { char data[4],crc; uint16_t result; data[0]=reg; I2C_StartCondition(); I2C_SendByte(SHT21_i2c_write); I2C_SendByte(reg); I2C_StartCondition(); I2C_SendByte(SHT21_i2c_read); data[1] = I2C_ReadByteAck(); data[2] = I2C_ReadByteAck(); crc=I2C_ReadByteNak(); I2C_StopCondition(); result=(data[1]<<8) | data[2]; checksum(result,4,crc); result &= 0xFFFC; return result; } float get_humidity() { //char buffer2[4]; uint16_t hum_value = read_value(humidity_hold_mode); return -6 + 125.0 / 65536.0 * hum_value; //dtostrf(rh,5,2,buffer2); _delay_ms(100); } float get_temperature() { //char buffer1[4]; uint16_t temp_value = read_value(temperature_hold_mode); return -46.85 + 175.72 / 65536.0 * temp_value; //dtostrf(tc,5,2,buffer1); _delay_ms(100); }  
    • Автор: Stratix
      Здравствуйте, у меня проблема с прошивкой разных устройств из-за программаторов. Дело в том что у меня есть некоторое количество китайских и самодельных программаторов для разных производителей, с ними постоянно какие-то проблемы, некоторые отказываются нормально работать на windows 10(другие версии ПО не устраивают), другие не работают с последними версиями сред разработки и т.д. Так же нужно прошивать схемы памяти. Хочу прошивать устройства без постоянной сборки программаторов и неудобств. Думаю о двух вариантах: взять оригинальные программаторы для всех производителей: altera, xlinx, arm, pic, avr(некоторые найти сложно, например оригинальный usb-blaster и высокая стоимость в сумме), второй вариант: взять универсальный программатор, который бы поддерживал все новые микросхемы, а вот с этим проблема, большинство универсальных программаторов не шьют stm, плис. Есть ли вообще реально универсальные программаторы? Мне было бы намного удобнее если на столе б лежал один программатор, а не куча. Смотрел список микросхем chipprog-48, пока что самый большой, к сожалению не поддерживает новые fpga, например: cyclone IV. Связывался, сказали что поддержки не будет и в будущем. Стоит ли взять chipprog-48 в 2018 году или есть программаторы лучше, с большим списком микросхем?
    • Автор: DimonRX
      Всем доброго времени суток!
      В AVR-ках я новичёк и очень нуждаюсь в вашей помощи.
      Задача у меня следующая. Есть драйвер управления серводвигателем на ATmega88. Помимо основной задачи ATmega88 через 74HC164D выводит на сдвоенный 7-ми сегментный индикатор направление вращения мотора в виде анимации (вращает сегмент по или против часовой стрелки). Рядом есть некая поделка на ATmega8, одной из задач которой является определение направления вращения мотора и, в зависимости от направления, выполнение различных действий. Как мне это сделать? Как подружить две меги? Всем заранее спасибо.