roboforum.ru

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

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

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

boez » 09 ноя 2010, 02:47

А чего, такого чуда как внешние метки кодевиженский ассемблер не понимает? Гнутый скажем ассемблер все неизвестные метки считает внешними. Так что из ассемблерного файла "видны" сишные переменные и функции. И не надо как в каменном веке адреса ручками писать (и вообще знать, куда потом линкер какие переменные сложит)

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

Webspider » 17 ноя 2010, 21:19

Проблема с AT45db161
Использую 8выводную версию в SOIC. Питание 3.5 ( и для памяти и для МК).
Почему то при откл. - вкл. питания в СТРАНИЦУ 1 (вторую то есть) пишется какой-то мусор поверх моих данных. что делать?
Хидер для памяти использую от avr123(спасибо :)).

Подскажите что в хидере и как надо поменять чтобы запись и чтение новой информации начиналась с 3ей страницы всегда?

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

kalexi » 09 фев 2011, 20:14

Здравствуйте, я хотел узнать: как рассчитать какая будет задержка между вызовом прерываний от таймера при частоте генератора 7МГц?

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

Michael_K » 09 фев 2011, 20:15

Какую настроите, такая и будет. Вопрос бессмысленный.

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

kalexi » 09 фев 2011, 20:28

Ладно, нужны формулы для расчета констант для таймера T0 Attiny13 или калькуляторы.

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

Radist » 09 фев 2011, 21:29

как рассчитать какая будет задержка между вызовом прерываний от таймера при частоте генератора 7МГц


Судя по вопросу, вы - новичок, поэтому я отвечу тоже "на пальцах". Таймер - такая штука, которая может считать тактовые импульсы и внешние импульсы. Остановимся пока на тактовых. Он считает их от того значения, которое в нем загружено (если обнулить таймер - то от нуля) до максимально возможного числа (если это 8 битный - то до 255, если 16 битный - то до 65535). У таймера есть такая штука, называется предделитель. Грубо говоря, он определяет каждый ли тактовый импульс надо считать. Можно считать каждый такт, можно каждый восьмой, шестнадцатый, шестьдесят четвертый, двести пятьдесят шестой, тысяча двадцать четвертый. Также у таймера есть несколько прерываний, вас пока интересуют прерывания по переполнению. Это прерывание надо разрешить в регистре масок прерываний таймеров. Также надо разрешить глобальные прерывания. Только после этого когда таймер переполнится, программа уйдет на вектор обработки прерывания от таймера. Соответственно там должен стоять безусловный переход на подпрограмму обработки прерывания, которая заканчивается не простым возвратом, а возвратом из прерывания.

Этой информации достаточно. Теперь вы можете все рассчитать сами. Удачи.

Добавлено спустя 1 минуту 53 секунды:
kalexi писал(а):нужны формулы для расчета констант для таймера T0 Attiny13 или калькуляторы.


Калькуляторы не нужны, а формулы выводятся при наличии понимания сути.

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

kalexi » 10 фев 2011, 00:30

2Radist
Спасибо за столь полный ответ, но к сожалению я это знаю. Просто есть одна проблема.
Допустим у меня ATtiny13 с 8-разрядным таймером, частота внутреннего генератора 1МГц.
Следовательно если OCR0A=200 и предделитель отключен, кол-во прерываний насчитывается следующим образом:
1 000 000Гц / 200 = 5 000Гц = 5Кц.

Теперь в Протеусе я запускаю симуляцию, но в динамиках слышу щелчки.

Добавлено спустя 4 минуты 15 секунд:
А, все, проблема решена. Просто не знал, что Протеус по умолчанию ставит частоту генератора равной 9,6Мгц.

Добавлено спустя 4 минуты 3 секунды:
Кстати, хотел спросить: нужно ли в основном цикле что-то писать (ну для уменьшения нагрузки на процессор), а то я видел функцию следующего вида, вот и пришла мне в голову эта мысль:
Код: Выделить всёРазвернуть
void sleep(){ int i; for (i=0; i; i++);}

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

flyroman » 26 фев 2011, 22:42

Ребят, а у меня 5 проводков прошивает atmega8 без питания контроллера - ЭТО НОРМАЛЬНО?

Добавлено спустя 15 секунд:
и читает и стирает и записывает

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

Vooon » 27 фев 2011, 00:27

Не хорошо так делать.
Паразитная запитка через защитные диоды.

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

bfrogg » 05 мар 2011, 01:05

Здравствуйте. Нужно сделать аппаратный ШИМ на Attiny2313. Немного почитал разные источники и вроде сделал 8-битный Fast PWM. Проверьте все ли правильно. Если да, то как мне сделать ФНЧ для этого ШИМа. Вообще задача состоит в том, чтобы управлять скоростью моторчиков у "робота".
Код: Выделить всёРазвернуть
   #define F_CPU 8000000UL  // указываем частоту в герцах
   
   #include <avr/io.h>
   #include <util/delay.h>

int main(void) // начало основной программы
{
   
   TCCR1A = (1<<COM1B1) | (1<<WGM10);
   TCCR1B = (1<<WGM12) | (1<<CS10);
   OCR1B = 50;
   DDRB |= (1<<PB4);
   
}

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

avr123.nm.ru » 09 мар 2011, 20:31

Зачем же ФНЧ для мотора ? Мотор сам является ФНЧ. ШИМ подайте на ключ как в задаче курса про ШИМ показано - http://www.proavr.narod.ru/z08.htm

А код проверьте в PROTEUS ! http://www.proteus123.narod.ru - И всегда его используйте. Там и модели моторов есть и привод с ОС ПИД есть.

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

Korbofos » 18 мар 2011, 15:01

Подскажите, что не так делаю?
Хочу запустить 36 кГц на таймере Attiny2313! С частотой вроде подгадал в протеусе с помощью ICC))) Почему, когда ногу конфигурирую ногу на вход на ней есть 1?
Код: Выделить всёРазвернуть
#include <TINY2313.H>
#include <delay.h>
#define ON_IR  DDRB.3 = 1
#define OFF_IR DDRB.3 = 0
void main(void)
{
PORTB = 0x00;
DDRB  = 0x09;
PORTD = 0x00;
DDRD  = 0x20;

//TCCR0B = 0x00; //stop timer   С Таймером_0 какие то странности
//TCNT0 = 0x91; //set count
//OCR0A = 0x6F; //set count
//OCR0B = 0x6F; //set count
//TCCR0A = 0x50; //start timer
//TCCR0B = 0x01; //start timer

TCCR1B = 0x00; //stop timer
TCNT1H = 0xFF; //set count value
TCNT1L = 0xE4;
OCR1AH  = 0x00; //set compare value
OCR1AL  = 0x1C;
OCR1BH  = 0x00; //set compare value
OCR1BL  = 0x1C;
TCCR1A = 0x53;
TCCR1B = 0x11; //start Timer
while (1)
{
ON_IR;
delay_us(600);
OFF_IR;
if (PIND.6 == 0){PORTB.0 = 1;}
else {PORTB.0 = 0;}
delay_us(8000);
}
}

Как бы по красивее сделать?

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

vadinator » 18 мар 2011, 15:18

единица будет, если включён внутренний подтягивающий резистор... название регистров не помню, но в ICC есть мастер настройки периферии, посмотрите там чекбоксы внимательно.

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

Korbofos » 18 мар 2011, 16:48

Подтяжка отключена

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

Korbofos » 18 мар 2011, 22:20

Кажется кусочки мозга уже выходят
Код: Выделить всёРазвернуть
#include <tiny2313.h>
#include <delay.h>
#define ON_IR TCCR0A = 0x50
#define OFF_IR TCCR0A = 0x00
// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Port B initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=Out Func2=Out Func1=In Func0=Out
// State7=T State6=T State5=T State4=0 State3=0 State2=0 State1=T State0=0
PORTB=0x00;
DDRB=0x1D;

// Port D initialization
// Func6=In Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=0 State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x20;

TCCR0B = 0x00; //stop timer
TCNT0 = 0x00; //set count
OCR0A = 0x6F; //set count
OCR0B = 0x6F; //set count
TCCR0A = 0x50; //start timer
TCCR0B = 0x01; //start timer

// 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: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;

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

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;

while (1)
      {
      ON_IR;
      delay_us(600);
      OFF_IR;
      delay_us(600);

      };
}

Оттак поехало


Rambler\'s Top100 Mail.ru counter