Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Микроконтроллеры > Разбираемся с IAR


Автор: bizar 08.01.04, 11:03
Понемногу в IAR разбираюсь, есть простенькая схема
решил сделать чтобы светодиод на RB2 мигал, по команде PIC
контроллера.
Код мне potor дал для бегущей строки, хотел переделать в обыкновенный
код для мигания. Тут ошибок тьма, покажите где?

user posted image
Нужен только светодиод подключённый к RB2......

struct time // описание структуры время
{
unsigned char sec;// секунды
} current_time;
void init_io(void);
void init_timer(void);
void main(void)
// тело программы
{
init_io(); //вызываем
init_timer(); //функции инициализации
__enable_interrupt();// разрешаем прерывания (описана в одном из хедерных файлов)
out = 1; // инициализируем переменную out.
old_sec = 0;// инициализируем счетчик секунд
while(1)// организуем бесконечный цикл
{
PORTB = ~out;//записываем в PORTB инверсный код светодиода, который хотим зажечь (мы же
// зажигаем их 0)
while(current_time.sec == old_sec); // ждем одну секунду

old_sec = current_time.sec; //присваиваем счетчику секунд текущее время (секунды)
}
}

//-----------------инициализация портов ввода/вывода----------------
void init_io(void)
{
DDRB = 0xff;//настрамваем PORTB на вывод
PORTB = 0xfb;//все выходы в 1, светодиоды погашены
}
//------------------------------------------------------------------

//-----------------инициализация таймара----------------------------
void init_timer(void)
{
TIMSK |= Bit(1); //разрешаем прерывания от TC0 1 в TOIE0
TCCR0 = 5; //говорим, что тактовую частоту будем делить на 1024

current_time.sec = 0;// обновление времени
current_time.min = 0;
current_time.hour = 0;
}
//------------------------------------------------------------------

Выделен красным цветом - объясните что за хедерные файлы, и для чего здесь нужна эта строчка
Выделен синим цветом - нужно исправить/дописать чтобы светодиод загорался.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    TCCR0 = 5; //говорим, что тактовую частоту будем делить на 1024

Зачем делить на 1024

Автор: trainer 08.01.04, 11:39
Цитата
bizar, 8.01.04, 14:03
__enable_interrupt();// разрешаем прерывания (описана в одном из хедерных файлов)
...
объясните что за хедерные файлы, и для чего здесь нужна эта строчка
Это заголовочные файлы, содержащие прототипы функций и макросы.
У меня IAR для PIC под рукой нет. В IAR EWAVR этот файл называется inavr.h
Вызов этой функции нужен, чтобы разрешить прерывания и соответственно в одном из обработчиков происходило инкрементирование времени. см. ниже

Цитата
bizar, 8.01.04, 14:03
PORTB = ~out;//записываем в PORTB инверсный код светодиода, который хотим зажечь (мы же
// зажигаем их 0)
Вообще-то непонятен алгоритм работы. По видимому,
PORTB ^= 8; // зажигаем или гасим светодиод на RB2


Цитата
bizar, 8.01.04, 14:03
Зачем делить на 1024
Очевидно, это времязадающий таймер - в его обработчике инкрементируется время.

Автор: potor 08.01.04, 12:38
TCCR0 = 5;//- это особенность конкретного контроллера (специальный регистр), в PICе это наверняка по другому
чтобы мигал PORTB2 надо:
while(1)// организуем бесконечный цикл
{

while(current_time.sec == old_sec); // ждем одну секунду
old_sec = current_time.sec; //присваиваем счетчику секунд текущее время (секунды)
if (PORTB == 0xff) PORTB = 0xfb;//горит portb 2
else PORTB = 0xff;//все диоды погашены
}

еще раз говорю, это для пика не пойдет, там регистры специальных функций другие:)
функция разрешения прерываний там тоже возможно называется по другому, но скорее всего так же
по поводу дисплея попытаюсь сделать сегодня вечером:)

Автор: SimpleSoft 09.01.04, 04:08
что за г...?
на PICке направление выбирается TRISB:
00 - весь порт B работает на выход
FF - весь порт B работает на вход

я для PICков avr не использую, там много глюков. исп Hi-Tech . Скачай hi-tech и на сайте cracks.am к
нему кряк подбери.
В Hi-Tech:
пишешь
static bit _LED @ (unsigned)&PORTB*8+2; /* bit2 in port B */
и оперируешь битом.

// пример оформления прерываения

static void interrupt
GeneralInterruptRoutine(void){
if (T0IF)
{
T0IF = 0;
// Timer0 interrupt

}

if (TMR1IF)
{
TMR1IF = 0;
// Timer1 interrupt
/******** Сюда пишешь счётчика...короче подбираешь 1 сек. задержку *********/
/* типа if (dwCounter >= 26) {
/* _LED =~ _LED;
/* dwCounter = 0;
/* }
/* dwCounter++;
/*
/******************************
}
if (RCIF)
{
RCIF = 0;
RX_Buf[RX_Cursor++] = RCREG;
if (RX_Cursor == RX_Size) RX_Cursor = 0;
// RX interrupt
}
if (SSPIF)
{
SSPIF = 0;
In_Buf_SPI[In_Cursor_SPI++] = SSPBUF;
if (In_Cursor_SPI == In_Size) In_Cursor_SPI = 0;
// SPI interrupt
}
}

// включаем все прерывания...
void InterruptsEnable(void)
{
GIE = 1;
PEIE = 1;
}

посмоти в доках к твоему PICу как включать Timer1 (это таймер счётчик по 65536 ~ 40ms полный цикл)
я привел пример для PIC16F877A

а какой кстати проц?

Автор: potor 09.01.04, 09:07
по поводу глючности IAR для пиков спорить небуду (не работал с ним и с пиками в частности)
по поводу операции с битами IAR это тоже позволяет просто надо описать union из чара и соответствующей битовой области
а вообще, это мое субъективное мнение, удобнее всего битовые операции реализованы в keil, там есть тип bit, переменная такого типа будет однозначно располагатся, только в битово адресуемой области:)

Автор: bizar 09.01.04, 09:31
SimpleSoft, что за Hi-Tech? Приведённый тобой код IAR ?

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    а какой кстати проц?    

всмысле

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    RTCC таймер/счетчик
    Режим таймера выбирается путём сбрасывания в ноль бита RTS, который находиться в регистре OPTION и т. д.
    Или таймер Watch Dog.]

Ты это имел ввиду.

Автор: potor 09.01.04, 10:32
Hi-Tech это еще одна среда разработки, я ее к сожалению не юзал
т е код тебе прислали не для IAR а для этой самой Hi-Tech
я кстати не врюхал??? ты пытаешься залить мой код написанный для AVR в свой PIC??? Если да то непойдет:)
это же другая архитектура, я тебе просто выслал пример программирования в IAR, но т.к. он у меня для AVR и дома тоже нашел AVR контроллер, я спаял на монтажке схему с диодиками, написал программку для моего контроллера, отладил и выслал тебе

Автор: bizar 09.01.04, 12:11
У каждого микроконтроллера различна работа таймера???
:ph34r: :ph34r: :ph34r:

Автор: potor 09.01.04, 12:32
у разнах микроконтроллеров разная архитектура: разные таймеры, разрядность режимы работы, регистры специальных ф-й и т.п., т.е. прежде чем писать программу для конкретного контроллера в первую очередь читаешь документацию именно по нему

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

#include<имя файла, где описан твой пресловутый порт RB>
void main(void)
{
while(1)
{
for (unsigned int i = 0xffff; i!=0; i--);
for (unsigned int i = 0xffff; i!=0; i--);
for (unsigned int i = 0xffff; i!=0; i--);
for (unsigned int i = 0xffff; i!=0; i--);
if (RB == 0xff) RB = 0xfb;
else RB=0xff;
}
}
проверяем должно скомпилится запускаем эмулятор и смотрим работает, или нет, если все ок заливаем в контроллер, если не заработало, ищем плюхи в монтаже, если заработало, прекрасно!!!
внимательно читаешь про работу таймера и про прерывания и реализовываешь с использованием оных и т.д.....

Добавлено в :
извини немножко не так? взглянул тут на документацию по твоему контроллеру:

#include<имя файла, где описаны PORTB и TRISB>
void main(void)
{
TRISB = 0; // настраиваем PORTB на выход
while(1)
{
for (unsigned int i = 0xffff; i!=0; i--);
for (unsigned int i = 0xffff; i!=0; i--);
for (unsigned int i = 0xffff; i!=0; i--);
for (unsigned int i = 0xffff; i!=0; i--);
if (PORTB == 0xff) PORTB = 0xfb;
else PORTB=0xff;
}
}

Автор: bizar 10.01.04, 05:05
Я думал без Таймера мигать не будет. :(
Что за 0xffff.

Автор: bizar 11.01.04, 09:08
0xfb порт RB2, а порт RB3, RB4 и т. д. как обозначаются.
#include<имя файла, где описаны PORTB и TRISB>
void main(void)
{
TRISB = 0; // настраиваем PORTB на выход
while(1)
{
for (unsigned int i = 0xffff; i!=0; i--);// я так понял этот цикл включает светодиод,
for (unsigned int i = 0xffff; i!=0; i--);// но не понял смысл этого цикла, ещё
for (unsigned int i = 0xffff; i!=0; i--);//зачем их надо 4 штуки (чтобы сровнять i до ноля,
for (unsigned int i = 0xffff; i!=0; i--);//может используешь его вместо таймера)??????????
if (PORTB == 0xff) PORTB = 0xfb; //если порт RB равен 0xff, значит порт RB присваивает 0xfb (то есть светодиод на RB2 погашен??)
else PORTB=0xff; // иначе порт RB присваивает 0xff
}
}

Автор: potor 12.01.04, 05:40
#include<имя файла, где описаны PORTB и TRISB>
void main(void)
{
TRISB = 0; // настраиваем PORTB на выход
while(1)
{
//организуем задержку, чтобы ты видел как мигает светодиод
//если не сделать эту задержку, то ты увидишь просто горящий светодиод
for (unsigned int i = 0xffff; i!=0; i--);
for (i = 0xffff; i!=0; i--);
for (i = 0xffff; i!=0; i--);
for (i = 0xffff; i!=0; i--);
//-------------------------------------------------------------------------
//собственно мигание светодиода
if (PORTB == 0xff) PORTB = 0xfb;
else PORTB=0xff;
}
}

Автор: bizar 12.01.04, 09:05
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    0xfb порт RB2, а порт RB3, RB4 и т. д. как обозначаются.

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Что за 0xffff.

Автор: potor 12.01.04, 10:27
Если внимательно почитвть описание то увидишь:
RB2 - это второй разряд порта PORTB
0xЧИСЛО - так в С обозначаются 16-ричные числа
fb - шестнадцпатиричное, это 11111011 двоичное
т е PORTB = 0xfb; говорит буквально следующее:
Записать во 2-й разряд PORTB (т.е. в RB2) нолик, а в остальные разряды 1
Соответственно PORTB = 0xff говорит
записать во все разряды PORTB 1
вот и получили мигание...

Автор: bizar 12.01.04, 12:54
Ты мне так и не ответил что/зачем/почему в примере
используешь 0xffff


Может я тебя не правельно понял.

Автор: potor 12.01.04, 12:57
да я просто реализую задержку
4 цикла котые считают от 65535 (0xffff) до нуля:)

Автор: bizar 12.01.04, 13:00
Значит через час/полтора, может больше
светодиод перестанет мигать.
Порт RB3 - fc???
RB4 - fd???

Автор: potor 12.01.04, 14:04
нет, эти четыре while дадут тебе задержку порядка секунды +- лапоть в зависимости от частоты генератора микроконтроллера
т.е. алгоритм до безобразия тупой :)
while (1){//все что в этих скобках бесконечный циклъ
// 1)сначала задержка порядка секунды
while(...);
while(...);
while(...);
while(...);
// 2)теперь меняем состояние светодиода на противоположное
if...
// и опять к шагу 1
}

Автор: bizar 12.01.04, 17:04
Ясно....
Проверьте исходничёк (поочерёдное мигание светодиодов подключённых к RB2, RB3, RB4, RB5)
У меня нет эмулятора (поэтому не могу проверить).
А вообще что за эмулятор - программа/внешнее устройство проверяющая работу микроконтроллера
Объясните bizar..у.?
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include<имя файла, где описаны PORTB и TRISB>
    void tik(unsigned int i)
                {
                for (i = 0xffff; i!=0; i--);
                for (i = 0xffff; i!=0; i--);
                for (i = 0xffff; i!=0; i--);
                for (i = 0xffff; i!=0; i--);
                }
    void tik1(void)
            {
            if (PORTB == 0xff) PORTB = 0xfb;
            else PORTB=0xff;
            }
    void tik2(void)
            {
            if (PORTB == 0xff) PORTB = 0xfc;
            else PORTB=0xff;
            }
    void tik3(void)
            {
            if (PORTB == 0xff) PORTB = 0xfd;
            else PORTB=0xff;
            }
    void tik4(void)
            {
            if (PORTB == 0xff) PORTB = 0xfe;
            else PORTB=0xff;
            }
    void main(void)
            {
            TRISB = 0;
            while(1)
                {
                tik ();
                tik1 ();
                tik ();
                tik2 ();
                tik ();
                tik3 ();
                tik ();
                tik4 ();
                }
    }

Автор: potor 13.01.04, 06:01
что то я не понял, что ты изобразил???

Добавлено в :
это даже не скомпилится???

Автор: bizar 13.01.04, 10:19
Это чума зажигает поочерёдна 4 светодиода
подключённые к RB2, RB3, RB4, RB5.
Я создал несколько функций, поставил их поочерёдна
и добавил бесконечный цикл.
Ещё мне:::::
Нужно заставить динамик пищать?????

Автор: potor 13.01.04, 10:32
где у тебя в порограмме функция main()???

Добавлено в :
по поводу пищания динамика:
на RB7 подаешь 0
на RB6 подаешь импульсы (например 440Hz это нота ля первой октавы)

Автор: bizar 13.01.04, 10:37
Вот эта функция main (это то что будет выполняться).
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    void main(void)
      {
      TRISB = 0;
      while(1)
       {
       tik ();
       tik1 ();
       tik ();
       tik2 ();
       tik ();
       tik3 ();
       tik ();
       tik4 ();
       }
    }

Автор: potor 13.01.04, 11:00
а tick2()? tick3()? tick4()?

Автор: bizar 13.01.04, 15:07
Цитата potor @ 13.01.04, 17:00
а tick2()? tick3()? tick4()?

tic2 зажигает RB3 (СВЕТОДИОД)
tic3 зажигает RB4 (СВЕТОДИОД)
tic4 зажигает RB5 (СВЕТОДИОД)
Если я неправельно написал, напиши как правельно.

Автор: bizar 13.01.04, 17:07
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    на RB6 подаешь импульсы (например 440Hz это нота ля первой октавы)

Как подавать импульсы на RB6, нужен кусочек кода с объяснением.
Я ещё многого не знаю, на словах не понимаю.

Автор: potor 14.01.04, 07:32
в общем дело в следующем:
void tic2 (void)
{
if (PORTB == 0xff) PORTB = 0xf7;
else PORTB=0xff;
}
void tic3 (void)
{
if (PORTB == 0xff) PORTB = 0xef;
else PORTB=0xff;
}
void tic4 (void)
{
if (PORTB == 0xff) PORTB = 0xdf;
else PORTB=0xff;
}
но дело в том, что такая реализация выглядит криво :(
предлагаю написать следующее:

main()
{
TRISB = 0;
PORTB = 0xdf;
while(1)
{
tick();
if (PORTB == 0xdf ) PORTB = 0xdf;
else PORTB <<= 1;
}
}

Добавлено в :
в общем дело в следующем:
void tic2 (void)
{
if (PORTB == 0xff) PORTB = 0xf7;
else PORTB=0xff;
}
void tic3 (void)
{
if (PORTB == 0xff) PORTB = 0xef;
else PORTB=0xff;
}
void tic4 (void)
{
if (PORTB == 0xff) PORTB = 0xdf;
else PORTB=0xff;
}
но дело в том, что такая реализация выглядит криво :(
предлагаю написать следующее:

main()
{
TRISB = 0;
PORTB = 0xdf;
while(1)
{
tick();
if (PORTB == 0xdf ) PORTB = 0xdf;
else PORTB <<= 1;
}
}

Добавлено в :
теперь, что касаемо пищалки:
я тебе сейчас не могу сказать как получить конкретную частоту на выходе (не хватает исходных данных: например частоы тактового генератора процессора), но могу натолкнуть. В общем существует два варианта:
1) использавать прерывание от таймера. Это наиболее предпочтительный вариант, но мы пока на прерывания не заморачиваемся
2) организовать программную задержку (как в случае с мигающим светодиодом)
...

void delay (void)
{
for (unsigned char i = 0xff; i != 0; i--)
}
// теперь давай опишем макрос для более удобной работы с битами
#define Bit(x) (1<<(x))
main()
{
TRISB = 0;
PORTB =0x7f;//обнуляем восьмой бит PORTB, остальные в 1
while(1)
{
delay();
if (PORTB & Bit(6)) // RB6 в 1?
PORTB &= ~Bit(6);// если да то обнуляем
else
PORTB |= Bit(6);// если нет то устанавливаем
}
}

Автор: bizar 14.01.04, 11:13
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    main()
              {
               TRISB = 0;
               PORTB = 0xdf;
               while(1)
                      {
                      tick();
                      if (PORTB == 0xdf ) PORTB = 0xdf;
                      else PORTB <<= 1;
                      }
              }


Это пример только к порту 0xdf?????

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    0xf7 ----RB3
    0xef  ---- RB4
    0xdf ---- RB5

Чё-то я закономерность не заметил, по назначению в Си портов RB.

Добавлено в :
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if (PORTB & Bit(6)) // RB6 в 1?
    PORTB &= ~Bit(6);// если да то обнуляем

Что значит "~", объясни по подробней этот кусок.

Автор: potor 14.01.04, 12:27
извиняюсь, ошибся

main()
{
TRISB = 0;
PORTB = 0xfd;// устанавливаем в ноль RB2
while(1)
{
tick();
if (PORTB == 0xdf ) // RB5 установлен в 0?
PORTB = 0fb; // если да, то устанавливаем в ноль RB2, остальные в 1
else PORTB <<= 1; иначе сдвигаем на 1 влево
}
я тебе кажется уже объяснял, что это не адреса портов, адрес порта PORTB описан в h файле, а это то что хотим в порт звписать
PORTB = 0xff; //записываем во все разряды PORTB единицы
PORTB = 0xfе;// записываем в RB0 0, в остальные разряды 1
PORTB = 0xfd;// записываем в RB1 0, в остальные разряды 1
PORTB = 0xfb;// записываем в RB2 0, в остальные разряды 1
PORTB = 0xf7;// записываем в RB3 0, в остальные разряды 1
PORTB = 0xef;// записываем в RB4 0, в остальные разряды 1
PORTB = 0xdf;// записываем в RB5 0, в остальные разряды 1
PORTB = 0xbf;// записываем в RB6 0, в остальные разряды 1
PORTB = 0x7f;// записываем в RB7 0, в остальные разряды 1

теперь далее
if (PORTB & Bit(6)) // делаем поразрядное логическое И содержимого POTRB и числа 01000000b, если результат не 0, значит в RB6 сейчас 1
PORTB &= ~Bit(6);// и если это так обнуляем RB6

~- это операция поразрядной инверсии числа в данном случае что получается:
Bit(6) это 01000000b
~Bit(6) это 10111111b
PORTB&=~Bit(6) это PORTB = PORTB & ~Bit(6), или попросту PORTB = PORTB & ~Bit(6), или совсем просто PORTB = PORTB & 0x40, или по человечески обнуление 6-го разряда PORTB (RB6)

Автор: bizar 14.01.04, 17:03
Усё отлично понял.
У пищалки нужно убрать конденсатор к твоему примеру.????

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    else PORTB <<= 1; иначе сдвигаем на 1 влево


А вроде нам нужно сдвигать на один в право.
else PORTB >>= 1;
RB2 - RB3 - RB4 - RB5 //Идёт в порядке возрастания.
Как сделать так чтобы 2 светодиода загорались одновременно???
Например RB2 и RB5. Я думаю так:
PORTB = 0xdb; //проверьте так ли это

Вот потренировался (проверь).
Порядок загорания светодиодов:
RB2 RB7 (одновременно)
RB3 RB6 (одновременно)
RB4 RB5 (одновременно)
Гаснут и всё сначала.
main()
{
TRISB = 0;
PORTB = 0xdb;
while(1)
{
tick();
if (PORTB == 0xcf )
PORTB = 0xff;
else PORTB = 0xb7;
if (PORTB == 0xb7)
PORTB = 0xcf;
else PORTB = 0xcf;
}

Автор: potor 15.01.04, 06:21
1 конденсатор у пищалки убирать ненужно, он служит для отсекания постоянной составляющей (ты кстати аккуратнее с ней, узнай ее потребляемую мощность, а то можешь спалить контроллер)
2 сдвигать нужно влево т к отсчет битов идет справа налево
3 по поводу RB2 и RB5 ты прав
4 по поводу проги немного неверно
main()
{
TRISB = 0;
PORTB = 0x7b;
while(1)
{
tick();
switch(PORTB)
{
case 0xcf : PORTB = 7b;
break;
case 0x7b : PORTB = b7;
break;
case 0xb7 : PORTB = 0xcf;
}
}

Автор: bizar 15.01.04, 16:54
Оператор case в Си не нашёл, поискал в pascal..е
Оператор выбора case является обобщением оператора if - он даёт возможность выполнить одно из нескольких действий в зависимости от значения переключателя.
В Си также обращаться с case????????????????????????????????????
Что за break - прерывания что ли (чего/кого)?????
Там ещё есть switch(PORTB) с чем его едят???? //золотой ключ, а это функция (сомневаюсь)
У тебя описано для четырёх светодиодов?????
Ты использовал 7b, а не 0х7b почему (так надо)????????

Автор: trainer 16.01.04, 06:07
Цитата
switch( переменная ) {
case значение1:
case значение2:
действия
break;
case значение3:
действия
break;
default:
действия, если ни одному из case не подошло.
}
В конференции Вы долго будете обучаться языку C. Купите какую-нибудь книжку.

Автор: potor 16.01.04, 08:38
Ты использовал 7b, а не 0х7b почему (так надо)????????

нет, это описка :)

Автор: bizar 16.01.04, 10:43
Цитата potor @ 16.01.04, 14:38
нет, это описка :)

Всмысле?? (должно быть 0х7b)??

Добавлено в :
trainer, Книги есть (но они не отвечают подробно на вопрос).

Автор: potor 16.01.04, 10:47
да, это должно быть 0x7b

Добавлено в :
по поводу книжки по С могу посоветовать поискать в инете: Керниган, Ричи. Язык C

Автор: bizar 16.01.04, 10:55
break - что/кто/для чего.
(пока ты в сети ответь).

Добавлено в :
У меня книга на руках Киммел (мастер).
Керниган, Ричи. Язык C поищю.

Автор: potor 16.01.04, 11:08
break в данном случае, этодля того, чтобы прекратить последующие проверки и выйти из switch

Автор: bizar 16.01.04, 11:16
Хочю в клаве модинг замутить, 13 светодиодов,
хватит ли питания у порта клавы.

Автор: potor 16.01.04, 11:21
не знаю, посмотри спецификацию
P.S. а нафига это надо?

Добавлено в :
хотя, это примерно 10мА, 99% что хватит

Добавлено в :
ссори 130мА, хватит

Автор: bizar 16.01.04, 11:23
Надо же на чём то учиться
Ты вообще знаешь что такое Модинг

Автор: potor 16.01.04, 11:30
вообще да (я иногда журналы читаю:))

Автор: bizar 16.01.04, 11:33
Придется питание отдельно заводить
если я к пику 13 светодиодов подключу он не взорвется????

Добавлено в :
Усё понил значит прокатит.

Автор: potor 16.01.04, 12:05
а вот по поводу пика, только если низкоточные 5мА штука

Автор: bizar 16.01.04, 15:15
У меня в клаве имеется микроконтроллер:
9917
КМЕ-9801-4
Входят 4 провода
Жёлтый
Красный
Коричневый
Белый
Куда цеплять питание не подскажете.
Я думаю к жёлтому проводу.
К каким выводам контроллера (клавы) подходит питание?????
RA0…..RA4 порт как присваивать 0.??????
RA0-----0x1e-----11110
RA1-----0x1d-----11101
RA2-----0x1b-----11011
RA3-----0x17-----10111
RA4-----КАК ТУТ ЗДЕЛАТЬ???????

Автор: trainer 16.01.04, 16:15
Цитата
bizar, 16.01.04, 18:15
У меня в клаве имеется микроконтроллер
Очень вряд ли, что там PIC.
Скорее всего там клон Intel i8048

Автор: bizar 16.01.04, 16:20
Цитата trainer @ 16.01.04, 22:15
Цитата
bizar, 16.01.04, 18:15
У меня в клаве имеется микроконтроллер
Очень вряд ли, что там PIC.
Скорее всего там клон Intel i8048

Там точно не PIC (аналог Intel i8048)
Я думаю совецкого производства.

Автор: SimpleSoft 16.01.04, 18:38
potor - ты не прав. Можно повесить очень мощные, если управляешь нулями, т.е. например..
PIC
___
| PB.7 LED ___
|------|<|--|___|-----* +5v
| '' 330 Ом
|
|
|
|
|
|
____

Автор: potor 19.01.04, 06:17
2SimpleSoft
тут вот какое дело, максимальный ток стока для PORTB, PORTA по документации 200мА.
ты предлагаешь вкльчить 13 диодов по 15мА- это 195мА(почти предел), я бы не рекомендовал так издеваться над контроллером, во всяком случае греться он будет как электроплитка и долго не проработает:(

Автор: bizar 19.01.04, 08:48
Теперь нужно чтобы контроллер ждал
когда мы нажмём на кнопку (то есть два порта RB соединяться)
и после этого он начнёт их зажигать.

Автор: potor 19.01.04, 10:27
в общем цепляем кнопку одним контактом на RB1, этот же контакт через 100кОм на питание, второй контакт кнопки на 0
в программе изменяем:
TRISB = 2;// RB1 настраиваем на вход, остальные разряды PORTB на выход
далее перед while(1) добавляем строчку
while(PORTB & Bit(1));
и вся любовь:)

Автор: bizar 19.01.04, 10:36
А если я хочю чтобы он ждал нажатие у нескольких
кнопок, и выполнял при каждем нажатии определённое
включения светодиодов.

Автор: potor 19.01.04, 10:41
хороше, ты только напиши, куда планируешь подключит кнопки, и куда светодиоды

Автор: bizar 19.01.04, 10:55
1 кнопка RA2 RA4
2 кнопка RA2 RA3
3 кнопка RA4 RA3

Светодиоды подрубил к RB0,RB1 RB2, RB3, RB4, RB5, RB6, RB7, RA1.

Автор: bizar 19.01.04, 14:54
Если нажимаем (RA2, RA4).
Выполняется...
main()
{
TRISB = 0;
PORTB = 0xfc;
while(1)
{
tick();
switch(PORTB)
{
case 0x1c : PORTB = 0xfc;
break;
case 0xfc : PORTB = 0xf3;
break;
case 0xf3 : PORTB = 0xcf;
break;
case 0xcf : PORTB = 0x3f;
break;
case 0x3f : PORTB = 0x1c;
}
}

Если нажимаем (RA4, RA3).
Выполняется...

main()
{
TRISB = 0;
PORTB = 0xfe;
while(1)
{
tick();
switch(PORTB)
{
case 0x1d : PORTB = 0xfe;
break;
case 0xfe : PORTB = 0xfd;
break;
case 0xfd : PORTB = 0xfb;
break;
case 0xfb : PORTB = 0xf7;
break;
case 0xf7 : PORTB = 0xef;
break;
case 0xef : PORTB = 0xdf;
break;
case 0xdf : PORTB = 0xbf;
break;
case 0xbf : PORTB = 0x7f;
break;
case 0x7f : PORTB = 0x1e;
break;
case 0x1e : PORTB = 0x1d;
break;
case 0x1d : PORTB = 0xfe;
}
}

Автор: potor 19.01.04, 17:34
батенька, вы совсем обленились:)
ну попытайся, хоть что нибудь сам написать, иначе ты ничему не научишься, тем более задача простенькая
в общем лови подсказку:
1)switch(PORTA)
...
2)TRISA = 0x04;// настройка RA2 на ввод, остальное на вывод
3)TRISA = 0x08;// настройка RA3 на ввод, остальное на вывод
попробуй написать сам, вышли свой вариант, укажу на ошибки, ну если уж совсем туго, напишу как правильно, просто обьясняю еще раз, пока не начнеш писать сам не научишься:)

Автор: bizar 22.01.04, 08:35
Да лень вперёд меня родилась.
Попробую сам, только скажи как
настроить RA0 и RB2 на ноль, а
остальные на единицу. КАК RB c RB
и RA c RA разобрался, не могу понять как
RA с RB.

Автор: potor 22.01.04, 09:28
Все просто
только ты не забывай, что помимо этого часть ног PORTA тебе нужно настраивать на вход, часть на выход и при опросе матрицы кнопок менять эти настройки.
вот пример RA0,RA1 на выход. RA0 настраиваем на ноль RA1 на единицу, остальные RA не важно, т.к. Настраиваем их на выход. PORTB весь на выход RB2 в 0, остальные разряды PORTB в 1:
TRISA = 0xfc;// настраиваем RA0, RA1 на выход
PORTA = 0xfe;// запиисываем в RA0 0, в остальные разряды PORTA 1(в частности нас интересует RA1 а,
// т.к остальные мы настроили на вход, по барабану, что туда писать)
TRISB = 0;// весь PORTB на выход
PORTB = 0xfb; //в RB2 0, в остальные разряды 1

Автор: bizar 22.01.04, 12:24
Кнопки цепляем по этой схеме.
(проверь правельно ли я подрубил кнопки)

Автор: potor 22.01.04, 12:31
можно так, я думал ты хотел их в матрицу объединить.
в зтом случае соответствующие разряды PORTA просто программируешь на ввод, дерзай дальше:)
на сегодня я побежал...

Добавлено в :
маленькое замечание, зачем ты взял нормально замкнутые контакты??? чтобы тока больше жрали??

Автор: bizar 22.01.04, 16:53
Поправка
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    _    _
     \
      \

Мы на секунду замыкаем контакт, и отпускаем его (кнопка не должна быть нажата постоянно)??????

Автор: potor 23.01.04, 05:56
да, только есснно в этом случае критерием нажатой кнопки будет 0 на соответствующем разряде порта

Автор: bizar 23.01.04, 09:37
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    критерием нажатой кнопки будет 0

В смысле критерием, я таких слов незнаю.
(малясь недоразвет)

Автор: potor 23.01.04, 10:20
признаком:)

Автор: bizar 24.01.04, 09:01
Это для одной кнопки.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    main()
         {
          TRISA = 4;
          PORTA = 0x1c;
          TRISB = 0;
          PORTB = 0xff;
          while(PORTA & Bit(1));
          while(1)
                  {
                  tick();
                  switch(PORTB, PORTA)
                                     {
                                     case 0x1c : PORTB = 0xfc;
                                     break;
                                     case 0xfc : PORTB = 0xf3;
                                     break;
                                     case 0xf3 : PORTB = 0xcf;
                                     break;
                                     case 0xcf : PORTB = 0x3f;
                                     break;
                                     case 0x3f : PORTA = 0x1c;
                                     }
                  }
    }

Для двух кнопок, можно создать две функции и врубать их поочерёдно если кнопка была нажата он будет выполнять эту функцию бесконечно???????? - (так можно реализовать программу)…..

Автор: trainer 24.01.04, 09:17
Цитата
bizar, 24.01.04, 12:01
switch(PORTB, PORTA)
Так делать бессмысленно. Это эквивалентно просто switch(PORTA)

Автор: bizar 24.01.04, 09:23
А как нужно (PORTB & PORTA)

Автор: trainer 24.01.04, 14:56
Цитата
bizar, 24.01.04, 12:23
А как нужно (PORTB & PORTA)
А скажи словами, чего хочешь получить?
Я некоторые этапы вашего диалога пропустил.

Автор: bizar 25.01.04, 06:02
Хотим заставить мигать светодиоды на PORTA и PORTB,
чтобы они мигали при нажатии кнопки.

Добавлено в :
Нужно чтобы два светодиода первый RB второй на RA загорались одновременно.

Автор: potor 26.01.04, 06:24
работа над ошибками:
Цитата

main()
{
TRISA = 3; // заменяем на TRISA = 3; ты же опрашиваешь кнопку на RA1, т е его и настраиваешь на вход
PORTA = 0x1c;
TRISB = 0;
PORTB = 0xff;
while(PORTA & Bit(1));
while(1)
{
tick();
if (PORTA & Bit(2)) PORTA &= ~Bit(2);
else POTRA |= Bit(2);
if (PORTB & Bit(1)) PORTB &= ~Bit(1);
else POTRB |= Bit(1);
}
}

Автор: bizar 26.01.04, 09:47
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    {
    tick();
    if (PORTA & Bit(2)) PORTA &= ~Bit(2);
    else POTRA |= Bit(2);
    if (PORTB & Bit(1)) PORTB &= ~Bit(1);
    else POTRB |= Bit(1);
    }

Объясни принцип работы этого кусочка (или натолкни на него).

Автор: potor 26.01.04, 11:47
Цитата

{
tick();
//------------------------------------------------
if (PORTA & Bit(2)) PORTA &= ~Bit(2);
else POTRA |= Bit(2);
// дословно:
// если 2-й бит порта PORTB установлен, сбрасываем его
// иначе устанавливаем его
//------------------------------------------------
if (PORTB & Bit(1)) PORTB &= ~Bit(1);
else POTRB |= Bit(1);
// тоже самое про первый бит порта PORTA
}

Автор: trainer 26.01.04, 12:03
Проще написать PORTB ^= Bit(1);
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    main()
        {
          TRISA = 3; // заменяем на TRISA = 3; ты же опрашиваешь кнопку на RA1, т е его и настраиваешь на вход
          PORTA = 0x1c;
          TRISB = 0;
          PORTB = 0xff;
          while(PORTA & Bit(1));
          while(1)
                  {
                  tick();
                  PORTA ^= Bit(2); // инвертируем бит
                  PORTB ^= Bit(1); // инвертируем бит
                  }
    }

Автор: potor 26.01.04, 12:27
2trainer
да, действительно, а я то бошку в свое время ломал, ка кэто одной командой сделать:)

Автор: bizar 26.01.04, 15:40
main()
{
TRISA = 3; // RA1 настраиваем на вход
TRISA = 4; // RA2 настраиваем на вход
TRISA = 8; // RA3 настраиваем на вход
PORTA = 0x1c;
TRISB = 0;
PORTB = 0xff;
while(PORTA & Bit(1));
while(1)
{
tick(); ????????????????????
tick2(); ??????????????????????
tick3(); ???????????????????????
PORTA ^= Bit(2); // инвертируем бит
PORTB ^= Bit(1); // инвертируем бит
??????????
??????????

}
}

Чёта я не понял как для нескольких кнопок делать.
А так в общем то potor и trainer спасибо за ваше терпение.

Автор: trainer 27.01.04, 07:18
Я так понимаю, что схема включения из CVET.RAR?
tick() - задержка на некоторый интервал времени?
Тогда этот код должен моргать некоторое время после нажатия кнопок одним из светодиодов, соответсвующим двоичному коду, образуемому нажатыми клавишами
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    main() {
       volatile unsigned char Keys;
       unsigned char mask;
       unsigned int i;
       TRISA = 4 | 8 | 16; // RA2,RA3,RA4 настраиваем на вход
       PORTA = 0x1c;
       TRISB = 0;
       while( 1 ) {
          PORTB = 0xff;
          do {
             tick();  // не будеи опрашивать кнопки слишком часто
             Keys = (~PORTA) & (4|8|16); // состояние кнопок на RA2-RA4. 1-нажата
          } while(Keys == 0);
          Keys >>= 2; // нормализуем(сдвигаем)
          mask = 1<<Keys; // битовая маска инвертируемого вывода порта B
          for( i=1000 ; i != 0 ; i-- ) {
             // "мигаем" соответствующим светодиодом
             PORTB ^= mask; // инвертируем бит
             tick(); // делаем небольшую задержку
          }
       }
    }
Здесь, правда, неплохо было бы ввести "антидребезг"

Автор: bizar 28.01.04, 14:01
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    for( i=1000; i != 0; i-- )


i=1000, это i = (TRISA = 8)? (В донном случаи i будет TRISA?)

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    mask = 1<<Keys; // битовая маска инвертируемого вывода порта B


По подробнее объясните.
У тебя в исходнике где: // "мигаем" соответствующим светодиодом
Можно указать одну последовательность миганий при нажатии,
А если я хочу к каждой кнопки различные последовательности мигания?
Так, на словах, что за "антидребезг".

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Я так понимаю, что схема включения из CVET.RAR?
    tick() - задержка на некоторый интервал времени?


Да, да.

Автор: trainer 29.01.04, 07:26
Цитата
bizar, 28.01.04, 17:01
i=1000, это i = (TRISA = 8)? (В донном случаи i будет TRISA?)
Это просто цикл из 1000 изменений состояния одного из светодиодов(светит/не светит).

Цитата
bizar, 28.01.04, 17:01
mask = 1<<Keys; // битовая маска инвертируемого вывода порта B

По подробнее объясните.
Это формирование битовой маски для инвертирования состояния нужного вывода. Просто в mask в бите, номер которого находится в Keys, будет установлена 1, в остальных битах - 0.

Цитата
bizar, 28.01.04, 17:01
У тебя в исходнике где: // "мигаем" соответствующим светодиодом
Можно указать одну последовательность миганий при нажатии,
А если я хочу к каждой кнопки различные последовательности мигания?
Можно. Программа только немного изменится.

Цитата
bizar, 28.01.04, 17:01
Так, на словах, что за "антидребезг".
Это несколько считываний состояния с небольшими интервалами между ними. Для устранения дребезга контактов.

Автор: bizar 29.01.04, 12:39
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    main()
            {
            volatile unsigned char Keys;
            unsigned char mask;
            unsigned int i;
            TRISA = 4 | 8 | 16; // RA2,RA3,RA4 настраиваем на вход
            PORTA = 0x1c;
            TRISB = 0;
            while(1)
                   {
                   PORTB = 0xff;
                   do
                    {
                    tick(); // не будеи опрашивать кнопки слишком часто
                    Keys = (~PORTA) & (4|8|16); // состояние кнопок на RA2-RA4. 1-нажата
                    }
                   while(Keys == 0);
                   Keys >>= 2; // нормализуем(сдвигаем)
                   mask = 1<<Keys; // битовая маска инвертируемого вывода порта B
                   for( i=1000; i != 0; i-- )
                           {
                           if (PORTA = 0x1b) PORTB == 0xfd; //Если RA2 вход, зажигаем RB1
                           if (PORTA = 0x17) PORTB == 0xfb; //Если RA3 вход, зажигаем RB2
                           else POTRB == 0xf7; //Если RA4 вход, зажигаем RB3
                           PORTB ^= mask; // инвертируем бит
                           tick(); // делаем небольшую задержку
                           }
                    }
            }
    }


Для нескольких кнопок.
Думаю что здесь что то не то. Проверьте?

Автор: trainer 29.01.04, 13:38
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    main() {
       volatile unsigned char Keys;
       unsigned char mask;
       unsigned int i;
       TRISA = 4 | 8 | 16; // RA2,RA3,RA4 настраиваем на вход
       PORTA = 0x1c;
       TRISB = 0;
       while(1) {
          PORTB = 0xff;
          do {
             tick(); // не будеи опрашивать кнопки слишком часто
             Keys = (~PORTA) & (4|8|16); // состояние кнопок на RA2-RA4. 1-нажата
          } while(Keys == 0);
          Keys >>= 2; // нормализуем(сдвигаем). Теперь:
                      //  бит 0 - RA2,
                      //  бит 1 - RA3,
                      //  бит 2 - RA4.
          mask = Keys;
          for( i=1000; i != 0; i-- ) {
             PORTB ^= mask;
             tick(); // делаем небольшую задержку
          }
       }
    }
Так?
P.S. Можно кое-что соптимизировать, но нагладность окончательно потеряется.

Автор: potor 29.01.04, 13:43
1)что то я не понял, Trainer же сделал тебе для нескольких кнопок?
2) нафига , если у тебя есть код нажатой кнопки в переменной mask, ты еще раз пытаешься проверять PORTA???
3) в твоем коде ошибка
if (PORTA = 0x1b) PORTB == 0xfd; //Если RA2 вход, зажигаем RB1
if (PORTA = 0x17) PORTB == 0xfb; //Если RA3 вход, зажигаем RB2
else POTRB == 0xf7; //Если RA4 вход, зажигаем RB3
эти строчки лишние:)

Автор: bizar 30.01.04, 06:29
potor, то есть где у trainer, написано
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    // "мигаем" соответствующим светодиодом

Можно написать код:
Если mask ровен тому-то выполнять те та включения светодиодов,
Если равен другому то другие светодиоды будут гореть?
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    for( i=1000; i != 0; i-- )

trainer, зачем ты :o использовал :o это в программе?

Автор: trainer 30.01.04, 08:11
Это цикл. Выполнять заданное действие ограниченное количество раз, а значит и ограниченное время.

Добавлено в :
Цитата
bizar, 30.01.04, 09:29
Если mask ровен тому-то выполнять те та включения светодиодов,
Только лучше не mask, а Keys. Расшифровку см. в сообщении #80

Автор: bizar 31.01.04, 09:10
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    potor, то есть где у trainer, написано
    // "мигаем" соответствующим светодиодом
     
    Можно написать код:
    Если mask ровен тому-то выполнять те та включения светодиодов,
    Если равен другому то другие светодиоды будут гореть?

Это будет выглядеть вот так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    {
    if (Keys = 0) POTRB == 0xfd; //Если Keys равен 0 горит светодиод на RB1
    if (Keys = 1) PORTB == 0xfb; //Если Keys равен 1 горит светодиод на RB2
    if (Keys = 2) PORTB == 0xf7; // Если Keys равен 2 горит светодиод на RB3
    }

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Это цикл. Выполнять заданное действие ограниченное количество раз, а значит и ограниченное время.

Тоесть светодиод мигнёт 1000 раз, и всё?

Автор: trainer 31.01.04, 17:23
Цитата
bizar, 31.01.04, 12:10
Тоесть светодиод мигнёт 1000 раз, и всё?
Точнее - 500 раз. В цикле одна итерация - зажечь, другая - погасить, т.е. две итерации на одну "вспышку". 1000/2 = 500.
Потом снова будет ожидаться нажатие кнопок.

Цитата
bizar, 31.01.04, 12:10
if (Keys = 0) POTRB == 0xfd; //Если Keys равен 0 горит светодиод на RB1
Keys внутри цикла for никогда не будет равен 0. Только от 1 до 7 включительно.
И этот набор if-ов можно заменить на switch(Keys)
P.S. В C и C++ присваивание значения обозначается = , а сравнение на равенство ==

Автор: bizar 01.02.04, 07:59
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    {
    switch (Keys == 1) PORTB = 0xfb; //Если Keys равен 1 горит светодиод на RB2
    switch (Keys == 2) PORTB = 0xf7; // Если Keys равен 2 горит светодиод на RB3
    else PORTB = 0xf7;
    }

Как ещё можно сделать, Keys = 0?
trainer, у тебя в примере, Keys от ноля до 2, можно было сделать от 1 до 3, или нет?
Чтобы такого гимара не было как в for не может Keys = 0.

Автор: trainer 01.02.04, 08:44
Цитата
bizar, 1.02.04, 10:59
Как ещё можно сделать, Keys = 0?
А зачем? Почему именно 0, а не, например, 1?

Цитата
bizar, 1.02.04, 10:59
у тебя в примере, Keys от ноля до 2
Не от 0 до 2, а три бита(с №0 по №2) - семь ненулевых значений(1,2,3,4,5,6,7).

Добавлено в :
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    switch( Keys ) {
       case 1:
          PORTB = 0xfb; //Если Keys равен 1 горит светодиод на RB2
          break;
       case 2:
          PORTB = 0xf7; // Если Keys равен 2 горит светодиод на RB3
          break;
       case 3:
          // другое действие
          break;
       case 4:
          // другое действие
          break;
       case 5:
          // другое действие
          break;
       case 6:
          // другое действие
          break;
       case 7:
          // другое действие
    }

Автор: bizar 02.02.04, 08:52
У нас же 3 кнопки почему case - 7 значений? :mellow:

Автор: trainer 02.02.04, 09:05
Цитата
bizar, 2.02.04, 11:52
У нас же 3 кнопки почему case - 7 значений?
Потому что каждой кнопке соответствует один бит, три кнопки - три бита. Могут быть нажаты и две и три кнопки одновременно. Всего комбинаций нажатий трех кнопок - 7 штук, в двоичном виде так:
001
010
011
100
101
110
111
Прим.: 1 - кнопка нажата, 0 - нет.

Автор: bizar 02.02.04, 10:42
Можно до 7 кнопок замутить?

Автор: trainer 02.02.04, 11:07
Цитата
bizar, 2.02.04, 13:42
Можно до 7 кнопок замутить?
Можно сколько угодно. Лишь бы портов хватило. В существующем варианте 3 кнопки, для которых существует 7 комбинаций нажатий.

Автор: potor 02.02.04, 11:11
нет, 3-входа=7 возможных состояний

Добавлено в :
ссори, уже ответили:)

Автор: bizar 02.02.04, 17:23
Типа этого?

Автор: NadZ 02.02.04, 19:31
Прошу прощения за оффтопик, но тут вообще про что? А то интересно стало!

Автор: trainer 03.02.04, 05:35
Цитата
NadZ, 2.02.04, 22:31
Прошу прощения за оффтопик, но тут вообще про что? А то интересно стало!
Да тут bizar пытается осваивать программирование микроконтроллеров на примере создания "мигалки" на МК семейства PIC16

Добавлено в :
Цитата
bizar, 2.02.04, 20:23
Типа этого?
Нет. :)
У тебя три бита(три входа: RA2,RA3,RA4, три кнопки). Сколько у трех бит возможных ненулевых состояний?
Ответ: 7
Хочешь больше - добавь еще используемых входов(портов) микроконтроллера. Только придется взять микроконтроллер побольше или совмещать функции выводов в существующем.

Автор: bizar 03.02.04, 09:26
Если нельзя сделать на трёх выводах семь кнопок,
зачем нужны :huh: 7 :huh: ненулевых состояний?

Автор: potor 03.02.04, 10:33
тебе же говорят, ты можешь отслеживать одновременное нажатие кнопок:)

Автор: trainer 03.02.04, 11:27
Цитата
bizar, 3.02.04, 12:26
зачем нужны 7 ненулевых состояний?
Они не нужны. Они есть. Элементарная двоичная арифметика - слово размером в три двоичных разряда имеет семь состояний, когда хотя бы один бит ненулевой. Не хочешь отслеживать все возможные состояния - не отслеживай. :)

Автор: bizar 03.02.04, 12:43
Нажимаю на кнопку выполняется зажигание светодиодов,
потом нажимаю другую, в исходнике trainer, не должны выполняться
другие зажигания, а будет выполняться до конца нажатие первой кнопки????

Добавлено в :
potor, я смогу нажать две кнопки одновременно и что из этого выйдит?

Автор: trainer 03.02.04, 13:09
:)
Программа опрашивает состояние всех кнопок и ждет пока не будет нажата хотя бы одна из них. Затем в соответствии с их состоянием выполняет некое действие в течение некоторого времени, затем снова опрашивает состояние и т.д..
Цитата
bizar, 3.02.04, 15:43
я смогу нажать две кнопки одновременно и что из этого выйдит?
Что напишешь в соответствующем case, то и выйдет.

Автор: bizar 04.02.04, 10:48
trainer, почему та сказал "нет" :rolleyes: , про схему
#93 там-же есть одновременное нажатие 2 кнопок, только в одной кнопки?

Автор: trainer 04.02.04, 10:58
Потому, что это не решение. В схеме из #93 можно все равно нажать несколько кнопок. Так зачем такой огород городить? Если 3 кнопки обеспечивают то же самое.

Автор: bizar 05.02.04, 09:28
В #include, нужно указать библиотеку, у меня IAR (PIC), (potor у тебя есть IAR для пик (ты его скачал или нет)) я не знаю какие библиотеки для чего служат, укажите какие/для чего?
Фрагменты выделенные :unsure: с двух сторон :unsure: :
Можно ли описывать так или нужно ставить break, мне надо одновременно чтобы порты RA и RB гасли светодиоды?
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include<имя файла, где описан твой пресловутый порт RB, RA>
    main()
         {
         volatile unsigned char Keys;
         unsigned char mask;
         unsigned int i;
         TRISA = 4 | 8 | 16; // RA2,RA3,RA4 настраиваем на вход
         PORTA = 0xff;
         TRISB = 0;
         while(1)
                {
                 PORTB = 0xff;
                 do
                   {
                    tick(); // не будеи опрашивать кнопки слишком часто
                    Keys = (~PORTA) & (4|8|16); // состояние кнопок на RA2-RA4. 1-нажата
                   }
                 while(Keys == 0);
                 Keys >>= 2; // нормализуем(сдвигаем)
                 mask = 1<<Keys; // битовая маска инвертируемого вывода порта B
                 for( i=1000; i != 0; i-- )
                                          {
                                           switch( Keys )
                                                        {
                                                        case 1:
                           PORTA = 0x1d; //Если Keys равен 1 горит светодиод на RA1
                           break;
                           PORTA = 0x1c; //горит RA1 и RA0
                           break;
                           PORTB = 0x7f; // горит RB7 с RA1 и RA0
                           break;
                           PORTB = 0x3f; // горит RB7, RB6 (RA1 - 0)
                           break;
                           PORTB = 0x1f; // горит RB7 - RB5 (RA1 - 0)
                           break;
                           PORTB = 0xf; // горит RB7 - RB4 (RA1 - 0)
                           break;
                           PORTB = 0x7; // горит RB7 - RB3 (RA1 - 0)
                           break;
                           PORTB = 0x3; // горит RB7 - RB2 (RA1 - 0)
                           break;
                           PORTB = 0x1; // горит RB7 - RB1 (RA1 - 0)
                           break;
                           PORTB = 0x0; // горит RB7 - RB0 (RA1 - 0)
                           //горят все светодиоды
                           break;
    :unsure:               PORTB = 0xff; // гасим светодиоды на RB
                           PORTA = 0xff; // гасим светодиоды на RA
    :unsure:               break;  
                           PORTB = 0xfe; // горит RB0
                           break;
                           PORTB = 0xfc; // горит RB0, RB1
                           break;
                           PORTB = 0xf8; // горит RB0 - RB2
                           break;
                           PORTB = 0xf0; // горит RB0 - RB3
                           break;
                           PORTB = 0xe0; // горит RB0 - RB4
                           break;
                           PORTB = 0xco; // горит RB0 - RB5
                           break;
                           PORTB = 0x80; // горит RB0 - RB6
                           break;
                           PORTB = 0x0; // горит весь RB порт
                           break;
                           PORTA = 0x1d; // горит RA1 (RB0 - 7)
                           break;
                           PORTA = 0x1c; // горит RA0, RA1 (RB0 - 7)
                           break;
    :unsure:               PORTA = 0xff; // гасим RA
                           POTRB = 0xff; // гасим RB
    :unsure:               break;
                          
                                                     case 2: // делаю в виде бегущей туда сюда точки
                           PORTA = 0x1d; // Если Keys равен 2 горит светодиод на RA1
                           break;
                           PORTA = 0x1e; //горит светодиод на RA0                      
                           break;
    :unsure:               PORTA = 0xff; // гасим RA порт
                           PORTB = 0x7f; //горит светодиод на RB7
    :unsure:               break;  
                           PORTB = 0xbf; //горит светодиод на RB6
                           break;
                           PORTB = 0xdf; //горит светодиод на RB5
                           break;
                           PORTB = 0xef; //горит светодиод на RB4
                           break;
                           PORTB = 0xf7; //горит светодиод на RB3
                           break;
                           PORTB = 0xfb; //горит светодиод на RB2
                           break;
                           PORTB = 0xfd; //горит светодиод на RB1
                           break;
                           PORTB = 0xfe; //горит светодиод на RB0
                           break;
                           PORTB = 0xfd; //горит светодиод на RB1
                           break;
                           PORTB = 0xfb; //горит светодиод на RB2
                           break;
                           PORTB = 0xf7; //горит светодиод на RB3
                           break;
                           PORTB = 0xef; //горит светодиод на RB4
                           break;
                           PORTB = 0xdf; //горит светодиод на RB5
                           break;
                           PORTB = 0xbf; //горит светодиод на RB6
                           break;
                           PORTB = 0x7f; //горит светодиод на RB7
                           break;
    :unsure:               PORTB = 0xff; // гасим RB порт
                           PORTA = 0x1e; //горит светодиод на RA0
    :unsure:               break;
                           PORTA = 0x1d; //горит светодиод на RA1
                           break;
                                                   }
                                         PORTB ^= mask; // инвертируем бит
                                         tick(); // делаем небольшую задержку
                                        }
                        }
               }
    tick() // делаем задержку времени
         {
          for (unsigned int i = 0xffff; i!=0; i--);
          for (unsigned int i = 0xffff; i!=0; i--);
          for (unsigned int i = 0xffff; i!=0; i--);
          for (unsigned int i = 0xffff; i!=0; i--);
         }

Автор: trainer 05.02.04, 11:37
Слишком уж много у тебя строчек в switch. :)
то есть хочется сделать бегущий огонь?
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include <pic16f84.h>
    /* подпрограмма временной задержки */
    void tick(void) {
       unsigned int i;
       for ( i = 0xffff; i!=0; i--);
       for ( i = 0xffff; i!=0; i--);
       for ( i = 0xffff; i!=0; i--);
       for ( i = 0xffff; i!=0; i--);
    }
    /* Эта подпрограмма зажигает нулем светодиод на определенном выводе */
    void FlashPin(unsigned char pin_code){
       switch(pin_code) {
          case 0:
          case 1:
          case 2:
          case 3:
          case 4:
          case 5:
          case 6:
          case 7:
             /* 0-7 - выводы порта B */
             PORTB &= 0xfe<<pin_code;
             break;
          case 8:
          case 9:
             /* 8,9 - выводы порта A(RA0,RA1) */
             PORTA &= 0xfe<<(pin_code-8);
       }
    }
    /* Эта подпрограмма гасит все светодиоды */
    void TurnOffPins(void) {
       PORTB = 0xff;
       PORTA |= 3;
    }
    /* основная программа */
    main() {
       volatile unsigned char Keys;
       unsigned char counter;
       unsigned char i;
       unsigned char direction;
       TRISA = 4 | 8 | 16; // RA2,RA3,RA4 настраиваем на вход
       PORTA = 0x1c;
       TRISB = 0;
       while(1) {
          TurnOffPins();   /* гасим все светодиоды */
          do {
             tick(); // не будем опрашивать кнопки слишком часто
             Keys = (~PORTA) & (4|8|16); // состояние кнопок на RA2-RA4. 1-нажата
          } while(Keys == 0);
          Keys >>= 2; // нормализуем(сдвигаем). Теперь:
                      //  бит 0 - RA2,
                      //  бит 1 - RA3,
                      //  бит 2 - RA4.
          counter = Keys;
          direction = -1;   /* направление "движения" */
          for( i=1000 ; i != 0 ; i-- ) {
             if( counter == Keys ) {
                // прошли круг - начанаем двигаться в другую сторону
                direction = -direction;
             }
             TurnOffPins();        /* гасим все светодиоды */
             FlashPin(counter);    /* зажигаем определенный */
             counter += direction; /* в следующий раз будем зажигать другой */
             if( counter == 0xff ) {
                /* закольцовываем "снизу" */
                counter = 9;
             }
             if( counter == 10 ) {
                /* закольцовываем "сверху" */
                counter = 0;
             }
             tick();  /* пауза - чтобы светодиод погорел немного */
          }
       }
    }
Работоспособность не проверял - у меня нет ни IAR EW PIC, ни PIC16F84
Что будет не понятно - отвечу.

Автор: potor 05.02.04, 14:14
Цитата

potor у тебя есть IAR для пик (ты его скачал или нет)

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

Автор: bizar 06.02.04, 09:27
Может сначало кряк поставить надо:

Автор: potor 06.02.04, 12:55
нет, я думаю сам пакет на iar-овском сайте битый лежит, ты то себе установил???

Автор: bizar 07.02.04, 08:05
У меня всё Ok поставилось, бес проблем.
Может как-нибудь тебе перекинуть... ^_^

Автор: potor 08.02.04, 01:52
да наверное не надо, как ты можешь его выслать? если почтой, я не вытяну такое письмо физически, кстати, ты тестовую плату спаял? работает? а то может мы обсуждаем неизвестно что?

Автор: bizar 10.02.04, 08:30
trainer, у тебя всё так сложно (в исходнике),
ты сможешь написать алгоритм (чтобы было более понятней)?
(до простого смертного это не доходит).

potor, плату накидал, теперь нужно скомпилить.
Как в IAR компилить??? :unsure:

Автор: potor 10.02.04, 08:49
Цитата

Как в IAR компилить???

build, только предварительно выставить нужные опции в свойствах проекта

Автор: bizar 10.02.04, 08:59
свойства проекта где расположены?
Project->build all?

Автор: potor 10.02.04, 09:05
Project->build all это скомпилировать весь проект
свойства проекта, это что то типа Project->properties, я сейчас на работе а там IAR а нет, поэтому точно сказать не могу, но помню точно, что значек свойств есть на панели инструментов

что тебе конкретно не понятно в исходнике trainera?
ты кернигена с ричем скачал?

Автор: bizar 10.02.04, 09:13
potor, если ссылки есть скинь.
Я обыкновенной самообучалкой пользуюсь, там такие сложные
примеры на разбирают.

Автор: potor 10.02.04, 09:17
http://cclib.nsu.ru/projects/gnudocs/texts/kernigan.html

Автор: trainer 10.02.04, 11:14
Цитата
bizar, 10.02.04, 11:30
ты сможешь написать алгоритм (чтобы было более понятней)?
А воспользоваться отладчиком? ;)

Итак, идея программы из #104 - создание бегущего огня. Пользователь нажимает одну или несколько кнопок - МК определяет двоичную комбинацию N, соответствующую нажатыи кнопкам и начинает гонять огоньки. Первым загорается светодиод N, затем он гаснет и загорается N+1-ый и так далее до 10-го, после которого загорается 1, затем 2 и так далее до N-го, после чего начинается движение в обратную сторону: N-1-ый, N-2-ой,...,1-ый, 10-ый и далее снова до N-го. И так далее по кругу.
Комментариев я там в тексте программы вроде достаточно много написал. :)

Автор: bizar 17.02.04, 13:39
trainer, а алгоритм для второй кнопки не как сделать не могу
а свитчей там ещё больше (это в моём примере где много свитч)

Добавлено в :
potor тестовую плату спаял только пример скомпилить не могу.

Автор: potor 17.02.04, 13:46
Цитата

trainer, а алгоритм для второй кнопки не как сделать не могу
а свитчей там ещё больше (это в моём примере где много свитч)

дык он же тебе для нескольких кнопок сделал?
Цитата

potor тестовую плату спаял только пример скомпилить не могу.

что неполучается? что говорят компилятор и линкер?

Автор: bizar 17.02.04, 13:59
Создаю Project и что дальше делать не знаю
куда кад вставлять?
Когда создаёшь Text вставляешь код
В заголовке Project, build - нельзя нажать.
Что делать?

Автор: trainer 17.02.04, 14:29
Если в IAR EWPIC так же, как и в IAR EWAVR, то нажимаешь меню File->New..., выбираешь source/text, вставляешь текст, нажимаешь File->SaveAs..., вводишь имя в виде имя_файла.c , нажимаешь Сохранить.
Если в проекте в разделе Common Sources этот файл не появился, то нажимаешь меню Project->Files..., выбираешь этот файл, нажимаешь Add, затем Done.
Файл в проекте.
Дальше - компиляция.

Автор: bizar 18.02.04, 03:44
В IAR для pic также.
Но у меня проблема счёлкаю project
а там все кнопки нельзя нажать кроме
двух последних (Librarian, Debugger).???????

Автор: potor 18.02.04, 05:47
незнаю, что то ты тупишь, домой приду посмотрю:)

Автор: trainer 18.02.04, 05:48
Ну, не знаю...
У меня в IAR EWAVR даже при пустом проекте эти кнопки активны.

Автор: bizar 18.02.04, 07:00
Вот полюбуйтесь что у меня выдаёт.
(Я почему-то не смог прекрепить этот файл к сообщению
выдовал ошибку может кто попробует, мне любопытно)Скачайте тут

Автор: potor 18.02.04, 07:23
дык сначало надо проект создать, а потом уже к нему С файл прикркплять

Добавлено в :
в меню file должно быть что то типа New WorckSpace, или New Project

Автор: bizar 18.02.04, 08:56
Создал я New Project
как к нему *.с файл прекрепить
и что далее делать опиши???

Автор: potor 18.02.04, 09:03
ну ищи что то типа Add file to project

Добавлено в :
посмотри вчерашний пост 120 от trainerа

Автор: bizar 18.02.04, 09:09
Нашёл Project->File
Теперь с чего начинать компилить.????

Автор: potor 18.02.04, 09:10
ты присоединил файл к проекту?

Добавлено в :
тип процессора задал?

Добавлено в :
если все ок, то жмакаешь build и наблюдаешь кучу ошибок, а потом вываливаешь их сюда

Автор: bizar 18.02.04, 09:17
В Project->Options
В General нужно указать путь к "Процессор сетап файл" pic16f84
Так да??? Что дальше???

Добавлено в :
Rebuilding target Debug...
tit.c
C:\Documents and Settings\bizar1\Рабочий стол\tit.c (2) : Fatal Error[Pe005]: could not open source file "pic16f84.h"

Total number of errors: 1
Total number of warnings: 0

Ошибка с описанием pic16f84????

Автор: potor 18.02.04, 09:27
смотри где у тебя находится файл pic16f84.h, и если его нет иши вайл с описаниями регистров
а вообще если он в каталоге твоего проекта пишут #include"pic16f84.h", а если в каталоге стандартных заголовков пишут #include<pic16f84.h>, но скорее всего он у тебя называется по другому, ищи, я на обед буду через час

Автор: bizar 18.02.04, 09:42
Нашол он правельно называеться io16f84.h
Теперь выдаёт:Rebuilding target Debug...
tit.c
C:\Documents and Settings\bizar1\Рабочий стол\tit.c (56) : Warning[Pe068]: integer conversion resulted in a change of sign
C:\Documents and Settings\bizar1\Рабочий стол\tit.c (57) : Warning[Pe069]: integer conversion resulted in truncation
Linking...

Total number of errors: 0
Total number of warnings: 2
Что дальше??

Автор: potor 18.02.04, 10:20
ну, вроде скомпилил (правда с варнингами), посмотри на какие мтрочки кода он выдает варнинги

Автор: bizar 19.02.04, 10:37
Всё удолил и повторил всё заново
Выдаёт:
Rebuilding target Debug...
tit.c
C:\PROGRA~1\IARSYS~1\ew23\PICmicro\INC\io16f84.h (24) : Fatal Error[Pe035]: #error directive: "This I/O-file is for the 16F84 controller only"

Total number of errors: 1
Total number of warnings: 0

Автор: potor 19.02.04, 10:48
видимо ты забыл в свойствах проекта задать тип контроллера, т е получается, что ты берешь заголовочный файл для PIC 16f84, а в проекте указан другой тип

Автор: trainer 19.02.04, 10:50
Цитата
bizar, 19.02.04, 13:37
Всё удолил и повторил всё заново
Зачем? У тебя же в #132 уже откомпилировалось. :)

Автор: bizar 19.02.04, 11:00
Незнаю просто решил потренироваться.
Сейчас удолил строчку в библиотеке io16f84.h
Скампелил:
Rebuilding target Debug...
tit.c
C:\Documents and Settings\bizar1\Рабочий стол\tit.c (55) : Warning[Pe068]: integer conversion resulted in a change of sign
C:\Documents and Settings\bizar1\Рабочий стол\tit.c (56) : Warning[Pe069]: integer conversion resulted in truncation
Linking...

Total number of errors: 0
Total number of warnings: 2


warnings:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    direction = -1;  
          for( i=1000; i != 0; i-- )


Добавлено в :
Potor ты был прав...

Автор: potor 19.02.04, 11:06
определи direction как signed char

Автор: bizar 19.02.04, 12:32
Всё работает теперь осталось одна ошибка
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    for( i=1000; i != 0; i-- )

Автор: potor 19.02.04, 12:48
объяви i как unsigned int

Добавлено в :
только в функции main конечно

Автор: trainer 19.02.04, 13:27
Цитата
potor, 19.02.04, 14:06
определи direction как signed char
Или напиши:
direction = (unsigned char)-1;



Ну что, типа, одним эмбеддером стало больше. :)



А работает-то как задумано?

Автор: potor 19.02.04, 13:32
Цитата

Ну что, типа, одним эмбеддером стало больше

да, вот только проверить на девайсе осталось:)

Автор: bizar 20.02.04, 08:56
Total number of errors - Это ошибки
Total number of warnings - а это про что??

Автор: potor 20.02.04, 09:05
Цитата

Total number of errors - Это ошибки
Total number of warnings - а это про что??

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

Автор: trainer 20.02.04, 09:27
Цитата
bizar, 20.02.04, 11:56
Total number of warnings - а это про что??
Это просто предупреждения. Например, о том, что компилятор не уверен в правильности чего-то. Или предупреждает о потенциальной опастности каких-то конструкций. Или просто сообщает, что он что-то сделал. :)

Автор: bizar 20.02.04, 09:30
Всё откомпилил "Ошибок нет".
Теперь нужно вытащить *.hex или *.bin
Как?

Автор: potor 20.02.04, 10:27
если линкер не создал hex, смотри настройки линкера, там должно быть чтго то типа generate hex file, или create hex file

Автор: bizar 21.02.04, 14:39
Нашёл только Generate linker listing
постави галочку и некаких изменений как мне быть? :unsure:

Автор: trainer 21.02.04, 16:03
Смотри содержимое папки Debug\Exe или Release\Exe в зависимости от того, какой проект собираешь(debug или release)

Автор: bizar 22.02.04, 05:26
В Release\Exe пусто нет ни одного файла
а в Debug\Exe два файла:
rrr.d39
rrr - в нём садержиться:
[Registers]
HiddenRegs=
NumVirtualRegs=0
[Watch]
Watches=
[Report]
DefWindowPos=0,1,-1,-1,-1,-1,0,0,500,195
[Source]
DefWindowPos=0,1,-1,-1,-4,-23,22,22,522,217
[Desktop]
Maximized=1
Pos0=0,1,-1,-1,-4,-23,22,22,522,217
Pos1=0,1,-1,-1,-1,-1,0,0,500,195
WndList=1,4
[States]
RestoreStates=0
NoOfStates=5
State0=1@8@8@0@24@1@1@4@21@1@4@0x18@^@^@^@
State1=1@8@8@0@25@1@1@4@21@1@4@0x19@^@^@^@
State2=1@8@8@0@27@1@1@4@21@1@4@0x1B@^@^@^@
State3=9@1@8@0@
State4=4@1@1@0@

Что дальше делать???? :ph34r:

Автор: trainer 22.02.04, 07:21
В свойствах соответствующей версии проекта в категории XLINK, закладка Output, группа Format что указано?

Автор: bizar 22.02.04, 08:10
Debug info with terminal I/O
На нём точка стоит.

Добавлено в :
Всё зделал
Результат:
:100000000A28950A950B052808000310930D940DF6
:020010000228C4
:100014006E28FF308C008D001328FF308D07031CE1
:100024008C030C080D04031D0F28FF308C008D0079
:100034001F28FF308D07031C8C030C080D04031DBF
:100044001B28FF308C008D002B28FF308D07031CEC
:100054008C030C080D04031D2728FF308C008D0031
:100064003728FF308D07031C8C030C080D04031D77
:100074003328080000308A000C08F63E031867286D
:100084000D3E020703188A0A82005128512851287C
:10009400512851285128512851285C285C28940162
:1000A400FE3093000C0895000120130813088312F6
:1000B400860567289401FE3093000C08F83E9500ED
:1000C400012013081308831285050800FF308312EA
:1000D40086000330850408001C30831685008312D3
:1000E400850000308316860068200B2083120509E2
:1000F4001C398F008F080319772803108F0C031005
:100104008F0C0F088E00FF30900003309100E83010
:10011400920011081204031976280F080E06031D15
:1001240096281008003C900068200E088C003C20A3
:1001340010088E07FF300E06031DA22809308E001A
:100144000A300E06031DA82800308E000B20FF3055
:080154009207031C91038B28A4
:00000001FF

Добавлено в :
Теперь ради интереса
хотел попробовать исходник с сообщения #103
Визде где switch выдал ошибки, поидее должно работать.
В чём дело???

Автор: trainer 22.02.04, 08:54
Цитата
bizar, 22.02.04, 11:10
хотел попробовать исходник с сообщения #103
Нет, то , что написано там, нормально компилироваться не будет никогда.

Добавлено в :
Цитата
bizar, 22.02.04, 11:10
Результат:
Ну вот это и есть hex-файл :)

Автор: bizar 27.02.04, 10:25
В инете не могу нармального, обычного програматора для Pic 16f84 найти.
Схем море но они нерабочие 2 программатор собираю и облом.
Скиньте схему точно рабочего прогромматора для PIC16F84, для программы ICPROG???

Автор: potor 27.02.04, 15:47
http://www.lancos.com/prog.html
подойдет, если у тебя PIC16F84A (там и схема и программа), а лучше задай этот вопрос на телесистемах людям, которые пиками занимаются, или на www.microchip.ru

Автор: bizar 28.02.04, 06:56
Собираю это воидино и должно работать???

user posted image
user posted image

Автор: potor 29.02.04, 02:04
возможно, не знаю, не пробовал:)

Автор: bizar 29.02.04, 04:55
potor что за выход Select power ext/batt
их вместе соединять с обеих картинок?
На сайте печатную плату не нашёл, (небеда сделаю) но ты её на том сайте
не видел, а то время тратить неохота?

Автор: trainer 29.02.04, 07:29
Цитата
bizar, 29.02.04, 07:55
что за выход Select power ext/batt
Это не выход. Это переключатель - внешнее питание( с External power circuit, а тот в свою очередь с внешнего БП ) или батарейное( от BT1 )

Автор: bizar 11.03.04, 10:57
Вроде всё пашет но чёто быстро он моргает.
Теперь нужно разобраться с обменном информации с компом.
Подключаю PIC к COM порту, подрубаю две кнопки.
При нажатии кнопки в моей проге на компе будет выведено какая кнопка была нажата.
Пишим прошиву. Что посоветуете??? potor, trainer вы работали с COM портами???

Автор: potor 11.03.04, 11:28
Цитата

Вроде всё пашет но чёто быстро он моргает.

ну переделай подпрограмму задержки, в чем проблемы?
например так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    void tick(void)
       {
       for ( unsigned int i = 0xffff; i!=0; i--)
          for ( unsigned char j = 10; j!=0; j--);
       }

на будующее вообще в восьмиразрядных контроллерах лучше меньше использовать тип int, как правило получается длинный код, тоесть оптимальнее так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    void tick(void)
       {
       for ( unsigned char i = 0xff; i!=0; i--)
          for ( unsigned char y = 0xff; y!=0; y--)
             for ( unsigned char j = 10; j!=0; j--);
       }



Цитата

Пишим прошиву. Что посоветуете??? potor, trainer вы работали с COM портами???


да, работали, ща посмотрю доку на твой контроллер

Добавлено в :
хе, у PIC16f84 нет встроенного UARTа т е придется тебе программно, по битику передавать
помочь помогу, но писать за тебя не буду:)
теперь скажи какая у тебя тактовая частота

Автор: bizar 12.03.04, 09:37
8 Mhz

Что за UART???

Автор: potor 12.03.04, 10:54
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    Что за UART???

универсальный асинхронный приемопередатчик, каковым com и является

ща прикину, как это лучше сделать передачу

Автор: trainer 12.03.04, 11:26
На какой скорости хочешь общаться с ПК?

Автор: potor 12.03.04, 13:56
в общем так:
1) для начала нам надо реализовать функию задрежки передачи следующего бита
выглядеть она будет примерно так
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    void TransmitBitDelay(void)
    {
    for (int i= число1; i!=0; i--)
      for (int j= число2; j!=0; j--);
    }

как подобрать числа расскажу дальше
2)организуем передачу (предполагаем ,что передатчик подключен к RA0, 8 бит данных, проверки четности нет, 1 стоповый бит, на выходе RA0 стоит max232)
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    void TransmitByte(char Symbol)
    {
     PORTA &= 0xfe; //передаем стартовый бит
     count = 8;// счетчик передаваемых бит данных
     do
       {
        TransmitBitDelay(); // задержка перед передачей следующего бита
        PORTA ^= (~Symbol) & 1; // выдаем очередной бит в COM
        Symbol >>= 1; //следующий бит
        count--;
       } while (count >0);
     TransmitBitDelay(); // задержка перед передачей следующего бита
     PORTA |= 1; //передаем стоповый бит
    }


теперь как посчитать числа:
компилиш программу, заходишь в отладчик и смотришь ассемблерный код функции TransmitBitDelay зная что обычная команда у тебя выполняется с частотой 2MHz команда перехода 1MHz подбираещь числа таким образом, чтобы вышеуказанная ф-я выполнялась с частотой равной частоте передачи

Автор: bizar 12.03.04, 17:28
Цитата trainer @ 12.03.04, 17:26
На какой скорости хочешь общаться с ПК?

А с какой лучше?

Автор: trainer 12.03.04, 17:45
Цитата
bizar, 12.03.04, 20:28
А с какой лучше?
Это зависит от задачи. С одной стороны, чем выше скорость - тем быстрее обмен. С другой стороны, чем выше скорость, тем больше ресурсов отъедает эмуляция последовательного порта. Обычно выбирают от 300 до 9600 бит/сек. Можно просто прикинуть необходимую скорость исходя из пропускной способности, времени реакции и реализуемого протокола.

Автор: bizar 14.03.04, 08:19
/*Вод что у меня преблезительно получилось*/
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include <io16f84.h>
    /* подпрограмма временной задержки */
    void tick(void) {
       unsigned int p;
       for ( p = 0xffff; p!=0; p--);
       for ( p = 0xffff; p!=0; p--);
       for ( p = 0xffff; p!=0; p--);
       for ( p = 0xffff; p!=0; p--);
    }
     
    void TransmitBitDelay(void)
    {
    for (int i= число1; i!=0; i--)
      for (int j= число2; j!=0; j--);
    }
     
    void TransmitByte(char Symbol)
    {
     PORTA &= 0xfe; //передаем стартовый бит
     count = 8;// счетчик передаваемых бит данных
     do
       {
        TransmitBitDelay(); // задержка перед передачей следующего бита
        PORTA ^= (~Symbol) & 1; // выдаем очередной бит в COM
        Symbol >>= 1; //следующий бит
        count--;
       } while (count >0);
     TransmitBitDelay(); // задержка перед передачей следующего бита
     PORTA |= 1; //передаем стоповый бит
    }
     
     
    main ()
           {
        TRISB = 4|8;  /* RB2 - RB3 настраиваем на вход */
        PORTB = 0xfc; /* RB0 - RB1 настраиваем на вывод*/
        while(1)
        {
         do
        {
             tick(); /* НЕБОЛЬШОЙ ПРОМЕЖУТОК ВРЕМЕНИ, "не будем опрашивать кнопки слишком часто" */
             Keys = (~PORTB) & (4|8); /* состояние кнопок на RB2-RB3. Ждёт нажатия */
        }
        Keys >>= 1;
        while(PORTB & Bit(0)); /* если установлен бит 0, значит нажата кнопка на RB2 */
        while(1)
            {
            void TransmitByte(34) /* посылаем 34 */
            }
        while(PORTB & Bit(1)); /* если установлен бит 1, значит нажата кнопка на RB3 */
        while(1)
            {
            void TransmitByte(35) /* посылаем 35 */
            }
        }
        }

Автор: trainer 14.03.04, 14:52
Цитата
bizar, 14.03.04, 11:19
do
{
TransmitBitDelay(); // задержка перед передачей следующего бита
PORTA ^= (~Symbol) & 1; // выдаем очередной бит в COM
Symbol >>= 1; //следующий бит
count--;
} while (count >0);
Лучше бы наверное так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     do
       {
        TransmitBitDelay(); // задержка перед передачей следующего бита
        PORTA = (PORTA&0xfe)|(Symbol&1); // выдаем очередной бит в COM
        Symbol >>= 1; //следующий бит
        count--;
       } while (count >0);


В main напортачил:
Цитата
bizar, 14.03.04, 11:19
while(1)
{
void TransmitByte(34) /* посылаем 34 */
}
Здесь цикл явно лишний: while(1) - это бесконечный цикл

Цитата
bizar, 14.03.04, 11:19
while(1)
{
void TransmitByte(35) /* посылаем 35 */
}
Здесь то же самое.
Ну и еще там несколько ошибок и лишних действий. :)
Я не знаю, что ты задумал, но main можно написать так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    main () {
       TRISB = 4|8;  /* RB2 - RB3 настраиваем на вход */
       PORTB = 0xfc; /* RB0 - RB1 настраиваем на вывод*/
       while(1) {
          do {
             tick(); /* НЕБОЛЬШОЙ ПРОМЕЖУТОК ВРЕМЕНИ, "не будем опрашивать кнопки слишком часто" */
             Keys = (~PORTB) & (4|8); /* состояние кнопок на RB2-RB3. Ждёт нажатия */
          } while( Keys == 0 );
          if(Keys & Bit(2))   /* если установлен бит 0, значит нажата кнопка на RB2 */
             TransmitByte(34); /* посылаем 34 */
          if(Keys & Bit(3))   /* если установлен бит 1, значит нажата кнопка на RB3 */
             TransmitByte(35); /* посылаем 35 */
       }
    }

Автор: bizar 15.03.04, 08:47
Цитата
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Я не знаю, что ты задумал,

Создаём две кнопки при нажатии которых pic будет посылать
код соответствующей кнопки.
Теперь по поводу числа potor чёт я несовсем понял?????
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include <io16f84.h>
    /* подпрограмма временной задержки */
    void tick(void) {
       unsigned int p;
       for ( p = 0xffff; p!=0; p--);
       for ( p = 0xffff; p!=0; p--);
       for ( p = 0xffff; p!=0; p--);
       for ( p = 0xffff; p!=0; p--);
    }
     
    void TransmitBitDelay(void)
    {
    for (int i= число1; i!=0; i--)
      for (int j= число2; j!=0; j--);
    }
     
    void TransmitByte(char Symbol)
    {
     PORTA &= 0xfe; //передаем стартовый бит
     count = 8;// счетчик передаваемых бит данных
     do
       {
        TransmitBitDelay(); // задержка перед передачей следующего бита
        PORTA ^= (~Symbol) & 1; // выдаем очередной бит в COM
        Symbol >>= 1; //следующий бит
        count--;
       } while (count >0);
     TransmitBitDelay(); // задержка перед передачей следующего бита
     PORTA |= 1; //передаем стоповый бит
    }
     
    main () {
       TRISB = 4|8;  /* RB2 - RB3 настраиваем на вход */
       PORTB = 0xfc; /* RB0 - RB1 настраиваем на вывод*/
       while(1) {
          do {
             tick(); /* НЕБОЛЬШОЙ ПРОМЕЖУТОК ВРЕМЕНИ, "не будем опрашивать кнопки слишком часто" */
             Keys = (~PORTB) & (4|8); /* состояние кнопок на RB2-RB3. Ждёт нажатия */
          } while( Keys == 0 );
          if(Keys & Bit(2))   /* если установлен бит 0, значит нажата кнопка на RB2 */
             TransmitByte(34); /* посылаем 34 */
          if(Keys & Bit(3))   /* если установлен бит 1, значит нажата кнопка на RB3 */
             TransmitByte(35); /* посылаем 35 */
       }
    }

Автор: potor 16.03.04, 07:15
PORTA забыл проинициализировать

Автор: bizar 16.03.04, 12:29
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    PORTA &= 0xfe; //передаем стартовый бит


Народ а помоему это PORTB ??????

potor, дык про числа обьестни по понятней..

Автор: potor 16.03.04, 12:37
Цитата

Народ а помоему это PORTB ??????

не понял?????
Цитата

дык про числа обьестни по понятней..

откомпили, зайди в отладчик и выложи сюда ассемблерный код ф-и TransmitBitDelay

Автор: potor 16.03.04, 13:42
ессно перед тем как компилить подставь вместо чисел например 10

Автор: bizar 25.03.04, 10:19
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include<io16f84.h>
    void TransmitBitDelay(void)
    {
    int i,j;
    for (i=10; i!=0; i--)
    for (j=10; j!=0; j--);
    }

Выдаёт ошибку
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Rebuilding target Debug...
    Untitled4.c
    Linking...
    Error[e46]: Undefined external "main" referred in __MAIN_CALL__ ( C:\PROGRAM FILES\IAR SYSTEMS\EW23\PICmicro\LIB\cl16f84.r39 )
     
    Total number of errors: 1
    Total number of warnings: 0


Что делать???

Автор: potor 25.03.04, 12:26
скомпили весь проект, так оно у тебя компилится не будет:), укажи компилятору чтобы он создал файл .lst с ассемблерным кодом, и выложи его здесь? либо зайди в дебаггер, укажи чтобы он показал тебе ВЕСЬ ассемблерный код, он показывает так :

строка С
асм
асм
асм
асм
строка С
...

найди код ф-и TransmitBitDelay и выложи его сюда

Добавлено в :
т.е. понял меня? линкер тебе говорит, что обьявлена функция main, но нигде не описана, эта ф-я должна присутствовать обязательно, т к это точка входа в программу

Автор: trainer 25.03.04, 14:04
Цитата
bizar, 25.03.04, 13:19
Выдаёт ошибку
В проекте нет файла, содержащего функцию main.

Автор: bizar 26.03.04, 08:38
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include <io16f84.h>
    /* подпрограмма временной задержки */
    void tick(void) {
       unsigned int p;
       for ( p = 0xffff; p!=0; p--);
       for ( p = 0xffff; p!=0; p--);
       for ( p = 0xffff; p!=0; p--);
       for ( p = 0xffff; p!=0; p--);
    }
     
    void TransmitBitDelay(void)
    {
    for (int i= 10; i!=0; i--)
      for (int j= 10; j!=0; j--);
    }
     
    void TransmitByte(char Symbol)
    {
     PORTA &= 0xfe; //передаем стартовый бит
     count = 8;// счетчик передаваемых бит данных
     do
       {
        TransmitBitDelay(); // задержка перед передачей следующего бита
        PORTA ^= (~Symbol) & 1; // выдаем очередной бит в COM
        Symbol >>= 1; //следующий бит
        count--;
       } while (count >0);
     TransmitBitDelay(); // задержка перед передачей следующего бита
     PORTA |= 1; //передаем стоповый бит
    }
     
     
    main ()
           {
     TRISB = 4|8;  /* RB2 - RB3 настраиваем на вход */
     PORTB = 0xfc; /* RB0 - RB1 настраиваем на вывод*/
     while(1)
     {
      do
     {
             tick(); /* НЕБОЛЬШОЙ ПРОМЕЖУТОК ВРЕМЕНИ, "не будем опрашивать кнопки слишком часто" */
             Keys = (~PORTB) & (4|8); /* состояние кнопок на RB2-RB3. Ждёт нажатия */
     }
     Keys >>= 1;
     while(PORTB & Bit(0)); /* если установлен бит 0, значит нажата кнопка на RB2 */
     while(1)
      {
      void TransmitByte(34) /* посылаем 34 */
      }
     while(PORTB & Bit(1)); /* если установлен бит 1, значит нажата кнопка на RB3 */
     while(1)
      {
      void TransmitByte(35) /* посылаем 35 */
      }
     }
     }

Выдаёт ошибку
[/CODE]Rebuilding target Debug...
Untitled1.c
Fatal Error[Cp001]: Copy protection check, Your time limited license is out of date - You must
register NOW to get the permanent key in order to continue using
this product!

Total number of errors: 1
Total number of warnings: 0[CODE]

Автор: potor 26.03.04, 08:43
ты крякнул IAR? он говорит, что у тебя лицензия закончилась

Автор: bizar 26.03.04, 08:46
Увсё сделал
Ошибки
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    count = 8;// счетчик передаваемых бит данных

и
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Keys = (~PORTB) & (4|8); /* состояние кнопок на RB2-RB3. Ждёт нажатия */
     }
     Keys >>= 1;
     while(PORTB & Bit(0)); /* если установлен бит 0, значит нажата кнопка на RB2 */
     while(1)
      {
      void TransmitByte(34) /* посылаем 34 */
      }
     while(PORTB & Bit(1)); /* если установлен бит 1, значит нажата кнопка на RB3 */
     while(1)
      {
      void TransmitByte(35) /* посылаем 35 */
      }
     }
     }


Добавлено в :
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    count = 8;// счетчик передаваемых бит данных

Надо сделать int правельно я думаю???

Автор: potor 26.03.04, 08:51
Цитата

unsigned char count=8;

Цитата

unsigned char Keys = (~PORTB) & (4|8); /* состояние кнопок на RB2-RB3. Ждёт нажатия */

определять такие ошибки пора бы уже и саму научиться:)

Автор: bizar 26.03.04, 09:12
potor, в тех местах так ошибки и остались
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Rebuilding target Debug...
    Untitled1.c
    C:\Documents and Settings\Administrator\My Documents\IAR проект\Новая папка\Untitled1.c (21) : Error[Pe268]: declaration may not appear after executable statement in block
    C:\Documents and Settings\Administrator\My Documents\IAR проект\Новая папка\Untitled1.c (43) : Error[Pe268]: declaration may not appear after executable statement in block
    C:\Documents and Settings\Administrator\My Documents\IAR проект\Новая папка\Untitled1.c (45) : Error[Pe112]: expected "while"
    C:\Documents and Settings\Administrator\My Documents\IAR проект\Новая папка\Untitled1.c (46) : Warning[Pe223]: function declared implicitly
    C:\Documents and Settings\Administrator\My Documents\IAR проект\Новая папка\Untitled1.c (49) : Error[Pe079]: expected a type specifier
    C:\Documents and Settings\Administrator\My Documents\IAR проект\Новая папка\Untitled1.c (50) : Error[Pe065]: expected a ";"
    C:\Documents and Settings\Administrator\My Documents\IAR проект\Новая папка\Untitled1.c (51) : Warning[Pe128]: loop is not reachable from preceding code
    C:\Documents and Settings\Administrator\My Documents\IAR проект\Новая папка\Untitled1.c (54) : Error[Pe079]: expected a type specifier
    C:\Documents and Settings\Administrator\My Documents\IAR проект\Новая папка\Untitled1.c (55) : Error[Pe065]: expected a ";"
    C:\Documents and Settings\Administrator\My Documents\IAR проект\Новая папка\Untitled1.c (57) : Warning[Pe001]: last line of file ends without a newline
     
    Total number of errors: 7
    Total number of warnings: 3

Автор: trainer 26.03.04, 09:20
Цитата
bizar, 26.03.04, 11:38
do
{
tick(); /* НЕБОЛЬШОЙ ПРОМЕЖУТОК ВРЕМЕНИ, "не будем опрашивать кнопки слишком часто" */
Keys = (~PORTB) & (4|8); /* состояние кнопок на RB2-RB3. Ждёт нажатия */
}
Keys >>= 1;
while(PORTB & Bit(0)); /* если установлен бит 0, значит нажата кнопка на RB2 */
Для do нет соответствующего while. Или Keys >>= 1; стоит не там, где нужно

Автор: potor 26.03.04, 09:21
ПОПРОБУЙ ТАК:
Цитата

void TransmitByte(char Symbol)
{
unsigned int count = 8;// счетчик передаваемых бит данных
PORTA &= 0xfe; //передаем стартовый бит
do
{
TransmitBitDelay(); // задержка перед передачей следующего бита
PORTA ^= (~Symbol) & 1; // выдаем очередной бит в COM
Symbol >>= 1; //следующий бит
count--;
} while (count >0);
TransmitBitDelay(); // задержка перед передачей следующего бита
PORTA |= 1; //передаем стоповый бит
}

Цитата

unsignet char Keys;
main ()
{
TRISB = 4|8; /* RB2 - RB3 настраиваем на вход */
PORTB = 0xfc; /* RB0 - RB1 настраиваем на вывод*/
while(1)
{
do
{
tick(); /* НЕБОЛЬШОЙ ПРОМЕЖУТОК ВРЕМЕНИ, "не будем опрашивать кнопки слишком часто" */
Keys = (~PORTB) & (4|8); /* состояние кнопок на RB2-RB3. Ждёт нажатия */
}
Keys >>= 1;
while(PORTB & Bit(0)); /* если установлен бит 0, значит нажата кнопка на RB2 */
while(1)
{
void TransmitByte(34) /* посылаем 34 */
}
while(PORTB & Bit(1)); /* если установлен бит 1, значит нажата кнопка на RB3 */
while(1)
{
void TransmitByte(35) /* посылаем 35 */
}
}
}

Автор: bizar 27.03.04, 05:59
Думаю нужно начать всё сначало?

Автор: potor 27.03.04, 20:38
в общем в моем IARe для AVR надо в режиме дебаггера сделать View/Disassembly, либо в Project/Options в закладке компилятора list ставишь галочку Assembler mnemonics, т е ты выслал не то, нужен ассемблерный код

Автор: bizar 28.03.04, 04:01
potor, я этим покозал что ошибок море,
и не знаю как их исправить (уже всё перепробовал).

Автор: potor 28.03.04, 15:59
бл...
unsigned char Keys
:)

Добавлено в :
точку с запятой незабудь поставить:)

Автор: potor 28.03.04, 17:01
на будующее, в микроконтроллерных компиляторах, ввиду их недоделанности, следует обращать внимание на первую ошибку, остальные генерятся как правило от балды:)

Автор: bizar 30.03.04, 08:12
Ещё остались ошибки.

Автор: potor 30.03.04, 08:30
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    main () {
       TRISB = 4|8;  /* RB2 - RB3 настраиваем на вход */
       PORTB = 0xfc; /* RB0 - RB1 настраиваем на вывод*/
       while(1) {
          do {
             tick(); /* НЕБОЛЬШОЙ ПРОМЕЖУТОК ВРЕМЕНИ, "не будем опрашивать кнопки слишком часто" */
             Keys = (~PORTB) & (4|8); /* состояние кнопок на RB2-RB3. Ждёт нажатия */
          } while( Keys == 0 );
          if(Keys & Bit(2))   /* если установлен бит 0, значит нажата кнопка на RB2 */
             TransmitByte(34); /* посылаем 34 */
          if(Keys & Bit(3))   /* если установлен бит 1, значит нажата кнопка на RB3 */
             TransmitByte(35); /* посылаем 35 */
       }
    }

этот код тебе писал ранее trainer:)

Автор: bizar 30.03.04, 11:12
В нём ошибка:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if(Keys & Bit(2))

Сдесь выдаёт ошибку.

Автор: potor 30.03.04, 11:19
после #include <io16f84.h>
вставь строчку
#define Bit(x) 1<<(x)
дело в том что команды Bit нет, это макрос который мы определяем сами

Автор: bizar 31.03.04, 05:25
Ok всё скомпелил без ошибок
теперь зашить и проверить.

Автор: potor 01.04.04, 04:44
неееет, зашить и проверить неполучится, сначала надо подобрать числа, т е десятки там не пройдут:)

Автор: potor 01.04.04, 12:38
повторюсь:
вышли сюда ассемблерный код функции TransmitBitDelay, я тебе обьясню как вычислить эти числа

Автор: bizar 04.04.04, 07:30
Я всё довно понял, времени просто не было

Автор: potor 05.04.04, 06:33
слуай, ты случайно в следующем коде точку с запятой после первого for не ставил???
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    void TransmitBitDelay(void)
    {
    for (int i= число1; i!=0; i--) // здесь точка с запятой ненужна
      for (int j= число2; j!=0; j--);
    }

если не ставил, значит оптимизатор что то намудрил, уменьши уровень оптимизации и вышли еще раз:)

Добавлено в :
или попробуй вот так записать:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    void TransmitBitDelay(void)
    {
    for (int i= число1; i!=0; i--)
      {
      for (int j= число2; j!=0; j--);
      }
    }

Автор: bizar 05.04.04, 09:08
Млин откуда там точка с запятой взялась не понимаю
вроде всё правельно наберал.
Ну ладно вот без неё.

Автор: potor 05.04.04, 19:45
ok завтра на работе посмотрю:)

Автор: potor 06.04.04, 05:33
вот это больше на правду похоже, но извини, я опять намудрил:)
переделай функцию вот так, а то компилятор много избыточного кода вставляет:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    void TransmitBitDelay(void)
    {
    for (unsigned char i= число1; i!=0; i--) // здесь точка с запятой ненужна
      for (unsigned char j= число2; j!=0; j--);
    }


Добавлено в :
ссори вот так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    void TransmitBitDelay(void)
    {
    unsigned char i,j
    for (i= число1; i!=0; i--) // здесь точка с запятой ненужна
      for (j= число2; j!=0; j--);
    }

Автор: bizar 06.04.04, 06:32
Кстати я там поменял:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    void TransmitBitDelay(void)
    {
    int i,j
    for (i= число1; i!=0; i--)
      for (j= число2; j!=0; j--);
    }

А зачем unsigned char?

Автор: potor 06.04.04, 06:37
int занимает 2 байта, char 1 байт, контроллер восьмиразрядный, т е вся арифметика побайтовая, и если использовать тип int получается больше по коду, в твоем случае рационально использовать unsignrd char

Добавлено в :
я тебе уже раньше писал, что int надо использовать по возможности реже

Автор: bizar 06.04.04, 06:45
Ну вот всё готово.
Что там на счёт чисел?

Автор: potor 06.04.04, 06:50
сейчас, разбирусь с тем, что он накомпилил, и расскажу:)

Автор: potor 06.04.04, 10:43
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    ;------------------------------------------------- этот код выполняется 1 раз-------------------------------------
    TransmitBitDelay:           ;сюда попадаем по call2 цикла
    ;    12 {
    ;    13 unsigned char i,j;
    ;    14 for (i= 10; i!=0; i--)
            MOVLW   10                            ;W=10                                         1 цикл  
            MOVWF   i                             ;i=W (i=10)                                   1 цикл
            GOTO    TransmitBitDelay_0            ;                                             2 цикла  
    ;----------------------------------------------------------------------------------------------------------------
                                                                                                   итого 6 циклов
     
     
     
    ;    15   for (j= 10; j!=0; j--);
    ;--------------------------------------------этот код выполняется i*j раз----------------------------------------
    ;-------------------причем команда BTFSS   _A_STATUS,2  выполняется за два цикла i раз---------------------------
    ;-----------------------------------------------а за один цикл i*(j-1) раз---------------------------------------
    ;-------------------команда GOTO    TransmitBitDelay_1 выполняется i*(j-1) раз-----------------------------------
    TransmitBitDelay_1:
            DECF    j,1                           ; вычитаем из j 1                             1 цикл
    TransmitBitDelay_2:
            MOVF    j,1                           ; (j==0)?                                     1 цикл
            BTFSS   _A_STATUS,2                   ; если не равно                               1(2)цикла
            GOTO    TransmitBitDelay_1              ; идем вычитать j                             2 цикла
    ;-----------------------------------------------------------------------------------------------------------------
                                                                                               итого i*(5*j-1) циклов
     
     
     
    ;--------------------------------------------этот код выполняется i раз----------------------------------------
    ;-------------------есть тонкость, команда BTFSС i-1 раз выполняется за 2 цикла и 1 раз за 1 цикл--------------
    ; ------------------а команда  GOTO    TransmitBitDelay_4   выполнится всего один раз-------------------------
            DECF    i,1                                      ; а если равно вычитаем из i  1    1 цикл
    TransmitBitDelay_0:
            MOVF    i,1                                      ;(i==0)?                           1 цикл
            BTFSC   _A_STATUS,2                              ;если равно  заканчиваем ф-ю       1(2)цикла
            GOTO    TransmitBitDelay_4                       ;на завершение ф-и                 2 цикла
            MOVLW   10                                       ;если не равно W=10                1 цикл  
            MOVWF   j                                        ;j=W (j=10)                        1 цикл
            GOTO    TransmitBitDelay_2                       ;идем разбираться с j              2 цикла
    ;-----------------------------------------------------------------------------------------------------------------                                                                                              итого 8*i+1 циклов
    ;    16 }
    ;----------------------------------и этот код 1 выполняется 1 раз-----------------------------------------------
    TransmitBitDelay_4:
            RETURN                                           ; возврат в основную прогу         2 цикла
    ;------------------------------------------------------------------------------------------------------------
             получаем всего циклов i*(5*j + 7)+9 циклов. Один цикл при твоем кварце 2MHz=2000000Hz
    допустим нам надо работать со частотой 9600Hz, решаем уравнение
    9600=2000000/(i*(5*j+7)+9)
    мы видим, что оно имеет множество решений, но нам нужны целые, или максимально приближенные к целым, решается оно методом подбора
    P.S.проверь правильность моих вычислений, а то я мог где то ошибитьсяJ

Автор: bizar 06.04.04, 10:59
Ok
если использовать 8Mhz = (8000000)
Что лучше использовать 2Mhz или 8Mhz
для передачи таких небольших чисел.
Но чтобы не было ни каких задержек тормажений?

Автор: potor 06.04.04, 11:23
нет, читайте доки, они рулез:)
один такт-8MHz
машинный цикл состоит у твоего пика из четырех тактов, т е 2MHz
т е это я тебе сказал для твоего кварца

Автор: bizar 06.04.04, 11:48
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Один цикл при твоем кварце 2MHz=2000000Hz

Мой кварц вобще-то 8Mhz
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    т е это я тебе сказал для твоего кварца


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Что лучше использовать 2Mhz или 8Mhz
    для передачи таких небольших чисел.
    Но чтобы не было ни каких задержек тормажений?

Автор: potor 06.04.04, 12:02
еше раз обьясняю, машинный цикл и тактовая частота разные вещи
считай машинным циклом время выполнения самой быстрой команды
у PIC16 два типа команд, одни выполняются за один машинный цикл, другие за два, есть правда команды, время выполнение которых зависит от результата
у PIC16 один машинный цикл = 4 такта, т е я тебе привел вычисления для кварца 8MHz

Автор: bizar 06.04.04, 14:00
Всё теперь осуществляем проект.
Ну нужно ещё прогу написать для приёма с COM порта.
Документацию по настройки COM скачал.
Короче potor, бли я даже не знаю как тебя отблагодорить.
:D :lol: :rolleyes: :wub: B) :yes:
Правда вопросов у меня ещё море но сначало
разберёмся с этим примером.

Автор: potor 06.04.04, 17:42
Цитата

Всё теперь осуществляем проект.
Ну нужно ещё прогу написать для приёма с COM порта

ненадо ничего писать, воспользуйся стандартным гипер терминалом для проверки:)

Автор: bizar 07.04.04, 07:49
potor, в гипере нужно поставить ждать звонка и всё?

Автор: potor 07.04.04, 10:22
нет, просто запустить, указав вместо модема номер com порта, попробуй нульмодемным кабелем соединить два com порта между собой, запусти два гипер терминала, настроенных на одну скорость с одинаковыми параметрами, в окне одного набери несколько символов с клавы, посмотри на окно другого, и все станет понятно

Автор: bizar 08.04.04, 09:23
Провернул всё как ты сказал
жму ждать звонка, а на другом звонить
ну и они не саеденяються тот бесконечно ждёт
другой дозванивается.

Автор: potor 08.04.04, 09:46
Цитата

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

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

Автор: bizar 08.04.04, 15:30
Nullmodem (9-9) Cable
Это

Автор: potor 08.04.04, 18:55
да, такой, но тебе достаточно просто 3 провода
2-3
3-2
5-5

Автор: bizar 09.04.04, 08:03
Ещё я немогу печатать пока до кого ни будь не дозванюсь.??

Автор: potor 09.04.04, 09:40
скорее всего у тебя выключено эхо, главное, чтобы в другом терминале, что то появилось

Добавлено в :
зайди в свойства\настройки\параметры ASCII, и поставь галочку перед - отображать введенные символы на экран

Автор: Small 19.09.04, 11:44
Народ ! Буду признателен если кто нить надоумит как IAR подключить к
AVR Studio!?

Автор: netaimaid 19.09.04, 12:10
Цитата
Small, 19.09.04, 16:44
Народ ! Буду признателен если кто нить надоумит как IAR подключить к
AVR Studio!?


Попробуйте в AVR Studio загрузить *.d90 с отладочной информацией.

Автор: Small^ 13.10.04, 10:59
Приведите пример обработки прерывания, например по переполнению таймера под Atmel !!

Автор: trainer 13.10.04, 12:11
На ассемблере(IAR EWAVR):
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    NAME KernelIntr        
       RTMODEL "__64bit_doubles", "disabled"
       RTMODEL "__cpu", "3"
       RTMODEL "__cpu_name", "AT90Mega161"
       RTMODEL "__enhanced_core", "enabled"
       RTMODEL "__has_elpm", "false"
       RTMODEL "__memory_model", "2"
       RTMODEL "__rt_version", "2.30"
       RSEG CSTACK:DATA:NOROOT(0)
       RSEG NEAR_Z:DATA:NOROOT(0)
       RSEG RSTACK:DATA:NOROOT(0)
     
       PUBLIC TaskSwitcher
     
       RSEG CODE:CODE:NOROOT(1)
    TaskSwitcher:
    ; что-то делаем
       reti  
    ;------------------------------------------------
       COMMON INTVEC:CODE:ROOT(1)
       ORG  36d             ; TIMER0_OVERFLOW_VECTOR
       RJMP TaskSwitcher
    END
На C(IAR EWAVR):
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #pragma vector=TIMER0_OVF0_vect
    __interrupt void CommonInterruptHandler(void) {
       /* что-то делаем */
    }

Автор: potor 18.10.04, 14:27
Спроси здесь

Автор: Moneyiac 07.06.05, 08:07
кто работал с IAR for AVR 3.20C, подскажите как там в дебагере заставить срабатывать прерывания от таймеров тогда когда им положено, а не прописывать постоянно какую-то абстрактную частоту их появления в Simulator/Interrupts

Автор: MeG 07.06.05, 12:53
В IAR-е, вроде (давно не юзал), можно файлик сделать с таймингами прерываний и по нему отлаживаться.

Автор: trainer 07.06.05, 17:32
По симуляции периферии вообще и прерываний в частности IAR EWAVR слабоват по сравнению с AVR Studio, ПМСМ. Это, похоже, единственный его недостаток.

Автор: potor 08.06.05, 09:19
Цитата

По симуляции периферии вообще и прерываний в частности IAR EWAVR слабоват по сравнению с AVR Studio, ПМСМ. Это, похоже, единственный его недостаток.

это точно, ты можешь сконвертить отладочный файл для AVR Studio и отлаживать там

Автор: Moneyiac 10.06.05, 12:44
Ладно, спасибо,
буду писать в AVR studio, там тоже есть С (а так хотелось С++ :'( )

Автор: trainer 10.06.05, 14:16
Цитата Moneyiac @
буду писать в AVR studio, там тоже есть С (а так хотелось С++ )
Можешь откомпилировать в IAR, а отлаживать под AVR Studio. Правда будут ли под AVR Studio видны прелести C++ - не знаю.

Автор: shtirlizzz 17.06.05, 10:33
Драсте всем кто нибудь пытался програмить контроллер Segnetics с помощью IAR systems. Начал разбираться с этим компилятором возникла куча проблемм прежде всего с настройками. Если кто сталкивался помогите. :wall:

Автор: MeG 18.06.05, 12:01
IAR systems, почему-то не знает об Segnetics абсолютно ни чего, наверное шифруются. И гугль о Segnetics-ах ни чего сказать не смог. Кинь ссылку на документацию или на сайт.
У тебя возникли проблемы с IAR systems или с настройками компилятора? Собственно в чем проблемы, может быть ты всетаки расскажешь, shtirlizzz

Автор: trainer 18.06.05, 13:10
Цитата MeG @
И гугль о Segnetics-ах ни чего сказать не смог.
Он просто неправильно написал. Signetics http://www.signetics.com/product.html

Автор: trainer 20.06.05, 14:47
Цитата shtirlizzz @
хотя Time я ни где и не использовал вроде
А в ClassBiosSMH не используется? И вообще, о таких ошибках без полных исходников можно долго гадать.

Автор: AVANGARD0_1338 05.03.10, 21:49
у кого есть сама эта программа(iar ewpic)??? пишите. как тока будет она я сразу вступю в дискуссию. а пока очень очень очень нужна

Автор: ir0407 09.05.10, 13:07
Всем привет! Вот, на старости лет лет решил освоить программирование микроконтроллеров... :)
Попробовал себя в AvrStudio на асме - вроде все нормально. Решил освоить и С. Полазив по интернету остановил свой выбор на IAR. Методом научного тыка вроде разобрался с настройками. Но в один прекрасный момент вылезла такая проблема.

Суть в следующем:
Изголяюсь с камнем ATtiny45, а конкретно с его USI под TWI. Все вроде бы нормально, все получается, а вот когда я захотел прикрутить к TWI прерывания вылезла непонятка. В симуляторе начали вылазить ошибки о выходе куда-то за пределы кода. Подозрение пало на инициализацию векторов. IAR вектора инициализирует двухбайтовыми командами. Смотрю в даташит по ATtiny45. Вижу следующее:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    9.1 Interrupt Vectors in ATtiny25/45/85
    The interrupt vectors of ATtiny25/45/85 are described in Table 9-1below.
     
    Table 9-1. Reset and Interrupt Vectors
    =========================================================================
    Vector No.  Program Address   Source         Interrupt Definition
    =========================================================================
    1           0x0000            RESET          External Pin, Power-on Reset,
                                                 Brown-out Reset, Watchdog Reset
    2           0x0001            INT0           External Interrupt Request 0
    3           0x0002            PCINT0         Pin Change Interrupt Request 0
    4           0x0003            TIMER1_COMPA   Timer/Counter1 Compare Match A
    5           0x0004            TIMER1_OVF     Timer/Counter1 Overflow
    6           0x0005            TIMER0_OVF     Timer/Counter0 Overflow
    7           0x0006            EE_RDY EEPROM  Ready
    8           0x0007            ANA_COMP       Analog Comparator
    9           0x0008            ADC            ADC Conversion Complete
    10          0x0009            TIMER1_COMPB   Timer/Counter1 Compare Match B
    11          0x000A            TIMER0_COMPA   Timer/Counter0 Compare Match A
    12          0x000B            TIMER0_COMPB   Timer/Counter0 Compare Match B
    13          0x000C            WDT Watchdog   Time-out
    14          0x000D            USI_START      USI START
    15          0x000E            USI_OVF        USI Overflow
     
    If the program never enables an interrupt source, the Interrupt Vectors are not used, and regular
    program code can be placed at these locations. The most typical and general program setup for
    the Reset and Interrupt Vector Addresses in ATtiny25/45/85 is shown in the program example
    below.

Как видно - везде выравнивание вроде как на байт. Смотрю в заголовочный файл IAR для ATtiny45 и вижу следующее:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    /* NB! vectors are specified as byte addresses */
     
    #define    RESET_vect          (0x00) /* External Pin, Power-on Reset, Brown-out Reset,
                                             Watchdog Reset */
    #define    INT0_vect           (0x02) /* External Interrupt Request 0 */
    #define    PCINT0_vect         (0x04) /* Pin Change Interrupt Request 0 */
    #define    TIM1_COMPA_vect     (0x06) /* Timer/Counter1 Compare Match A */
    #define    TIM1_OVF_vect       (0x08) /* Timer/Counter1 Overflow */
    #define    TIM0_OVF_vect       (0x0A) /* Timer/Counter0 Overflow */
    #define    EE_RDY_vect         (0x0C) /* EEPROM Ready */
    #define    ANA_COMP_vect       (0x0E) /* Analog Comparator */
    #define    ADC_vect            (0x10) /* ADC Conversion Complete */
    #define    TIM1_COMPB_vect     (0x12) /* Timer/Counter1 Compare Match B */
    #define    TIM0_COMPA_vect     (0x14) /* Timer/Counter0 Compare Match A */
    #define    TIM0_COMPB_vect     (0x16) /* Timer/Counter0 Compare Match B */
    #define    WDT_vect            (0x18) /* Watchdog Time-out */
    #define    USI_START_vect      (0x1A) /* USI START */
    #define    USI_OVF_vect        (0x1C) /* USI Overflow */

Вижу выравнивание на слово. Начинаю тормозить... :slow:

Лезу в инклуды асма AvrStudio - вижу следующее:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ; ***** INTERRUPT VECTORS ************************************************
    .equ    INT0addr    = 0x0001    ; External Interrupt 0
    .equ    PCI0addr    = 0x0002    ; Pin change Interrupt Request 0
    .equ    OC1Aaddr    = 0x0003    ; Timer/Counter1 Compare Match 1A
    .equ    OVF1addr    = 0x0004    ; Timer/Counter1 Overflow
    .equ    OVF0addr    = 0x0005    ; Timer/Counter0 Overflow
    .equ    ERDYaddr    = 0x0006    ; EEPROM Ready
    .equ    ACIaddr         = 0x0007    ; Analog comparator
    .equ    ADCaddr         = 0x0008    ; ADC Conversion ready
    .equ    OC1Baddr    = 0x0009    ; Timer/Counter1 Compare Match B
    .equ    OC0Aaddr    = 0x000a    ; Timer/Counter0 Compare Match A
    .equ    OC0Baddr    = 0x000b    ; Timer/Counter0 Compare Match B
    .equ    WDTaddr         = 0x000c    ; Watchdog Time-out
    .equ    USI_STARTaddr   = 0x000d    ; USI START
    .equ    USI_OVFaddr = 0x000e    ; USI Overflow

Потихоньку начинаю офигевать... :crazy:

Решил посмотреть что видно в дизассемблере AvrStudio - увидел вот это:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ---- Test_3.asm -----------------------------------------------------------------------------------
    47:             rjmp RESET           ; Reset Handler
    +00000000:   C00E       RJMP      PC+0x000F      Relative jump
    48:             reti                 ; rjmp EXT_INT0 ; IRQ0 Handler
    +00000001:   9518       RETI                     Interrupt return
    49:             reti                 ; rjmp PCINT0 ; PCINT0 Handler
    +00000002:   9518       RETI                     Interrupt return
    50:             reti                 ; rjmp TIM1_COMPA ; Timer1 CompareA Handler
    +00000003:   9518       RETI                     Interrupt return
    51:             reti                 ; rjmp TIM1_OVF ; Timer1 Overflow Handler
    +00000004:   9518       RETI                     Interrupt return
    52:             reti                 ; rjmp TIM0_OVF ; Timer0 Overflow Handler
    +00000005:   9518       RETI                     Interrupt return
    53:             reti                 ; rjmp EE_RDY ; EEPROM Ready Handler
    +00000006:   9518       RETI                     Interrupt return
    54:             reti                 ; rjmp ANA_COMP ; Analog Comparator Handler
    +00000007:   9518       RETI                     Interrupt return
    55:             reti                 ; rjmp ADC ; ADC Conversion Handler
    +00000008:   9518       RETI                     Interrupt return
    56:             reti                 ; rjmp TIM1_COMPB ; Timer1 CompareB Handler
    +00000009:   9518       RETI                     Interrupt return
    57:             reti                 ; rjmp TIM0_COMPA ;
    +0000000A:   9518       RETI                     Interrupt return
    58:             reti                 ; rjmp TIM0_COMPB ;
    +0000000B:   9518       RETI                     Interrupt return
    59:             reti                 ; rjmp WDT ;
    +0000000C:   9518       RETI                     Interrupt return
    60:             reti                 ; rjmp USI_START ;
    +0000000D:   9518       RETI                     Interrupt return
    61:             reti                 ; rjmp USI_OVF ;
    +0000000E:   9518       RETI                     Interrupt return
    @0000000F: RESET
    73:       RESET:    ldi r16, low(RAMEND)         ; Main program start
    +0000000F:   E50F        LDI       R16,0x5F          Load immediate
    74:                 ldi r17, high(RAMEND); Tiny45/85 also has SPH
    +00000010:   E011        LDI       R17,0x01          Load immediate
    75:                 out SPL, r16         ; Set Stack Pointer to top of RAM
    +00000011:   BF0D        OUT       0x3D,R16          Out to I/O location
    76:                 out SPH, r17         ; Tiny45/85 als has SPH
    +00000012:   BF1E        OUT       0x3E,R17          Out to I/O location

Каждая команда занимает слово, но адресация почему то идет как побайтная. Вот тут я приехал. :wall:

Вот может кто нибудь прояснить эту ситуацию? А то у меня уже мозги кипят. :D

================================================================================
И еще вопрос. IAR не генерит код(кроме области векторов) если в опциях не подключена никакая библиотека. А мне надо заставить компилятор генерить код без подключения библиотек. Исходников стандартных библиотек в моем IAR нет, только скомпилированные. Можно ли как-то заставить IAR генерить код без подключения библиотек? Или может у кого-то есть эти исходники? Поделитесь плиз? Я догадываюсь, что исходники есть наверное в инсталяторе IAR, но как их вытянуть оттуда пока не знаю. Наверное нужна более дорогая лицензия.

Автор: trainer 09.05.10, 17:52
Цитата ir0407 @
Смотрю в даташит по ATtiny45. Вижу следующее:
Как видно - везде выравнивание вроде как на байт.
Не на байт, а на слово. Память программ при переходах адресуется пословно, младший бит адреса не указывается в коде команды и подразумевается равным 0. Ну или, если смотреть с другой стороны - адрес является порядковым номером 16-битного слова. Особенность архитектуры AVR.

Автор: ir0407 09.05.10, 17:59
Спасибо. :) А в каком документе на сайте Atmel-a можно найти эту инфу об особенностях архитектуры. А то я что-то никак не могу ничего такого найти. Инфы столько, что глаза разбегаются.

Автор: trainer 09.05.10, 18:26
Вот уж не помню.

Автор: MeG 10.05.10, 05:14
Цитата trainer @
Не на байт, а на слово. Память программ при переходах адресуется пословно, младший бит адреса не указывается в коде команды и подразумевается равным 0. Ну или, если смотреть с другой стороны - адрес является порядковым номером 16-битного слова. Особенность архитектуры AVR.

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

Автор: trainer 10.05.10, 07:18
А там вроде бы на русском языке написано "Память программ", "при переходах"

Автор: ЫукпШ 10.05.10, 10:32
Цитата ir0407 @
IAR не генерит код(кроме области векторов) если в опциях не подключена никакая библиотека. А мне надо заставить компилятор генерить код без подключения библиотек. Исходников стандартных библиотек в моем IAR нет, только скомпилированные.

Исходники библиотек обычно имеются у версий компилятора "professional".

Но, насколько я помню, если библиотека указана, но ничего из неё
не используется, то в исполнимые коды ничего из такой библиотеки
не включается. И это не только у IAR.

Что касается тонкостей адресации.
Использование С/C++ - компилятора как раз и даёт возможность
не обращать на эти самые тонкости никакого внимания.
Не помню, чтобы мне это понадобилось за последние xxx лет.

Автор: ir0407 10.05.10, 17:32
Цитата ЫукпШ @
Но, насколько я помню, если библиотека указана, но ничего из неё
не используется, то в исполнимые коды ничего из такой библиотеки
не включается.

Да, ничего не включается, но все равно в дампе присутствует небольшой код инициализации библиотеки. А мне бы хотелось посмотреть где это находится, как сделано и если нужно изменить под свои нужды.
Цитата ЫукпШ @
Использование С/C++ - компилятора как раз и даёт возможность
не обращать на эти самые тонкости никакого внимания.

Теперь это я уже понял. Просто надо хорошо знать и умело применять опции компилятора и линкера.
Цитата ЫукпШ @
Не помню, чтобы мне это понадобилось за последние xxx лет.

Столько не живут. :jokingly:

Автор: ЫукпШ 10.05.10, 18:00
Цитата ir0407 @
Да, ничего не включается, но все равно в дампе присутствует небольшой код инициализации библиотеки. А мне бы хотелось посмотреть где это находится, как сделано и если нужно изменить под свои нужды.

Не знаю, не замечал. :huh:

Может речь идёт о стартапе ?
Его исходники обычно имеются.
Поищи файл cstartup (.s90 ?).

Что касается стандартных процедур, то линкер IAR имеет
"удобную" логику работы, а именно:
если некая процедура обнаружена в юзерной программе, в библиотеке
она не разыскивается. Это значит, можно переопределить
любую стандартную процедуру. Например, если реализовать
собственную putchar тогда стандартный printf будет пользовать
именно её. В результате можно выводить данные куда захочешь.

Автор: ir0407 11.11.12, 17:36
О, как! :D Не густо же тут вопросов однако... И мой был последним аж два года назад. Ну что ж, попробуем продолжить, т.к. я так и не поборол тогда IAR-овский компилятор, вернулся к своему любимому асму. Потом времени не было этим заниматься, потом желания... И вот теперь и время появилось и желание, но воз пока и ныне там же.

Вопрос состоит в следующем. В качестве учебного эксперимента решил переписать под IAR свой асмовый модуль под USART. И снова сразу же наткнулся на какие-то сишные грабли при передаче парметра в функцию. Делаю вот так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #define SYS_CLK = 14745600UL
    #define USART_BAUD = 57600
    #define BAUD_CONST (SYS_CLK / (16 * USART_BAUD) - 1)
     
    void InitUSART(unsigned int BaudConst);
     
    void main(void)
    {
      InitUSART(BAUD_CONST);  //<-- Компилятор ругается на эту строку
    }
     
    void InitUSART(unsigned int BaudConst);
    {
      UBRRH = (unsigned char)BaudConst >> 8;
      UBRRL = (unsigned char)BaudConst;
    }

При компиляции идет ругань на указанную строчку в виде текста "expected expression". При этом если в параметр функции подставить конкретное число все компилируется нормально, а вот с макроподстановкой BAUD_CONST не хочет. Подскажите плиз где я тут на грабли наступаю. Уже весь мануал по языку триста раз скурил, но по той скудной инфе что там есть никак не могу раздуплиться по работе с макросами. В чем мой косяк?

Автор: trainer 12.11.12, 06:27
Цитата ir0407 @
При компиляции идет ругань на указанную строчку в виде текста "expected expression".
Естественно будет ругань. Убери символ = из макроопределений. Иначе у тебя после развертывания макросов получается ( = 14745600UL / (16 * = 57600) - 1)

Автор: ir0407 12.11.12, 09:37
Гы... :D Ёкереный бабай... Точно! Вот что значит сила привычки. Спасибо большое.

Автор: VLeshka 22.03.13, 12:06
Всю ветку прочитал.
Есть проект, написан в IAR.
Напарник передаёт мне исходный код, у него компиляция выдаёт hex-файл размером в 96кб, а у меня копия такого же проекта выдаёт hex-файл размером в 146кб.
Проверили настройки в Project - Options:
- Debugger - Driver: ST-Link (для него делаем).
- С/С++ compiler - Optimizations - Level: High.
- Linker - Config - Linker Configuration File: Задали Override default (задана копия файла как и у напарника).

Засада в том, что мой hex-файл размером в 146кб никак не подходит для прошивки прибора (прошивальщики что в IAR, что фирменный STM32 не могут прошить им, ругаясь на слишком большой размер - это факт). А hex-файл размером в 96кб, получаемый при компиляции у напарника, прекрасно подходит (но его надо отлаживать далее при приборе).

Вобщем, надо выяснить причину, почему IAR выдаёт hex-файл повышенного размера.
HELP. :help:

Автор: trainer 23.03.13, 10:58
Если в настройках проекта все идентично - разница может быть из-за разных версий компиляторов и/или библиотек

Автор: VLeshka 26.03.13, 04:03
trainer версии сравнили - у меня поновей, по мнению напарника это не должно влиять. Также обратил внимание, что у меня нет прав на запись в каталоге программы IAR, в каталоге Program Files. Пытаюсь получить права администратора - у нас на работе это не просто сделать. :)

Автор: trainer 26.03.13, 05:29
Цитата VLeshka @
Также обратил внимание, что у меня нет прав на запись в каталоге программы IAR, в каталоге Program Files.
А зачем тебе нужны права туда? :blink:

Автор: VLeshka 26.03.13, 05:52
trainer только предположение, что это влияет. Другой теории, куда надо идти, нет.

Автор: trainer 26.03.13, 11:28
Аааа... Ну тогда переустанови Windows. Точно поможет.

runtime у вас, очевидно, разного размера.
IAR, если я правильно помню, в map-файлах умеет выдавать размеры откомпилированных функций и объектов. Можно сравнить.

Автор: VLeshka 03.04.13, 10:07
trainer переустановка помогла бы, особенно с установкой прав админа для меня.:)
Вобщем, на одном и том же комьпютере, "до меня", под логином администратора всё было нормально. Под моим логином, гостя, как мной и описано. В итоге просто "перебазировался" с приборами на свой компьютер с моими администраторскими правами.

Автор: VLeshka 09.05.16, 16:53
Воскрешу тему!

При построении проекта, в окне build выводит отчёт типа:

7 274 bytes of CODE memory
240 bytes of DATA memory (+ 23 absolute )
763 bytes of CONST memory (+ 136 absolute )


Хочу узнать, что значит (+ 23 absolute ).

Справочник IAR не знает, что это такое. Интернет тоже (если есть где-либо - поправьте!).

Решил копать через отчёты IAR. Настройкой в Linker -> Generate linker listing создал segment map в формате html.
Далее, в этом файле так же сухо приводится absolute в сокращении "abs" в таблице Module summary.

Зацепился за "Module summary" -> Перерыл официальные доки IAR, много всяких в инете скачал, НО: везде приводится одна и та же фраза "Module summary which lists the contribution (in bytes) from each module". Ни слова про absolute.

ТАК ЧТО ЖЕ ТАКОЕ ABSOLUTE???

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)