Например TDA7294

Форум РадиоКот :: Просмотр темы - отладка в AVR на Си и моделирование Proteus проги с таймером
Форум РадиоКот
https://radiokot.ru/forum/

отладка в AVR на Си и моделирование Proteus проги с таймером
https://radiokot.ru/forum/viewtopic.php?f=20&t=48254
Страница 1 из 2

Автор:  sanshoy [ Пн май 16, 2011 04:48:23 ]
Заголовок сообщения:  отладка в AVR на Си и моделирование Proteus проги с таймером

Здравствуйте! У меня к вам вопрос. Вообщем, пишу не сложную прогу на Си в отладчике 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 все вроде прошивается но индикатор не мигает. В чем дело не знаю. Помогите пожалуйста!!!

Автор:  codenamehawk [ Пн май 16, 2011 20:19:14 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

После того как PORTB=0x01; у вас нигде нет PORTB=0x00;
В прерывании проверяйте что уже послано в порт и посылайте противоположенное значение.

Вместо INTERRUPT(...) используйте ISR(...)

Автор:  sanshoy [ Ср май 18, 2011 01:07:59 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

Спасибо за функцию ISR . Ошибок стало меньше. Но, только если вас не затруднит, не могли бы по подробнее описать то что вы начали - что После того как PORTB=0x01; у вас нигде нет PORTB=0x00;
В прерывании проверяйте что уже послано в порт и посылайте противоположенное значение.

это последние то что в Build было:

Build started 18.5.2011 at 02:02:54
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
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 0 warnings...

Автор:  codenamehawk [ Ср май 18, 2011 07:35:00 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

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

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

Насчет ошибок выложите проект.

Автор:  sanshoy [ Ср май 18, 2011 15:55:24 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

Да в правы он действительно постоянно горит. Программа вот такая:

#define F_CPU 4000000UL
#include <avr/io.h>
#include <avr/iom16.h>
#include <avr/interrupt.h>

ISR(SIG_OVERFLOW1)
{
PORTB=0x01;
}
int main(void)
{
DDRB=0x01;
TCCR1A=0x00;
TCCR1B=0x04;
TCNT1=61630;
TIFR=0x00;
TIMSK=0x04;
GICR=0;
sei();
while(1==1);
}

Дальше подумаю. Спасибо.

Автор:  sanshoy [ Ср май 18, 2011 16:41:47 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

Опробовал вот такой вариант, все равно постоянно горит:
#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 каждую секунду
}

Автор:  codenamehawk [ Ср май 18, 2011 19:46:35 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

sanshoy писал(а):
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, там видны сразу состояние счетчика, режим работы таймера.

Чем отличаются КОД от ПРОЕКТа?

Автор:  urry [ Чт май 19, 2011 08:43:45 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

Код:
#define F_CPU 4000000UL
#define DEL 1024
#define FOUT 1 // cek
#define TM  65536 - (F_CPU/DEL)/FOUT
#include <avr/io.h>
#include <avr/iom16.h>
#include <avr/interrupt.h>

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 каждую секунду

Автор:  sanshoy [ Чт май 19, 2011 17:24:05 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

codenamehawk проект это все файлы расширения .hex, .c, а код это то что я вам написал.Все равно спасибо огромное.
urry спасибо за код. Стало значительно лучше. Только мигает не каждую секунду, а каждые 5 секунд.

Автор:  urry [ Чт май 19, 2011 17:28:27 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

Не верю (С) Станиславский
Установите правильную частоту контроллера в протеусе. Период - 2 сек - сек работы + сек паузы.

Автор:  sanshoy [ Чт май 19, 2011 17:53:29 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

Все заработало спасибо. Только FOUT выставил 5 сек.

Автор:  sanshoy [ Чт май 19, 2011 18:21:52 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

у меня в протеусе русификатор лажает - какие то иероглифы не возможно что либо выставлять , а нормальный русификатор антивирусник определяет как вирус.....попрошу минутку.

Автор:  urry [ Чт май 19, 2011 21:54:42 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

Чудес не бывает. Даже в неисправном телевизоре работают законы физики. (с) подполковник Сухотский ЖВУРЭ
Ищите, что не так.
и прямо здесь напрашивается коррекция по алгоритму Брезенхема -при дробном значении делителя - это не больно - в одном случае секунда меньше, в другом больше, но в сумме..
И вы задолбали своим незнанием русского языка - слово несложная - пишется ВМЕСТЕ !
да, блядь, и поэтому - тоже ВМЕСТЕ.
----------
Ну реально достает... :(

Автор:  codenamehawk [ Чт май 19, 2011 22:19:54 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

sanshoy писал(а):
codenamehawk проект это все файлы расширения .hex, .c, а код это то что я вам написал.Все равно спасибо огромное.

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

То urry, дав полностью рабочий код, убиваете желание думать самому.

Код:
TCNT1+=TM;

так работать будет точнее
Код:
TCNT1=TM;

Автор:  urry [ Чт май 19, 2011 22:25:10 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

Вот сейчас меня забанят за мат....
И я не буду ни у кого отбивать желание :)
Код:
так работать будет точнее
Код:
TCNT1=TM;

ну как Вам сказать, чтоб не обидеть...

Автор:  codenamehawk [ Чт май 19, 2011 22:31:30 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

И зачем там плюс?
Чтоб работало медленнее?

Автор:  codenamehawk [ Чт май 19, 2011 22:35:50 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

urry писал(а):
ну как Вам сказать, чтоб не обидеть...

Меня может обидеть только тупое высказывание.

Автор:  urry [ Чт май 19, 2011 22:36:53 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

неа. Прерывание происходит не сразу - идет сохранение контекста, все дела, но в это время таймер все еще считает.
К моменту, когда мы добрались до до реального изменения по прерыванию, в нем уже что-то натикало от 0. Вот это все, что натикало, мы добавляем к просчитанному значению - и компенсируем сохранение контекста, сохранение в стеке след значения адреса...
Только первое значение прерывания будет неточным, остальные уже будут скомпенсированы.

Автор:  codenamehawk [ Чт май 19, 2011 22:56:27 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

urry писал(а):
неа. Прерывание происходит не сразу - идет сохранение контекста, все дела, но в это время таймер все еще считает.
К моменту, когда мы добрались до до реального изменения по прерыванию, в нем уже что-то натикало от 0. Вот это все, что натикало, мы добавляем к просчитанному значению - и компенсируем сохранение контекста, сохранение в стеке след значения адреса...
Только первое значение прерывания будет неточным, остальные уже будут скомпенсированы.

На вскидку, с параметрами этой задачи (4Mhz/1024), таймер не успеет тикнуть.
Посмотрю в студио для проверки.

Автор:  urry [ Чт май 19, 2011 23:01:21 ]
Заголовок сообщения:  Re: отладка в AVR на Си и моделирование Proteus проги с тайм

Критерий истины - практика (С) Карл Маркс
:)

навскидку тоже пишется вместе... :(

Брезенхем плачет по этой задаче - его условия прямо... Нестандартная частота деления, сказка короче...
Меня еще не забанили ?

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/