WinAvr в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
shootnikS
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср янв 05, 2011 17:51:35
Откуда: Пенза

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

Сообщение shootnikS »

Разобрался с обратным отсчетом, получился вот такой код:

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

void mugaga(volatile unsigned int arr[])
{
unsigned int tick=9999;
unsigned int num=7;
tick--;
unsigned int tmp=tick;
while( num >4 ){
arr[num]=tmp%10;
tmp=tmp/10;
num--;
}
}


Появился следующий трабл (надеюсь последний): Как настроить на синхронную работу 2 таймера счетчика на ATmega16A. Пожалуйста напишите код инициализации на WinAVR
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

shootnikS писал(а):Пожалуйста напишите код инициализации на WinAVR
когда я читаю подобные просьбы, сразу вспоминаю, как в первом классе соседка по парте объясняла учителю: "у меня палочки кривые, потому что я папиной ручкой писала - у него почерк кривой, вот и ручка пишет криво".

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

ваш полученный в муках код - ужасный...

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

void mugaga(volatile unsigned int arr[] /* это еще зачем?! */){
   unsigned int tick=9999;
   unsigned int num=7;
   
   tick--; // нафига?! сразу сделать tick = 9998; было нельзя?!

   unsigned int tmp=tick; // нафига?! tick у вас нигде более не используется, зачем его копировать в ДРУГУЮ переменную?!

   while( num >4 ){ // нафига?! начальное значение num известно, поэтому цикл ВСЕГДА будет прокручиваться 3 раза
                            // либо изначально не надо было 7 присваивать, либо с условием цикла что-то не то - где логика?!
      arr[num]=tmp%10;
      tmp=tmp/10;
      num--;
   }
}

и вообще, работа вашей функции ВСЕГДА равносильна следующему коду:

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

arr[7] = 8;
arr[6] = 9;
arr[5] = 9;
так что все ваши циклы и прочее - лишнее совершенно
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
shootnikS
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср янв 05, 2011 17:51:35
Откуда: Пенза

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

Сообщение shootnikS »

зачем так ругаться на мой вымученный алгоритм?))
Объясняю:
1.В функцию я передаю массив. т.к. я же хочу с ним работать))
2.tick - да, ошибся) Присваивался только для проверки, т.к. этот тик получается в процессе выполнения программы: bsd=step[4]*1000+step[5]*100+step[6]*10+step[7]; и передается в функцию Ftype_1(step, bsd);
3. tmp=tick, да нафига?)) :dont_know:
4. Логика здесь: я работаю с массивом на 8, мне нужно делать обратный отсчет второй половины массива (с эл. 5,6,7,8). Поэтому я прокручиваю цикл 4 раза (забыл написать tick>=4) и заполняю его с последнего элемента. Для устранения вопросов привожу функцию обратного отсчета из массива !4! элементов:

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

void Ftype_1(volatile unsigned int array[], unsigned int tick) {
   unsigned int num=3;
   tick--;   
  while(num){array[num]=tick%10;tick=tick/10; num--;}
 }


ЗЫ: массив уменьшается ровно на 1 и получается:

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

array[3] = 8;
array[2] = 9;
array[1] = 9;
array[0] = 9;

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

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

Сообщение ARV »

я не очень понял, что там за обратный отсчет вы затеваете, но я вам показал, что ваша функция всегда и безоговорочно делает только одно: заносит 3 числа в массив, причем заносимые числа всегда одинаковы и при миллионе вызовов этой функции будет миллион раз записаны одни и те же 3 числа на одни и те же места в массиве.

никакого отсчета я не увидел - его там и нет :)

P.S. если в массиве у вас лежат числа, обозначающие разряды десятичного числа, и вы хотите это многоразрядное "псевдочисло" уменьшать, то делать это надо совсем не так... и вообще, если мое предположение верно - не понятно, что это за задача у вас какая-то странная...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
shootnikS
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср янв 05, 2011 17:51:35
Откуда: Пенза

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

Сообщение shootnikS »

кнопками выставляем значение на нижнем индикаторе, кнопкой count вычитаем единичку)
Вложения
test3.rar
в Proteus прописать путь к hex-файлу
(33.26 КБ) 257 скачиваний
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

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

Сообщение R_ura »

Продолжаю разбираться с прерыванием.
Вот есть такая незамысловатая программка. Суть ее - в прерывании , каждую 1 млсек
инкрементируется cnt_S и устанавливается флаг прерывания int_1ms.
В основном цикле проверяется содержимое cnt_S, и при досчете до 1000 ( = 1 сек)
инвертируется вывод МК, т.е. мигает светодиод.
По флагу прерывания int_1ms в основном цикле также ведется подсчет кол-ва прерываний
до той же секунды ( 1000млсек) другим счетчиком cnt_1000ms, что вызывает мигание другого светодиода.
По идее светодиоды должны мигать одновременно , но почему-то от счетчика, инкрементируемого в самом прерывании светодиод мигает чаще...
Что здесь не так? Оба счетчика определены как volatile.

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

//   i n i t      TCNT0:
  TIMSK =(1<<TOIE0);  // Timer0 overflow interrupt enable
  TCCR0 = 3;          // Prescaller > ;0=STOP; 2=F/8; 3=F/64 4=F/256;
  cnt_S = 0;
  sei();
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 while(1)
    { 
       if (cnt_1000ms == 1000) cnt_1000ms = 0;   // clear conter 1ms
       if (int_1ms == 1)  cnt_1000ms ++;             // if interrupt. Ò0 - increment counter 1 sec
       int_1ms = 0;                                             // clear flag int_1ms
//.......................................................
      if (cnt_S == 1000)                         // if  1000ms -
         { InvBit(PORTC, 5);                    // invert. PIN C.5
            cnt_S = 0; };                               // clear   cnt_S

       if (cnt_1000ms ==1000)  InvBit(PORTA, 0); // if  1000ms - invert. PIN A.0

   }; 
   return (0);
}

//*****************************************************************
 
 ISR (TIMER0_OVF_vect)
    { 
       cnt_S ++ ;     
        TCNT0 = 0x06 ;                                 // interrupt 1ms
      int_1ms = 1;                             // set flag int_1ms
    }
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Возможно, кому-то будет интересно... я разместил свои труды про WinAVR & Co...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

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

Сообщение stas00n »

ARV, спасибо, должно быть полезно. А продолжение после публикации будет, или можно секретный авторский экземпляр получить? :))) :))) С автографом? :)))
fly2015
Родился
Сообщения: 1
Зарегистрирован: Вт янв 25, 2011 08:52:13

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

Сообщение fly2015 »

Подскажите, необходимо вывести десятичное число, к примеру 242, в двоичной форме это 11110010 , программа выводит в регистр 74HC595 с права налево, но мне необходимо чтобы программа его выводила с лева на право.Как это сделать уже весь мозг сломал.
Rusja2008
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн окт 06, 2008 15:51:58
Откуда: Черкассы

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

Сообщение Rusja2008 »

Вот если бы Вы привели кусок кода как делаете побитную передачу справа на лево, можно было бы и подсказать что то. :)
Не умееш - не берись, но не взявшись не научишся.
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

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

Сообщение inkHunter »

Прог. для передачи через UART
#include <avr/io.h>
#include <stdio.h>

int main (void)
{
int i=10;
UCSRB=(1<<RXEN)|(1<<TXEN);
UBRRL=0x33;
while (1)
{
printf ("i=i%\n\r",i);
}
}
Тестирую в протеусе но ничего не получаю на UART
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Victor Gordienko писал(а):Прог. для передачи через UART
#include <avr/io.h>
#include <stdio.h>

int main (void)
{
int i=10;
UCSRB=(1<<RXEN)|(1<<TXEN);
UBRRL=0x33;
while (1)
{
printf ("i=i%\n\r",i);
}
}
Тестирую в протеусе но ничего не получаю на UART

и не получите. в WinAVR для работы с консольным вводом-выводом надо создать функции ввода-вывода байтов, указать их при инициализации потока стандартного ввода-вывода, и только потом пользоваться функциями printf-scanf

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

Мой уютный бложик... заходите!
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

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

Сообщение inkHunter »

ARV писал(а):
Victor Gordienko писал(а):Прог. для передачи через UART
#include <avr/io.h>
#include <stdio.h>

int main (void)
{
int i=10;
UCSRB=(1<<RXEN)|(1<<TXEN);
UBRRL=0x33;
while (1)
{
printf ("i=i%\n\r",i);
}
}
Тестирую в протеусе но ничего не получаю на UART

и не получите. в WinAVR для работы с консольным вводом-выводом надо создать функции ввода-вывода байтов, указать их при инициализации потока стандартного ввода-вывода, и только потом пользоваться функциями printf-scanf

ранее я давал ссылочку о моем переводе доки WinAVR - скачайте, почитатйте... описание stdio.h идет здесь

Нашел пример с книги Программирование на языке С для AVR и PIC микроконтроллеров (Шпак Ю.А., 2006)

// putchar.c

#include <avr/io.h>
#include <stdio.h>

int main (void)
{
const char str[] = "12345";
int i;
UBRR = 25;
UCR = 0x18;
i = 0;
while (1)
{
if (i > 4) i = 0;
putchar(str[i]);
}
}


Не работает, что тоже нужно создать функции ввода-вывода байтов, но ведь вроде с киниги должно 100 % работать ... ????
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

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

Сообщение lix »

режимы портов на хосте и МК точно совпадают?
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

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

Сообщение inkHunter »

lix писал(а):режимы портов на хосте и МК точно совпадают?

да, в протеусе вложено .
Вложения
uart.rar
(11.53 КБ) 236 скачиваний
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

я вам, по-моему, четко изложил, что надо сделать... а вы снова за шпака хватаетесь... кто такой - этот шпак? дядя ваш - шпак? (почти О.Бендер) мой вам совет - не читайте плохих книг (почти проф.Преображенский) :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

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

Сообщение alexval2006 »

в проге на CV встретилась такая строчка
code [cnt_bit] = !PIND.2; //записываем бит кода, PIND.2 - входная нога, прерывание 0
как выглядит её аналог в WinAVR ?
code [cnt_bit] = !(((PIND) >> (2)) & 0x01); // ???
ktmp
Родился
Сообщения: 14
Зарегистрирован: Пн янв 24, 2011 10:50:02

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

Сообщение ktmp »

Пр! А может кто-нибудь пояснить отличие 20090313 от 20100110, в частности по работе с eeprom?

Собсно, чего спрашиваю: столкнулся с непонятками. Делаю проект в Code::Blocks, довольно давно (собственного makefile нет, настройки компилятора и линкера - рабочие; mega8535, winavr-20100110). Почти все готово, но понадобилось поработать с eeprom. Не вопрос, #include <avr/eeprom.h> и далее по мануалу. Но не тут-то было.

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

eeprom_read_block( (void*)&set_value, (void*)2, SCHED_STORE_LENGTH);
for( i=0; i<SCHED_STORE_LENGTH; i++ ){
    set_value[i]=eeprom_read_byte((void*)2+i);
}
if( eeprom_is_ready() ) i++;

Поясню: сначала я безмятежно вызвал в коде eeprom_read_block, линкер ругнулся
obj\Debug\main.o||In function `main':|
D:\HPMon\main.c|470|undefined reference to `__eerd_block_m8535'|

Хм, ну ладно. Убрал вызов eeprom_read_block, заменил его циклом, в котором читаю по байтам. Все хорошо, компилится. Т.к. проц уже под завязку, откладываю работу с eeprom и иду шерстить внешние библиотеки, выкидывать из них ненужные функции и сокращать возможности. Спустя какое-то время ковыряния во внешних библиотеках проект опять перестает компилиться:
obj\Debug\main.o||In function `main':|
D:\HPMon\main.c|473|undefined reference to `__eerd_byte_m8535'|

Что за? Убираю вызов eeprom_read_byte, добавляю вызов eeprom_is_ready просто для того чтобы убедиться в работоспособности библиотеки - нормально. Возвращаю назад вызов eeprom_read_* - ошибки. Переставляю winavr - ошибки. Гуглю - ноль результатов (проблема у человека на avrfreaks - не в счет, там косяк visual studio был). Параллельно установил winavr-20090313, подменил его вместо 20100110 - о, проект скомпилился без ошибок. Проверил, вернул назад 20100110 - ошибки. Правда, в железе пока не проверял, код для eeprom, кроме этих двух тестовых вызовов eeprom_read_*, я еще не писал.
В чем прикол такого поведения? Ведь нареканий на avr-libc не было, в проекте куча работающих include типа delay, io, pgmspace, interrupt... Неужели потребовался год разработки avr-libc, чтобы добавить косяков в функции eeprom? Или это не проблема avr-libc и winavr?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

alexval2006 писал(а):в проге на CV встретилась такая строчка
code [cnt_bit] = !PIND.2; //записываем бит кода, PIND.2 - входная нога, прерывание 0
как выглядит её аналог в WinAVR ?
code [cnt_bit] = !(((PIND) >> (2)) & 0x01); // ???
вот так:

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

code[cnt_bit] = !(PIND & _BV(PD2));
хотя может и иначе - смотря по тому, что там у вас за массив code[], какой его смысл...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

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

Сообщение alexval2006 »

это из статьи http://radiokot.ru/articles/16/
а вот то что я накодил http://alexval2007.ucoz.ru/dowanloads/RC5.zip
Ответить

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