Оружие будущего
http://future-weapons.ru/forum/

С чего начать изучение МК?
http://future-weapons.ru/forum/viewtopic.php?f=36&t=1629
Страница 2 из 3

Автор:  Piton [ Пт янв 21, 2011 2:47 pm ]
Заголовок сообщения:  Re: С чего начать изучение МК?

Спасибки за схемку.
Так. Поизучал немного мат часть и думаю начать попытки в программировании МК всеиаки с ATMega16. Пусть он и 40-ножка, НО в этом есть и прелесть всетаки 4 полноценных порта. Можно не заморачиваться в вводом выводом информации. На слепыше с таким количеством портов можно не париться с "переферией" и добовлять по мере продвижения в программировании всякие фичи на разные порты.

Автор:  petru-nick [ Пт янв 21, 2011 6:07 pm ]
Заголовок сообщения:  Re: С чего начать изучение МК?

Будет ли программироваться МК, если фьюзы настроены на работу МК от кварца и кварц не работает? Чот восьмая атмежка нихочет прошивочку выполнять, даже простейшее "вывести единички на все".
----------------------------------------------------
блять, и сразу вот сюда писать прибежа :facepalm:

И, собс-но, в чем проблема: инициализация была вынесена в отдельную функцию:
void initialization (void)
{
}
И так, как формально это процедура, вызвал я ее аля делфаля, бо большую часть времени в нем пишу
inizialization; //и компилл не ругался
А по сишному нужно:
initialization();

Автор:  Piton [ Вс янв 30, 2011 7:29 pm ]
Заголовок сообщения:  Re: С чего начать изучение МК?

Хе...
И всетаки она бегает!!!
http://www.youtube.com/watch?v=ZMrkrkKZp0o
С помощью лома и какойто матери мне всеже удалось заставить ЭТО работать.

Я сдесь попил пивка с моим другом, программером, а тот мне поведал, что в настоящее время рулят танковые клинья и ковровое бомбометание в области программирования однокристальных МК и асемблером уже мало кто пользуется (ну если только надо создать очень компактную прогу). В роле "коврового бомбометания" выступают, специально заточенные среды разработки, а в роли "танковых клиньев" довно забытый Си.
После того как отошла голова от выпитого пива посмотрел я внимательно на схему "5 проводков" скачал Code Vision AVR, http://rutracker.org/forum/viewtopic.php?t=1003463 отрыл старый учебник по Си. Потом немного вдумчивого чтения, немного паечки. и вот собсна все. Теперь буду вникать в прерывания и т.д.

Автор:  Испытатель [ Вс янв 30, 2011 7:31 pm ]
Заголовок сообщения:  Re: С чего начать изучение МК?

кодевизион да хорошый.
он и ассемблер умеет, если чо.

Автор:  Piton [ Вс янв 30, 2011 7:34 pm ]
Заголовок сообщения:  Re: С чего начать изучение МК?

Испытатель писал(а):
кодевизион да хорошый.
он и ассемблер умеет, если чо.


Судя по изученному в последние две недели (после того как наступит просветление) лучше всего использовать некий сплав ассемблера и Си. К тому же Си поддерживает вставки на ассемблере.

Автор:  luxor [ Вт фев 01, 2011 12:05 am ]
Заголовок сообщения:  Re: С чего начать изучение МК?

Вот тоже все подумываю с чегоб начать :| Что посоветуете ? Фрунзе или еще что ?

Вот имхо весьма полезная вещь , для освоения на макетке http://datagor.ru/practice/diy-tech/149 ... ega16.html
to Piton что за плата на видео если не секрет ?

Автор:  Piton [ Вт фев 01, 2011 6:49 pm ]
Заголовок сообщения:  Re: С чего начать изучение МК?

luxor писал(а):
Вот тоже все подумываю с чегоб начать :| Что посоветуете ? Фрунзе или еще что ?

Вот имхо весьма полезная вещь , для освоения на макетке
to Piton что за плата на видео если не секрет ?


Я не претендую на звание матерого программера. НО свои 5 копеек всетаки вставлю.
Можно начать с Фрунзе. НО я бы посоветовал начать с Приложения 1 том2. Там про числа кодироваиня и арефметические действия. Это есть и в первом томе. НО как оно объяснено во втором мне понравилось больше.
После того как двоичное исчисление будет понятно можно читать первый том целиком.
Так же неплохо для начала надыбать книгу по Си. Именно по Си без ++. (Т.к. объектами для начинающего программера да еще на МК не пахнет вообще) Конечно на асемблере сразу, оно конечно круто. НО всетаки запустить светодиод мне пока удалось только на Си. Хотя теоретически, (запустить дорожку на ассемблере) никаких проблемм, там вообще все понятно как божий день. Но пока не получается и больше из за того, что просто незнаю пока как в CV начать писать на асс-ре. Но зато на Си без проблемм. Да и вообще писать проги по мат вычислениям на асс-ре в самом начале пути освоения программирования... это можно рехнуться.
Что же касается макетки. Я тоже думал что начинать надо на ней. :facepalm:
даже купил ее на митьке. Но после того как сжег КрЕн5 даже не успев запоять панельку. (всему виной были сопли) то понял, что мне проще сделать печать, чем выпендриваться напаевая перемычки.
Вот собсно и сама моя макетка. (В приложенном файле она же. Может кому сгодиться)

Изображение

Изображение

Резюки на светодиодах и индикаторе по 1кОм. Можно и по 0.5 но уменя их мало.
Резюки на кнопки по 10 кОм.
ЮСБ разъем для программатора. Там как раз 4 провода + Земля. (Пришлось распотрашить один кабель.) Ну вот и все 5 копеек.
:D
ДА, что касаемо предложенной тобой макетки... МММ. Я с такими не работал. незнаю. НО всеравно перемычки это по видимому не для меня.

Вложения:
МК 1.rar [13.59 KIB]
Скачиваний: 162

Автор:  luxor [ Вт фев 01, 2011 10:23 pm ]
Заголовок сообщения:  Re: С чего начать изучение МК?

Собственно на видео напряг разьем USBЮ , ибо упоминалось то про мегу 16 :mrgreen:

Автор:  Испытатель [ Вт фев 01, 2011 11:12 pm ]
Заголовок сообщения:  Re: С чего начать изучение МК?

я юзаю для связи с компом и внутрисхемного программирования разъем DB9, хоть и большой, зато довольно удобный и солидный.

Автор:  Shah [ Ср фев 02, 2011 3:15 am ]
Заголовок сообщения:  Re: С чего начать изучение МК?

Цитата:
Что же касается макетки. Я тоже думал что начинать надо на ней.

люто, бешено двачую, макетки суть уг, даже так УГ,
времени на распайку перемычек уходит столько, что хватит плату нормальную придумать, заЛУТить и вытравить
ЗЫ. есть конечно варианты из 5-10 деталек - но их рассово верно паять навесом

Автор:  Испытатель [ Ср фев 02, 2011 11:36 am ]
Заголовок сообщения:  Re: С чего начать изучение МК?

с макетками да, лучше не связываться. неудобные.

Автор:  luxor [ Ср фев 02, 2011 11:59 am ]
Заголовок сообщения:  Re: С чего начать изучение МК?

Ну в неоторы случаях имхо удобно ;)

Автор:  Piton [ Чт фев 10, 2011 10:05 pm ]
Заголовок сообщения:  Re: С чего начать изучение МК?

Блин!! Кто нить может сказать в мегах16 есть какая нить разница между 0 и 2 таймером.
было подмечено, что 2 таймер при одинаковых настройках дает более частые прерывания.
В регистрах счетчиков изначально нули, делители настроены одинаково 1024.
А прерывания более частые. Чо за нах.
Ведь оба счетчика 8осьми битные.
Или я чо-то не догоняю????
Есть правда один момент ... 2ой таймер является асинхронным.
У него там чо свой генератор стоит да еще и с мультипликатором??

Автор:  Испытатель [ Чт фев 10, 2011 10:20 pm ]
Заголовок сообщения:  Re: С чего начать изучение МК?

приориет прерываний счетчика Т2 выше, чем счетчика Т0
http://microchipinf.com/articles/45/148
вот, в будущем надо подстраивать программу под приоритет, например, в обработчике прерываний разрешать прерывания

Автор:  Piton [ Чт фев 10, 2011 10:24 pm ]
Заголовок сообщения:  Re: С чего начать изучение МК?

Испытатель писал(а):
приориет прерываний счетчика Т2 выше, чем счетчика Т0

И поэтому он должен раза в два быстрей работать.
Хмм.

Автор:  Испытатель [ Чт фев 10, 2011 11:48 pm ]
Заголовок сообщения:  Re: С чего начать изучение МК?

перечитал вопрос - а т2 срабатывает чаще при одновременном использовании обоих таймеров или раздельно было замечено? так-же вопрос - сколько тактов занимает обработчик прерывания? вполне возможно, что обработчик жрет время.
вообще, при совпадении моментов времени векторов прерываний, прерывания согласно" приоритету выстраиваются в "очередь" и выполняются друг за другом, и поидее, каких то конфликтов возникать не должно.

Автор:  Piton [ Пт фев 11, 2011 6:51 am ]
Заголовок сообщения:  Re: С чего начать изучение МК?

Испытатель писал(а):
а т2 срабатывает чаще при одновременном использовании обоих таймеров или раздельно

Монопенисуально. Запускал по разному методом разрешения конкретных прерываний

Испытатель писал(а):
сколько тактов занимает обработчик прерывания?

Обработчики совершенно одинаковые т.к. пока просто тестирую .
Сама же обработка счетчика прерываний тоже одна и таже.

Испытатель писал(а):
вообще, при совпадении моментов времени векторов прерываний, прерывания согласно" приоритету выстраиваются в "очередь" и выполняются друг за другом, и поидее, каких то конфликтов возникать не должно.

Вот и я тоже так мыслю НО на таймере 0 светодиод загорается примерно 1 раз в секунду, а на таких же установках таймера 2 раза 4 за нее.
ХОтя, как я уже писал дилитель один и тотже, внешних сигналов тактирования (кроме штатно установленного кварца на 11.0592) нет. МК ATMega 16A.

Автор:  Испытатель [ Пт фев 11, 2011 9:29 am ]
Заголовок сообщения:  Re: С чего начать изучение МК?

а код си? если да - можно посмотреть?

Автор:  Piton [ Пт фев 11, 2011 6:03 pm ]
Заголовок сообщения:  Re: С чего начать изучение МК?

Испытатель писал(а):
а код си? если да - можно посмотреть?


Ну как бы вот.
Это полная программа.





//Определение глобальных переменных
//------------------------------------------------------
unsigned int Timer_0_ovf = 0; //Переменная Таймера 0 по переполнению
unsigned char Timer_0_Korrekcia = 0; //Переменная предустановки таймера 0 (0...255)
//unsigned int Timer_1_ovf = 0; //Переменная Таймера 0 по переполнению
//unsigned char Timer_1_Korrekcia = 0; //Переменная предустановки таймера 0 (0...255)
unsigned int Timer_2_ovf = 0; //Переменная Таймера 0 по переполнению
unsigned char Timer_2_Korrekcia = 0; //Переменная предустановки таймера 0 (0...255)

//Подцепляемые файлы
//---------------------------------------------
#include <mega16.h>
#include "Funk_mega16.c"
#include "interrupt_mega_16.c"


//Основная программа
void main(void)
{
//Определение локальных переменных
//-----------------------------------
unsigned int Second_time = 30; //Переменная отсчета прерывания таймера 0
unsigned char Schet_0_9 = 0; //Переменная отсчета цифр от 0 до 9


//Порты
//------------------------------------
//Порт А
PORTA=0b00000000;
DDRA=0b11111111;

//Порт B
PORTB=0b00000000;
DDRB=0b11111111;

//Порт C
PORTC=0b00000000;
DDRC=0b11111111;

//Порт D
PORTD=0b00000000;
DDRD=0b11111111;

//Таймер 0

TCCR0=0b00000101;
TCNT0=0x00;
OCR0=0x00;

//Таймер 1

TCCR1A=0b00000000;
TCCR1B=0b00000101;
//Регистры счета
TCNT1H=0x00;
TCNT1L=0x00;

ICR1H=0x00;
ICR1L=0x00;
//Регистры сравнения
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

//Таймер 2
//--------------------------------------

ASSR=0b00000000;
//Регистр управления
TCCR2=0b00000101;
TCNT2=0x00;
OCR2=0x00;

//Стороживой таймер
WDTCR = 0b00000;

//Аналоговый компаратор
ACSR=0b10000000;


//Разные настройки
//-----------------------------------------------------
//Внешние прерывания
MCUCR=0x00;
MCUCSR=0x00;
//Регистр разрешения прерывания счетчиков
TIMSK=0b01000001;
//Регистр флагов прерывания счетчиков
TIFR = 0b01000001;
//Регистр сброса предделителя счетчиков
SFIOR = 0b00000000;

#asm
sei; //Разрешаем прерывания
#endasm

//---------------------------------------------------------------------
//Тело программы
while (1)
{
//Счетчик прерываний таймера
if (Timer_2_ovf == Second_time)
{
static unsigned int Light = 0; //переменная точки
//Определение индикации вкл/выкл
if (Light == 1) Light = 0;
else Light = 1;
//Индикация точки
Ligt_ON_OUT (Light) ;
//Индикация цифр
indikator (Schet_0_9, 0);
if (Light ==1) Schet_0_9++;
if (Schet_0_9 >= 10) Schet_0_9 = 0 ;
//Сброс счетчика таймера при достижени секунды
Timer_2_ovf = 0;
}

}

};
//---------------------------------------------------------------------
//Конец основной програмы


//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//Прерывание счетчика О по переполнению
/* Глобальная переменая
unsigned int Timer_0_ovf Счетчик таймера
Timer_0_Korrekcia Начальное здачение счета */
//-------------------------------------------------------------------------
//Начало обработки TIM0_OVF
interrupt [TIM0_OVF]void timer0_overflow(void)
{
TCCR0 = 0b00000000; //Счетчик остановлен
TCNT0 = Timer_0_Korrekcia; //Загрузить значения предустановки (Глобальная переменная)
Timer_0_ovf ++; //Прибавляем значение к счетчику прерываний
TCCR0 = 0b00000101; //Счетчик запущен с делителем 1024
}
//Конец обработки TIM0_OVF
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------

//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//Прерывание счетчика 2 по переполнению
/*Глобальная переменая
unsigned int Timer_2_ovf Счетчик таймера
Timer_2_Korrekcia Начальное здачение счета */
//-------------------------------------------------------------------------
//Начало обработки TIM0_OVF
interrupt [TIM2_OVF]void timer2_overflow(void)
{
TCCR2 = 0b00000000; //Счетчик остановлен
TCNT2 = Timer_2_Korrekcia; //Загрузить значения предустановки (Глобальная переменная)
Timer_2_ovf ++; //Прибавляем значение к счетчику прерываний
TCCR2 = 0b00000101; //Счетчик запущен с делителем 1024
}
//Конец обработки TIM2_OVF
//-------------------------------------------------------------------------


//---------------------------------------------------------
//---------------------------------------------------------
//Функуия Indikator отображения числа от 0 до 9 на панели индикатора.
//Если число меньше 0 и больше 9 то отображает (Е.)
//с установленного в функции порта и жестко привязанное
//к выводам индикатора
//
//Вход - Chislo - число от 0 до 9 int (Показания индикатора)
// Tochka - число 0, 1, 2 int (Показетель точки)
// 0 Число без точки
// 1 Число с точкой
// 2 Число игнорируется, отображается только точка
//Выхд - нет
//
//Начало функции indikator
void indikator (int Chislo, int Tochka )
{
if (Chislo < 0 || Chislo > 9 || Tochka < 0 || Tochka > 2)PORTC = 119; // Проверка входящих данных и отображение (Е.) в случае некоректных значений
else
{
if (Tochka == 2) PORTC = 4; // Отображаем только точку
else
{
if (Tochka == 1) Tochka = 4; // Добовляем к отображению точку
switch (Chislo)
{
case 0:PORTC = 235 + Tochka; break; // Отображает 0
case 1:PORTC = 136 + Tochka; break; // Отображает 1
case 2:PORTC = 211 + Tochka; break; // Отображает 2
case 3:PORTC = 217 + Tochka; break; // Отображает 3
case 4:PORTC = 184 + Tochka; break; // Отображает 4
case 5:PORTC = 121 + Tochka; break; // Отображает 5
case 6:PORTC = 123 + Tochka; break; // Отображает 6
case 7:PORTC = 200 + Tochka; break; // Отображает 7
case 8:PORTC = 251 + Tochka; break; // Отображает 8
case 9:PORTC = 249 + Tochka; break; // Отображает 9
}
}
}

return ;
}
// Конец Функции Indikator
//---------------------------------------------------------
//---------------------------------------------------------
//Функуция мигания
//Вход - bit Flag_ON (Флаг сигнала 0...1)
//Выход - нет
//
//Начало функции Ligt_ON_OUT
void Ligt_ON_OUT (unsigned char Flag_ON)
{
if (Flag_ON == 1){PORTA.0 = 1;}
else {PORTA.0 = 0;}
return ;
}
//Конец функции Ligt_ON_OUT

Автор:  Испытатель [ Пт фев 11, 2011 6:41 pm ]
Заголовок сообщения:  Re: С чего начать изучение МК?

TCCR2 = 0b00000101 - коэффициент деления не 1024 а 128, 1024 будет 0b00000111, судя по даташиту (таблица 17-6 или 54 в разных даташитах). потому у тебя таймер2 и работает чаще =)
и это - зачем останавливать таймер на время обрабатывания прерывания? так у тебя накапливается ошибка со временем.

Страница 2 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/