Страница 36 из 111
Re: WinAvr в вопросах и ответах
Добавлено: Ср янв 12, 2011 13:48:03
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
Re: WinAvr в вопросах и ответах
Добавлено: Ср янв 12, 2011 16:30:40
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--;
}
}
и вообще, работа вашей функции ВСЕГДА равносильна следующему коду:
так что все ваши циклы и прочее - лишнее совершенно
Re: WinAvr в вопросах и ответах
Добавлено: Ср янв 12, 2011 20:51:09
shootnikS
зачем так ругаться на мой вымученный алгоритм?))
Объясняю:
1.В функцию я передаю массив. т.к. я же хочу с ним работать))
2.tick - да, ошибся) Присваивался только для проверки, т.к. этот тик получается в процессе выполнения программы: bsd=step[4]*1000+step[5]*100+step[6]*10+step[7]; и передается в функцию Ftype_1(step, bsd);
3. tmp=tick, да нафига?))
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;
Но есть же циклы?))
Re: WinAvr в вопросах и ответах
Добавлено: Ср янв 12, 2011 21:00:35
ARV
я не очень понял, что там за обратный отсчет вы затеваете, но я вам показал, что ваша функция всегда и безоговорочно делает только одно: заносит 3 числа в массив, причем заносимые числа всегда одинаковы и при миллионе вызовов этой функции будет миллион раз записаны одни и те же 3 числа на одни и те же места в массиве.
никакого отсчета я не увидел - его там и нет
P.S. если в массиве у вас лежат числа, обозначающие разряды десятичного числа, и вы хотите это многоразрядное "псевдочисло" уменьшать, то делать это надо совсем не так... и вообще, если мое предположение верно - не понятно, что это за задача у вас какая-то странная...
Re: WinAvr в вопросах и ответах
Добавлено: Чт янв 13, 2011 13:56:43
shootnikS
кнопками выставляем значение на нижнем индикаторе, кнопкой count вычитаем единичку)
Re: WinAvr в вопросах и ответах
Добавлено: Сб янв 15, 2011 23:29:32
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
}
Re: WinAvr в вопросах и ответах
Добавлено: Вс янв 16, 2011 17:14:52
ARV
Возможно, кому-то будет интересно... я разместил свои труды про
WinAVR & Co...
Re: WinAvr в вопросах и ответах
Добавлено: Сб янв 22, 2011 17:37:15
stas00n
ARV, спасибо, должно быть полезно. А продолжение после публикации будет, или можно секретный авторский экземпляр получить?

С автографом?

Re: WinAvr в вопросах и ответах
Добавлено: Вт янв 25, 2011 09:03:01
fly2015
Подскажите, необходимо вывести десятичное число, к примеру 242, в двоичной форме это 11110010 , программа выводит в регистр 74HC595 с права налево, но мне необходимо чтобы программа его выводила с лева на право.Как это сделать уже весь мозг сломал.
Re: WinAvr в вопросах и ответах
Добавлено: Вт янв 25, 2011 12:05:29
Rusja2008
Вот если бы Вы привели кусок кода как делаете побитную передачу справа на лево, можно было бы и подсказать что то.

Re: WinAvr в вопросах и ответах
Добавлено: Пн фев 07, 2011 00:39:43
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
Re: WinAvr в вопросах и ответах
Добавлено: Пн фев 07, 2011 08:14:23
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 идет
здесь
Re: WinAvr в вопросах и ответах
Добавлено: Пн фев 07, 2011 10:04:39
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
);
}
}
Не работает, что тоже нужно создать функции ввода-вывода байтов, но ведь вроде с киниги должно 100 % работать ... ????
Re: WinAvr в вопросах и ответах
Добавлено: Пн фев 07, 2011 10:14:44
lix
режимы портов на хосте и МК точно совпадают?
Re: WinAvr в вопросах и ответах
Добавлено: Пн фев 07, 2011 10:48:56
inkHunter
lix писал(а):режимы портов на хосте и МК точно совпадают?
да, в протеусе вложено .
Re: WinAvr в вопросах и ответах
Добавлено: Пн фев 07, 2011 13:07:23
ARV
я вам, по-моему, четко изложил, что надо сделать... а вы снова за шпака хватаетесь... кто такой - этот шпак? дядя ваш - шпак? (почти О.Бендер) мой вам совет - не читайте плохих книг (почти проф.Преображенский)

Re: WinAvr в вопросах и ответах
Добавлено: Вт фев 08, 2011 21:54:21
alexval2006
в проге на CV встретилась такая строчка
code [cnt_bit] = !PIND.2; //записываем бит кода, PIND.2 - входная нога, прерывание 0
как выглядит её аналог в WinAVR ?
code [cnt_bit] = !(((PIND) >> (2)) & 0x01); // ???
Re: WinAvr в вопросах и ответах
Добавлено: Ср фев 09, 2011 01:34:36
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?
Re: WinAvr в вопросах и ответах
Добавлено: Ср фев 09, 2011 08:44:00
ARV
alexval2006 писал(а):в проге на CV встретилась такая строчка
code [cnt_bit] = !PIND.2; //записываем бит кода, PIND.2 - входная нога, прерывание 0
как выглядит её аналог в WinAVR ?
code [cnt_bit] = !(((PIND) >> (2)) & 0x01); // ???
вот так:
хотя может и иначе - смотря по тому, что там у вас за массив code[], какой его смысл...
Re: WinAvr в вопросах и ответах
Добавлено: Ср фев 09, 2011 21:47:48
alexval2006