Страница 1 из 3

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

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

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

Добавлено: Пн июл 07, 2014 16:24:30
BigallS
Видеокурсы здесь есть http://cxem.net/video.php?category=3 посмотрите.
Урок по работе с ацп http://www.avrki.ru/articles/content/lesson_5/

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

Добавлено: Пн июл 07, 2014 16:28:30
tantrum
Я смотрел этот видеокурс.
Причем здесь АЦП?

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

Добавлено: Вт июл 08, 2014 00:19:18
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.
И почему все перестали читать бумажные книги? Да Инет завален сканами книг.

Плюс к тому читайте чужие исходники.

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

Добавлено: Вт июл 08, 2014 00:33:33
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.

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

Добавлено: Вт июл 08, 2014 00:39:03
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 так вообще без разницы под какой компилятор писать.

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

Добавлено: Вт июл 08, 2014 07:17:44
ARV
100500-й раз повторяю: все глобальные переменные, которые используются и в обработчиках прерывания, должны быть обязательно volatile

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

Добавлено: Вт июл 08, 2014 09:07:22
Аlex
tantrum писал(а):чтобы счетчик отсчитал 5 раз от 0 до 255
А для чего ? Если можно посчитать 1 раз от 0 до 1275 :)

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

Добавлено: Вт июл 08, 2014 12:18:22
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...

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

Добавлено: Вт июл 08, 2014 12:25:28
ARV
tantrum писал(а):На выходе полный 0...

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

я фигею...

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

Добавлено: Вт июл 08, 2014 12:43:43
tantrum
ARV

Так?

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

volatile unsigned char n=0;
Тоже не работает.

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

Добавлено: Вт июл 08, 2014 12:53:02
oleg110592
if (n>=5)
{
n++; <-------------------- сюда никогда не попадем n=0
PORTB = 0xFF;
n=0;
}
может так: if (++n>=5)

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

Добавлено: Вт июл 08, 2014 12:56:36
tantrum
oleg110592 писал(а):n++; <-------------------- сюда никогда не попадем n=0
Почему сюда не попадем?

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

Добавлено: Вт июл 08, 2014 12:58:19
oleg110592
условие попадания n>=5, а n=0

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

Добавлено: Вт июл 08, 2014 13:00:33
tantrum
Так оно же после каждого прерывания должно прибавлять единичку. Так и насчитает 5, нет...?

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

Добавлено: Вт июл 08, 2014 13:05:38
oleg110592
как же насчитает, если не попадет в строку n++

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

Добавлено: Вт июл 08, 2014 13:06:15
tantrum
А как сделать, чтобы оно попало в строку n++?

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

Добавлено: Вт июл 08, 2014 13:16:15
oleg110592
убрать n++
вместо if (n>=5) написать if (++n>=5)
это тоже надо volatile unsigned char n=0;

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

Добавлено: Вт июл 08, 2014 13:19:17
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;
}

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

Добавлено: Вт июл 08, 2014 13:32:23
Danko
Настраиваем таймер1, а прерывание ждём от таймера0