Заголовок сообщения: отладка в AVR на Си и моделирование Proteus проги с таймером
Добавлено: Пн май 16, 2011 04:48:23
Родился
Зарегистрирован: Пн май 16, 2011 04:08:52 Сообщений: 11
Рейтинг сообщения:0
Здравствуйте! У меня к вам вопрос. Вообщем, пишу не сложную прогу на Си в отладчике AVR Studio. Точнее, с умной книжки ее передрал. Я начинающий программист , по этому не судите строго. Вообщем задачка такая:(Называется: индикатор мигающий каждую секунду) . Значит. К выводу 0 порта B подключен светодиодный индикатор который должен переключаться каждую секунду. Это можно сделать с помощью прерывания по переполнению таймера. С помощью разрядов CS10-CS12 регистра TCCR1B устанавливается коэффициент деления частоты системной синхронизации таймера. Выбираем 1024, что соответствует значению 0b101 или просто 5. Таким образом, в случае рабочей частоты МК 4МГц, значение счетного регистра TCNT1 будет увеличиваться через каждые 1024/4000000=0,000256 c. Следовательно, надо установить такое стартовое значение счетчика, чтобы до его переполнения отсчитывалось 1/0.000256=3906 импульсов. Поскольку с помощью 16 разрядов счетчика предел 65535(0xFFFF), то он должен инициализироваться значением 65535-5906=61630..... ........ Программа такая: #define F_CPU 4000000UL #include <avr/io.h> #include <avr/iom16.h> #include <avr/interrupt.h> #include <avr/signal.h> INTERRUPT(SIG_OVERFLOW1) { TCNT1=0x10000-(F_CPU/1024); PORTB=0x01; } int main(void) { DDRB=0x01; TCCR1A=0; TCCR1B=0x05; TCNT1=0x10000-(F_CPU/1024); TIFR=0; TIMSK=0x04; GICR=0; sei(); while(1) ; }
Вопрос в том. 1) После написания программы прошивка выполнилась только по нажатию прошить со 2-го раза( то есть во второй раз errors-0,warnings-0),а в первый раз вышло: Build started 16.5.2011 at 05:37:58 avr-gcc -mmcu=atmega16 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT example_07.o -MF dep/example_07.o.d -c ../example_07.c In file included from ../example_07.c:5: C:/WinAVR/avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>." ../example_07.c:7: warning: return type defaults to `int' ../example_07.c: In function `INTERRUPT': ../example_07.c:7: warning: type of "__vector_8" defaults to "int" ../example_07.c:10: warning: control reaches end of non-void function avr-gcc -mmcu=atmega16 -Wl,-Map=example_07.map example_07.o -o example_07.elf avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature example_07.elf example_07.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex example_07.elf example_07.eep || exit 0 /usr/bin/sh: /c/winavr/bin/avr-objcopy: Invalid argument avr-objdump -h -S example_07.elf > example_07.lss /usr/bin/sh: /c/winavr/bin/avr-objdump: Invalid argument make: *** [example_07.lss] Error 126 Build failed with 1 errors and 4 warnings...
2) Я значит попытался проделать виртуальное моделирование этой проги в Proteus. Ни чего не выходит. Может схему ни так нарисовал, может дело все в том что компиляция выполнена не правильно. Схема значит такая :MK Atmega16 и индикатор подключен к выводу 0 порта B. В Proteus все вроде прошивается но индикатор не мигает. В чем дело не знаю. Помогите пожалуйста!!!
Заголовок сообщения: Re: отладка в AVR на Си и моделирование Proteus проги с тайм
Добавлено: Ср май 18, 2011 01:07:59
Родился
Зарегистрирован: Пн май 16, 2011 04:08:52 Сообщений: 11
Рейтинг сообщения:0
Спасибо за функцию ISR . Ошибок стало меньше. Но, только если вас не затруднит, не могли бы по подробнее описать то что вы начали - что После того как PORTB=0x01; у вас нигде нет PORTB=0x00; В прерывании проверяйте что уже послано в порт и посылайте противоположенное значение.
Но, только если вас не затруднит, не могли бы по подробнее описать то что вы начали -
В прерывании, в порт вы посылаете 1, скажем индикатор зажегся. В следующем прерывании вы снова в порт вы посылаете 1, но она там уже установлена, индикатор будет гореть все время.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: отладка в AVR на Си и моделирование Proteus проги с тайм
Добавлено: Ср май 18, 2011 16:41:47
Родился
Зарегистрирован: Пн май 16, 2011 04:08:52 Сообщений: 11
Рейтинг сообщения:0
Опробовал вот такой вариант, все равно постоянно горит: #define F_CPU 4000000UL #include <avr/io.h> #include <avr/iom16.h> #include <avr/interrupt.h> PORTB=0x00; ISR(SIG_OVERFLOW1) {
if (PORTB==0x00)// Если порт B в нулевом разряде имеет 0 то такой код { PORTB^=0x01; } else //либо в противном случае { PORTB=0x00; } } int main(void) { DDRB=0x01;// Настраиваем нулевой выход порта B на выход TCCR1A=0x00;// Т/С1 отключен от вывода ОС1, режим ШИМ отключен TCCR1B=0x04;//Коэффициент деления частоты системной синхронизации 1024 TCNT1=61630;//инициализируем значение счетного регистра равным 61630 TIFR=0x00;//Сбрасываем все флаги прерываний от Т/C1 TIMSK=0x04;// Разрешаем прерывание по переполнению счетного регистра Т/С1 GICR=0;//Запрет внешних прерываний sei();//Общее разрешение прерываний while(1==1);//Ожидаем прерывание от Т/С1 каждую секунду }
if (PORTB==0x00)// Если порт B в нулевом разряде имеет 0 то такой код }
Раз уж стоит протеус, то проверьте что даст считывание порта В. (А куда вы засунули PORTB=0x00; я молчу)
Попробуйте так
Код:
ISR(SIG_OVERFLOW1) { if ((PORTB & 0x01)==0)// Если порт B в нулевом разряде имеет 0 то такой код { PORTB=0x01; //Если правильно делать то PORTB |= (1<<0); } else //либо в противном случае { PORTB=0x00; //Если правильно делать то PORTB &= ~(1<<0); }
}
Чего не хватает, чтобы моргало каждую секунду, попробуйте найти сами. Работу таймера легко отследить при отладке в AVRStudio, там видны сразу состояние счетчика, режим работы таймера.
ISR(SIG_OVERFLOW1) { PORTB^=0x01; TCNT1+=TM; } int main(void) { DDRB=0x01;// Настраиваем нулевой выход порта B на выход TCCR1A=0x00;// Т/С1 отключен от вывода ОС1, режим ШИМ отключен //! TCCR1B=0x05;//Коэффициент деления частоты системной синхронизации 1024 //! PORTB=0x00; TCNT1=TM;//инициализируем значение счетного регистра равным 61630 TIFR=0x00;//Сбрасываем все флаги прерываний от Т/C1 TIMSK=0x04;// Разрешаем прерывание по переполнению счетного регистра Т/С1 GICR=0;//Запрет внешних прерываний sei();//Общее разрешение прерываний while(1==1);//Ожидаем прерывание от Т/С1 каждую секунду
Заголовок сообщения: Re: отладка в AVR на Си и моделирование Proteus проги с тайм
Добавлено: Чт май 19, 2011 17:24:05
Родился
Зарегистрирован: Пн май 16, 2011 04:08:52 Сообщений: 11
Рейтинг сообщения:0
codenamehawk проект это все файлы расширения .hex, .c, а код это то что я вам написал.Все равно спасибо огромное. urry спасибо за код. Стало значительно лучше. Только мигает не каждую секунду, а каждые 5 секунд.
Заголовок сообщения: Re: отладка в AVR на Си и моделирование Proteus проги с тайм
Добавлено: Чт май 19, 2011 18:21:52
Родился
Зарегистрирован: Пн май 16, 2011 04:08:52 Сообщений: 11
Рейтинг сообщения:0
у меня в протеусе русификатор лажает - какие то иероглифы не возможно что либо выставлять , а нормальный русификатор антивирусник определяет как вирус.....попрошу минутку.
Чудес не бывает. Даже в неисправном телевизоре работают законы физики. (с) подполковник Сухотский ЖВУРЭ Ищите, что не так. и прямо здесь напрашивается коррекция по алгоритму Брезенхема -при дробном значении делителя - это не больно - в одном случае секунда меньше, в другом больше, но в сумме.. И вы задолбали своим незнанием русского языка - слово несложная - пишется ВМЕСТЕ ! да, блядь, и поэтому - тоже ВМЕСТЕ. ---------- Ну реально достает...
codenamehawk проект это все файлы расширения .hex, .c, а код это то что я вам написал.Все равно спасибо огромное.
Проект это все файлы вместе и файлы для протеуса тоже. Так сразу видно где что неправильно написано или не те установки выбраны. Выложив проект, вы экономите время тех, кто пытается вам помочь.
То urry, дав полностью рабочий код, убиваете желание думать самому.
Код:
TCNT1+=TM;
так работать будет точнее
Код:
TCNT1=TM;
Последний раз редактировалось codenamehawk Чт май 19, 2011 22:25:57, всего редактировалось 1 раз.
неа. Прерывание происходит не сразу - идет сохранение контекста, все дела, но в это время таймер все еще считает. К моменту, когда мы добрались до до реального изменения по прерыванию, в нем уже что-то натикало от 0. Вот это все, что натикало, мы добавляем к просчитанному значению - и компенсируем сохранение контекста, сохранение в стеке след значения адреса... Только первое значение прерывания будет неточным, остальные уже будут скомпенсированы.
неа. Прерывание происходит не сразу - идет сохранение контекста, все дела, но в это время таймер все еще считает. К моменту, когда мы добрались до до реального изменения по прерыванию, в нем уже что-то натикало от 0. Вот это все, что натикало, мы добавляем к просчитанному значению - и компенсируем сохранение контекста, сохранение в стеке след значения адреса... Только первое значение прерывания будет неточным, остальные уже будут скомпенсированы.
На вскидку, с параметрами этой задачи (4Mhz/1024), таймер не успеет тикнуть. Посмотрю в студио для проверки.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения