Страница 18 из 111
Добавлено: Вт июл 21, 2009 11:58:04
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;
}
Добавлено: Вт июл 21, 2009 12:52:28
smac
Kisik писал(а):
Вот , самая простая мигалка, если я эти delay-и поставлю в текст Main, то работать будет, если так как здесь, то задержки пропадают.
...
А оно вообще компилится? По идее не должно, ибо функцию delay_1s нужно использовать так
Добавлено: Вт июл 21, 2009 13:19:08
Kisik
smac писал(а):
А оно вообще компилится? По идее не должно, ибо функцию delay_1s нужно использовать так
Ура!!! Огромное спасибо! Вот что значит заассемблированность и запаскалированность мышления.

компилятор ошибок не выдавал, только ворнинги, statement with no effect, и выкидывал нафиг эти задержки.Теперь работает.Буду учиться дальше.

Добавлено: Вт июл 21, 2009 20:17:47
ARV
Kisik писал(а):Буду учиться дальше.

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

вы хоть поняли, почему у вас не работало все, хотя компилятор не выдавал ошибок? или просто "проехали"? тогда это не учеба...
Да, нашел кое-какую инфу по этому поводу. Скобки являются оператором вызова функции, имя которой указано.Нет вызова - нет и кода, только ворнинги. Непонятно почему разработчики компилятора не поставили эту проблему в разряд синтаксических ошибок.

Добавлено: Ср июл 22, 2009 11:00:11
ARV
без скобок у вас получается указатель на функцию. синтаксис Си допускает использование "упоминания" в коде любого имени переменной (указатель - та же переменная), т.е. такой код допустим:
ясное дело, что для этого примера такое упоминание действительно бессмысленно, и будет потому с ворнингом выброшено компилятором. иное дело, если будет написано
в этом случае в код будет вставлено считывание переменной. ворнинг останется скорее всего, однако в данном случае это может иметь глубокий смысл: например, считывание переменной
UDR однозначно меняет ее содержимое

то есть простое упоминание в тексте программы этой переменной хоть и выглядит бессмысленным, но на самом деле может существенно изменить логику работы програмы.
собственно, это главное.
Добавлено: Ср июл 22, 2009 12:35:09
Kisik
Спасибо,
ARV !
Получается неправильную информацию нашел

Добавлено: Вт июл 28, 2009 09:03:28
TechMike
Не получается банально мигать светодиодами на портах mega16 в winavr 2008г.в., нужна помощь.
Если делаю вот так с портами:
Код: Выделить всё
#define led_error_on (PORTB|=_BV(PB3)) // ставим PINB3 в 1
#define led_error_off (PORTB&= ~_BV(PB3)) // ставим PINB3 в 0
В результате состояние порта не меняется при вызове
Если делать вот так:
Код: Выделить всё
#define led_error_on (PORTB|=(1<<3)) // ставим PINB3 в 1
#define led_error_off (PORTB&=(~(1<<3))) // ставим PINB3 в 0
То МК периодически сбрасывается при вызове
и установить какую-либо зависимость сброса и дерганья портами не удалось, проект уже разросся весь исходник смотреть долго... Всегда использовал уже много лет конструкцию по второму посту и все работало, но сейчас какая то мистика, симуляция в Avr Studio отрабатывает без проблем, но в железе все не так, JTAG отладчика нет.
Настроены порты вот так:
Код: Выделить всё
DDRB=0b11111110; //делаем выходами все порты PINB кроме 0.
PINB=0b00000001; //выводим на все выходы PORTB 0, кроме 0
PORTB=0b00000001; // и подягиваем на +питания PORTB 0.
Как правильно дергать ногами?
Добавлено: Вт июл 28, 2009 10:18:57
ARV
разбирайтесь с мистикой.
разницы между PORTB |= _BV(PB3) и PORTB |= 1<<PB3 нет никакой абсолютно. явно ни к зависаниям, ни к сбросам это иметь отношения не может.
на сколько я понимаю, запись в PINB бессмысленна.
Добавлено: Вт июл 28, 2009 10:54:20
smac
ARV писал(а):разбирайтесь с мистикой.
на сколько я понимаю, запись в PINB бессмысленна.
Если я правильно помню, то в меге запись в PINB действительно бессмыслена. Однако я точно помню, что есть тиньки, у которых при записи в любой из битов PINх единцы состояние соответствующего бита в регистре PORTх меняется на противоположное (вот собственно посмотрел в даташит на тини13А - так и есть).
Добавлено: Вт июл 28, 2009 11:26:38
TechMike
ARV писал(а):разбирайтесь с мистикой.
разницы между PORTB |= _BV(PB3) и PORTB |= 1<<PB3 нет никакой абсолютно. явно ни к зависаниям, ни к сбросам это иметь отношения не может.
на сколько я понимаю, запись в PINB бессмысленна.
Уже два вечера разбираюсь, к сожалению безуспешно, никогда такого не было в прописных истинах.
Как все таки для GCC, правильно "дергать" выходом?
Добавлено: Вт июл 28, 2009 11:30:51
ARV
да вот так и дергать, как вы делаете. и GCC тут вовсе ни при чем вообще
Добавлено: Вт июл 28, 2009 19:05:59
Yellow Tiger
TechMike, я бы посоветовал сначала, в качестве проверки, вывести в порт не результат вычисления выражения (мало ли, какие там очепятки имеются), а константу, можно по таймеру или циклом выводить меандр двумя константами - если не сработает и этот железный метод, то нужно будет добавить перед инструкциями вывода инструкции перевода PORTB в режим вывода:
- если после этого все заработает, значит порт либо не был правильно проинициализирован, либо его в какой-то момент времени какой-то участок кода (или сброс) инициализирует иначе,
- если же не заработает, то придется предположить, что порт или весь камень неработоспособны.
Добавлено: Чт июл 30, 2009 17:40:23
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;
}
Добавлено: Чт июл 30, 2009 18:32:12
smac
Kisik писал(а):Еще есть вопросик, теперь по прерываниям.
...
Не знаю точно, но может быть проблема в том, что Вы не указываете или неправильно указываете контроллер, из-за чего получается неправильная таблица векторов прерываний. Также, может быть, проблема в том, что Вы описывает обрабочик прерывания как возвращающий что-то. Вопрос к Вам - как Вы думаете куда возвратит обработчик прерывания то число 0?
И одно замечание, не знаю какой версии у вас WinAVR, но в нынешних версиях обрабочик прерывания лучше оформлять так:
Добавлено: Чт июл 30, 2009 18:44:40
ARV
кроме сказанного smac-ом добавлю следующее:
1. signal.h подключать не надо, если подключается interrupt.h. signal - вообще устаревший модуль, не рекомендуемый к дальнейшему применению.
2. для вашей программки stdio.h не требуется. фраза про битые инклюды непонятна.
3. return в обработчике прерываний не нужен.
Добавлено: Пт июл 31, 2009 07:34:55
Kisik
ARV писал(а):кроме сказанного smac-ом добавлю следующее:
1. signal.h подключать не надо, если подключается interrupt.h. signal - вообще устаревший модуль, не рекомендуемый к дальнейшему применению.
Подключение обоих модулей я копирую из книжки Шпака по Си
2. для вашей программки stdio.h не требуется. фраза про битые инклюды непонятна.
Движок форума режет их так, что не поймешь что там написано.
Вы тоже как-то в этой теме упоминали этот момент
3. return в обработчике прерываний не нужен.
Это я методом научного тыка пытаюсь избавиться от некоторых ворнингов. В той обстановке , при которой я пытаюсь Си изучать, глубоко обдумать и хорошенько поискать не получается, параллельно выполняю свою работу.
Приду , сразу попробую выполнить рекомендации. Спасибо Вам, Коты
Попутно есть еще поблема: при первых попытках компиляции проекта, постоянно и несистематически вылетает ошибка:
Отсутствует Target для создания *.elf файла.
После нескольких манипуляций (но не изменений, просто пару пересохранений) Makefile а также перезагрузок самого Programmers Notepad-а или создания пустого файла *.elf (причем не всегда это помагает, приходится экспериментировать в AVRStudio) она пропадает и все начинает компилиться. Проект который нормально компилился после команды Make Clean перестал компилиться с выбросом этой же ошибки.
Добавлено: Пт июл 31, 2009 17:36:36
Kisik
smac
И одно замечание, не знаю какой версии у вас WinAVR, но в нынешних версиях обрабочик прерывания лучше оформлять так:
Код:
ISR (TIM1_OVF_vect )
{PORTA ^=0xFF;
}
Спасибо, пошло как надо, правда вектор пришлось другой ставить.По этому поводу еще вопросик: в книжке Евстифеева "Микроконтроллеры семейства Mega" написано что в режиме "сброс при совпадении" Timer_1 выставляет флаг переполнение в момент сброса в ноль , но судя по симуляциям и работе живого проца это не так

, выставляются только при достижении максимума флаги OCF1A и ICF1, да и в даташите вроде не упоминается флаг переполнения или я не прав?
Добавлено: Пт июл 31, 2009 18:34:49
ARV
я вам очень советую не читать во время ужина советских газет... о чем это я? да, вот о чем: читайте не книжки, которые мало того, что устарели по информации, так еще и ошибок кучу содержат, а читайте даташиты и доки по компилятору.
для WinAVR отлично все описано в доке, входящей в комплект: и про оформление прерываний, и про остальное... А по поводу флагов таймера вот что скажу (вы и сами можете это прочесть в даташите): флаг переполнения, как следует из самого названия, устанавливается в том случае, когда происходит переполнение счетчика, а не его досрочный сброс (при совпадении - режим СТС).
Добавлено: Пн авг 03, 2009 09:48:25
TechMike
TechMike писал(а):ARV писал(а):разбирайтесь с мистикой.
разницы между PORTB |= _BV(PB3) и PORTB |= 1<<PB3 нет никакой абсолютно. явно ни к зависаниям, ни к сбросам это иметь отношения не может.
на сколько я понимаю, запись в PINB бессмысленна.
Уже два вечера разбираюсь, к сожалению безуспешно, никогда такого не было в прописных истинах.
Как все таки для GCC, правильно "дергать" выходом?
Мистика улетучилась, перекинул светодиоды с PORTB на PORTD, поставил вместо 7805 КР142ЕН5, по входу крена 100мкф, по выходу к керамике еще 10мкф и пока полет нормальный....