Atmega8: простенький секундомер

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Atmega8: простенький секундомер

Сообщение Alexeyslav »

Значит я их с SBI перепутал. Хм.

Пользуюсь конструкциями

.macro set_bit
SET
BLD @0,@1
.endmacro

.macro clear_bit
CLT
BLD @0,@1
.endmacro

Она не трогает биты статуса кроме T.
Реклама
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Atmega8: простенький секундомер

Сообщение ILYAUL »

Что бы закончить тему . Вот почему она так себя ведёт
2. Interrupts may be lost when writing the timer registers in the asynchronous timer
The interrupt will be lost if a timer register that is synchronous timer clock is written when the
asynchronous Timer/Counter register (TCNTx) is 0x00.
Problem Fix/Workaround
Always check that the asynchronous Timer/Counter register neither have the value 0xFF nor
0x00 before writing to the asynchronous Timer Control Register (TCCRx), asynchronous
Timer Counter Register (TCNTx), or asynchronous Output Compare Register (OCRx).
Баг не вылечен до сих пор.
Реклама
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Atmega8: простенький секундомер

Сообщение Alexeyslav »

Еще чуть-чуть и он станет фичей.
Иринка
Встал на лапы
Сообщения: 85
Зарегистрирован: Вт мар 27, 2012 16:07:25

Re: Atmega8: простенький секундомер

Сообщение Иринка »

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

unsigned char number[] =
{
0x3, //0
0x9f, //1
0x25, //2
0x0d, //3
0x99, //4
0x49, //5
0x41, //6
0x1f, //7
0x1, //8
0x9 //9
};

/*
ABCDEFGP
0 11111100 = 0xfc
1 01100000 = 0x60
2 11011010 = 0xda
3 11110010 = 0xf2
4 01100110 = 0x66
5 10110110 = 0xb6
6 10111110 = 0xbe
7 11100000 = 0xe0
8 11111110 = 0xfe
9 11110110 = 0xf6
*/

volatile unsigned char selected_seg = 0; // текущий выводимый сегмент
volatile unsigned char values[6]; // значения сегментов
volatile unsigned char min, sec, msec; // значения минут, секунд, милисекунд
volatile unsigned char timerEnabled;

// параметры индикатора
#define DDR_SELECT_SEG DDRC
#define PORT_SELECT_SEG PORTC
#define DDR_VALUE_SEG DDRB
#define PORT_VALUE_SEG PORTB

// параметры порта кнопки
#define DDR_BUTTON DDRD
#define PIN_BUTTON PIND
#define POUT_BUTTON PORTD
#define BUTTON_BIT 0

// состояния машины
#define STATE_RESET 0
#define STATE_ENABLE 1
#define STATE_DISABLE 2

// таймер для вывода значений на индикатор
ISR (TIMER0_OVF_vect, ISR_NOBLOCK)
{
PORT_SELECT_SEG = _BV(selected_seg);
PORT_VALUE_SEG = number[values[selected_seg]];
if (!(selected_seg%2)) // поставим точку между минутами/секундами/милисекундами
PORT_VALUE_SEG &= ~1;
selected_seg++;
if (selected_seg==6)
selected_seg = 0;
}

// таймер для счета времени
ISR (TIMER2_OVF_vect, ISR_NOBLOCK)
{
msec++;
values[0] = msec%10;
values[1] = msec/10;
if (msec == 100)
{
msec = 0;
values[0] = 0;
values[1] = 0;
sec++;
values[2] = sec%10;
values[3] = sec/10;
if (sec==60)
{
sec = 0;
values[2] = 0;
values[3] = 0;
min++;
values[4] = min%10;
values[5] = min/10;
if (min==60)
min = 0;
}
}
}

void resetTimer ()
{
msec = 0;
sec = 0;
min = 0;
values[0] = values[1] = values[2] = values[3] = values[4] = values[5] = 0;
}

// разрешить вывод значений на индикаторы
static void viewEnable (void)
{
cli ();
TCNT0 = 0;
TIMSK |= _BV(TOIE0);
sei ();
}

// разрешить счет времени
static void timerEnable (void)
{
cli ();
TCNT2 = 0;
TIMSK |= _BV(TOIE2);
timerEnabled = 1;
sei ();
}

// запретить счет времени
static void timerDisable (void)
{
cli ();
TIMSK &= ~_BV(TOIE2);
timerEnabled = 0;
sei ();
}

// инициализация таймера
static void timerInit (void)
{
cli ();
TCCR0 |= _BV(CS01);
TCCR2 |= _BV(CS21) | _BV(CS20);
timerEnabled = 0;
sei ();
}

// инициализация индикатора
void init7Segs (void)
{
DDR_SELECT_SEG |= 0x3F;
DDR_VALUE_SEG |= 0xFF;
}

// инициализация кнопок
void initButtons (void)
{
DDR_BUTTON &= _BV(BUTTON_BIT);
POUT_BUTTON |= _BV(BUTTON_BIT);
}

int main (void)
{
init7Segs (); // инициализация индикатора
initButtons (); // инициализация кнопки
timerInit (); // инициализация таймера
resetTimer (); // обнуление таймера
viewEnable (); // разрешение вывода на индикатор
unsigned char btnPrevState = PIN_BUTTON; // предыдущее состояние кнопки
unsigned char state = 0; // состояние машины
while (1) // бесконечный цикл
{
if (PIN_BUTTON != btnPrevState) // если произошло действие(нажали/отпустили кнопку)
{
if (!(PIN_BUTTON&_BV(BUTTON_BIT))) // если нажали на кнопку
{
switch (state) // посмотрим что за состояние сейчас
{
case STATE_RESET: // состояние обнуления (когда горят все нули)
timerEnable (); // разрешаем счет таймера
state = STATE_ENABLE; // установим состояние (счет запущен)
break; // выйти
case STATE_ENABLE: // счет запущен
timerDisable (); // отключим таймер
state = STATE_DISABLE; // переключим на состояние стоп
break;
case STATE_DISABLE: // состояние стоп
resetTimer (); // обнулим таймер
state = STATE_RESET; // таймер обнулен
break;

}
}
btnPrevState = PIN_BUTTON; // запомним предыдущее состояние кнопки
}
}
}
При компиляции не создается hex файл, вот что пишется при компиляции:

mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT Sec.o -MF dep/Sec.o.d -c ../Sec.c
/usr/bin/sh: -Wall: command not found
make: [Sec.o] Error 127 (ignored)
mmcu=atmega8 -Wl,-Map=Sec.map Sec.o -o Sec.elf
/usr/bin/sh: -Wl,-Map=Sec.map: command not found
make: [Sec.elf] Error 127 (ignored)
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature Sec.elf Sec.hex
avr-objcopy: 'Sec.elf': No such file
make: *** [Sec.hex] Error 1
Build failed with 1 errors and 0 warnings...

Компилю в AVR Studio через GCC компилятор, помогите кто-нибудь, скажите что за проблема!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Atmega8: простенький секундомер

Сообщение ILYAUL »

А какая у Вас studio?
Реклама
Иринка
Встал на лапы
Сообщения: 85
Зарегистрирован: Вт мар 27, 2012 16:07:25

Re: Atmega8: простенький секундомер

Сообщение Иринка »

ILYAUL, у меня AVR Studio 4
Реклама
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Atmega8: простенький секундомер

Сообщение ILYAUL »

Ирина, у студий 4 есть разные версии и в чём пишите GCC,WinAVR.......
Последний раз редактировалось ILYAUL Вс май 27, 2012 23:40:15, всего редактировалось 1 раз.
Иринка
Встал на лапы
Сообщения: 85
Зарегистрирован: Вт мар 27, 2012 16:07:25

Re: Atmega8: простенький секундомер

Сообщение Иринка »

ILYAUL, версия 4.19, если быть точнее, а пишу в GCC, я же написала, что в GCC, какая-то странная проблема, может Вы попробуете у себя прокомпилить?
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Atmega8: простенький секундомер

Сообщение ILYAUL »

Это проблема скорее не кода. Вы устанавливали вместе со студией Tollchain для этой версии?
Иринка
Встал на лапы
Сообщения: 85
Зарегистрирован: Вт мар 27, 2012 16:07:25

Re: Atmega8: простенький секундомер

Сообщение Иринка »

ILYAUL, а Tollchain, это что вообще? Ничего подобного не устанавливала, устанавливала только студию и потом дополнительно GCC компилятор.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Atmega8: простенький секундомер

Сообщение ILYAUL »

Atmel с 4.19 версии убрал поддержку сторонних компиляторов типа WINAVR и возможно и стороних GCC. Выпустив свой под названием TOOLCHAIN. Вы можете попробывать откатится на 4.18 - очень не плохая студия со всеми ее добавками. Или хорошенько почистив ком (реестр ) от Вашего GCC учтановить avr-toolchain-installer-3.0.0.240-win32.win32.x86- это его первая версия. В архиве на сайте atmel ( http://www.atmel.com/tools/STUDIOARCHIVE.aspx) есть и постарше. Вообщем-то в инете полно тем по этому поводу , может кто-то и нашёл решение более короткое.
В версиях 5 и возможно 6 ( не проверял) studio можно отключать toolchain и пользоваться своим. Но 5-ка - это мама не горюй , по моему личному мнению.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Atmega8: простенький секундомер

Сообщение Alexeyslav »

А помоему, 4.19 - это последняя бесплатная версия. 5-ю и 6-ю искать разве что на варезниках, напрямую с их сайта не скачать.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Atmega8: простенький секундомер

Сообщение ILYAUL »

Alexeyslav писал(а):А помоему, 4.19 - это последняя бесплатная версия. 5-ю и 6-ю искать разве что на варезниках, напрямую с их сайта не скачать.
Atmel никода денег за свои проги не брал , не берёт и сейчас. Нажимаем правой клавишей мышки, без регистрации
http://www.atmel.com/dyn/resources/prod ... 0.1843.exe (743 М)
http://www.atmel.com/Images/as6installe ... readme.pdf
или
http://www.atmel.com/tools/atmelstudio.aspx если желаем оставить свой след на просторах сервака atmel
Иринка
Встал на лапы
Сообщения: 85
Зарегистрирован: Вт мар 27, 2012 16:07:25

Re: Atmega8: простенький секундомер

Сообщение Иринка »

Кто прогает на С? Помогите, пожалуйста, мне надо в данной программе изменить, чтобы на миллисекунды отводился 1 знак и на минуты 1 знак, а на секунды 2 знака, а здесь на все по 2 знака отводится, и чтобы индикатор был с общим катодом, а не анодом! Очень надо, кто понимает, исправьте пожалуйста!
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Atmega8: простенький секундомер

Сообщение Alexeyslav »

Просто не выводи на индикатор соответствующие позиции... или вообще индикаторы соответствующие не ставь.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»