Перейти к содержанию

Вопросы от начинающих по МК


Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

38 минут назад, Alex сказал:

@Hell , Вы видите разницу, где запускать таймер - в обработчике прерывания или вне его ?
 

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

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Привет! Мне потребовалось написать насложную программу по управлению реле. Решил в данном проекте попытаться слесть с Arduino и написать код на C. Для реализации проекта мне нуцжно написать подобие фукции millis(). Стал изучать как это можно сделать и понят что сначало надо поморгать лампочкой используя таймер :)

Вот с этим то и возникла проблема!

1) Я целы вечер на это убил НО найти не смог. Как в atmel studio7 сделать форматирование кода!!!!???

2) Код работать не хочет. 

#define F_CPU 8000000
#include <avr/io.h>
#include <avr/interrupt.h>

#define Led (1<<PB3)

int i = 0;

ISR (TIMER1_COMPA_vect)
{
	if (i == 0)
	{
		i = 1;
	}
	else
	{
		i = 0;
	}
}

int main(void)
{
	TCCR1 |= (1 << CS12); //делитель 256
	TCCR1 |= (1 << CTC1); //сброс по совпадению
	OCR1A = 0b00010010; //число для сравнения

	TIMSK |= (1 << OCIE1A); //прерывание по совпадению
	DDRB = 0; //все ноги МК на вход
	DDRB |= Led; //пин светодиода на выход
	sei(); //разрешить прерывание
	while (1)
	{
		if (i == 0)
		{
			PORTB |= Led; //включить светодиод
		}
		else
		{
			PORTB &= ~Led; //выключить светодиод
		}
	}
}

Я пока плохо понимаю как настраивается таймер. Особенно сложно дается выбора делителя и подсчет частоты..... МК у меня Attiny85. Но пока симуляцию кода провожу в студии. 

Непонятка по таймерам. В даташите говорится что у Attiny85 2 таймера и оба по 8 бит. А вот в студии указано что один 16 бит а второй 8 бит... 

IO.PNG.af272ea271172d094790f0362aae7496.PNG

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

15 часов назад, LEVV2006 сказал:

Как в atmel studio7 сделать форматирование кода!!!!???

Что Вы имеете в виду под "форматированием кода" ? Форматированием занимается программист, а не IDE.
 

15 часов назад, LEVV2006 сказал:

Код работать не хочет.

Это как ? Может плохо заставляете ? 
 

15 часов назад, LEVV2006 сказал:

В даташите говорится что у Attiny85 2 таймера и оба по 8 бит. А вот в студии указано что один 16 бит а второй 8 бит...

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

49 минут назад, LEVV2006 сказал:

Capture.JPG.bbf32bd612d8ff3f70dafcae58308c48.JPG

Тут, как бэ, какие вопросы, таковы и ответы.
 

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

3 минуты назад, Alex сказал:

1) Что Вы имеете в виду под "форматированием кода" ? Форматированием занимается программист, а не IDE.

2) Это как ? Может плохо заставляете ? 

3) Верьте исключительно документации от производителя.

4) Тут, как бэ, какие вопросы, таковы и ответы.
 

1) Под форматированием я подразумеваю его выравнивание относительно фигурных скобок. А то получается строчки кода идут одна под другой и код становится не читабельным. 

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

3) Тогда прошу пояснить почему а Студии одно а в описание к микросхеме другое? Или где я что не понимаю.

4) Вопросы были. А вот ответ ставит вопросы об адекватности. Ну де ладно. 

В интернете многое что написано о таймерах. Но все примеры для atmega8 и старше. С Attiny85 немного другие настройки.... Вот я и засомневался.

Кроме того вчера после написания сообщения на форум решил ещё поковыряться с кодом. Заметил что в симуляции пин все таки переключается только по какому то странному принципу. И когда я выполняю код построчно то почему то указатель не переходит в код с прерыванием. Это странно.

timer.JPG

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

Вообще это глупость: мигать светодиодом путем опроса в главном цикле флага, выставляемого в прерывании. Почему бы сразу в прерывании им не мигать? оставляя за скобками инициализацию таймера, как-то так:

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

#define Led (1<<PB3)

int i = 0;

ISR (TIMER1_COMPA_vect){
	PORTB ^= Led;
}

int main(void)
{
	TCCR1 |= (1 << CS12); //делитель 256
	TCCR1 |= (1 << CTC1); //сброс по совпадению
	OCR1A = 0b00010010; //число для сравнения

	TIMSK |= (1 << OCIE1A); //прерывание по совпадению
	DDRB = 0; //все ноги МК на вход
	DDRB |= Led; //пин светодиода на выход
	sei(); //разрешить прерывание
	while (1){
	}
}

 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Я так с начало и делал. И ваш код правильней! Но! В симуляторе при отработке кода построчно не удается отследить работу программы. Как только строка попадает  цикл while симулятор перестает работать и показывать значения битов. Из за этого мной было принято решение написать программу так как она есть. 

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

Только что, LEVV2006 сказал:

Как только строка попадает  цикл while симулятор перестает работать и показывать значения битов.

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

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Или добавьте пару nop'ов в бесконечный цикл чтобы симулятор прыгал по ним а не сходил с ума. И, вроде, в последних версиях Студии отладку прерываний надо разрешать явным образом.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Там где-то в настройках есть пункт mask interrupts. Его значение нужно поставить в false, чтобы симулятор заходил в прерывания.

Посмотрел точно. Debug - options - tools - mask interrupts while stepping. Там надо false поставить, чтобы в пошаговом выполнении в прерывания заходил симулятор. Это касается 6 и 7 версии atmel studio.

Изменено пользователем Tokes
Ссылка на комментарий
Поделиться на другие сайты

Привет! Есть небольшой прогресс. Первое что я сделал это удалил atmel studio7 и поставил atmel studio6.2 и произвел настройку " mask interrupts while stepping" как посоветовал Tokes. Теперь при пошаговом выполнении кода и срабатывание прерывания указатель перемешается на прерывание. 

Теперь касательно Attiny85. Тот код что я показывал ранее рабочий и прерывание срабатывает но таймер при этом не сбрасывается. Долго искал и вот что выяснил. 

Есть 3 регистра для сравнения OCR1A,OCR1B,OCR1C

*Бит CTC1 установлен

OCR1A - когда OCR1A=TCNT1 То срабатывает флаг прерывания, происходит прерывание но таймер считает дальше.

OCR1B - Я пока не понял зачем он нужен. 

OCR1C - когда OCR1C=TCNT1 То срабатывает прерывание и счетчик сбрасывается. 

Единственное что пока не понятно это настройка TIMSK-OCIE1A. Эта настройка разрешает прерывание при совпадении OCR1A=TCNT1 но при этом OCR1A можно вообще не использовать в коде и никак не настраивать а прерывание будет срабатывать на OCR1C.

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

2 часа назад, LEVV2006 сказал:

Долго искал и вот что выяснил. 

Вы бы рассказали, где вы нашли эту информацию. При срабатывании прерывания по совпадению таймер сбрасывается только при работе в режиме CTC, а в обычном режиме он и не должен сбрасываться. 

2 часа назад, LEVV2006 сказал:

настройка TIMSK-OCIE1A. Эта настройка разрешает прерывание при совпадении OCR1A=TCNT1 но при этом OCR1A можно вообще не использовать в коде и никак не настраивать а прерывание будет срабатывать на OCR1C.

Фантастика какая-то!

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Я смотрел в даташит. 

TCCR1 – Timer/Counter1 Control Register

Bit 7 – CTC1 : Clear Timer/Counter on Compare Match

When the CTC1 control bit is set (one), Timer/Counter1 is reset to $00 in the CPU clock cycle after a compare match with OCR1C register value. If the control bit is cleared, Timer/Counter1 continues counting and is unaffected by a compare match.

Бит 7 - CTC1: очистить таймер / счетчик на совпадении

Когда бит управления CTC1 установлен (один), таймер / счетчик 1 сбрасывается до $ 00 в такт ЦПУ после сопоставления сравнения с регистровым значением OCR1C. Если бит управления очищен, таймер / счетчик 1 продолжает подсчет и не влияет на сравнение.

В общем если код такой

TCCR1 |= (1 << CS12); //делитель 256
TCCR1 |= (1 << CTC1); //сброс по совпадению
OCR1C = 0b00001010; //число для сравнения
TIMSK |= (1 << OCIE1A); //прерывание по совпадению

То прерывание срабатывает. Не знаю почему но срабатывает! Единственное мне кажется срабатывает оно не корректно так как в стимуляторе флаги OCF1A и OCF1B включаются и выключаются хаотически. Кроме того не совсем корректно работает счетчик. Он может увеличится не на один бит а сразу на 2-3 бита что мне кажется так быть не должно.

Если написать код так 

TCCR1 |= (1 << CS12); //делитель 256
TCCR1 |= (1 << CTC1); //сброс по совпадению
OCR1A = 0b00001010; //число для сравнения
OCR1C = 0b00001010; //число для сравнения
TIMSK |= (1 << OCIE1A); //прерывание по совпадению

То все работает корректно и логично (в стимуляторе). Прерывания срабатывают, флаги устанавливаются, счетчик сбрасывается.

Если я что то не так пишу то пожалуйста подправьте.

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

Важно понимать, что одна строчка на Си может развернуться в очень много ассемблерных команд, каждая из которых занимает от одного такта работы. Поэтому, выполняя команды построчно счётчик может сразу вырасти на два-три и более значения. Что касается таймеров - чудес, увы, не будет :) Как настроили, так и работает. В даташите подробно, как нигде написано назначение каждого регистра и каждого бита в каждом регистре. Местами приведены примеры в виде кода на Си и ассемблере. Так вот, чтобы работало - нужно не бегло прочитать, а вдумчиво и верно перевести документ. Меня очень хорошо выручал онлайн переводчик от гугл, где было что-то не понятно.

Например, вы пишете, что прерывание срабатывает, хотя не должно. Но ведь вы его сами разрешили. И даже если потом не настраивали значение OCR1A, оно всё равно будет проинициализировано значением 0х00. Вот и срабатывает.

А OCR1B нужен как дополнительный источник прерывания. Например, чтобы сделать двухканальный ШИМ сигнал на одном счётчике.

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

Добрый день, подскажите где взять значения кодов ошибок для I2C stm32. В хал есть функция HAL_I2C_GetError(). Мне она возвращает всё время 4. Что это 4 означает понятия не имею, где посмотреть можно?

Изменено пользователем GOR23
Ссылка на комментарий
Поделиться на другие сайты

10 минут назад, GOR23 сказал:

где взять значения кодов ошибок

 

Например, в файле stm32f4xx_hal_i2c.h

#define HAL_I2C_ERROR_NONE       ((uint32_t)0x00000000U)    /*!< No error           */
#define HAL_I2C_ERROR_BERR       ((uint32_t)0x00000001U)    /*!< BERR error         */
#define HAL_I2C_ERROR_ARLO       ((uint32_t)0x00000002U)    /*!< ARLO error         */
#define HAL_I2C_ERROR_AF         ((uint32_t)0x00000004U)    /*!< AF error           */
#define HAL_I2C_ERROR_OVR        ((uint32_t)0x00000008U)    /*!< OVR error          */
#define HAL_I2C_ERROR_DMA        ((uint32_t)0x00000010U)    /*!< DMA transfer error */
#define HAL_I2C_ERROR_TIMEOUT    ((uint32_t)0x00000020U)    /*!< Timeout Error      */

У Вас получается AF error, то есть отсутствие Acknowledge бита при обмене.

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

Добрый вечер! 

Вот дернуло собрать проект 2007 года. Уже вторую неделю бьюсь над ним. Прошивки .hex не прошиваются через avr studio, пишет что файл не является Intel HEX. Протеус при эмуляции говорит: line 1 colon expected at start of line. AVRDude шьет без вопросов. Процессор живой. Генерация на кварце есть. Но никаких признаков жизни.

В чем может быть проблема?

yampp3.c

yampp3.hex

Изменено пользователем vitaly
Ссылка на комментарий
Поделиться на другие сайты

Проблема может быть в том что HEX скомпилирован не под ваш МК, адреса регистров отличаются и программа дёргает непойми что.

Учение - изучение правил. Опыт - изучение исключений.

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

6 минут назад, Alexeyslav сказал:

HEX скомпилирован не под ваш МК

Вот, посмотрел по makefile, все та же мега162, как и у меня. Нашел похоже причину невозможности прошивки AVR Studio, там идет создание srec а не ihex файла

makefile

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

warning это не ошибка а предупреждение. Их, конечно, надо исправлять, но скомпилироваться не помешает.

Если бы дали себе труд перевести текст предупреждения, поняли бы что надо всего лишь заменить signal.h на interrupt.h

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...