Программирование AVR на С (в среде Atmel Studio 6).

Обсуждаем контроллеры компании Atmel.
Ответить
Мучитель микросхем
Аватара пользователя
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Сообщение tantrum »

Добрый день, уважаемые Коты! Суть создания темы такова: я начал изучать программирование AVR по видеокурсу (работа с портами, АЦП). Он закочился, но я хочу продолжить дальше обучаться. Решил освоить таймеры. Но....! Выплывает куча проблем: то статьи написаны под CodeVision, то еще что-то...
На данный момент я хочу попросить вас, чтобы мне написали код (именно самый простой с комментариями) таймера, который бы при подсчете, например, до 5 засвечивал светодиод на 2 секунды (без использования delay).
Типа так:
1) Настраиваем на 8Мгц
2) Библиотеки
3) Создаем переменную, в которую будет записываться количество прерываний
4) Настройка таймера
5) Обнуляем таймер
6) Прибавляем к нашей переменной единицу при каждом обнулении счетчика
7) (Как я понимаю, это должно быть здесь)
if (n==2) //n - количество прерываний
PORTC = 0xFF;
(К примеру)
8 ) Установка предделителя
9) ....
И здесь поправте, если что.
Надеюсь на помощь и понимание.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 754
Зарегистрирован: Пт апр 15, 2011 21:11:22
Откуда: Россия

Сообщение BigallS »

Видеокурсы здесь есть http://cxem.net/video.php?category=3 посмотрите.
Урок по работе с ацп http://www.avrki.ru/articles/content/lesson_5/
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Сообщение tantrum »

Я смотрел этот видеокурс.
Причем здесь АЦП?
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

tantrum писал(а): который бы при подсчете, например, до 5 засвечивал
при подсчете до пяти чего ? нажатий кнопки? прерываний от таймера? при подсчете гривен в кармане?
tantrum писал(а):1) Настраиваем на 8Мгц
В студии создаем новый проект и там выбираем камень и его частоту и пр.
tantrum писал(а):2) Библиотеки

Код: Выделить всё

#include <avr/io.h>		// Ножки ввода-вывода
#include <util/delay.h>		// Задержки
#include <avr/interrupt.h>	// Прерывания
и т.д. смотря что используете
tantrum писал(а):3) Создаем переменную, в которую будет записываться количество прерываний

Код: Выделить всё

unsigned char n;
tantrum писал(а):4) Настройка таймера
читать даташит
tantrum писал(а):6) Прибавляем к нашей переменной единицу при каждом обнулении счетчика

Код: Выделить всё

ISR (TIMER0_OVF_vect) {
	n++;
}

Фигня это все.
Вы просите персональный урок по программированию в Си в шестой Студии. Так ВЫ программы писать не научитесь.

Какой то абстрактный проект.
Нельзя от фонаря брать данные.
Посчитать до 100 нужна переменная unsigned char или signed char или char или скажем uchar ну или uint8_t, а если счет будет до 130 все эти переменные подойдут? А если до 1000 ? Бежать на форум. Караул мне нужна новая переменная. :shock:


P.S.
И почему все перестали читать бумажные книги? Да Инет завален сканами книг.

Плюс к тому читайте чужие исходники.
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Сообщение tantrum »

Danko писал(а):при подсчете до пяти чего ? нажатий кнопки? прерываний от таймера? при подсчете гривен в кармане?
После 5 прерываний, ну чтобы счетчик отсчитал 5 раз от 0 до 255.
Пробовал так делать:

Код: Выделить всё

unsigned char n=0;
ISR (TIMER0_OVF_vect)
{
n++;
if (n==5)
PORTB = 0xFF;
else 
PORTB = 0x00;
n=0;
}
Ну так ведь? Но не получается...
Понимаю... Но это тяжело, познавать такое дело...
P.S. Этот урывок кода и нашел с чужого исходника. Только он был под CodeVisionAVR.
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

А не пробовали к нему сами коменты написать?

А какая хрен разница в компиляторе (диалекте)? Си есть Си.


Я бы написал так:

Код: Выделить всё

ISR (TIMER0_OVF_vect)
{
     n++;
     if (n >= 5) { // так надежнее если где-то значение переменной перепрыгнет через пятерку
         n=0;
         PORTB = 0xFF;
     }
     else 
     {
         PORTB = 0x00;
     }
}

ну в CVAVR прерывание выглядит так

Код: Выделить всё

interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
А вот тоже прерывание, но только в ICC

Код: Выделить всё

void timer0_ovf_isr(void)
если использовать стандартные наименования типов переменных например unsigned char , а не их синонимы например uint8_t так вообще без разницы под какой компилятор писать.
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

tantrum писал(а):чтобы счетчик отсчитал 5 раз от 0 до 255
А для чего ? Если можно посчитать 1 раз от 0 до 1275 :)
Мучитель микросхем
Аватара пользователя
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Сообщение tantrum »

Аlex

Просто, чтобы 5 раз сработало прерывание.

Danko

Пробую так:

Код: Выделить всё

#define F_CPU 8000000
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned char n=0;
ISR(TIMER0_OVF_vect)
{
	TCNT1 = 0; 
		if (n>=5)
		{
			n++;
			PORTB = 0xFF;
			n=0;
		}
		else
		{
			PORTB = 0x00;
		}
}
int main()
{
	DDRB = (1<<PB0); //PB0 на выход
	TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10); // настраиваем делитель
	TIMSK |= (1<<TOIE1); // разрешаем прерывание по переполнению таймера
	TCNT1 = 0;     
	sei();                // выставляем бит общего разрешения прерываний
	while(1);       
	return 0;
}
На выходе полный 0...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

tantrum писал(а):На выходе полный 0...

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

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

Мой уютный бложик... заходите!
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Сообщение tantrum »

ARV

Так?

Код: Выделить всё

volatile unsigned char n=0;
Тоже не работает.
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

if (n>=5)
{
n++; <-------------------- сюда никогда не попадем n=0
PORTB = 0xFF;
n=0;
}
может так: if (++n>=5)
Мучитель микросхем
Аватара пользователя
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Сообщение tantrum »

oleg110592 писал(а):n++; <-------------------- сюда никогда не попадем n=0
Почему сюда не попадем?
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

условие попадания n>=5, а n=0
Мучитель микросхем
Аватара пользователя
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Сообщение tantrum »

Так оно же после каждого прерывания должно прибавлять единичку. Так и насчитает 5, нет...?
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

как же насчитает, если не попадет в строку n++
Мучитель микросхем
Аватара пользователя
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Сообщение tantrum »

А как сделать, чтобы оно попало в строку n++?
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

убрать n++
вместо if (n>=5) написать if (++n>=5)
это тоже надо volatile unsigned char n=0;
Мучитель микросхем
Аватара пользователя
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Сообщение tantrum »

Не работает. :(

Код: Выделить всё

#define F_CPU 8000000
#include <avr/io.h>
#include <avr/interrupt.h>
volatile unsigned char n=0;
ISR(TIMER0_OVF_vect)
{
	TCNT1 = 0; 
		if (++n>=5)
		{
			PORTB = 0xFF;
			n=0;
		}
		else
		{
			PORTB = 0x00;
		}
}
int main()
{
	DDRB = (1<<PB0); //PB0 на выход
	TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10); // настраиваем делитель
	TIMSK |= (1<<TOIE1); // разрешаем прерывание по переполнению таймера
	TCNT1 = 0;     
	sei();                //бит общего разрешения прерываний
	while(1);       
	return 0;
}
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

Настраиваем таймер1, а прерывание ждём от таймера0
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Ответить

Вернуться в «AVR»