roboforum.ru

Технический форум по робототехнике.

МикроКонтроллер AVR начинающим - общие вопросы

Re: МикроКонтроллер AVR начинающим - общие вопросы

avr123.nm.ru » 10 авг 2010, 20:14

Кариёзный монстр писал(а): в качестве примеров там платка что автор самоучителя продает за 2500р, те тоже мимо(


Эту плату вы можете в PROTEUS собрать БЕСПЛАТНО !

У меня в начале курса - обучалка по AVR http://avr123.nm.ru еще ДО РЕКЛАМЫ :D есть ссылка на библиотеку книг по электронике - там есть много хороших книг.

Re: МикроКонтроллер AVR начинающим - общие вопросы

Кариёзный монстр » 11 авг 2010, 16:02

Эту плату вы можете в PROTEUS собрать БЕСПЛАТНО !

Кстати отличная мысль. Пусть не уверен, что получится такую сложную для меня плату собрать, попытка не пытка )
Вообще я нашел книжку "Самоучитель разработчика устройст на микроконтролерах AVR", там и си, и ассемблер есть. Сейчас по ней и учусь )) Сегодня приехал программатор и несколькими мк, попробую сделать традиционный бегущий огонек (: Главное справиться с самым сложным, схему собрать :)) Кстати очень забавно писать на си после лиспа, почти так же забавно как на лиспе после си =)

Re: МикроКонтроллер AVR начинающим - общие вопросы

galex1981 » 11 авг 2010, 16:16

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

Re: МикроКонтроллер AVR начинающим - общие вопросы

avr123.nm.ru » 11 авг 2010, 16:30

Все схему даже не надо в PROTEUS собирать, просто поместите мега16 на лист и большинство прог не потребуют вообще ничего добавлять в PROTEUS.

Обучалка PROTEUS - http://proteus123.narod.ru - кратко о работе в программе PROTEUS азы.

Re: МикроКонтроллер AVR начинающим - общие вопросы

radonv » 13 авг 2010, 23:12

Привет всем. Прошивал atmega16.. все было ок, диоды мигали. Натыкал паяльником,перепайвал у ножек. Включил не пашет. Подрубил к компу вылезла ошибка: FLASH contents mismatch at addres: 16h FLASH Read: 140h Buffer data: 940Ch ( ну вообщем адреса изменяются и ничего прошить немогу) Как быть? Жив ли контроллер?

Re: МикроКонтроллер AVR начинающим - общие вопросы

avr123.nm.ru » 13 авг 2010, 23:46

Наверно стирание перед прошивкой не включено у вас. "Эрайз чип" сделайте.

Re: МикроКонтроллер AVR начинающим - общие вопросы

Лавич » 16 авг 2010, 18:41

Прошу помочь разобраться с программой.
Хочу с ИК-пульта (протокол RC5) управлять светом в комнате используя тини13, но никак не могу разобраться с кодом. Нашел в сети несколько алгоритмов, но после подгонки под тини13 они не работают. В процессе отладки выяснил, что в обработчике прерываний по входу исполняются строки case 0 и if (not_korr == 1), а вот величина счетчика периодов таймера(Timer) не проходит условие для временнЫх пределов (проверка короткого промежутка и проверка длинного промежутка).
Пишу на Си в CVAVR. В чем я ошибся?
Код: Выделить всёРазвернуть
//частота 1МГц
#include <tiny13.h>
#include <delay.h>
#define tsop PINB.1
#define led PORTB.3
//Счетчик битов RC5
unsigned char sct_bit = 0;
//Буффер RC5
unsigned char rc5=0,rc5old=1;
//Временные пределы
#define Tmin 22 //длинный промежуток 22х64мкс=1.4мс
#define Tmax 35                   // 35х64мкс=2.2мс
#define TminK 11 //короткий промежуток 11х64мкс=0.7мс
#define TmaxK 19                  // 19х64мкс=1.2мс
//Флаг центра
unsigned char centre =  0;
//Флаг попадания в промежутки
unsigned char not_korr = 0;
//число в счетчике таймера
unsigned char Timer = 0;


// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
Timer = TCNT0; //запоминаем значение счетчика
TCNT0 = 0;     //обнуляем счетчик
not_korr = 1;
             
switch (sct_bit)   {
                  case 0:{
                        TCCR0B = 0x03; //запускаем таймер на частоте 15625 КГц (один такт 64мкс)
                        rc5 =!tsop;//записываем в эл.массива
                        sct_bit++;
                        centre = 1;
                        break;
                        }
                                 
                  case 13:{             // если бит последний то
                        TCCR0B = 0x00; //останавливаем таймер
                        TCNT0=0;
                        sct_bit = 0;             
                        led=1;   //зажигаем светодиод
                        rc5old=rc5;   
                        rc5=0;
                        };     
                  default:{

                        if ((Timer>TminK)&(Timer<TmaxK))   // проверка короткого промежутка
                                {
                                if (centre) {
                                        centre = 0;
                                        not_korr = 0;
                                        }
                                else {
                                        centre = 1;
                                        rc5 = (rc5<<1)+!tsop;
                                        sct_bit++;
                                        not_korr=0;
                                        };
                                };     
                   
                        if ((Timer>Tmin)&(Timer<Tmax)){ // проверка длинного промежутка
                                rc5 = rc5<<1+!tsop;
                                sct_bit++;
                                not_korr = 0;
                                };
                                                 
                        if (not_korr == 1) {             // если не попали ни в один из промежутков то
                                TCCR0B = 0x00;
                                TCNT0 = 0;
                                sct_bit = 0;
                                rc5=0;                             
                                return;   
                                };                                                               
                        };
                   };
                             
}

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{   
                                       
                                       TCCR0B = 0x00;
                                       TCNT0 = 0;
                                       sct_bit = 0;
                                       rc5=0;
                                       
}

void main(void)
{

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=out Func2=In Func1=In Func0=in
// State5=T State4=T State3=0 State2=T State1=T State0=t
PORTB=0x00;
DDRB=0x08;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x40;
MCUCR=0x01;
GIFR=0x40;

// Global enable interrupts
#asm("sei")
led=!led;
delay_ms(100);
led=!led;
while (1)
      {
     
      };
}

Re: МикроКонтроллер AVR начинающим - общие вопросы

rishon » 16 авг 2010, 19:09

Подскажите пожалуйста можно ли решать разные задачи используя фронт и спад вх. импульса по одному из INT.
Спасибо

Re: МикроКонтроллер AVR начинающим - общие вопросы

avr123.nm.ru » 16 авг 2010, 20:14

Можно. Обработчик прерывания будет один - "по любому изменению", в нем надо анализировать ( например через if ) что произошло - спад или фронт.

Re: МикроКонтроллер AVR начинающим - общие вопросы

Лавич » 21 авг 2010, 18:42

Помогите советом.
Не могу установить нужную частоту на tiny13.
Написал простенькую программу мигания светодиодом в CVAVR:
Код: Выделить всёРазвернуть
#include <tiny13.h>
int n;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
        if (n==100){n=0;PORTB.3=!PORTB.3;}
        n++;
}

void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State5=T State4=T State3=0 State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x08;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 0,977 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;

// Global enable interrupts
#asm("sei")

while (1)
      {
       };
}

Частоту в Configure the project менял несколько раз от 1 Мгц до 9.6Мгц и все безрезультатно, а именно - светодиод мигает раз в 4-5 секунд, как будто частота МК стоит 100кГц. Фьюзы не трогал вообще.
В чем причина такого поведения?

Re: МикроКонтроллер AVR начинающим - общие вопросы

boez » 21 авг 2010, 19:15

Лавич писал(а):Помогите советом.
Не могу установить нужную частоту на tiny13.
В чем причина такого поведения?

Думаю в том, что
Лавич писал(а):Фьюзы не трогал вообще.

:)

Ведь тактовая определяется как раз фьюзами! Ну а также подключенным кварцем если он используется. А частота в проекте определяет всякие константы в программе, определяющие разные там делители уартов, задержки для delay_ms и т.п. Для правильной работы программы они обе должны совпадать. Но на приведенную прогу настройка в проекте видимо не влияет, поскольку в ней задержки и прочее не используются. Если я конечно при беглом взгляде чего-то не перепутал.

Re: МикроКонтроллер AVR начинающим - общие вопросы

Лавич » 21 авг 2010, 19:32

boez писал(а):
Лавич писал(а):Помогите советом.
Не могу установить нужную частоту на tiny13.
В чем причина такого поведения?

Думаю в том, что
Лавич писал(а):Фьюзы не трогал вообще.

:)

Хм, значит ли это то что данный МК без внешнего источника сигнала либо кварца может быть запрограммирован только на определенную частоту посредством фьюзов (9.8Мгц,4.6Мгц,128кГц) и я не смогу выставить на нем, например, 1Мгц?

Re: МикроКонтроллер AVR начинающим - общие вопросы

avr123.nm.ru » 21 авг 2010, 19:37

Не точно.

Re: МикроКонтроллер AVR начинающим - общие вопросы

boez » 21 авг 2010, 23:41

А, у 13-го это не совсем так. У него есть регулируемый делитель системного клока. То есть фузами выставляется источник - внешний (только генератор, кварц не поддерживается), 4.8, 9.6 и 128кГц. Еще фузами можно выбрать стартовое значение делителя - 1 или 8. А после всего этого - уже программой можно вписать делитель какой надо. В общем, внимательно читать страницы с 24 по 28.

Да, фузы источника - CKSEL0, CKSEL1 (не выставлять в 00!), делителя - CKDIV8. Регистр СLKPR.

Re: МикроКонтроллер AVR начинающим - общие вопросы

Лавич » 22 авг 2010, 09:05

Спасибо за помощь, boez.
До фузов я уже добрался и поигрался с ними, но не помогает, к тому же, они изначально были поставлены на 9.6кГц, а у меня все равно работает как на 128кГц. Делитель СLKPR я вообще не использую. Тиньки у меня две и у обеих такая проблема. Менял фузы ставя 4.8МГц, но даже разницы не почувствовал, причем сами фузы пишутся и читаюся верно после отключения-подключения к программатору (использую программатор Громова и UniProf для прошивки). У меня есть ещё Mega8535, у неё фузы стоят на 1МГц и с временными промежутками все в порядке.
Может тиньки бракованные и выкинуть мне их нафиг? :)


Rambler\'s Top100 Mail.ru counter