ArduinoIDE и ATmega16, корректируем ядро

Клапауций
Offline
Зарегистрирован: 10.02.2013

kisoft пишет:
Может быть легко из-за частоты кварца, потому что разный ассемблерный код. Ничего, мне интересно покопаться в USB.

тогда получается, что файлеги *16mhz.hex готовых прошивок, которые выложили разработчики нерабочие.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Не всё софт, железо разное может быть

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Нашел кварц на 12МГц, взял твою прошивку, всё равно глушняк. Явно проблема подключения (провода), потому что ответа от платы нет. USBView показывает, что в ответ получен дескриптор 0 длины, т.е. не получен, хорошо хоть определяет, что это устройство Low speed. USB3.0, USB2.0 разъемы - пофигу. Провод менял, тоже пофигу. Блиин, забыл баллоны попинать и стекло протереть, щас! :)

 

Клапауций
Offline
Зарегистрирован: 10.02.2013

kisoft пишет:

Нашел кварц на 12МГц, взял твою прошивку, всё равно глушняк. Явно проблема подключения (провода), потому что ответа от платы нет. USBView показывает, что в ответ получен дескриптор 0 длины, т.е. не получен, хорошо хоть определяет, что это устройство Low speed. USB3.0, USB2.0 разъемы - пофигу. Провод менял, тоже пофигу. Блиин, забыл баллоны попинать и стекло протереть, щас! :)

брось мне USBView - я свои поудалял, никогда ими не пользовался

хорошо, а почему у меня работает на двух нетбуках ASUS и одном древнем шаинтехе с PIII-500(храню ради LPT-порта)?

Клапауций
Offline
Зарегистрирован: 10.02.2013

воткни в USB-хаб простой с поддержкой USB1.1 - что будет?

стабилитроны у тебя правильно запаяны? питание 5 вольт... не знаю - начиная с IgorPlugUSB подобное юзаю и никаких нареканий.

 

Клапауций
Offline
Зарегистрирован: 10.02.2013

нашёл USBView

Device Descriptor:
bcdUSB:             0x0110
bDeviceClass:         0xFF
bDeviceSubClass:      0x00
bDeviceProtocol:      0x00
bMaxPacketSize0:      0x08 (8)
idVendor:           0x16C0
idProduct:          0x05DC
bcdDevice:          0x0102
iManufacturer:        0x01
0x0409: "www.fischl.de"
iProduct:             0x02
0x0409: "USBasp"
iSerialNumber:        0x00
bNumConfigurations:   0x01

ConnectionStatus: DeviceConnected
Current Config Value: 0x00
Device Bus Speed:     Low
Device Address:       0x01
Open Pipes:              0

Configuration Descriptor:
wTotalLength:       0x0012
bNumInterfaces:       0x01
bConfigurationValue:  0x01
iConfiguration:       0x00
bmAttributes:         0x80 (Bus Powered )
MaxPower:             0x32 (100 Ma)

Interface Descriptor:
bInterfaceNumber:     0x00
bAlternateSetting:    0x00
bNumEndpoints:        0x00
bInterfaceClass:      0x00
bInterfaceSubClass:   0x00
bInterfaceProtocol:   0x00
iInterface:           0x00

при чём тут провод? замени, если тебе не нравится... на что?, если 

#define USB_CFG_DPLUS_BIT       2

в оригинальном паке с http://www.obdev.at/products/vusb/usbasploader.html указан и я его не менял.

 
kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Мамка у меня не старая, скорее более или менее новая ASRock Extreme4. Про 1.1 USB там нет ни слова (только 2.0 и 3.0), но такие устройства (1.1), судя по всему есть и работают, так что дело не в этом. Других компов под рукой нет, потому проверить на другой мамке не могу.
Провод - я про USB кабель.
Стабилитронов у меня нет, потому поставить нечего, вполне возможно проблема в этом.
Видимо придется ЛА подключить, хотя что я там увижу, пока что понятия не имею.

Сейчас подключено так:
PD2 (16) - D+, там же подтяжка на +5В
PD3 (17) - GND (чтобы не маяться, пусть всегда в загрузчик выходит
PD6 (20) - D-
В исходниках написано про подтяжку к +3.5В. Потому есть подозрение, что в этом и проблема.
Подключаю кабель в USB2.0 разъемы, хотя и в 3.0 тоже самое.

Клапауций
Offline
Зарегистрирован: 10.02.2013

kisoft пишет:

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

ясно - подключи к USB-хабу версии 1.1 или запитай халабуду от 3.3 вольт.

Клапауций
Offline
Зарегистрирован: 10.02.2013

вот схема с чего начиналось - не уверен, что будет писать, но хоть запустится. два диода снизят напряжение питания до 3.3

http://www.obdev.at/products/vusb/index.html

Клапауций
Offline
Зарегистрирован: 10.02.2013

ещё

>PD3 (17) - GND (чтобы не маяться, пусть всегда в загрузчик выходит

не "всегда", а после ручного ресета кнопкой - перепроверил, чего-то мне не приходило так запускать загрузчик.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Убрал BYPASS на пинборде, стало лучше, 4.00В питание и всё завелось в полпинка. Поставил драйвер LIBUSB, теперь без ошибок.

Вот она какая, лажа, буду знать. Лично мне непонятно, почему выдавая в разъем +5В, имея дифференциальную передачу на D+, D-, нужно ограничиваться эти сигналы на уровне 3.5В. Самое главное, нигде про 3.5В не наталкивался, хотя перерыл гору информации.

ПС У меня нет магаза под рукой, чтобы что то купить нужно ехать в Москву, а это часов пять времени туда-сюда.

Что ты там хотел посмотреть в примерах, конкретно?

UPD: про кнопку. Я это высмотрел в исходниках. Потому просто сейчас висит на земле, потому и сразу заходит в загрузчик, нафиг мне нужен софт в ATmega16, кроме как программатор.

Клапауций
Offline
Зарегистрирован: 10.02.2013

сигналка USB фурычит на логике 3,3 вольта, а мы ей логические сигналы 5 вольт шлём, поэтому костыль со стабилитронами - старые USB это проглатывали, а новые тестируют устройство и отрубают.

если стабилитроны трудно достать, то нарой у себя или знакомых старый медленный USB-хаб(в смысле "тройник") - он примет без стабилитронов.

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

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

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ок, лучше найти стабилитроны, попробую порыться в ненужных железках. Мышка валяется, там какие то есть.
Хочу попробовать скомпилировать сам, думаю всё будет пахать как надо, плюс на 16МГц кварца попробую.
Уфф, надо полученные знания в голове уложить ;)

Клапауций
Offline
Зарегистрирован: 10.02.2013

kisoft пишет:
Ок, лучше найти стабилитроны, попробую порыться в ненужных железках. Мышка валяется, там какие то есть. Хочу попробовать скомпилировать сам, думаю всё будет пахать как надо, плюс на 16МГц кварца попробую. Уфф, надо полученные знания в голове уложить ;)

Ну, я выше давал список изменений - проверь: make - должен побайтно файлег совпасть, затем делай, что хочешь - там можно светодиоды подрубить или подтяжку программную... хотя - зачем?

я сам сидел, думал, что можно - оставил минималистично.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

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

С этим я разберусь, мне стабилитроны надо добыть из хлама ))) По 6 диодов, многовато, хотя, может и найду столько. Светики, опять же есть, думаю здесь их вполне хватит, токи небольшие

Клапауций
Offline
Зарегистрирован: 10.02.2013

kisoft пишет:

С этим я разберусь, мне стабилитроны надо добыть из хлама ))) По 6 диодов, многовато, хотя, может и найду столько. Светики, опять же есть, думаю здесь их вполне хватит, токи небольшие

подожди - почему по шесть диодов?

два - последовательно в линию питания +5V USB

стабилитроны не найдёшь - проще найти USB-хаб.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Не хочу недопитание использовать, лучше ограничить D-, D+.
Смысл в том, что мне не нужен такой программатор, у меня с этим и пинбоард справится.
Меня больше интересует программаторы, которые можно сделать, прошив Загрузчик в стандартную плату.
Да и в любом случае, использование USB на пинбоарде это может пригодиться, независимо от питания

Клапауций
Offline
Зарегистрирован: 10.02.2013

kisoft пишет:
Не хочу недопитание использовать, лучше ограничить D-, D+.  

Тогда по три - 1,2*3=3,6

kisoft пишет:
Смысл в том, что мне не нужен такой программатор, у меня с этим и пинбоард справится. Меня больше интересует программаторы, которые можно сделать, прошив Загрузчик в стандартную плату. Да и в любом случае, использование USB на пинбоарде это может пригодиться, независимо от питания

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

Единственно, что не может - фьюзы МК перешить, т.к. сам на борту обитает.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Это я уже понял, сам себе программатор. Особого интереса у меня к нему нет. Но поиграться было полезно. К тому же теперь я знаю как доработать ПБ, чтобы использовать лишний USB разъем для атмеги16 (стм32 и так будет нормально), такая информация очень полезна. Так что спасибо!

 

Клапауций
Offline
Зарегистрирован: 10.02.2013

мне нравится - не понимаю нахрена все производители дуино железные usb->сом-порты в свои платы пихают?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

А мне наоборот железный USB больше нравится. Да и стандартного загрузчика хватало до сих пор. Так что, от необходимости всё, кому то нужно одно, кому то - другое. К тому же производитель заинтересован продавать программаторы, наверняка, потому и нет универсального решения.

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Чтобы поставить некую точку, резюмирую:

USBaspLoader. Загрузчик для AVR МК. Адаптируем под АТмегу16А.
 
16 МГц - завелось нормально, что и требовалось доказать. Кстати, для 16МГц код намного меньше, чем для 12 МГц.
 
Версия исходников - крайняя, скачивал с репозитория github.
 
Компилятор WinAVR-20100110 или toolchain от ArduinoIDE 1.0.5, разницы никакой, работают оба варианта.
 
До кучи, залил Blink, работает нормально.
 
Поигрался с BUTTON. Если на земле, то заходит в загрузчик, если нет, то сразу в приложение. Но, у меня добавлены следующие defines: -DCONFIG_NO__BOOTLOADER_CAN_EXIT -DCONFIG_NO__HAVE_SPMINTEREFACE,
CONFIG_NO__BOOTLOADER_CAN_EXIT - это как раз невозможность выхода из загрузчика (нужно отжать кнопку и ребутнуть, тогда и только тогда выходит)
 
В общем кому нужна быстрая загрузка на выносных камнях (на стандартных платах могут быть проблемы с уровнем), можно рекомендовать этот загрузчик, хотя некий гемор может присутствовать в виде ограничения D+ и D- стабилитронами при питании +5В, на 3.3В всё должно пахать как надо.
 
На всякий случай, моё железо:
 
Pinboard2 rev.2 (PB2),
ATmega16A (из набора PB2),
6 проводов, мама-мама (4 на прошивку загрузчика, 2 на соединение D+, D- с ATmega16A)
USB кабель
ОС: Windows7 x64
 
На PB2 был выключен BYPASS (питание от USB), в этом случае питание на ATmega16A идет около 4В, либо нужно ограничить сигнал на входах D+ и D- до 3.6В установив стабилитроны (тогда, возможно и на +5В будет работать нормально. У меня нет стабилитронов, потому проверить пока не могу).
 
Всем доброй охоты!
 
PS Наверное надо бы было это всё в другую тему вылить, а то в куче всё.
 
UPD2: Клапауций, спасибо за идею и помощь.
 
Клапауций
Offline
Зарегистрирован: 10.02.2013

kisoft пишет:
Чтобы поставить некую точку, резюмирую:

Кагбы резюме-резюме...

USBaspLoader успешно портируется на ATmega16

подробная инструкция тут #40 и тут #49 , всё что после и между читать в контексте "что произойдёт, если я неправильно подключу устройство?"

*проблемы с питанием отсутствуют.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ну вот, благодаря раскопкам, теперь на ATmega16 завелся еще и AVRDoper в виде STK500 (у них с USBaspLoader одинаковая часть на USB, только режимы разные), который видит ATmel Studio 6.1 на Windows7 x64. Правда пока только входная часть, осталось попробовать реальный камень на выход подключить и проверить, как оно работает. ISP & HVSP.

А если поставить драйвер от AVRDoper, то будет собственно AVRDoper работать (но уже через USB, а STK500 через Virtual COM port работает).

 

Клапауций
Offline
Зарегистрирован: 10.02.2013

kisoft пишет:

А если поставить драйвер от AVRDoper, то будет собственно AVRDoper работать (но уже через USB, а STK500 через Virtual COM port работает).

При установке драйверов AVRDoper прикидывается COM-портом, висящим на USB, но... на W7x32 не желает работать - драйвера нужно искать. на XP - работает.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Странно, на 7 x64 работает. На 32 не смогу проверить, это виртуалку надо ставить. Впрочем, у меня должна быть ссылка с инструкцией по установке драйверов. Выложу чуть позже.

UPD:

Ну вот, всё получилось замечательно, правда пришлось инвертировать пару сигналов. Зато AVRDoper завелся в виде STK500, прочитал в Atmel Stduio прошивку и фьюзы Arduino ProMini (5V, 328P). Теперь осталось всё это сделать нормальным программатором, а также проверить режим HVSP.

А здесь я брал инструкцию по установке драйверов на семерку 64, там есть и 32, может поможет:

http://yourdevice.net/forum/viewtopic.php?p=6&sid=dcac0300f549ab01d9d3ab02dadeac72#p6

 

radiofannat
radiofannat аватар
Offline
Зарегистрирован: 11.09.2013

очень позновательно! у меня вопрос, либы Ethernet и LiquidCrystal будут работать? может кто пробовал? собственно, хочу сделать лан тестер http://habrahabr.ru/post/190632/ но более продвинутый, ethernet shield на w5100 + пинг и DHCP клиентом, 16 atmega как раз подходит по дип корпусу и количеству пинов, что посоветуете?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Спасибо!

LiquidCrystal работает нормально, проверено на LCD из комплекта PinBoardII rev.2.
Есть фикс на нестандартную для Arduino частоту 12МГц, если вдруг Вы будете использовать другой нестандартный кварц, можно будет пофиксить и это.

По поводу Ethernet, к сожалению, ничего подсказать не могу, поскольку шилдов у меня таких нет. Я мельком исходники Ethernet библиотеки посмотрел, вроде бы проблем быть не должно, но гарантировать не могу.

 

radiofannat
radiofannat аватар
Offline
Зарегистрирован: 11.09.2013

там ещё есть либа ICMP, надо пробовать! спасибо)

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Сегодня дошли руки проверить другие частоты PWM для начала на таймере 1. Мы знаем, что частота PWM равна примерно 490 Гц. 

Внимание! При использовании функции tone на таймере 1, частота PWM изменится, поскольку он перепрограммируется. Поэтому при использовании такого метода нельзя использовать функцию tone.

Собственно код, который нужно вставить в функцию setup() и использовать PWM на пинах 4 и 5 с другой частотой PWM.

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

#define PWM_2 1

// PWM_0 - 1
#if defined(PWM_0)
  // 31,373 KHz
  TCCR1B = _BV(CS10);

// PWM_1 - 8
#elif defined(PWM_1)
  // 3,922 KHz
  TCCR1B = _BV(CS11);

// PWM_2 - 64
#elif defined(PWM_2)
  // 490,238 Hz
  TCCR1B = _BV(CS11) | _BV(CS10);

// PWM_3 - 256
#elif defined(PWM_3)
  // 122,560 Hz
  TCCR1B = _BV(CS12);

// PWM_4 - 1024
#elif defined(PWM_4)
  // 30,640 Hz
  TCCR1B = _BV(CS12) | _BV(CS10);
#endif

Здесь строка:

#define PWM_2 1

определяет какой делитель будет использоваться. Соответственно:

#define PWM_0 1 - будет включать предделитель = 1 (~31,3 KHz)

#define PWM_1 1 - будет включать предделитель = 8 (~3,9 KHz)

#define PWM_2 1 - будет включать предделитель = 64 (это штатный вариант, ~490 Hz)

#define PWM_3 1 - будет включать предделитель = 256 (~122,5 Hz)

#define PWM_4 1 - будет включать предделитель = 1024 (~30,6 Hz)

Разумеется нужно оставить только одну строку с #define PWM_x 1.
 

 

triada13
Offline
Зарегистрирован: 04.01.2013

kisoft, большое спасибо.

Клапауций
Offline
Зарегистрирован: 10.02.2013

kisoft, посмотри на досуге, что нужно для М16 прописать для реализации замера питающего напряжения.

http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Я уже где то использовал ADMUX и т.п. поскребу по сумеркам :)
UPD: по сусекам :) t9 блин

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Теоретически оказалось всё просто, но я еще не проверил, код такой, изменения выделил.

Смысл в том, что в 16-ой опорное 1.22В, а у других 1.1В. Но предупреждаю сразу - я не проверял, чуть позже проверю.

long readVcc()
{
  // Read 1.1V reference against AVcc (1.22 for ATmega16)
  // set the reference to Vcc and the measurement to the internal 1.1V reference
  #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined (__AVR_ATmega16__)
    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
    ADMUX = _BV(MUX5) | _BV(MUX0);
  #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
    ADMUX = _BV(MUX3) | _BV(MUX2);
  #else
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #endif  

  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Start conversion
  while (bit_is_set(ADCSRA,ADSC)); // measuring

  uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
  uint8_t high = ADCH; // unlocks both

  long result = (high<<8) | low;

  #if !defined(__AVR_ATmega16__)
  result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
  #else
  result = 1248060L / result; // Calculate Vcc (in mV); 1248060 = 1.22 *1023*1000
  #endif
  return result; // Vcc in millivolts
}

 

Клапауций
Offline
Зарегистрирован: 10.02.2013

спасибо - проверю сегодня.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Я проверил, расследование показало:

И совсем не 1.22В, а от 1.15 до 1.4 (среднее 1.23). Подставив число 1258290L вместо 1248060L я получил более точное значение (3907мВ при питании 3970мВ, но тестер у меня китайский, может врать, я не проверял). При 1248060L показывает 3875мВ.

Думаю, что данное число нужно скорректировать для конкретного камня и, возможно, используемого питания.

Удачной проверки :)

А лучше всего сделать типа

#define VAL (1.23*1023*1000)

чтобы было наглядно видно. И потом проверить на разных напряжениях питания.

PS: Щас попробовал, при питании 4,85-4,86 выдает4766мВ.

Вот для умозаключений табличка для числа 1258290L:

Vcc readVCC
   
3,97 3907
4,85 4766

UPD: Кстати, подумалось, а почему бы не измерять внешнее смещение от точного стабилитрона, типа TL431, об этом же и в комментариях к статье пишут. Этот же прием используется в измерителе полупроводниковых приборов. Я себе для подобных целей взял LM4040AIM3-2.5/NOPB TI (2.5В, точность +-0.1%), но пока не пробовал. Хотя я этот вопрос не вентилировал, возможно и этот вариант со своими тараканами.

 

Клапауций
Offline
Зарегистрирован: 10.02.2013

опередил меня

в общем, аналогично - номинальное 1.23 по документации, поставил 1.24.

и, вот это delay(2); // Wait for Vref to settle кажется лишним.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

На счет delay не скажу в wiring установка и запуск в разных местах, надо ДШ смотреть, но ты это и сам знаешь. Имхо вопрос философский, неужели так критично по времени замер vcc?

Клапауций
Offline
Зарегистрирован: 10.02.2013

kisoft пишет:
Имхо вопрос философский, неужели так критично по времени замер vcc?

я проверил без - разницы не заметил, но - вывожу инфу на LCD, а в библиотеке LiquidCrystal тоже задержки присутсвуют, может они как-то компенсируют... иначе - обложимся этими задержками, не будем знать, откуда ноги тупняков ростут.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Я посмотрел в ядре (wiring_analog.c, analogRead):

#if defined(ADMUX)
	ADMUX = (analog_reference << 6) | (pin & 0x07);
#endif

	// without a delay, we seem to read from the wrong channel
	//delay(1);

#if defined(ADCSRA) && defined(ADCL)
	// start the conversion
	sbi(ADCSRA, ADSC);

	// ADSC is cleared when the conversion finishes
	while (bit_is_set(ADCSRA, ADSC));

Задержка закомментарена.

В ДШ ничего на эту тему нет, есть только для других режимов АЦП.

Не думаю, что у тебя между установкой ADMUX & ADCSRA вставлен вывод на LCD. В общем на твой страх и риск, я думаю. Если не так важно и прога не использует аналоговые пины (не использует analogRead совсем!), то это не важно, потому что переключений мультиплексора входов АЦП не будет. Но если добавить постоянное чтение разных входов через analogRead, может и оглоблей накатить по затылку в ненужный момент.

 

Клапауций
Offline
Зарегистрирован: 10.02.2013

kisoft пишет:

Не думаю, что у тебя между установкой ADMUX & ADCSRA вставлен вывод на LCD.

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

kisoft пишет:

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

тогда оставлю delay(1); вместо 2-х

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Жадный ты :)
Зато я вчера увидел, что в атмеге16 термометра нет, а в 32u4 есть

Клапауций
Offline
Зарегистрирован: 10.02.2013

kisoft пишет:
Жадный ты :) Зато я вчера увидел, что в атмеге16 термометра нет, а в 32u4 есть

а, я не увидел - пытался запустить, а оно мне 39 градусов показывает.

а, где смотрел, что видно тебе было?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Так на мониторе видел!

Вроде нормально 39 градусов, во всяком случае для камня - вполне. Это ж не на улице

 

Kлапаyций 99.99
Offline
Зарегистрирован: 11.10.2014

народ, гляньте на строки 136, 137 - так правильно?.. а, то мне как-то не по феншую кажется

136                         #endif
137                         #endif
/*
  wiring_analog.c - analog input and output
  Part of Arduino - http://www.arduino.cc/

  Copyright (c) 2005-2006 David A. Mellis

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General
  Public License along with this library; if not, write to the
  Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  Boston, MA  02111-1307  USA

  Modified 28 September 2010 by Mark Sproul

  $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $
*/

#include "wiring_private.h"
#include "pins_arduino.h"

uint8_t analog_reference = DEFAULT;

void analogReference(uint8_t mode)
{
        // can't actually set the register here because the default setting
        // will connect AVCC and the AREF pin, which would cause a short if
        // there's something connected to AREF.
        analog_reference = mode;
}

int analogRead(uint8_t pin)
{
        uint8_t low, high;

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
        if (pin >= 54) pin -= 54; // allow for channel or pin numbers
#elif defined(__AVR_ATmega32U4__)
        if (pin >= 18) pin -= 18; // allow for channel or pin numbers
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega16__)
        if (pin >= 24) pin -= 24; // allow for channel or pin numbers
#elif defined(analogPinToChannel) && (defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__))
        pin = analogPinToChannel(pin);
#else
        if (pin >= 14) pin -= 14; // allow for channel or pin numbers
#endif
        
#if defined(__AVR_ATmega32U4__)
        pin = analogPinToChannel(pin);
        ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
#elif defined(ADCSRB) && defined(MUX5)
        // the MUX5 bit of ADCSRB selects whether we're reading from channels
        // 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high).
        ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
#endif
  
        // set the analog reference (high two bits of ADMUX) and select the
        // channel (low 4 bits).  this also sets ADLAR (left-adjust result)
        // to 0 (the default).
#if defined(ADMUX)
        ADMUX = (analog_reference << 6) | (pin & 0x07);
#endif

        // without a delay, we seem to read from the wrong channel
        //delay(1);

#if defined(ADCSRA) && defined(ADCL)
        // start the conversion
        sbi(ADCSRA, ADSC);

        // ADSC is cleared when the conversion finishes
        while (bit_is_set(ADCSRA, ADSC));

        // we have to read ADCL first; doing so locks both ADCL
        // and ADCH until ADCH is read.  reading ADCL second would
        // cause the results of each conversion to be discarded,
        // as ADCL and ADCH would be locked when it completed.
        low  = ADCL;
        high = ADCH;
#else
        // we dont have an ADC, return 0
        low  = 0;
        high = 0;
#endif

        // combine the two bytes
        return (high << 8) | low;
}

// Right now, PWM output only works on the pins with
// hardware support.  These are defined in the appropriate
// pins_*.c file.  For the rest of the pins, we default
// to digital output.
void analogWrite(uint8_t pin, int val)
{
        // We need to make sure the PWM output is enabled for those pins
        // that support it, as we turn it off when digitally reading or
        // writing with them.  Also, make sure the pin is in output mode
        // for consistenty with Wiring, which doesn't require a pinMode
        // call for the analog output pins.
        pinMode(pin, OUTPUT);
        if (val == 0)
        {
                digitalWrite(pin, LOW);
        }
        else if (val == 255)
        {
                digitalWrite(pin, HIGH);
        }
        else
        {
                switch(digitalPinToTimer(pin))
                {
                        #if  defined(__AVR_ATmega16__)
                        case TIMER0A:
                                // connect pwm to pin on timer 0
                                sbi(TCCR0, COM01);
                                OCR0 = val; // set pwm duty
                                break;
                        #else
                        // XXX fix needed for atmega8
                        #if defined(TCCR0) && defined(COM00) && !defined(__AVR_ATmega8__)
                        case TIMER0A:
                                // connect pwm to pin on timer 0
                                sbi(TCCR0, COM00);
                                OCR0 = val; // set pwm duty
                                break;
                        #endif
                        #endif

                        #if defined(TCCR0A) && defined(COM0A1)
                        case TIMER0A:
                                // connect pwm to pin on timer 0, channel A
                                sbi(TCCR0A, COM0A1);
                                OCR0A = val; // set pwm duty
                                break;
                        #endif

                        #if defined(TCCR0A) && defined(COM0B1)
                        case TIMER0B:
                                // connect pwm to pin on timer 0, channel B
                                sbi(TCCR0A, COM0B1);
                                OCR0B = val; // set pwm duty
                                break;
                        #endif

                        #if defined(TCCR1A) && defined(COM1A1)
                        case TIMER1A:
                                // connect pwm to pin on timer 1, channel A
                                sbi(TCCR1A, COM1A1);
                                OCR1A = val; // set pwm duty
                                break;
                        #endif

                        #if defined(TCCR1A) && defined(COM1B1)
                        case TIMER1B:
                                // connect pwm to pin on timer 1, channel B
                                sbi(TCCR1A, COM1B1);
                                OCR1B = val; // set pwm duty
                                break;
                        #endif

                        #if defined(TCCR2) && defined(COM21)
                        case TIMER2:
                                // connect pwm to pin on timer 2
                                sbi(TCCR2, COM21);
                                OCR2 = val; // set pwm duty
                                break;
                        #endif

                        #if defined(TCCR2A) && defined(COM2A1)
                        case TIMER2A:
                                // connect pwm to pin on timer 2, channel A
                                sbi(TCCR2A, COM2A1);
                                OCR2A = val; // set pwm duty
                                break;
                        #endif

                        #if defined(TCCR2A) && defined(COM2B1)
                        case TIMER2B:
                                // connect pwm to pin on timer 2, channel B
                                sbi(TCCR2A, COM2B1);
                                OCR2B = val; // set pwm duty
                                break;
                        #endif

                        #if defined(TCCR3A) && defined(COM3A1)
                        case TIMER3A:
                                // connect pwm to pin on timer 3, channel A
                                sbi(TCCR3A, COM3A1);
                                OCR3A = val; // set pwm duty
                                break;
                        #endif

                        #if defined(TCCR3A) && defined(COM3B1)
                        case TIMER3B:
                                // connect pwm to pin on timer 3, channel B
                                sbi(TCCR3A, COM3B1);
                                OCR3B = val; // set pwm duty
                                break;
                        #endif

                        #if defined(TCCR3A) && defined(COM3C1)
                        case TIMER3C:
                                // connect pwm to pin on timer 3, channel C
                                sbi(TCCR3A, COM3C1);
                                OCR3C = val; // set pwm duty
                                break;
                        #endif

                        #if defined(TCCR4A)
                        case TIMER4A:
                                //connect pwm to pin on timer 4, channel A
                                sbi(TCCR4A, COM4A1);
                                #if defined(COM4A0)             // only used on 32U4
                                cbi(TCCR4A, COM4A0);
                                #endif
                                OCR4A = val;    // set pwm duty
                                break;
                        #endif
                        
                        #if defined(TCCR4A) && defined(COM4B1)
                        case TIMER4B:
                                // connect pwm to pin on timer 4, channel B
                                sbi(TCCR4A, COM4B1);
                                OCR4B = val; // set pwm duty
                                break;
                        #endif

                        #if defined(TCCR4A) && defined(COM4C1)
                        case TIMER4C:
                                // connect pwm to pin on timer 4, channel C
                                sbi(TCCR4A, COM4C1);
                                OCR4C = val; // set pwm duty
                                break;
                        #endif
                                
                        #if defined(TCCR4C) && defined(COM4D1)
                        case TIMER4D:                           
                                // connect pwm to pin on timer 4, channel D
                                sbi(TCCR4C, COM4D1);
                                #if defined(COM4D0)             // only used on 32U4
                                cbi(TCCR4C, COM4D0);
                                #endif
                                OCR4D = val;    // set pwm duty
                                break;
                        #endif

                                                        
                        #if defined(TCCR5A) && defined(COM5A1)
                        case TIMER5A:
                                // connect pwm to pin on timer 5, channel A
                                sbi(TCCR5A, COM5A1);
                                OCR5A = val; // set pwm duty
                                break;
                        #endif

                        #if defined(TCCR5A) && defined(COM5B1)
                        case TIMER5B:
                                // connect pwm to pin on timer 5, channel B
                                sbi(TCCR5A, COM5B1);
                                OCR5B = val; // set pwm duty
                                break;
                        #endif

                        #if defined(TCCR5A) && defined(COM5C1)
                        case TIMER5C:
                                // connect pwm to pin on timer 5, channel C
                                sbi(TCCR5A, COM5C1);
                                OCR5C = val; // set pwm duty
                                break;
                        #endif

                        case NOT_ON_TIMER:
                        default:
                                if (val < 128) {
                                        digitalWrite(pin, LOW);
                                } else {
                                        digitalWrite(pin, HIGH);
                                }
                }
        }
}

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Да вроде как верно: 

135 это к 129 - й

136 к 121 - й

Kлапаyций 99.99
Offline
Зарегистрирован: 11.10.2014

hugoboss317 пишет:

Да вроде как верно: 

135 это к 129 - й

136 к 121 - й

ага, спасибо.

*привет, hugoboss317, как там арабы поживают?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Просьба не забивать тему. Пожалуйста. Про endif правильно ответили. Hugo, вырос, так держать!
;) Без подколок, честно.
Я и так уже здесь почти не появляюсь, читать срач нет времени, ушёл в stm32, да cubietruck мучаю. Если интересно, лучше в отдельной теме.
Однако, свой Леонардо время от времени юзаю, что бы побырому что нибудь проверить.
openhab мучаю или он меня. Пока свободно, можно посмотреть здесь http://kisoft.ru:8081/openhab.app?sitemap=home данные реальные. Пока что открыто, потому что это только монитор, без управления. Другой вариант http://kisoft.ru:8081/greent
Если интересно, расскажу в другой теме.
Надеюсь на понимание. Спасибо

art100
Offline
Зарегистрирован: 09.03.2014

kisoft пишет:
... openhab ...greent...
конечно движки всякие нужны движки всякие важны

Это в КубическихТракторах такая встроенная вебхрень? или в arduino leonardo веб влезла?

мне актуальенько вайфайные esp8266 приползут надо будет затылок чесать :)

все стало кажется понятно 

разработано на java

странички вроде живенько шлет

На КубическомТракторе что-то еще можно делать с ОткрытымКоммутатором?

боюсь если яву в дуе не засунуть ардуинами тут пахнуть не будет

ну вот и  пофлудили

по теме совестимости ОперационныхСистем

4 дня долбался

думал всякие дребезги повторы пролезают на веселеньком питании от USB-OTG Android Nexus 7

осцилоскоп показывает напруги чуток ниже 5в но импулсы от енкодера четкие однозначнопонимаемые

ардуинологически тоже четко одна команда декодирована и послана

На Windows7 крутит медиагромкость по чуть чуть на Android KitKat 4.4.4 енкодер делает один импульс а громкость без остановки ползет или в максимум или в минимум

прикольненько так

отпускание кнопки оказалось андроиды сами не делают

им об этом надо сказать конкретно

стоять сволоч я кнопку видишь уууужеееее выыытяяяягииивааааююююю

вот прикол

короче дарю код Win/Lin только что отладил

//Encoder- только громкость------------------------------------------------------------------------------------------------------------------------------------------
void EncoderDecoder(){
//  currentTime = millis();//запомнили время
//  if(currentTime>=(loopTime+0.5)){//если прошло 5мс=200Гц на Windows7 нет повторов на Android KitKat4.4.4 боремся с повторами ОС попытка притормозить
    varEncoderA=digitalRead(PINENCODERA);    
    varEncoderB=digitalRead(PINENCODERB);    
    if((!varEncoderA)&&(varEncoderA_prev)){// ловим ассинхронность изменения 
      if(!varEncoderB){ 
        r2.code=HID_VOLUP;   HID_SendReport(3,&r2,sizeof(struct cr));//press 
        r2.code=   0x0000;   HID_SendReport(3,&r2,sizeof(struct cr));//release for android kitkat4.4.4       Serial.println(r2.code,HEX);//Serial.println("HID_VOLUP");//test  
      } 
      else            { 
        r2.code=HID_VOLDOWN; HID_SendReport(3,&r2,sizeof(struct cr));//press 
        r2.code=   0x0000;   HID_SendReport(3,&r2,sizeof(struct cr));//release for android kitkat4.4.4       Serial.println(r2.code,HEX);//Serial.println("HID_VOLDOWN");//test 
      } 
    }  
    varEncoderA_prev = varEncoderA;     // сохраняем значение А для следующего цикла
//    loopTime = currentTime;//запомнили время
//  }
}
//Encoder----------------------------------------------------------------------------------------------------------------------------------------------------------------

эх боюсь атмегой8...168 тут обделаться или не отделатся :)

думаю ветка ATmega16 без перспективы

актуальный код засунуть становится труднее и труднее без трудозатраных ухищрений

Верной дорогой идем к Синклеру 64килобайта + магнитофон + мамин телевизор по новой цене.

 

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Сервер сейчас на Synology DS414 (это NAS такой). В дальнейшем, скорей всего перелезет на cubietruck, там видно будет.
Так что ардуино тут и не пахнет ;)
Датчики на 1-wire, метеостанция готовая - netatmo.