Краткий Курс - программирование AVR - часть VII

 
1 2 3 4 5 6 7 12
+
-
edit
 

termostat

аксакал

Lioxa> Помогите кто может плс.
Lioxa> Есть два контроллера (мега8) с одного на другой надо передать информацию по USART.
Lioxa> Соеденил TX c RX установил одинаковый битрэйт. Посылаю одни числа получаю совсем другие, может кто знает что за фигня ? [»]

проверь прошивки в VMLAB. если у тебя не кварцы а внутр RC генераторы то тоже может быть такое.

=NIK=
NIK2

новичок
2 termostat
Попробовал пройдти урок 2
Не работает функции

putchar('R');
putchar('x');

У меня ICCAVR версии 7.03
 

=NIK=
NIK2

новичок
Извиняюсь.

Я имел ввиду урок 3
 
RU termostat #19.10.2005 19:01
+
-
edit
 

termostat

аксакал

Как не работает? всегда нужны подробности.

не компилируется или не выводит символы?


Должно работать и с новым компилятором.

Вот примеры которые идут с компилятором.

папка: iccv7avr\examples.avr

файлы: 8q.c и clock.c

и помощь:

iccv7avr\Help\ICCAVR\wwhelp\wwhimpl\js\html\wwhelp.htm
Это сообщение редактировалось 19.10.2005 в 19:22
RU termostat #19.10.2005 19:23
+
-
edit
 

=NIK=
NIK2

новичок
Вот текст программы которая не компелиться:
(Задача 03)

//ICC-AVR application builder : 18.10.2005 2:26:58
// Target : 2313

// Crystal: 3.6864Mhz


#include <io2313v.h>
#include <macros.h>
#include <stdio.h>

unsigned char crt;

void port_init(void)
{
PORTB = 0x00;
DDRB = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}

//TIMER0 initialize - prescale:1024
// desired value: 49.5Hz

// actual value: 50,000Hz (1,0%)

void timer0_init(void)
{
TCCR0 = 0x00; //stop timer
TCNT0 = 0xB8; //set count
TCCR0 = 0x05; //start timer
}

#pragma interrupt_handler timer0_ovf_isr:7
void timer0_ovf_isr(void)
{
//TIMER0 has overflowed
TCNT0 = 0xB8; //reload counter value
DDRB = 0x20;
PORTB = 0x20;
crt=0;
while(crt<200)
{
crt++;
}
PORTB = 0;

crt=0;

putchar('R');
putchar('x');

}

//UART0 initialize
// desired baud rate: 9600

// actual: baud rate:9600 (0,0%)

void uart0_init(void)
{
UCR = 0x00; //disable while setting baud rate
UBRR = 0x17; //set baud rate
UCR = 0x08; //enable
}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer0_init();
uart0_init();

MCUCR = 0x00;
GIMSK = 0x00;
TIMSK = 0x02;
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

void main(void)
{
init_devices();
while(1);
}



А вот что ICC пишет:
iccavr -c -e -D__ICC_VERSION="7.03A" -DAT90S2313 -l C:\icc\work\work.c
iccavr -o work -bfunc_lit:0x16.0x800 -dram_end:0xdf -bdata:0x60.0xdf -dhwstk_size:16 -beeprom:1.128 -fintelhex -S2 @work.lk

ERROR Function \'putchar\' not defined. This is a function that references


the device's IO register locations and must be compiled specifically
for the target device. You may find examples of this function for
different devices under the <install root>\examples.AVR directory.
C:\icc\bin\imakew.exe: Error code 1
Done: there are error(s). Exit code: 1
 

=NIK=
NIK2

новичок
Еще глупый вопрос:

Что делает МК при попадании в цикл while который находится в прерывании?
Я имею ввиду то что если причина выхода из цикла не в этом же прерывании. Т.е. ведь чтобы выйдти из цикла, надо выйдти из прерывания (т.к. флаг I аппаратно сбрасывается при входе в прерывание). То есть из прирывания он никогда не выйдет...

Что я не понял?
 

SAA

втянувшийся

=NIK=> Еще глупый вопрос:
=NIK=> Что делает МК при попадании в цикл while который находится в прерывании?
 


;) Жрет, гад, питание.

=NIK=> Я имею ввиду то что если причина выхода из цикла не в этом же прерывании.
 


Насколько я понял ты говоришь про while который в main. Это стандартный подход, т.е. загнал MCU в цикл из которого он выходит только на прерывание.

=NIK=> Т.е. ведь чтобы выйдти из цикла, надо выйдти из прерывания
 


:D , нет не так! "Что бы войти (вернуться) назад в цикл нужно выйти из прерывания.

=NIK=> (т.к. флаг I аппаратно сбрасывается при входе в прерывание). То есть из прирывания он никогда не выйдет...
 


Так на то есть reti который аппаратно флаг на место садит ;) А компилятор (ну по крайней мере GCC) понимает где просто процедура а где прерывание, и соотвественно раставляет ret или reti.

=NIK=> Что я не понял? [»]

Ну не знаю. Всего и я не в состоянии понтять - это нормально ;)
 

SAA

втянувшийся

Прошение прошу у NIK ;))

Что делает МК при попадании в цикл while который находится в прерывании?
 


Я отвечал помоему совсем про другое в предыдущем посту. Конечно если цикл безусловный, то выбраться он сможет из него только по RESET или WATCHDOG. Как ты верно заметил прерывания внутри обработчика прерываний запрещены, а значит вложенных прерываний не будет. Ну и все вообщем то приплыли.
 
+
-
edit
 

termostat

аксакал


=NIK=> !ERROR Function 'putchar' not defined. This is a function that references
=NIK=> the device's IO register locations and must be compiled specifically
=NIK=> for the target device. You may find examples of this function for
=NIK=> different devices under the <install root>\examples.AVR directory.
=NIK=> C:\icc\bin\imakew.exe: Error code 1
=NIK=> Done: there are error(s). Exit code: 1 [»]


Я думаю что ты не выполнил задачу 01 и соответственно не указал в свойствах проекта что используешь AVR2313.
+
-
edit
 

termostat

аксакал

=NIK=> Еще глупый вопрос:
=NIK=> Что делает МК при попадании в цикл while который находится в прерывании?
=NIK=> Я имею ввиду то что если причина выхода из цикла не в этом же прерывании. Т.е. ведь чтобы выйдти из цикла, надо выйдти из прерывания (т.к. флаг I аппаратно сбрасывается при входе в прерывание). То есть из прирывания он никогда не выйдет...
=NIK=> Что я не понял? [»]

что делает этот код:

code text
  1. crt=0;
  2. while(crt<200)
  3. {
  4. crt++;
  5. }


пойми пожалуйста сам, стр 5 курса и в задачах с 1-й

сделав его МК пойдет дальше и покинет прерывание.

=NIK=
NIK2

новичок
Попробую спросить по другому:

В задаче 04 , в процедуре "void get_period(void)" есть строчка:

while(no_INT0); // ждем прерывания по
// очередному спаду сигнала


т.е. программа будет находиться в цикле до тех пор пока переменная no_INT0=1
Сама процедура "void get_period(void)" находиться в прерывании переполнения таймлером.

А строка, которая разрешает выход из этого цикла, находится в процедуре обработки внешнего прерывания.

Вот и вопрос, как программа попадает во внешнее прерывание, если причина выхода из цикла,
и сам цикл находятся в разных прерываниях. А глобальное разрешение перываний сбрасывается аппаратно
при входе в прерывание?
 

SAA

втянувшийся

=NIK=> Попробую спросить по другому:
=NIK=> В задаче 04 , в процедуре "void get_period(void)" есть строчка:
=NIK=> while(no_INT0); // ждем прерывания по
=NIK=> // очередному спаду сигнала
=NIK=> т.е. программа будет находиться в цикле до тех пор пока переменная no_INT0=1
=NIK=> Сама процедура "void get_period(void)" находиться в прерывании переполнения таймлером.
=NIK=> А строка, которая разрешает выход из этого цикла, находится в процедуре обработки внешнего прерывания.
=NIK=> Вот и вопрос, как программа попадает во внешнее прерывание, если причина выхода из цикла,
=NIK=> и сам цикл находятся в разных прерываниях. А глобальное разрешение перываний сбрасывается аппаратно
=NIK=> при входе в прерывание?

Видимо при входе в interrupt ICC (а это помоем он), так CodeVision на отрез отказался компилить включает прерывания в заголовке функции.
Проще скомпили и посмотри есть или нет SEI.
 

SAA

втянувшийся

Нашел ICC скомпилил, нет там разрешения прерываний. :unsure:

SAA> Проще скомпили и посмотри есть или нет SEI. [»]

Термостат, объясни ради бога, почему - а то я сейчас все брошу и в VMLab пойду твои задачи по курсу решать ;), останешься без кондера ;)
Да кстати почему в примере 04 изменил своем любимцу CodeVision?
 
RU termostat #21.10.2005 13:45
+
-
edit
 

termostat

аксакал

Дык дочитайте задачу 4 до конца! Там же

avr123.nm.ru/mkkurs04.htm

сказано что сначала симуляция не заработала и ессно изза бит7 в регистре SREG!

и есть исправленый 3-й вариант файлов к задаче.

=======

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

Вот к 5-й задаче и далее и прояснилось для МЕНЯ что:

для любителя и начинающего CVAVR+VMLAB самое ТО !
Это сообщение редактировалось 21.10.2005 в 14:19

bsdk

новичок
TERMOSTAT тебе памятник ставить надо за этот курс !!!
У меня МК уже светодиодиками моргает и так и сяк ! Прикольно!
Я раньше СДУ собирал так там на один эфект деталей гора а тут
всего ничего .
Вопрос есть один .Как организовать правильно линию RESET без сложностей
а то везде какие то детали буржуйские стоят а у меня их нет.
Я сделал с +5v через резюк на 10К и кондер 10мк на минус а паралельно кондеру нормально открытый кнопк
Вроде работает и SPI не обижается но может от такой схемы МК плохо будет?
И где можно посмотреть все команды применяемые в С при програмировании
МК?
 

=NIK=
NIK2

новичок
to bsdk

Ставят супервизоры питания
Они удерживают reset в низком уровне до тех пор пока питание не войдет в норму.

Есть специальные кренки типа 7805 с выходом для ресета. Т.е. кренка и супервизор в одном.

Резистор не питание есть внутри самой микросхемы. Но внешний не помешает.

В серии AVRMEGA есть встроенный BOD (почитай даташит, все поймешь)

В любом случае компилятор переводит код в директивы ассеблера, они есть в даташит.

to termostat:

Виноват, исправлюсь. Просто не дочитал до конца. У меня вопрос возник и я на этом месте застрял.
Никчему даже что дальше это ошибка всплыла. :)
 

SAA

втянувшийся


=NIK=> Они удерживают reset в низком уровне до тех пор пока питание не войдет в норму.
=NIK=> Есть специальные кренки типа 7805 с выходом для ресета.

Хмм сколько видел 7805 спец выводов на ресет не заметил как обычно три вход, выход, земля.



To termostat: Слушай не могу понять где то видимо не так делаю, еще сутки помучаюсь сам и сброшу тебе проект на кондер, что то врет он или я не то от него ожидаю. Так что готовься помогать.

 

=NIK=
NIK2

новичок
По моему называется 78RL05.
Ну т.е. какая-то буква кроме L добавляется. У нее 5 выводов
 
+
-
edit
 

DrDoom

новичок
Из-за чего в mega8535 может портится ОЗУ во время работы?
 
RU termostat #26.10.2005 22:52
+
-
edit
 

termostat

аксакал

ОЗУ вряд ли, а вот с ЕЕПРОМ там ошибки известно почему возникают и в ерратах должны быть описаны.

А вообще многие беды от "не правильного" питания.

На более подробный вопрос можно подробней ответить.

Yuran

опытный

Первое что пришло на ум, по поводу испорченной памяти - это кривонаписанная программа B) Проверь не затираются ли данные из-за расширения стека B)
 
RU termostat #27.10.2005 00:06
+
-
edit
 
+
-
edit
 

DrDoom

новичок
Прога на асме. Чтобы выяснить причину - упрощена. Порядок работы: запускаю АЦП в free running режиме. В прерывании считываю значения. Описание глюка: через некоторое время работы, перестают происходить прерывания АЦП. Контролировал, выставляя '1' на пине 7 порта С в прерывании АЦП. Скорее всего портятся установки АЦП, но как ?!
 

pokos

аксакал

DrDoom> Прога на асме. Чтобы выяснить причину - упрощена. Порядок работы: запускаю АЦП в free running режиме. В прерывании считываю значения. Описание глюка: через некоторое время работы, перестают происходить прерывания АЦП. Контролировал, выставляя '1' на пине 7 порта С в прерывании АЦП. Скорее всего портятся установки АЦП, но как ?! [»]

Мой диагноз. Программа не успевает обрабатывать прерывания от АЦП, Yuran прав - стек переполняется.
Сокращайте время обработки прерываний. Я, в своё время, даже специальный светодий делал, чтобы он мне показывал, остаётся ли у проца время на обработку.
 
1 2 3 4 5 6 7 12

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru