Обсуждаем контроллеры компании Atmel.
Ответить

(решено) Помогите адаптир. Arduino скетч для AtmelStudio7.0

Вс янв 26, 2020 11:43:38

Есть Arduino скетч PWM-DAC 10-bit/12-bit для Attiny85:
http://www.technoblogy.com/show?1NGL

Вроде все совместимо, кроме функций "pinMode(1, OUTPUT);" и "analogRead(A1);"(совместимо имеется ввиду, компилятор AS7.0 не ругается).
Что сделал для функции pinMode:
DDRB |= _BV(PB1);

Функцию analogRead просто удалил.

В чем суть проблемы:
Не работает DAC на attiny85 скомпилированный на Atmel Studio 7.0 в принципе (и эмуляции в Proteus) - он не дергает ногу PB1 при любом значении analogWrite10(value);.
На Attiny85 установлены фьюзы 8МГц внутр. без делителя.

Вот мой код:
Код:
/*
 * test_dac10bit.c
 *
 * Created: 25.01.2020 17:39:05
 * Author : Dima
 */

#include <avr/io.h>
#include <avr/interrupt.h>

// One 10-bit analogue output from an ATtiny85 ************************************

volatile int Dac = 0;
volatile int Cycle = 0;

// Overflow interrupt
ISR (TIMER1_OVF_vect) {
   static int remain;
   if (Cycle == 0) remain = Dac;
   if (remain >= 256) { OCR1A = 255; remain = remain - 256; }
   else { OCR1A = remain; remain = 0; }
   Cycle = (Cycle + 1) & 0x03;
}

void analogWrite10 (int value) {
   cli(); Dac = value; sei();
}

int main(void)
{
   // Timer/Counter1 doing PWM on OC1A (PB1)
   TCCR1 = 1<<PWM1A | 1<<COM1A0 | 1<<CS10;
   TIMSK |= _BV(TOIE1);
   DDRB |= _BV(PB1);
    /* Replace with your application code */
    while (1)
    {
      analogWrite10(511);
    }
}



Прошу помочь адаптировать 10-bit'ный DAC для AtTiny85 и для среды Atmel Studio 7.0.
Последний раз редактировалось Deoptim Вс янв 26, 2020 19:36:18, всего редактировалось 1 раз.

Re: Помогите адаптировать Arduino скетч для AtmelStudio7.0

Вс янв 26, 2020 12:05:11

У седьмой студии есть плагин для адуринок - ставьте и пробуйте работать.
Правда... похоже он есть ПЛАТНЫЙ...
8)

Re: Помогите адаптировать Arduino скетч для AtmelStudio7.0

Вс янв 26, 2020 12:31:11

BOB51, этот плагин использует исходники Arduino, а они в свою очередь - не оптимизированны под Attiny85.
Помимо жуткого размера, там еще записывается ненужный бутлодер.
Мне для проекта нужна именно Atmel Studio 7.0

Re: Помогите адаптировать Arduino скетч для AtmelStudio7.0

Вс янв 26, 2020 12:47:32

У ардуино IDE есть платформа "внешнего автора" DIY Attiny с множеством вариантов настроек.
Данная платформа включает в себя 8-лапки, в том числе и тини85.
Строчка для добавления в комплект
https://raw.githubusercontent.com/sleem ... index.json
(Добавляем в окошко "дополнительные ссылки для менеджера плат" и затем загружаем
"DIY ATtiny byJames Sleeman..." открыв сам менеджер)
Сама IDE генерирует два *.hex файла проекта - один с бутлоадером, другой без оного для возможности загрузки ЛЮБЫМ СТОРОННИМ ПРОГРАММАТОРОМ:
скетч -> экспорт бинарного файла,
размещаемый в той же папке, что и сам СКОТч
:wink:

Re: Помогите адаптировать Arduino скетч для AtmelStudio7.0

Вс янв 26, 2020 13:11:54

BOB51, Попробовал.
В Arduino этот скетч занимает 1Кбайт(HEX)
В Atmel Studio 7.0 (хоть он и не работает) 668Байт(HEX)
Грубо говоря размер в два раза больше.
Раньше компилировал подобное для Software UART - и сравнивал размеры Arduino и Atmega8 - тоже было в два раза больше.
Говорю же, Arduino не оптимизирован для размера прошивки ...

Добавлено after 1 minute 41 second:
Тем более у меня все библиотеки для Atmel Studio 7.0(не буду же я всё переделывать) - они оптимальны под размер, чтоб влезло.
Затык только на DAC 10-bit

Re: Помогите адаптировать Arduino скетч для AtmelStudio7.0

Вс янв 26, 2020 13:22:32

Если очень хочется "оптимизации" - пишем программы на ЧИСТОМ АССЕМБЛЕРЕ.
:wink:
Насчет "занимает меньше, но не работает" -
следовательно отсутствует часть "скрытых библиотек" функционала ардуино.
Посему и код поменьше.
Кстати... существует ряд приемов, устраняющих неиспользуемые в прикладном коде участки библиотек, которые "по умолчанию" являются обязательной частью СКОТча.
Частично где-то тут разбиралось:
https://radiokot.ru/forum/viewtopic.php?f=62&t=156720
8)
И в заключение:
Написание программ необходимо каждый раз выполнять В РАМКАХ КОНКРЕТНОГО КОМПИЛЯТОРА (IDE).
Попытки "приспособить" исходник, созданный для другого компилятора требуют детальных знаний устройства и "начинки" КАЖДОГО из используемых компиляторов и их составных частей, скрытых от простого пользователя.
Посему - или используем то, что предоставлено и соответствующий компилятор или переписываем исходник ЗАНОВО, под тот компилятор, которым владеем (хотя бы на среднем уровне).
Остальное - САДОМАЗОХИЗЬМА.
8)

Re: Помогите адаптировать Arduino скетч для AtmelStudio7.0

Вс янв 26, 2020 17:49:27

Вроде как прерывание таймера
Код:
ISR (TIMER1_OVF_vect)
произойдет когда TCNT1 досчитает до 0xFF,
а в данном режиме
Код:
TCCR1 = 1<<PWM1A | 1<<COM1A0 | 1<<CS10;
TCNT1 досчитывает только до значения в OCR1C,
а OCR1C у него 0 (нулю) равен, соответственно TCNT1 вообще не считает, он TCNT1 на 0 (нуле) стоит.
Условие прерывания не выполняется.

Re: Помогите адаптировать Arduino скетч для AtmelStudio7.0

Вс янв 26, 2020 18:58:23

Dimon456, не работает "функция" прерывания таймера "ISR (TIMER1_OVF_vect)" которая вызывается в while(1).
Если я вручную забиваю OCR1A=6;(например) до while(1) - то значение на пине меняется.

Что можно сделать?


P.S.
Добавил еще "OCR1C=255; //250KHz for PCK Table 12-3 in datasheet"

Все, сделал, достаточно просто добавить в main и в "ISR (TIMER1_OVF_vect)" - TCNT1=255; (таблица 12-3 из даташита)
Спасибо Dimon456
Ответить