CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
alex-wolf
Открыл глаза
Сообщения: 63
Зарегистрирован: Сб мар 09, 2013 21:46:01
Откуда: Уфа
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение alex-wolf »

WiseLord писал(а):Максимальное значение восьмибитного (unsigned) числа не 256, а 255. Если добавить 1, будет 256, а это единица (она "выпадает" из восьми бит) и 8 нулей, что равносильно 0.
отсчет ведется от 0, а не от 1
как раз и получается
в цефр = как мы считаем
0 = 1
1 = 2
2 = 3
...
255 = 256
больше 256 происходит перенос , а переносить некуда, регистр обнуляется
Реклама
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Re: CodeVision AVR в вопросах и ответах

Сообщение pashaumnov »

друзья помогите с расчетами. нужно посчитать таймер 0 в тини 13. задача следующая делаю часы , необходимо высчитать сколько тиков будет сделано в одну секунду. тактируем от внутреннего генератора частота 9,6мгц. расчет надо сделать для двух вариантов таймер нормал, и таймер по совпадению.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18556
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение ARV »

pashaumnov писал(а):делаю часы ... тактируем от внутреннего генератора частота 9,6мгц
часы будут так себе, за сутки ошибаться будут минут на 20.

в чем у вас проблема?

вот вариант расчета:
1. используем самый большой из доступных предделителей таймера 1024. то есть таймер считать будет с частотой 9600000/1024=9375 Гц.
2. если работать по переполнению таймера, то прерывание по переполнению будет возникать с частотой 9375/256=36,62109375 Гц. число очень неудобное, значит, необходимо использовать программный пересчет с режимом СТС
3. 9375 делится нацело на 3, 5, 15, 25, 75, 125, 375, 625 и 1775. разумеется, для 8-битного таймера можно использовать значение только меньше 255, поэтому выбираем любое из подходящих и таким образом настраиваем режим СТС. пусть будет самое большое из возможных 125. тогда прерывание по совпадению будет возникать с частотой 9375/125=75 Гц, т.е. 75 раз в секунду.
4. заводим дополнительный программный однобайтный счетчик в обработчике прерываний, и этим самым счетчиком каждое прерывание считаем до 75 - как досчитали, значит, прошла "ровно" секунда.

если не хотите режим СТС, то надо попробовать поступить аналогично, подобрав такие значения предделителя и программного счетчика, чтобы в итоге получить целые числа, как результат деления. но сразу скажу, результат будет хуже, т.к. программные счетчики уже не будут однобайтными, а значит, обработчик прерывания будет более сложным, а в attiny13 и так мало места.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Re: CodeVision AVR в вопросах и ответах

Сообщение pashaumnov »

спасибо то что нужно. убегать будут я корректировку програмно сделаю каждый час и еще милисекунды накопившиеся за день тоже корректировать буду. а вот вопрос еще с шаговым двигателем четыре контакта от флопи дисковода , который двигает головку вперед назад. распиновку вроде бы нашел а вот с какой частотой нужно подавать 1 на контакты просто вывовдить 1 попеременно на каналы или использовать задержку. а еще я шкиф когда доставал руками крутанул и вот интересно он теперь заведется ??
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: CodeVision AVR в вопросах и ответах

Сообщение COKPOWEHEU »

Да вы герой! Корректировать уход частоты генератора от напряжения питания, температуры и погоды на Марсе, да еще по таким хитрым алгоритмам, что будет достаточно коррекции всего раз в час, а не непрерывной. Может расскажете электронщикам об этом волшебном алгоритме, а то они дураки кварцы ставят и мучаются с термокомпенсацией и различием у разных производителей, да еще конденсаторы по ногам подбирают.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18556
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение ARV »

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

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Re: CodeVision AVR в вопросах и ответах

Сообщение pashaumnov »

нет нет часы это я образно выразился . девайс следующий это устройство которое будет включать и выключать свет в аквариуме. при включении кнопкой меню входим в установку реального времени , с начало минуты затем часы, потом устанавливаем время включения и выключения . оно устанавливается только часами минуты мне тут не важны. при выключении устройства из сети значения включения и выключения записываются в память. что бы при включении осталось только настроить часы. поэтому точность тут мне не важна.так небольшая корректировка. пол часа туда пол часа сюда погоды для рыбок не сделают.))) я понимаю что для часов необходим кварц. ну а тут мне нужно просто приблизительный отсчет времени . в дальнейшем планирую перекинуть это все на мегу 8 и прикрутить туда еще и шаговик , с его помощью буду так же рыбок кормить. возможно к меге прикручу и семисигментник если освою(((( как бы разбираюсь сам да с помощью таких хороших и умных людей как вы. вот с таймером боле менее стало понятно. с шаговиком думаю будет посложнее . с семисигментником тоже придется повозиться . с массивами еще не работал и как выводить из массива по событию нужную информацию не знаю.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: CodeVision AVR в вопросах и ответах

Сообщение COKPOWEHEU »

Так и начали бы делать сразу на ATmega8, неужели вам жалко места на плате. Там и таймеров побольше, и выводы для кварца найдутся, и выходную переферию есть куда повесить.
Для света в аквариуме возможно стоит использовать фотодатчик. Если нет готового, сойдет обычный диод в стеклянном корпусе, светодиод или транзистор со спиленной крышкой.
Ну и с индикацией разобраться стоит пораньше, на ней сможете проверять остальную программу - выводить значения переменных, например.
Работа с массивами лучше расписана в книгах по "компьютерному" Си - Кернигана и Ричи, хотя бы. Специфичное для контроллеров разве что модификатор volatile, если переменная или массив используется в прерывании и основной программе, да указание расположить константу во флеш-памяти, если надо (пока, наверное, не надо).
L.O.D
Встал на лапы
Сообщения: 139
Зарегистрирован: Чт фев 11, 2016 18:35:37

Re: CodeVision AVR в вопросах и ответах

Сообщение L.O.D »

COKPOWEHEU писал(а):Специфичное для контроллеров разве что модификатор volatile, если переменная или массив используется в прерывании и основной программе, ...
Это не специфика м/к, это общий для всех применений случай.
- Из овощей я больше всего люблю пельмени... © Соседский Мальчик
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: CodeVision AVR в вопросах и ответах

Сообщение Vov123 »

Так, на всякий случай, для любителей минимализма:
http://ru.aliexpress.com/item/4-Digit-L ... wVersion=1
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Re: CodeVision AVR в вопросах и ответах

Сообщение pashaumnov »

У меня просто очень много тинек.да и на нем мне полегче осваивать си.люблю миниатюрные вещи даже делал трехслойные платы.ещё не люблю когда остаётся много не используемой памяти в мк. Хотя я впервые столкнулся с тем что мне ещё не хватило.изначально планировалось в память занести время включения и выключение.но по ходу пьессы я разгулялся и что то добавлял уже при написании программы.фотодатчик тут не подходит.например зимой темнеет очень рано к примеру в комнате в 6 вечера уже тёмно.а свет нужен скажем часов до 9 вечера. И как быть с включением света в комнате.тоже будет вносить ненужные включения.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: CodeVision AVR в вопросах и ответах

Сообщение COKPOWEHEU »

L.O.D писал(а):Это не специфика м/к, это общий для всех применений случай.
Конечно, но программируя для компьютера об этом можно еще долго не узнать, тогда как в МК без этого нельзя.
На счет фотодатчика я и не говорил, что включать подсветку надо синхронно с ним. Скорее, считать суммарную освещенность за день, а ночью включать на оставшееся время.
L.O.D
Встал на лапы
Сообщения: 139
Зарегистрирован: Чт фев 11, 2016 18:35:37

Re: CodeVision AVR в вопросах и ответах

Сообщение L.O.D »

COKPOWEHEU писал(а):
L.O.D писал(а):Это не специфика м/к, это общий для всех применений случай.
Конечно, но программируя для компьютера об этом можно еще долго не узнать, тогда как в МК без этого нельзя.
Ситуации, в которых нужен void, абсолютно одинаковы, что в компьютерах, что в м/к, поэтому "долго не узнать" будет одинаковой протяженности для всех указанных случаев. :dont_know:
- Из овощей я больше всего люблю пельмени... © Соседский Мальчик
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: CodeVision AVR в вопросах и ответах

Сообщение COKPOWEHEU »

При чем здесь void? Я писал про volatile. Он важен разве что в прерываниях, которые на ПК используются гораздо реже, чем на МК.
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Re: CodeVision AVR в вопросах и ответах

Сообщение pashaumnov »

Тоесть если какая либо переменная находится в прерывании то обьявляем ещё как volatile. А если переменная в eprom?? И сколько памяти ест этот volatile??
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: CodeVision AVR в вопросах и ответах

Сообщение uk8amk »

То есть если переменная используется для перечачи информации между прерыванием и основной программой, то обязательно volatile.
Кушает памяти ровно столько как и любая другая переменная. Разница только в оптимизации доступа к такой переменной.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18556
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение ARV »

uk8amk писал(а):volatile.
Кушает памяти ровно столько как и любая другая переменная. Разница только в оптимизации доступа к такой переменной.
не совсем. volatile явно потребует больше памяти для работы с нею, т.к. по сути означает отсутствие оптимизации при работе с нею.
например:

Код: Выделить всё

var = a + a + а + а;
если переменная а обычная, то компилятор считает ее значение в регистр(ы) и сделает сдвиг на 2 влево, т.е. умножит на 4. если же переменная volatile, то она будет четырежды считана в регистры. если это переменная long, то можете прикинуть, сколько регистров это потратит, сколько тактов.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
L.O.D
Встал на лапы
Сообщения: 139
Зарегистрирован: Чт фев 11, 2016 18:35:37

Re: CodeVision AVR в вопросах и ответах

Сообщение L.O.D »

COKPOWEHEU писал(а):При чем здесь void? Я писал про volatile.
И я про него, но T9, мелкий пакостник, заменил на void. :))) Так что, все по-прежнему - и в мэйнфрейме, и в персоналке, и в планшете, и, наконец, в микроконтроллере, указывая сишный квалификатор volatile, мы запрещаем компилятору строить какие-либо предположения о содержании переменной, чтобы не "соптимизировал" лишнего сдуру.
COKPOWEHEU писал(а):... volatile. Он важен разве что в прерываниях, ...
Ни в коем случае не только в прерываниях! Это необходимо тогда, когда значение объекта данных модифицируется непредсказуемым (для компилятора) образом - помимо прерывания, это может быть регистр ввода/вывода или переменная, модифицируемая кодом, находящимся вне поля зрения компилятора, или даже в поле его зрения, но работающим асинхронно. Все эти ситуации никак не ассоциированы с м/к и частота их возникновения связана не с платформой, а с задачей.
COKPOWEHEU писал(а):... в прерываниях, которые на ПК используются гораздо реже, чем на МК.
Вероятно, это так в вашей практике, но это не означает, что и вообще на ПК прерывания (или регистры ввода/вывода, или событийное программирование) используются реже, чем на м/к. Такие дела. :)
- Из овощей я больше всего люблю пельмени... © Соседский Мальчик
Аватара пользователя
gdoom
Прорезались зубы
Сообщения: 213
Зарегистрирован: Ср дек 15, 2010 14:37:38

Re: CodeVision AVR в вопросах и ответах

Сообщение gdoom »

Товарищи подскажите, что то не могу понять. Делаю простой счётчик вот к примеру код для mega8^

Код: Выделить всё

#include <mega8.h>

#asm
   .equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
int s = 0;

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
   s++;
   if(s>59)
   {
      s=0;
   }
   
  TCNT1H=0;
  TCNT1L=0;
}

void main(void)
{

TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E;
OCR1AL=0x85;

TIMSK=0x10; 

lcd_init(8);

#asm("sei")

while (1)
      {
       lcd_gotoxy(0,0);  
        lcd_putchar(s/10+0x30);
        lcd_putchar(s%10+0x30);
      };
}

- как видите на ногах B висит жки - частота 8Мгц работает всё, секунды считает.
Но вот когда пишу для tiny2313 молчит, вот код:

Код: Выделить всё


#include <lcd.h>
#include <tiny2313.h>
 
#asm
   .equ __lcd_port=0x18 ;PORTB
#endasm


int s = 0;

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
   s++;
   if(s>59)
   {
      s=0;
   }
   
  TCNT1H=0;
  TCNT1L=0;
}

void main(void)
{
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E;
OCR1AL=0x85;

TIMSK=0x10; 

lcd_init(8);

#asm("sei")
while (1)
      {
        lcd_gotoxy(0,0);  
        lcd_putchar(s/10+0x30);
        lcd_putchar(s%10+0x30);
      }
}
- где ошибка подскажите пожалуйста?
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: CodeVision AVR в вопросах и ответах

Сообщение COKPOWEHEU »

Еще раз. На ПК необходимость в volatile возникает при работе с прерываниями и многопоточными программами. То есть далеко не сразу после освоения helloworld'а. А на контроллерах прерывания идут сразу после мигания диодом. Разумеется, речь не про самые основы, а про программирование на ЯВУ.
Если бы вы учили человека программированию для ПК и МК в какой момент рассказывали бы про тот же volatile?
Ответить

Вернуться в «AVR»