Страница 4 из 4
Re: Atmega8: простенький секундомер
Добавлено: Ср май 02, 2012 20:14:52
Alexeyslav
Значит я их с SBI перепутал. Хм.
Пользуюсь конструкциями
.macro set_bit
SET
BLD @0,@1
.endmacro
.macro clear_bit
CLT
BLD @0,@1
.endmacro
Она не трогает биты статуса кроме T.
Re: Atmega8: простенький секундомер
Добавлено: Сб май 05, 2012 21:39:25
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).
Баг не вылечен до сих пор.
Re: Atmega8: простенький секундомер
Добавлено: Вс май 06, 2012 00:03:10
Alexeyslav
Еще чуть-чуть и он станет фичей.
Re: Atmega8: простенький секундомер
Добавлено: Сб май 26, 2012 14:44:35
Иринка
#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 компилятор, помогите кто-нибудь, скажите что за проблема!
Re: Atmega8: простенький секундомер
Добавлено: Сб май 26, 2012 22:20:03
ILYAUL
А какая у Вас studio?
Re: Atmega8: простенький секундомер
Добавлено: Вс май 27, 2012 00:06:27
Иринка
ILYAUL, у меня AVR Studio 4
Re: Atmega8: простенький секундомер
Добавлено: Вс май 27, 2012 23:01:08
ILYAUL
Ирина, у студий 4 есть разные версии и в чём пишите GCC,WinAVR.......
Re: Atmega8: простенький секундомер
Добавлено: Вс май 27, 2012 23:39:40
Иринка
ILYAUL, версия 4.19, если быть точнее, а пишу в GCC, я же написала, что в GCC, какая-то странная проблема, может Вы попробуете у себя прокомпилить?
Re: Atmega8: простенький секундомер
Добавлено: Вс май 27, 2012 23:45:25
ILYAUL
Это проблема скорее не кода. Вы устанавливали вместе со студией Tollchain для этой версии?
Re: Atmega8: простенький секундомер
Добавлено: Вс май 27, 2012 23:49:26
Иринка
ILYAUL, а Tollchain, это что вообще? Ничего подобного не устанавливала, устанавливала только студию и потом дополнительно GCC компилятор.
Re: Atmega8: простенький секундомер
Добавлено: Пн май 28, 2012 00:09:25
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-ка - это мама не горюй , по моему личному мнению.
Re: Atmega8: простенький секундомер
Добавлено: Пн май 28, 2012 00:15:50
Alexeyslav
А помоему, 4.19 - это последняя бесплатная версия. 5-ю и 6-ю искать разве что на варезниках, напрямую с их сайта не скачать.
Re: Atmega8: простенький секундомер
Добавлено: Пн май 28, 2012 00:46:32
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
Re: Atmega8: простенький секундомер
Добавлено: Пн май 28, 2012 15:36:56
Иринка
Кто прогает на С? Помогите, пожалуйста, мне надо в данной программе изменить, чтобы на миллисекунды отводился 1 знак и на минуты 1 знак, а на секунды 2 знака, а здесь на все по 2 знака отводится, и чтобы индикатор был с общим катодом, а не анодом! Очень надо, кто понимает, исправьте пожалуйста!
Re: Atmega8: простенький секундомер
Добавлено: Пн май 28, 2012 18:56:28
Alexeyslav
Просто не выводи на индикатор соответствующие позиции... или вообще индикаторы соответствующие не ставь.