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

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт янв 28, 2021 09:06:09

Код:
***
ftoa(adc, 2 ,buffer);  //ftoa(float n,unsigned char decimals,char *str);     
puts(buffer);                     //puts(char *str);
puts(", ");
itoa(PERIOD_ON,buffer);   //void itoa(int n,char *str);
puts(buffer);
puts("\n");

Спасибо большое :beer: Не из лени своей, писать на форуме начал, реально инфы ноль по этому делу.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт янв 28, 2021 10:52:37

neid, очевидно же: putchar('\n'); putchar('\r');

P.S. Хотя и можно и puts обойтись, да

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт янв 28, 2021 11:08:53

Вообще кстати puts() ведь должна сама в конце символ новой строки печатать. У neid либо она не из stdlib.h берется (реализация функции), либо в терминале настроен newline на CR+LF возможно.

Система событий в новых мк от Microchip

Чт янв 28, 2021 11:39:15

Пытаюсь настроить систему событий Attiny1607, чтобы по срабатыванию таймера запускалось чтение АЦП.
Настраиваю вот так:
Код:
    EVSYS.SYNCCH0    = 0x02; //TCA0_OVF_LUNF
    EVSYS.SYNCUSER0 =    0x01;   //ADC0

 Инициализация ADC:
    // Частота ADC: 208,333 kHz =20 000KHz/6 /16
    //  Опорное напряжение ADC: AVCC pin
    ADC0.CTRLA = 0x00; //Full 10-bit resolution. The 10-bit ADC results are accumulated or stored ADC.RES
    ADC0.CTRLB = 0x00;
    ADC0.CTRLC = 0x13;//CLK_PER divided by 16, Опорное напряжение ADC: AVCC pin
    ADC0.MUXPOS = 0x08; //начальный режим чтения с ножки (PB5-AIN8)
    ADC0.INTCTRL = ADC_RESRDY_bm;//Result Ready Interrupt Enable
    ADC0.EVCTRL = 1;  //разрешить запуск по событию
    ADC0.CTRLA   = ADC_ENABLE_bm;//включить АЦП
    ADC0.COMMAND = 0x01;//Start Conversion
    while ( (ADC0.INTFLAGS & 1)==0 );// подождём конца первого преобразования (флага прерывания ацп)

    asm("sei"::);   // Разрешить глобальное прерывание
    ADC0.INTFLAGS |=1;

Таймер работает, а прерывание АЦП ISR (ADC0_RESRDY_vect) не срабатывает.
Помогите пожалуйста настроить регулярную работу АЦП.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт янв 28, 2021 12:22:55

Lilia, а если не запускать преобразование при настройке АЦП? Т.е. вот это всё убрать:
Код:
    ADC0.COMMAND = 0x01;//Start Conversion
    while ( (ADC0.INTFLAGS & 1)==0 );// подождём конца первого преобразования (флага прерывания ацп)

    asm("sei"::);   // Разрешить глобальное прерывание
    ADC0.INTFLAGS |=1;

И оставить только sei(); (причем лучше так из #include <avr/cpufunc.h>, без asm()).

Если не поможет, попробуйте в студии из Atmel Start'а сгенерить код и посмотреть что там оно нагенерит. Вообще в мануале пишут что надо асинхронный канал настроить на использование синхронного. Честно с системой событий новых AVR я сам пока не разбирался. Но если бы случился затык, полез бы смотреть код из генератора.
• Configure TCA with the desired frequency and period
• Select TCA overflow event as an event source for synchronous event channel 0
• Configure asynchronous user channel 1 (ADC0) to use synchronous event channel 0 as event
input
• Configure the ADC0 for an ADC conversion triggered by an event

Отсюда: http://ww1.microchip.com/downloads/en/A ... 02400A.pdf

Добавлено after 36 seconds:
PS: START доступен прям тут нынче, можно и не из студии: https://start.atmel.com/#project

Добавлено after 25 minutes 59 seconds:
Lilia, ага, покопался в START'е - ADC0 использует ASYNCUSER0, а у вас SYNCUSER. Вот как старт нагенерил:
Код:
   EVSYS.ASYNCUSER1 = EVSYS_ASYNCUSER1_SYNCCH0_gc; /* Synchronous Event Channel 0 */
   EVSYS.SYNCCH0 = EVSYS_SYNCCH0_TCA0_OVF_LUNF_gc; /* Timer/Counter A0 overflow */

...
ISR(ADC0_RESRDY_vect)
{
   // Clear the interrupt flag
   ADC0.INTFLAGS |= ADC_RESRDY_bm;
}

Ну и плюс про очищения флага я напоминаю. А в остальном как у вас. Просто user channel не тот выбран по-идее.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт янв 28, 2021 12:28:07

neid, очевидно же: putchar('\n'); putchar('\r');
P.S. Хотя и можно и puts обойтись, да

Честно я залез в help, и только перевел описание для библиотеки <stdlib.h> вчера, а до этой библиотеки <stdio.h> долез сегодня после вашего сообщения, и увидел что вы имеете ввиду - void putchar(char c);. Вообще я только постигаю все это дело и многие мои тупые первые ошибки гуглю или ищу на форумах более менее правильно объяснение... и может мне первым делом надо было понять для чего эти библиотеки, и как они работают. Но нам же уже надо в УАРТ данные слать))))

NStorm писал(а):Вообще кстати puts() ведь должна сама в конце символ новой строки печатать. У neid либо она не из stdlib.h берется (реализация функции), либо в терминале настроен newline на CR+LF возможно.

Из нее самой stdlib.h , подключена еще alcd.h. Я пока не в железе, а в Протусе, не увидел там таких настроек терминала.

Мужики в любом случаем спасибо, ошибки свои понял что я не так делал!)

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт янв 28, 2021 12:31:18

Пытаюсь настроить систему событий Attiny1607, чтобы по срабатыванию таймера запускалось чтение АЦП.

ТаймерА вообще тикает? Если тикает, то доходит ли счёт до момента OVF?

У меня от внешней ноги всё срабатывает:

Код:
#define EVSYS_SYNCCH_ZERO   EVSYS_SYNCCH0_PORTC_PIN1_gc


inline void EventSystem_Init(void)
{
    EVSYS.SYNCCH0 = EVSYS_SYNCCH_ZERO;
   
    //////

    EVSYS.ASYNCUSER1 = EVSYS_SYNCUSER0_SYNCCH0_gc;      // Call event for ADC0   
}


Я код пишу используя макроопределения из заголовочников Atmel/Microchip, чтобы лишний раз в даташит не заглядывать.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт янв 28, 2021 13:11:39

NStorm, parovoZZ,
Заработало! спасибо!

Асинхронный канал для АЦП я пробовала.
А вот заработало, когда EVSYS.ASYNCUSER0 на EVSYS.ASYNCUSER1 поменяла. Может поделитесь почему 1 должен быть? :dont_know:


Я код пишу используя макроопределения из заголовочников Atmel/Microchip, чтобы лишний раз в даташит не заглядывать.

Это дело хорошее. Но у меня глупый вопрос, как эти макроопределения быстро находить?(у меня Atmel studio)

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт янв 28, 2021 13:46:52

Но у меня глупый вопрос, как эти макроопределения быстро находить?(у меня Atmel studio)

Так студия же и подсказывает.
Из записи
Код:
EVSYS.SYNCUSER0 =    0x01;

сразу не ясно, на какой канал подписывается получатель SYNCUSER0. А вот так сразу понятно:
EVSYS.ASYNCUSER1 = EVSYS_SYNCUSER0_SYNCCH0_gc;

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт янв 28, 2021 13:49:05

А вот заработало, когда EVSYS.ASYNCUSER0 на EVSYS.ASYNCUSER1 поменяла. Может поделитесь почему 1 должен быть? :dont_know:

USER канал в EVSYS - это "получатель" сообщения. Конкретно именно ADC0 находится в ASYNCUSER1. Это написано в таблице 14.5.5:
Изображение
Т.е. при n=1, выбираем "целью" события ADC0. Значит писать надо в EVSYS.ASYNCUSER1. Чуть ниже небольшая таблица, которая показывает 4 варианта что можно туда записать - это тот канал, с которого будем принимать сообщения.
"Отправитель", это там где просто канал, без USER. Т.к. у нас отправитель TCA0_OVF_LUNF - он находится в SYNCCH0 (табл. 14.5.4), поэтому и пишем сюда 0x1. Тем самым говоря, что отправитель был задан в канале SYNCCH0.

Вы же получателем выбрали сам таймер обратно, записав в EVSYS.SYNCUSER0 = 1 (табл. 14.5.6). А если писали в EVSYS.ASYNCUSER0 - то отправляли событие в таймер Б (TCB), соотв. по таблице 14.5.5.
Вложения
evsys.png
(45.21 KiB) Скачиваний: 789
Последний раз редактировалось NStorm Чт янв 28, 2021 14:42:35, всего редактировалось 1 раз.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт янв 28, 2021 14:36:31

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

Это не отправитель, а выбор канала, по которому будут приходить события. А вот к уже выбранному каналу необходимо привязать отправителя. Каких отправителей на какой канал можно повесить - надо смотреть даташит.
Асинхронный канал предназначен для асинхронных событий (фронты этих событий не синхронизируются с тактовой частотой МК) от внешних ног, от асинхронных таймеров.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт янв 28, 2021 14:43:46

Да, немного напутал. Перефразировал, чтобы правильнее звучало.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт янв 28, 2021 15:04:26

NStorm, вот теперь действительно все понято. Спасибо огромное!
Как же с ними все по-хитрому...

Добавлено after 12 minutes 11 seconds:
parovoZZ, тоже спасибо за помощь.

Еще про Atmel studio.
(Тут можно глупые вопросы задавать?)

У меня сама студия только названия регистров подсказывает. Может это где-то настраивается?

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт янв 28, 2021 15:09:51

Lilia, вообще по-умолчанию должно быть. Попробуйте обновить студию и Pack поддержки семейства МК (не помню где, но где-то отдельно там в опциях они есть). Студия сейчас кстати Microchip Studio стала называться.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт мар 18, 2021 17:52:21

Товарищи,

У меня новый вопрос. Пытаюсь настроить внешнее прерывание в том же attiny1607. В регистре INTFLAGS по внешнему событию в порта А меняется бит, но прертывание не происходит. Прерывание таймера и АЦП удалось настроить. Не понимаю в чем может быть дело.

Код:
   PORTA_PIN2CTRL=0x01; //Sense  both edges
   SREG = 0xD0; //Global Interrupt Enable   

ISR (PORTA_PORT_vect)
{
}

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт мар 18, 2021 21:12:07

Странная запись... У меня это выглядит вот так:

Код:
PORTB.PIN2CTRL = PORT_ISC_RISING_gc


У меня сейчас студии нет под рукой, поэтому более сказать не могу.
Глобальные прерывания включаются так (это нагляднее)
Код:
sei();


Добавлено after 2 hours 41 minute 36 seconds:
У меня сама студия только названия регистров подсказывает. Может это где-то настраивается?


Должно быть так:

Изображение
Вложения
help.png
(15.29 KiB) Скачиваний: 592

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт мар 18, 2021 23:11:30

Должно быть так:

Изображение

Не так, а PORT_ISC_BOTHEDGES_gc, если хотят по обоим фронтам. Что в общем-то и было написано, хоть и виде "бяки" - магического числа 0x01.

Добавлено after 12 minutes 2 seconds:
Хотя да, я бы SREG = 0xD0; //Global Interrupt Enable на
Код:
#include <avr/interrupt.h>
...
sei();

заменил был

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт мар 19, 2021 09:20:38

Не так,

Я отвечал на этот вопрос и показал как у меня
У меня сама студия только названия регистров подсказывает. Может это где-то настраивается?



А до этого
PORT_ISC_BOTHEDGES_gc

автор вопроса сама способна дойти. Девушка весьма смышлёная.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт мар 19, 2021 10:16:49

Приветствую. Я с новыми мк AVR не работал. Посмотрел бегло даташит на упомянутый камушек. Что могу сказать. Интересненько. От классических авр есть во многом серьёзные отличия. Хотел бы поинтересоваться насчёт впечатлений об этих камушках. Что скажете? Плюсы, минусы.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт мар 19, 2021 11:19:14

Demiurg, там много из xmega перекочевало. Камни классные, себе взял attiny1614 на поиграться, но пока только соб-но и "игрался" с ними только. Преимуществ масса. Просто на порядок более развитая периферия, которая местами даже лучше stm32 (ничего против stm32 не имею, местами там лучше, просто факты что местами у 0-series/1-series AVRок есть круче вещи). Недостатки - сходства с классическими AVR очень мало, осваивать почти заново всё надо. Программатор нужен UPDI, это легко решаемо в принципе, полно вариантов уже из чего их собрать. Что USBAsp есть мод., из CH340 переходника можно сделать и т.д. Я покупал оригинальный Snap! за $15 - работает в родных IDE + есть отладка железная (не проверял правда пока). Как-то так.
ЗЫ. Помимо тинек у них подобные штуки еще в линейке мег появились: https://www.microchip.com/wwwproducts/en/AVR128DA64
Ответить