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

Обсуждаем контроллеры компании Atmel.
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

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

Сообщение R_ura »

ARV писал(а):и вправду, чертовщина у вас какая-то... пригласите попа с кадилом, пусть освятит вашу лабораторию, ибо я вот только что в студии просимулировал этот код (только поменял PORTA на PORTB, т.к. у меня заточено на atmega8) - работает, ё! как и было обещано. так что это у вас лыжи неправильные :)))

Лыжи таки оказались неправильные..))) Заменил проц - все заработало... Спасибо..
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

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

Сообщение radio-kot »

А писали что на Паскале работал ?

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

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

Сообщение shootnikS »

Как правильно работать с массивами в WinAVR?

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

#define F_CPU 3686400UL 
 #include <avr/io.h>
 #include <util/delay.h>
 #include <avr/interrupt.h>
 

 unsigned char step[2];
 unsigned int i;
   
void temp(){
i++;
step[i]++;}   

ISR(TIMER0_OVF_vect){

 if(!(PIND & (1<<PIND5))){
   temp();
   }
TCNT0=0x00;
   };
   
   int main(void)             

TIMSK=(0<<TOIE0);
TCCR0=(0<<CS00)|(0<<CS01)|(1<<CS02);

DDRD = 0x0F;
PORTD|=_BV(PD5);

PORTC=0x70;
DDRC=0x0F;
     
sei();

while (1) {   

PORTC=step[0];
_delay_ms(1);

PORTC=step[1];
_delay_ms(1);

}; }   


При "0" на пятой линии порта D из T0 вызывается функция temp, которая должна изменить номер и значение элемента массива на 1. Значения массива step должны выводится в порт С.
Сие действие не получается. Почему??
ЗЫ Не смотрите на смысловую нагрузку, ее нет, мне важен сам принцип, почему не изменяется номер и значение массива step?
Последний раз редактировалось shootnikS Вс янв 09, 2011 10:28:00, всего редактировалось 1 раз.
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

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

Сообщение radio-kot »

winavr наверно тоже не видит смысловой нагрузки и оптимизирует жестко.

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

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

Сообщение ARV »

ну и алгоритмик :(
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение shootnikS »

не нравится?
volatile действительно помог
можно пару ссылочек для изучения WinAVR и его особенностей, только начал))
Смотрим в эту тему))
viewtopic.php?f=20&t=40373
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

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

Сообщение radio-kot »

Изучите примеры в самом WinAVR
Будете проходить мимо- проходите!
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

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

Сообщение TICLIR »

ARV писал(а):вот как-то так.

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

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

Сообщение ARV »

не обязательно, но желательно.
очистку надо производить только в том случе, если произошло значительное изменение проекта, например, поменялись коренным образом 2 из 12 файлов проекта. в этом случае студия может "забыть" о том, что надо пересобрать все файлы, и проект будет ошибочным. в общем, студия иной раз коники выкидывает, тут не поспоришь. поэтому если вы собрали проект, который работать должен, а он не работает - начните с Make Clean и только потом выискивайте ошибки.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

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

Сообщение TICLIR »

ARV писал(а):не обязательно, но желательно.

Спасибо. Вот функцию обязательно объявлять.

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

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

Сообщение shootnikS »

Столкнулся с такой банальной на первый взгляд проблемой, как разложить, например число 1567 в массив а={1,5,6,7}. За помощь буду очень признателен. Естественно на WinAVR
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

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

Сообщение radio-kot »

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

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

Сообщение shootnikS »

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

int buffer[3];
int  num=123;
itoa(num,buffer,10);


Я правильно понял? Запишет num=123 в массив buffer[1,2,3], в 10-ой системе?

Помогите с алгоритмом: имеется a={1,2,3,4,9,9,9,9} Нужно организовать обратный отсчет второй половины массива по действию, т.е.:

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

a={1,2,3,4,9,9,9,9}
PORTA|=_BV(PA0);       
PORTA&=~_BV(PA0);
a={1,2,3,4,9,9,9,8}
PORTA|=_BV(PA0);       
PORTA&=~_BV(PA0);
a={1,2,3,4,9,9,9,7}
...........................
a={1,2,3,4,0,0,0,0}


хотел сделать так:

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

temp=a[4]*1000+a[5]*100+a[6]*10+a[7];
temp--;
itoa(temp,array,10);

Организовываем число, отнимаем еденицу, обратно записываем в массив. Не получилось обратно записать его во вторую половину массива((.
at0m
Родился
Сообщения: 9
Зарегистрирован: Сб июл 04, 2009 09:33:45

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

Сообщение at0m »

Подскажите, как сделать массив указателей на биты регистра? Требуется провернуть что-то типа a[0] = 1 где a[0] был бы PORTx PDy.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

itoa запишет в массив СИМВОЛЫ десятичного числа, чтобы получить ЦИФРЫ надо потом из всех НЕНУЛЕВЫХ элементов массива ВЫЧЕСТЬ символ '0' - получите желаемое.

понятия БИТ в языке Си не существует: минимальная адресуемая единица данных - БАЙТ, поэтому сделать массив битов НЕВОЗМОЖНО. в С++ есть средства, которые позволяют сделать ПОЧТИ ТО, ЧТО ХОЧЕТСЯ, но во-первых, чтобы понять КАК это делается - надо иметь голову с крайне редкими мозгами, а во-вторых, это все равно будет не МАССИВ.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
at0m
Родился
Сообщения: 9
Зарегистрирован: Сб июл 04, 2009 09:33:45

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

Сообщение at0m »

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

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

Сообщение shootnikS »

так? или может проще:

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

for (int i=0; i<8; i++)
{
 if(a[i]>0){a[i]=a[i]-'0';}
}


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

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

Сообщение ARV »

shootnikS писал(а):так? или может проще:

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

for (int i=0; i<8; i++)
{
 if(a[i]>0){a[i]=a[i]-'0';}
}


помогите пожалуйста с этим обратным отсчетом, весь проект встал((

все так, но не забудьте про размер буфера и предварительный вызов itoa() ну и для проверки я бы просто использовал if(a[i])
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

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

Сообщение lix »

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

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

Сообщение shootnikS »

Товарищи, помогайте:
не получается сделать обратный отсчет с помощью itoa();
PD5,PD6,PD7 кнопки управления индикаторами. (>>, up, down)
По нажатию PD4 должен организовываться обратный отсчет на нижнем индикаторе (9999, 9998, 9997 и т.д.)
В реальности показывает какую-то чушь((
Выкладываю проект в Proteus v.7.7 sp2 и исходник в WinAVR.
Вложения
проект.rar
В Proteus пропишите путь к hex-файлу
(53.96 КБ) 240 скачиваний
Ответить

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