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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Kisik
Родился
Сообщения: 10
Зарегистрирован: Пт июл 17, 2009 10:26:33

Сообщение Kisik »

Сергей69 писал(а):Приведи текст этой маленькой программы.


Вот , самая простая мигалка, если я эти delay-и поставлю в текст Main, то работать будет, если так как здесь, то задержки пропадают.

#include <avr>
#include <stdio>
#include <util>
#include <inttypes>
void delay_1s(void)
{ _delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
}

int main (void)
{
DDRA=0xFF;
while (1)
{
PORTA=0xFF;
delay_1s;
PORTA =0;
delay_1s;
}
return 0;
}
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Kisik писал(а):Вот , самая простая мигалка, если я эти delay-и поставлю в текст Main, то работать будет, если так как здесь, то задержки пропадают.
...

А оно вообще компилится? По идее не должно, ибо функцию delay_1s нужно использовать так

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

delay_1s();
Аватара пользователя
Kisik
Родился
Сообщения: 10
Зарегистрирован: Пт июл 17, 2009 10:26:33

Сообщение Kisik »

smac писал(а):А оно вообще компилится? По идее не должно, ибо функцию delay_1s нужно использовать так

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

delay_1s();


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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Kisik
Родился
Сообщения: 10
Зарегистрирован: Пт июл 17, 2009 10:26:33

Сообщение Kisik »

ARV писал(а):
Kisik писал(а):Буду учиться дальше. :)))
вы хоть поняли, почему у вас не работало все, хотя компилятор не выдавал ошибок? или просто "проехали"? тогда это не учеба...


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

Сообщение ARV »

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

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

int var;
var;
ясное дело, что для этого примера такое упоминание действительно бессмысленно, и будет потому с ворнингом выброшено компилятором. иное дело, если будет написано

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

volatile int var;
var;
в этом случае в код будет вставлено считывание переменной. ворнинг останется скорее всего, однако в данном случае это может иметь глубокий смысл: например, считывание переменной UDR однозначно меняет ее содержимое :) то есть простое упоминание в тексте программы этой переменной хоть и выглядит бессмысленным, но на самом деле может существенно изменить логику работы програмы.

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

Мой уютный бложик... заходите!
Аватара пользователя
Kisik
Родился
Сообщения: 10
Зарегистрирован: Пт июл 17, 2009 10:26:33

Сообщение Kisik »

Спасибо, ARV !
Получается неправильную информацию нашел :shock:
TechMike
Прорезались зубы
Сообщения: 247
Зарегистрирован: Сб дек 15, 2007 23:00:54
Откуда: Moscow
Контактная информация:

Сообщение TechMike »

Не получается банально мигать светодиодами на портах mega16 в winavr 2008г.в., нужна помощь.
Если делаю вот так с портами:

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

#define led_error_on (PORTB|=_BV(PB3)) // ставим PINB3 в 1 
#define led_error_off (PORTB&= ~_BV(PB3)) // ставим PINB3 в 0
В результате состояние порта не меняется при вызове

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

led_error_on;
led_error_off;


Если делать вот так:

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

#define led_error_on (PORTB|=(1<<3)) // ставим PINB3 в 1 
#define led_error_off (PORTB&=(~(1<<3))) // ставим PINB3 в 0



То МК периодически сбрасывается при вызове

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

led_error_on;
led_error_off;

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

Настроены порты вот так:

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

DDRB=0b11111110; //делаем выходами все порты PINB кроме 0.
PINB=0b00000001; //выводим на все выходы PORTB 0, кроме 0
PORTB=0b00000001; // и подягиваем на +питания PORTB 0.

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

Сообщение ARV »

разбирайтесь с мистикой.

разницы между PORTB |= _BV(PB3) и PORTB |= 1<<PB3 нет никакой абсолютно. явно ни к зависаниям, ни к сбросам это иметь отношения не может.

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

Мой уютный бложик... заходите!
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

ARV писал(а):разбирайтесь с мистикой.

на сколько я понимаю, запись в PINB бессмысленна.

Если я правильно помню, то в меге запись в PINB действительно бессмыслена. Однако я точно помню, что есть тиньки, у которых при записи в любой из битов PINх единцы состояние соответствующего бита в регистре PORTх меняется на противоположное (вот собственно посмотрел в даташит на тини13А - так и есть).
TechMike
Прорезались зубы
Сообщения: 247
Зарегистрирован: Сб дек 15, 2007 23:00:54
Откуда: Moscow
Контактная информация:

Сообщение TechMike »

ARV писал(а):разбирайтесь с мистикой.

разницы между PORTB |= _BV(PB3) и PORTB |= 1<<PB3 нет никакой абсолютно. явно ни к зависаниям, ни к сбросам это иметь отношения не может.

на сколько я понимаю, запись в PINB бессмысленна.


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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

TechMike, я бы посоветовал сначала, в качестве проверки, вывести в порт не результат вычисления выражения (мало ли, какие там очепятки имеются), а константу, можно по таймеру или циклом выводить меандр двумя константами - если не сработает и этот железный метод, то нужно будет добавить перед инструкциями вывода инструкции перевода PORTB в режим вывода:

- если после этого все заработает, значит порт либо не был правильно проинициализирован, либо его в какой-то момент времени какой-то участок кода (или сброс) инициализирует иначе,

- если же не заработает, то придется предположить, что порт или весь камень неработоспособны.
Аватара пользователя
Kisik
Родился
Сообщения: 10
Зарегистрирован: Пт июл 17, 2009 10:26:33

Сообщение Kisik »

Еще есть вопросик, теперь по прерываниям.
При выполнении такого кода в симуляторе AVRStudio и в живом проце происходит непонятная ерунда: при появлении прерывания от таймера программа перекидывается сначала на адрес 0x0008(как и положено), там стоит RJMP PC+0x0015, но начало подпрограммы обработки прерывания находится на 1 байт дальше.В итоге через еще пару прыжков оказываюсь в начале основного тела программы и обработка, естесственно не происходит. Как это побороть или что я неправильно сделал в проге? Спасибо.


#include avr/io.h //Тут я поубирал треугольные скобочки :(
#include stdio.h // а то из-за них инклуды битые
#include avr/signal.h
#include avr/interrupt.h
#define F_CPU 8000000UL

int INTERRUPT(SIG_OVERFLOW1)
{PORTA ^=0xFF;
return 0;
}

int main(void)
{DDRA=0xFF;
PORTA=0xFF;
OCR1A=30000;
TCCR1A=0;
TCCR1B=0x0B;
TIMSK=0x04;
sei();
while (1);
return 0;
}
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Kisik писал(а):Еще есть вопросик, теперь по прерываниям.
...

Не знаю точно, но может быть проблема в том, что Вы не указываете или неправильно указываете контроллер, из-за чего получается неправильная таблица векторов прерываний. Также, может быть, проблема в том, что Вы описывает обрабочик прерывания как возвращающий что-то. Вопрос к Вам - как Вы думаете куда возвратит обработчик прерывания то число 0?
И одно замечание, не знаю какой версии у вас WinAVR, но в нынешних версиях обрабочик прерывания лучше оформлять так:

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

ISR (TIM1_OVF_vect )
   {PORTA ^=0xFF;
   }
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

кроме сказанного smac-ом добавлю следующее:
1. signal.h подключать не надо, если подключается interrupt.h. signal - вообще устаревший модуль, не рекомендуемый к дальнейшему применению.
2. для вашей программки stdio.h не требуется. фраза про битые инклюды непонятна.
3. return в обработчике прерываний не нужен.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Kisik
Родился
Сообщения: 10
Зарегистрирован: Пт июл 17, 2009 10:26:33

Сообщение Kisik »

ARV писал(а):кроме сказанного smac-ом добавлю следующее:
1. signal.h подключать не надо, если подключается interrupt.h. signal - вообще устаревший модуль, не рекомендуемый к дальнейшему применению.

Подключение обоих модулей я копирую из книжки Шпака по Си


2. для вашей программки stdio.h не требуется. фраза про битые инклюды непонятна.

Движок форума режет их так, что не поймешь что там написано. :(
Вы тоже как-то в этой теме упоминали этот момент :(

3. return в обработчике прерываний не нужен.


Это я методом научного тыка пытаюсь избавиться от некоторых ворнингов. В той обстановке , при которой я пытаюсь Си изучать, глубоко обдумать и хорошенько поискать не получается, параллельно выполняю свою работу. :(

Приду , сразу попробую выполнить рекомендации. Спасибо Вам, Коты :)

Попутно есть еще поблема: при первых попытках компиляции проекта, постоянно и несистематически вылетает ошибка:
Отсутствует Target для создания *.elf файла.
После нескольких манипуляций (но не изменений, просто пару пересохранений) Makefile а также перезагрузок самого Programmers Notepad-а или создания пустого файла *.elf (причем не всегда это помагает, приходится экспериментировать в AVRStudio) она пропадает и все начинает компилиться. Проект который нормально компилился после команды Make Clean перестал компилиться с выбросом этой же ошибки.
Аватара пользователя
Kisik
Родился
Сообщения: 10
Зарегистрирован: Пт июл 17, 2009 10:26:33

Сообщение Kisik »

smac
И одно замечание, не знаю какой версии у вас WinAVR, но в нынешних версиях обрабочик прерывания лучше оформлять так:
Код:
ISR (TIM1_OVF_vect )
{PORTA ^=0xFF;
}


Спасибо, пошло как надо, правда вектор пришлось другой ставить.По этому поводу еще вопросик: в книжке Евстифеева "Микроконтроллеры семейства Mega" написано что в режиме "сброс при совпадении" Timer_1 выставляет флаг переполнение в момент сброса в ноль , но судя по симуляциям и работе живого проца это не так :o , выставляются только при достижении максимума флаги OCF1A и ICF1, да и в даташите вроде не упоминается флаг переполнения или я не прав?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

я вам очень советую не читать во время ужина советских газет... о чем это я? да, вот о чем: читайте не книжки, которые мало того, что устарели по информации, так еще и ошибок кучу содержат, а читайте даташиты и доки по компилятору.
для WinAVR отлично все описано в доке, входящей в комплект: и про оформление прерываний, и про остальное... А по поводу флагов таймера вот что скажу (вы и сами можете это прочесть в даташите): флаг переполнения, как следует из самого названия, устанавливается в том случае, когда происходит переполнение счетчика, а не его досрочный сброс (при совпадении - режим СТС).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
TechMike
Прорезались зубы
Сообщения: 247
Зарегистрирован: Сб дек 15, 2007 23:00:54
Откуда: Moscow
Контактная информация:

Сообщение TechMike »

TechMike писал(а):
ARV писал(а):разбирайтесь с мистикой.

разницы между PORTB |= _BV(PB3) и PORTB |= 1<<PB3 нет никакой абсолютно. явно ни к зависаниям, ни к сбросам это иметь отношения не может.

на сколько я понимаю, запись в PINB бессмысленна.


Уже два вечера разбираюсь, к сожалению безуспешно, никогда такого не было в прописных истинах.
Как все таки для GCC, правильно "дергать" выходом?


Мистика улетучилась, перекинул светодиоды с PORTB на PORTD, поставил вместо 7805 КР142ЕН5, по входу крена 100мкф, по выходу к керамике еще 10мкф и пока полет нормальный....
Ответить

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