roboforum.ru

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

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

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

rig » 09 фев 2009, 20:04

расшифровать чтоли.
если операция побитовое И (&) перемножаю по битно получаю
Код: Выделить всёРазвернуть
0b10000000
0b10000010
---------------
0b10000000


если операция побитовое или (|) складываю по битно получаю
Код: Выделить всёРазвернуть
0b10000000
0b10000010
---------------
0b10000010

примерно так

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

ALHIMIK » 09 фев 2009, 20:19

Странная штука-
в Лебедеве нашёл формулу расчёта периода пререполнения таймера
LaTeX: T0=n(Nm-N0)/F
где T0-период переполнения
n - предделитель
Nm - максимальное значение таймера+1такт на сброс ФФ->0
N0 - начальное значение
F - тактовая частота
считаю делитель 1 тактовая частота 7.3728МГц Nm-65536 N0-59715 и период получается 789 мкС задаю
TCNT1H=E9;
TCNT1L=43;
А период получается 35 мС В чём ошибка ?

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

rig » 09 фев 2009, 20:42

очевидно в программе

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

ALHIMIK » 09 фев 2009, 20:57

Код: Выделить всёРазвернуть
TCCR1A=0x00;
TCCR1B=0x01;
TCNT1H=0xE9;
TCNT1L=0x43;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
while(1)
{
while(!(TIFR&1<<2));
      TIFR&=1<<2;
      PORTD.7++;
      while(!(TIFR&1<<2));
      TIFR&=1<<2;
};

Вот часть кода период переключения 35.2мС вместо 1.578 мС разница 20 раз HELP

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

rig » 09 фев 2009, 21:25

может воспользоваться мастером кода, ктож его поймет что надо. если используется тамер то зачем while? пользуем прерываения
кодевижен посоветовал так для меги 32й
Код: Выделить всёРазвернуть
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer 1 value
TCNT1H=0xE9;
TCNT1L=0x43;
// Place your code here
PORTD.7++;   // дергаем ногой по переполнению таймера
}

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0xE9;
TCNT1L=0x43;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;


Добавлено спустя 5 минут 13 секунд:
ALHIMIK писал(а):while(1)
while(1)
{
while(!(TIFR&1<<2));
      TIFR&=1<<2;
      PORTD.7++;
      while(!(TIFR&1<<2));
      TIFR&=1<<2;
};


что хотел получить то , чет не пойму.

Добавлено спустя 1 минуту 24 секунды:
админы, добавьте уже подсказку как язык тэгу коде указать, я опять все забыл. по подобию URL

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

ALHIMIK » 09 фев 2009, 21:29

НЕ здесь именно задержка нужна прерывание по таймеру уже есть да ёще прерывания скорей всего будят :roll:
а использовать nop не хочется это как то не спортивно :)

Добавлено спустя 3 минуты 45 секунд:
Выкладываю полный фаил а то у вас больно бурная фантазия :oops:
Вложения
dalnometr on TSOP 1738.rar
Исходник и проекты
(49.29 КиБ) Скачиваний: 6

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

rig » 09 фев 2009, 22:21

Bit 2 – TOV1: Timer/Counter1, Overflow Flag
если я правильно понял то этот бит переполнения таймера

Код: Выделить всёРазвернуть
 while(!(TIFR&1<<2));  // ждем когда бит 2 станет единицей, тоесть переполнение TIFR&0b00000100
      TIFR&=1<<2;        // обнуляем все кроме 2 бита потому что см выше. хотя по идее надо обнулить только 2й бит
      PORTD.7++;         // инверсия ноги
      while(!(TIFR&1<<2));   // ждем переполнения таймера а с чего ему переполняться? он не запущен
      TIFR&=1<<2;             // обнуляем все кроме 2 бита

сброс ноги это так
TIFR=TIFR&(~(1<<2))
  (1<<2) =>0b00000100
~(1<<2) =>0b11111011
TIFR&0b11111011 => обнулим 2й бит. както так.


и ваще я б скобок понаставлял, а то непонятно с какая операция приоритетней сдвиг или логическое &

тяжело это курить даташит 8) . ваще лучше на курс сходить, там это разжевано.

Добавлено спустя 2 минуты 48 секунд:
ну все, я устал :o

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

ALHIMIK » 09 фев 2009, 22:28

Чтобы обнулить этот бит нужно записать в него еденицу Батенька :Bravo:
Регистр TIFR содержит в себе ТОЛЬКО ФЛАГИ ПРЕРЫВАНИЙ а запись while(!(TIFR&1<<2)) в TIFR не чего не записывает
Чтобы запустить таймер нужно изменить биты Cksel которые находятся в TCCR1B :P
А здесь я сбрасывал ФЛАГ записывая в него 1

Добавлено спустя 2 минуты 29 секунд:
А операция сдвига и меет большей приоритет чем & и =

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

rig » 09 фев 2009, 23:02

ну вот сам все умеешь, что тогда притворяешься?
хотя едеиничку яб записывал так
Код: Выделить всёРазвернуть
 TIFR= TIFR|(1<<2);

пришлось Евстигнеева читать, казалось бы зачем ?

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

ALHIMIK » 10 фев 2009, 12:05

ещё учусь до умея далеко НО не работает как надо :shock:

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

slavaslx » 10 фев 2009, 14:51

Может кто знает как обращаться к битам какойто перееменной в CV, не используя конструкцию здвига ---(...N<<6...)--- (например как обращаемся к регистрам контроллера PORTA.1=0;...):

Чтобы было как то так (это конечно не работает):
bit Z, X;
u.c. value=0xff;
Z=value.1; // т.е. битовой переменной присвоить значение бита №1 переменной value.
X=value.2; // т.е. битовой переменной присвоить значение бита №2 переменной value.

Может есть какойто оператор типа : Z=znachenie_bita_#1_peremenoi.VALUE_....
В хелпе КВ не нашел...

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

rig » 10 фев 2009, 14:53

кстати таймер инициализировать после каждого цикла ни кто не отменял. В прерывание это автоматом подставляется, а ежели сам то сам должен задать начало отсчета иначе по кругу с нуля считать будет.
Код: Выделить всёРазвернуть
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer 1 value
TCNT1H=0xE9;   <- вот об этом
TCNT1L=0x43;   <- вот об этом
// Place your code here
}

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

avr123.nm.ru » 10 фев 2009, 14:59

slavaslx писал(а):Может кто знает как обращаться к битам какойто перееменной в CV, не используя конструкцию здвига ---(...N<<6...)--- (например как обращаемся к регистрам контроллера PORTA.1=0;...):

Конечяно знает и написал даже для разных компиляторов и универсальную форму:
http://avr123.nm.ru/z1.htm

Кстати на 1 странице этого топика !

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

ALHIMIK » 10 фев 2009, 15:35

Чудеса 2 rig СПАСИБО заработало

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

avr123.nm.ru » 10 фев 2009, 15:43

ALHIMIK писал(а):Чудеса 2 rig СПАСИБО заработало

Интересно как вы "это чудо" в задачах 1 и 6 про тамеры не увидели ???


Rambler\'s Top100 Mail.ru counter