Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.137.178.133] |
|
Сообщ.
#1
,
|
|
|
Понемногу в IAR разбираюсь, есть простенькая схема
решил сделать чтобы светодиод на RB2 мигал, по команде PIC контроллера. Код мне potor дал для бегущей строки, хотел переделать в обыкновенный код для мигания. Тут ошибок тьма, покажите где? Нужен только светодиод подключённый к 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; } //------------------------------------------------------------------ Выделен красным цветом - объясните что за хедерные файлы, и для чего здесь нужна эта строчка Выделен синим цветом - нужно исправить/дописать чтобы светодиод загорался. TCCR0 = 5; //говорим, что тактовую частоту будем делить на 1024 Зачем делить на 1024 |
Сообщ.
#2
,
|
|
|
Цитата Это заголовочные файлы, содержащие прототипы функций и макросы.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 |
Сообщ.
#3
,
|
|
|
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;//все диоды погашены } еще раз говорю, это для пика не пойдет, там регистры специальных функций другие:) функция разрешения прерываний там тоже возможно называется по другому, но скорее всего так же по поводу дисплея попытаюсь сделать сегодня вечером:) |
Сообщ.
#4
,
|
|
|
что за г...?
на 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 а какой кстати проц? |
Сообщ.
#5
,
|
|
|
по поводу глючности IAR для пиков спорить небуду (не работал с ним и с пиками в частности)
по поводу операции с битами IAR это тоже позволяет просто надо описать union из чара и соответствующей битовой области а вообще, это мое субъективное мнение, удобнее всего битовые операции реализованы в keil, там есть тип bit, переменная такого типа будет однозначно располагатся, только в битово адресуемой области:) |
Сообщ.
#6
,
|
|
|
SimpleSoft, что за Hi-Tech? Приведённый тобой код IAR ?
а какой кстати проц? всмысле RTCC таймер/счетчик Режим таймера выбирается путём сбрасывания в ноль бита RTS, который находиться в регистре OPTION и т. д. Или таймер Watch Dog.] Ты это имел ввиду. |
Сообщ.
#7
,
|
|
|
Hi-Tech это еще одна среда разработки, я ее к сожалению не юзал
т е код тебе прислали не для IAR а для этой самой Hi-Tech я кстати не врюхал??? ты пытаешься залить мой код написанный для AVR в свой PIC??? Если да то непойдет:) это же другая архитектура, я тебе просто выслал пример программирования в IAR, но т.к. он у меня для AVR и дома тоже нашел AVR контроллер, я спаял на монтажке схему с диодиками, написал программку для моего контроллера, отладил и выслал тебе |
Сообщ.
#8
,
|
|
|
У каждого микроконтроллера различна работа таймера???
|
Сообщ.
#9
,
|
|
|
у разнах микроконтроллеров разная архитектура: разные таймеры, разрядность режимы работы, регистры специальных ф-й и т.п., т.е. прежде чем писать программу для конкретного контроллера в первую очередь читаешь документацию именно по нему
я бы тебе предложил, прежде чем сразу хвататься за все, подключи к своему контроллеру светодиодик, внимательно почитай документацию (не лезь сразу в прерывания, таймеры и т.п) и напиши простенькую программку, чтобы пресловутый светодиод замигал, например: #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; } } |
Сообщ.
#10
,
|
|
|
Я думал без Таймера мигать не будет.
Что за 0xffff. |
Сообщ.
#11
,
|
|
|
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 } } |
Сообщ.
#12
,
|
|
|
#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; } } |
Сообщ.
#13
,
|
|
|
0xfb порт RB2, а порт RB3, RB4 и т. д. как обозначаются. Что за 0xffff. |
Сообщ.
#14
,
|
|
|
Если внимательно почитвть описание то увидишь:
RB2 - это второй разряд порта PORTB 0xЧИСЛО - так в С обозначаются 16-ричные числа fb - шестнадцпатиричное, это 11111011 двоичное т е PORTB = 0xfb; говорит буквально следующее: Записать во 2-й разряд PORTB (т.е. в RB2) нолик, а в остальные разряды 1 Соответственно PORTB = 0xff говорит записать во все разряды PORTB 1 вот и получили мигание... |
Сообщ.
#15
,
|
|
|
Ты мне так и не ответил что/зачем/почему в примере
используешь 0xffff Может я тебя не правельно понял. |
Сообщ.
#16
,
|
|
|
да я просто реализую задержку
4 цикла котые считают от 65535 (0xffff) до нуля:) |
Сообщ.
#17
,
|
|
|
Значит через час/полтора, может больше
светодиод перестанет мигать. Порт RB3 - fc??? RB4 - fd??? |
Сообщ.
#18
,
|
|
|
нет, эти четыре while дадут тебе задержку порядка секунды +- лапоть в зависимости от частоты генератора микроконтроллера
т.е. алгоритм до безобразия тупой while (1){//все что в этих скобках бесконечный циклъ // 1)сначала задержка порядка секунды while(...); while(...); while(...); while(...); // 2)теперь меняем состояние светодиода на противоположное if... // и опять к шагу 1 } |
Сообщ.
#19
,
|
|
|
Ясно....
Проверьте исходничёк (поочерёдное мигание светодиодов подключённых к RB2, RB3, RB4, RB5) У меня нет эмулятора (поэтому не могу проверить). А вообще что за эмулятор - программа/внешнее устройство проверяющая работу микроконтроллера Объясните bizar..у.? #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 (); } } |
Сообщ.
#20
,
|
|
|
что то я не понял, что ты изобразил???
Добавлено в : это даже не скомпилится??? |
Сообщ.
#21
,
|
|
|
Это чума зажигает поочерёдна 4 светодиода
подключённые к RB2, RB3, RB4, RB5. Я создал несколько функций, поставил их поочерёдна и добавил бесконечный цикл. Ещё мне::::: Нужно заставить динамик пищать????? Прикреплённый файлZvuk.rar (0.73 Кбайт, скачиваний: 866) |
Сообщ.
#22
,
|
|
|
где у тебя в порограмме функция main()???
Добавлено в : по поводу пищания динамика: на RB7 подаешь 0 на RB6 подаешь импульсы (например 440Hz это нота ля первой октавы) |
Сообщ.
#23
,
|
|
|
Вот эта функция main (это то что будет выполняться).
void main(void) { TRISB = 0; while(1) { tik (); tik1 (); tik (); tik2 (); tik (); tik3 (); tik (); tik4 (); } } |
Сообщ.
#24
,
|
|
|
а tick2()? tick3()? tick4()?
|
Сообщ.
#25
,
|
|
|
Цитата potor @ 13.01.04, 17:00 а tick2()? tick3()? tick4()? tic2 зажигает RB3 (СВЕТОДИОД) tic3 зажигает RB4 (СВЕТОДИОД) tic4 зажигает RB5 (СВЕТОДИОД) Если я неправельно написал, напиши как правельно. |
Сообщ.
#26
,
|
|
|
на RB6 подаешь импульсы (например 440Hz это нота ля первой октавы) Как подавать импульсы на RB6, нужен кусочек кода с объяснением. Я ещё многого не знаю, на словах не понимаю. |
Сообщ.
#27
,
|
|
|
в общем дело в следующем:
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);// если нет то устанавливаем } } |
Сообщ.
#28
,
|
|
|
main() { TRISB = 0; PORTB = 0xdf; while(1) { tick(); if (PORTB == 0xdf ) PORTB = 0xdf; else PORTB <<= 1; } } Это пример только к порту 0xdf????? 0xf7 ----RB3 0xef ---- RB4 0xdf ---- RB5 Чё-то я закономерность не заметил, по назначению в Си портов RB. Добавлено в : if (PORTB & Bit(6)) // RB6 в 1? PORTB &= ~Bit(6);// если да то обнуляем Что значит "~", объясни по подробней этот кусок. |
Сообщ.
#29
,
|
|
|
извиняюсь, ошибся
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) |
Сообщ.
#30
,
|
|
|
Усё отлично понял.
У пищалки нужно убрать конденсатор к твоему примеру.???? 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; } |
Сообщ.
#31
,
|
|
|
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; } } |
Сообщ.
#32
,
|
|
|
Оператор case в Си не нашёл, поискал в pascal..е
Оператор выбора case является обобщением оператора if - он даёт возможность выполнить одно из нескольких действий в зависимости от значения переключателя. В Си также обращаться с case???????????????????????????????????? Что за break - прерывания что ли (чего/кого)????? Там ещё есть switch(PORTB) с чем его едят???? //золотой ключ, а это функция (сомневаюсь) У тебя описано для четырёх светодиодов????? Ты использовал 7b, а не 0х7b почему (так надо)???????? |
Сообщ.
#33
,
|
|
|
Цитата В конференции Вы долго будете обучаться языку C. Купите какую-нибудь книжку. switch( переменная ) { case значение1: case значение2: действия break; case значение3: действия break; default: действия, если ни одному из case не подошло. } |
Сообщ.
#34
,
|
|
|
Ты использовал 7b, а не 0х7b почему (так надо)????????
нет, это описка |
Сообщ.
#35
,
|
|
|
Цитата potor @ 16.01.04, 14:38 нет, это описка Всмысле?? (должно быть 0х7b)?? Добавлено в : trainer, Книги есть (но они не отвечают подробно на вопрос). |
Сообщ.
#36
,
|
|
|
да, это должно быть 0x7b
Добавлено в : по поводу книжки по С могу посоветовать поискать в инете: Керниган, Ричи. Язык C |
Сообщ.
#37
,
|
|
|
break - что/кто/для чего.
(пока ты в сети ответь). Добавлено в : У меня книга на руках Киммел (мастер). Керниган, Ричи. Язык C поищю. |
Сообщ.
#38
,
|
|
|
break в данном случае, этодля того, чтобы прекратить последующие проверки и выйти из switch
|
Сообщ.
#39
,
|
|
|
Хочю в клаве модинг замутить, 13 светодиодов,
хватит ли питания у порта клавы. |
Сообщ.
#40
,
|
|
|
не знаю, посмотри спецификацию
P.S. а нафига это надо? Добавлено в : хотя, это примерно 10мА, 99% что хватит Добавлено в : ссори 130мА, хватит |
Сообщ.
#41
,
|
|
|
Надо же на чём то учиться
Ты вообще знаешь что такое Модинг |
Сообщ.
#42
,
|
|
|
вообще да (я иногда журналы читаю:))
|
Сообщ.
#43
,
|
|
|
Придется питание отдельно заводить
если я к пику 13 светодиодов подключу он не взорвется???? Добавлено в : Усё понил значит прокатит. |
Сообщ.
#44
,
|
|
|
а вот по поводу пика, только если низкоточные 5мА штука
|
Сообщ.
#45
,
|
|
|
У меня в клаве имеется микроконтроллер:
9917 КМЕ-9801-4 Входят 4 провода Жёлтый Красный Коричневый Белый Куда цеплять питание не подскажете. Я думаю к жёлтому проводу. К каким выводам контроллера (клавы) подходит питание????? RA0…..RA4 порт как присваивать 0.?????? RA0-----0x1e-----11110 RA1-----0x1d-----11101 RA2-----0x1b-----11011 RA3-----0x17-----10111 RA4-----КАК ТУТ ЗДЕЛАТЬ??????? |
Сообщ.
#46
,
|
|
|
Цитата Очень вряд ли, что там PIC.bizar, 16.01.04, 18:15 У меня в клаве имеется микроконтроллер Скорее всего там клон Intel i8048 |
Сообщ.
#47
,
|
|
|
Цитата trainer @ 16.01.04, 22:15 Цитата Очень вряд ли, что там PIC.bizar, 16.01.04, 18:15 У меня в клаве имеется микроконтроллер Скорее всего там клон Intel i8048 Там точно не PIC (аналог Intel i8048) Я думаю совецкого производства. |
Сообщ.
#48
,
|
|
|
potor - ты не прав. Можно повесить очень мощные, если управляешь нулями, т.е. например..
PIC ___ | PB.7 LED ___ |------|<|--|___|-----* +5v | '' 330 Ом | | | | | | ____ |
Сообщ.
#49
,
|
|
|
2SimpleSoft
тут вот какое дело, максимальный ток стока для PORTB, PORTA по документации 200мА. ты предлагаешь вкльчить 13 диодов по 15мА- это 195мА(почти предел), я бы не рекомендовал так издеваться над контроллером, во всяком случае греться он будет как электроплитка и долго не проработает:( |
Сообщ.
#50
,
|
|
|
Теперь нужно чтобы контроллер ждал
когда мы нажмём на кнопку (то есть два порта RB соединяться) и после этого он начнёт их зажигать. |
Сообщ.
#51
,
|
|
|
в общем цепляем кнопку одним контактом на RB1, этот же контакт через 100кОм на питание, второй контакт кнопки на 0
в программе изменяем: TRISB = 2;// RB1 настраиваем на вход, остальные разряды PORTB на выход далее перед while(1) добавляем строчку while(PORTB & Bit(1)); и вся любовь:) |
Сообщ.
#52
,
|
|
|
А если я хочю чтобы он ждал нажатие у нескольких
кнопок, и выполнял при каждем нажатии определённое включения светодиодов. |
Сообщ.
#53
,
|
|
|
хороше, ты только напиши, куда планируешь подключит кнопки, и куда светодиоды
|
Сообщ.
#54
,
|
|
|
1 кнопка RA2 RA4
2 кнопка RA2 RA3 3 кнопка RA4 RA3 Светодиоды подрубил к RB0,RB1 RB2, RB3, RB4, RB5, RB6, RB7, RA1. |
Сообщ.
#55
,
|
|
|
Если нажимаем (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; } } |
Сообщ.
#56
,
|
|
|
батенька, вы совсем обленились:)
ну попытайся, хоть что нибудь сам написать, иначе ты ничему не научишься, тем более задача простенькая в общем лови подсказку: 1)switch(PORTA) ... 2)TRISA = 0x04;// настройка RA2 на ввод, остальное на вывод 3)TRISA = 0x08;// настройка RA3 на ввод, остальное на вывод попробуй написать сам, вышли свой вариант, укажу на ошибки, ну если уж совсем туго, напишу как правильно, просто обьясняю еще раз, пока не начнеш писать сам не научишься:) |
Сообщ.
#57
,
|
|
|
Да лень вперёд меня родилась.
Попробую сам, только скажи как настроить RA0 и RB2 на ноль, а остальные на единицу. КАК RB c RB и RA c RA разобрался, не могу понять как RA с RB. |
Сообщ.
#58
,
|
|
|
Все просто
только ты не забывай, что помимо этого часть ног 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 |
Сообщ.
#59
,
|
|
|
Кнопки цепляем по этой схеме.
(проверь правельно ли я подрубил кнопки) Прикреплённый файлCVET.rar (5.65 Кбайт, скачиваний: 461) |
Сообщ.
#60
,
|
|
|
можно так, я думал ты хотел их в матрицу объединить.
в зтом случае соответствующие разряды PORTA просто программируешь на ввод, дерзай дальше:) на сегодня я побежал... Добавлено в : маленькое замечание, зачем ты взял нормально замкнутые контакты??? чтобы тока больше жрали?? |
Сообщ.
#61
,
|
|
|
Поправка
_ _ \ \ Мы на секунду замыкаем контакт, и отпускаем его (кнопка не должна быть нажата постоянно)?????? |
Сообщ.
#62
,
|
|
|
да, только есснно в этом случае критерием нажатой кнопки будет 0 на соответствующем разряде порта
|
Сообщ.
#63
,
|
|
|
критерием нажатой кнопки будет 0 В смысле критерием, я таких слов незнаю. (малясь недоразвет) |
Сообщ.
#64
,
|
|
|
признаком:)
|
Сообщ.
#65
,
|
|
|
Это для одной кнопки.
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; } } } Для двух кнопок, можно создать две функции и врубать их поочерёдно если кнопка была нажата он будет выполнять эту функцию бесконечно???????? - (так можно реализовать программу)….. |
Сообщ.
#66
,
|
|
|
Цитата Так делать бессмысленно. Это эквивалентно просто switch(PORTA) bizar, 24.01.04, 12:01 switch(PORTB, PORTA) |
Сообщ.
#67
,
|
|
|
А как нужно (PORTB & PORTA)
|
Сообщ.
#68
,
|
|
|
Цитата А скажи словами, чего хочешь получить?bizar, 24.01.04, 12:23 А как нужно (PORTB & PORTA) Я некоторые этапы вашего диалога пропустил. |
Сообщ.
#69
,
|
|
|
Хотим заставить мигать светодиоды на PORTA и PORTB,
чтобы они мигали при нажатии кнопки. Добавлено в : Нужно чтобы два светодиода первый RB второй на RA загорались одновременно. |
Сообщ.
#70
,
|
|
|
работа над ошибками:
Цитата 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); } } |
Сообщ.
#71
,
|
|
|
{ tick(); if (PORTA & Bit(2)) PORTA &= ~Bit(2); else POTRA |= Bit(2); if (PORTB & Bit(1)) PORTB &= ~Bit(1); else POTRB |= Bit(1); } Объясни принцип работы этого кусочка (или натолкни на него). |
Сообщ.
#72
,
|
|
|
Цитата { 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 } |
Сообщ.
#73
,
|
|
|
Проще написать PORTB ^= Bit(1);
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); // инвертируем бит } } |
Сообщ.
#74
,
|
|
|
2trainer
да, действительно, а я то бошку в свое время ломал, ка кэто одной командой сделать:) |
Сообщ.
#75
,
|
|
|
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 спасибо за ваше терпение. |
Сообщ.
#76
,
|
|
|
Я так понимаю, что схема включения из CVET.RAR?
tick() - задержка на некоторый интервал времени? Тогда этот код должен моргать некоторое время после нажатия кнопок одним из светодиодов, соответсвующим двоичному коду, образуемому нажатыми клавишами 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(); // делаем небольшую задержку } } } |
Сообщ.
#77
,
|
|
|
for( i=1000; i != 0; i-- ) i=1000, это i = (TRISA = 8)? (В донном случаи i будет TRISA?) mask = 1<<Keys; // битовая маска инвертируемого вывода порта B По подробнее объясните. У тебя в исходнике где: // "мигаем" соответствующим светодиодом Можно указать одну последовательность миганий при нажатии, А если я хочу к каждой кнопки различные последовательности мигания? Так, на словах, что за "антидребезг". Я так понимаю, что схема включения из CVET.RAR? tick() - задержка на некоторый интервал времени? Да, да. |
Сообщ.
#78
,
|
|
|
Цитата Это просто цикл из 1000 изменений состояния одного из светодиодов(светит/не светит).bizar, 28.01.04, 17:01 i=1000, это i = (TRISA = 8)? (В донном случаи i будет TRISA?) Цитата Это формирование битовой маски для инвертирования состояния нужного вывода. Просто в mask в бите, номер которого находится в Keys, будет установлена 1, в остальных битах - 0.bizar, 28.01.04, 17:01 mask = 1<<Keys; // битовая маска инвертируемого вывода порта B По подробнее объясните. Цитата Можно. Программа только немного изменится.bizar, 28.01.04, 17:01 У тебя в исходнике где: // "мигаем" соответствующим светодиодом Можно указать одну последовательность миганий при нажатии, А если я хочу к каждой кнопки различные последовательности мигания? Цитата Это несколько считываний состояния с небольшими интервалами между ними. Для устранения дребезга контактов. bizar, 28.01.04, 17:01 Так, на словах, что за "антидребезг". |
Сообщ.
#79
,
|
|
|
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(); // делаем небольшую задержку } } } } Для нескольких кнопок. Думаю что здесь что то не то. Проверьте? |
Сообщ.
#80
,
|
|
|
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. Можно кое-что соптимизировать, но нагладность окончательно потеряется. |
Сообщ.
#81
,
|
|
|
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 эти строчки лишние:) |
Сообщ.
#82
,
|
|
|
potor, то есть где у trainer, написано
// "мигаем" соответствующим светодиодом Можно написать код: Если mask ровен тому-то выполнять те та включения светодиодов, Если равен другому то другие светодиоды будут гореть? for( i=1000; i != 0; i-- ) trainer, зачем ты использовал это в программе? |
Сообщ.
#83
,
|
|
|
Это цикл. Выполнять заданное действие ограниченное количество раз, а значит и ограниченное время.
Добавлено в : Цитата Только лучше не mask, а Keys. Расшифровку см. в сообщении #80 bizar, 30.01.04, 09:29 Если mask ровен тому-то выполнять те та включения светодиодов, |
Сообщ.
#84
,
|
|
|
potor, то есть где у trainer, написано // "мигаем" соответствующим светодиодом Можно написать код: Если mask ровен тому-то выполнять те та включения светодиодов, Если равен другому то другие светодиоды будут гореть? Это будет выглядеть вот так: { if (Keys = 0) POTRB == 0xfd; //Если Keys равен 0 горит светодиод на RB1 if (Keys = 1) PORTB == 0xfb; //Если Keys равен 1 горит светодиод на RB2 if (Keys = 2) PORTB == 0xf7; // Если Keys равен 2 горит светодиод на RB3 } Это цикл. Выполнять заданное действие ограниченное количество раз, а значит и ограниченное время. Тоесть светодиод мигнёт 1000 раз, и всё? |
Сообщ.
#85
,
|
|
|
Цитата Точнее - 500 раз. В цикле одна итерация - зажечь, другая - погасить, т.е. две итерации на одну "вспышку". 1000/2 = 500.bizar, 31.01.04, 12:10 Тоесть светодиод мигнёт 1000 раз, и всё? Потом снова будет ожидаться нажатие кнопок. Цитата Keys внутри цикла for никогда не будет равен 0. Только от 1 до 7 включительно.bizar, 31.01.04, 12:10 if (Keys = 0) POTRB == 0xfd; //Если Keys равен 0 горит светодиод на RB1 И этот набор if-ов можно заменить на switch(Keys) P.S. В C и C++ присваивание значения обозначается = , а сравнение на равенство == |
Сообщ.
#86
,
|
|
|
{ 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. |
Сообщ.
#87
,
|
|
|
Цитата А зачем? Почему именно 0, а не, например, 1?bizar, 1.02.04, 10:59 Как ещё можно сделать, Keys = 0? Цитата Не от 0 до 2, а три бита(с №0 по №2) - семь ненулевых значений(1,2,3,4,5,6,7). bizar, 1.02.04, 10:59 у тебя в примере, Keys от ноля до 2 Добавлено в : 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: // другое действие } |
Сообщ.
#88
,
|
|
|
У нас же 3 кнопки почему case - 7 значений?
|
Сообщ.
#89
,
|
|
|
Цитата Потому что каждой кнопке соответствует один бит, три кнопки - три бита. Могут быть нажаты и две и три кнопки одновременно. Всего комбинаций нажатий трех кнопок - 7 штук, в двоичном виде так:bizar, 2.02.04, 11:52 У нас же 3 кнопки почему case - 7 значений? 001 010 011 100 101 110 111 Прим.: 1 - кнопка нажата, 0 - нет. |
Сообщ.
#90
,
|
|
|
Можно до 7 кнопок замутить?
|
Сообщ.
#91
,
|
|
|
Цитата Можно сколько угодно. Лишь бы портов хватило. В существующем варианте 3 кнопки, для которых существует 7 комбинаций нажатий. bizar, 2.02.04, 13:42 Можно до 7 кнопок замутить? |
Сообщ.
#92
,
|
|
|
нет, 3-входа=7 возможных состояний
Добавлено в : ссори, уже ответили:) |
Сообщ.
#94
,
|
|
|
Прошу прощения за оффтопик, но тут вообще про что? А то интересно стало!
|
Сообщ.
#95
,
|
|
|
Цитата Да тут bizar пытается осваивать программирование микроконтроллеров на примере создания "мигалки" на МК семейства PIC16 NadZ, 2.02.04, 22:31 Прошу прощения за оффтопик, но тут вообще про что? А то интересно стало! Добавлено в : Цитата Нет. bizar, 2.02.04, 20:23 Типа этого? У тебя три бита(три входа: RA2,RA3,RA4, три кнопки). Сколько у трех бит возможных ненулевых состояний? Ответ: 7 Хочешь больше - добавь еще используемых входов(портов) микроконтроллера. Только придется взять микроконтроллер побольше или совмещать функции выводов в существующем. |
Сообщ.
#96
,
|
|
|
Если нельзя сделать на трёх выводах семь кнопок,
зачем нужны 7 ненулевых состояний? |
Сообщ.
#97
,
|
|
|
тебе же говорят, ты можешь отслеживать одновременное нажатие кнопок:)
|
Сообщ.
#98
,
|
|
|
Цитата Они не нужны. Они есть. Элементарная двоичная арифметика - слово размером в три двоичных разряда имеет семь состояний, когда хотя бы один бит ненулевой. Не хочешь отслеживать все возможные состояния - не отслеживай. bizar, 3.02.04, 12:26 зачем нужны 7 ненулевых состояний? |
Сообщ.
#99
,
|
|
|
Нажимаю на кнопку выполняется зажигание светодиодов,
потом нажимаю другую, в исходнике trainer, не должны выполняться другие зажигания, а будет выполняться до конца нажатие первой кнопки???? Добавлено в : potor, я смогу нажать две кнопки одновременно и что из этого выйдит? |
Сообщ.
#100
,
|
|
|
Программа опрашивает состояние всех кнопок и ждет пока не будет нажата хотя бы одна из них. Затем в соответствии с их состоянием выполняет некое действие в течение некоторого времени, затем снова опрашивает состояние и т.д.. Цитата Что напишешь в соответствующем case, то и выйдет. bizar, 3.02.04, 15:43 я смогу нажать две кнопки одновременно и что из этого выйдит? |
Сообщ.
#101
,
|
|
|
trainer, почему та сказал "нет" , про схему
#93 там-же есть одновременное нажатие 2 кнопок, только в одной кнопки? |
Сообщ.
#102
,
|
|
|
Потому, что это не решение. В схеме из #93 можно все равно нажать несколько кнопок. Так зачем такой огород городить? Если 3 кнопки обеспечивают то же самое.
|
Сообщ.
#103
,
|
|
|
В #include, нужно указать библиотеку, у меня IAR (PIC), (potor у тебя есть IAR для пик (ты его скачал или нет)) я не знаю какие библиотеки для чего служат, укажите какие/для чего?
Фрагменты выделенные с двух сторон : Можно ли описывать так или нужно ставить break, мне надо одновременно чтобы порты RA и RB гасли светодиоды? #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--); } |
Сообщ.
#104
,
|
|
|
Слишком уж много у тебя строчек в switch.
то есть хочется сделать бегущий огонь? #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(); /* пауза - чтобы светодиод погорел немного */ } } } Что будет не понятно - отвечу. |
Сообщ.
#105
,
|
|
|
Цитата potor у тебя есть IAR для пик (ты его скачал или нет) скачать то я его скачал, два раза пытался, не проходит у меня его установка, причем на обоих домашних машинах:(( |
Сообщ.
#106
,
|
|
|
Может сначало кряк поставить надо:
Прикреплённый файлEWPIC_V221Acrk.rar (16.65 Кбайт, скачиваний: 490) |
Сообщ.
#107
,
|
|
|
нет, я думаю сам пакет на iar-овском сайте битый лежит, ты то себе установил???
|
Сообщ.
#108
,
|
|
|
У меня всё Ok поставилось, бес проблем.
Может как-нибудь тебе перекинуть... |
Сообщ.
#109
,
|
|
|
да наверное не надо, как ты можешь его выслать? если почтой, я не вытяну такое письмо физически, кстати, ты тестовую плату спаял? работает? а то может мы обсуждаем неизвестно что?
|
Сообщ.
#110
,
|
|
|
trainer, у тебя всё так сложно (в исходнике),
ты сможешь написать алгоритм (чтобы было более понятней)? (до простого смертного это не доходит). potor, плату накидал, теперь нужно скомпилить. Как в IAR компилить??? |
Сообщ.
#111
,
|
|
|
Цитата Как в IAR компилить??? build, только предварительно выставить нужные опции в свойствах проекта |
Сообщ.
#112
,
|
|
|
свойства проекта где расположены?
Project->build all? |
Сообщ.
#113
,
|
|
|
Project->build all это скомпилировать весь проект
свойства проекта, это что то типа Project->properties, я сейчас на работе а там IAR а нет, поэтому точно сказать не могу, но помню точно, что значек свойств есть на панели инструментов что тебе конкретно не понятно в исходнике trainera? ты кернигена с ричем скачал? |
Сообщ.
#114
,
|
|
|
potor, если ссылки есть скинь.
Я обыкновенной самообучалкой пользуюсь, там такие сложные примеры на разбирают. |
Сообщ.
#116
,
|
|
|
Цитата А воспользоваться отладчиком? bizar, 10.02.04, 11:30 ты сможешь написать алгоритм (чтобы было более понятней)? Итак, идея программы из #104 - создание бегущего огня. Пользователь нажимает одну или несколько кнопок - МК определяет двоичную комбинацию N, соответствующую нажатыи кнопкам и начинает гонять огоньки. Первым загорается светодиод N, затем он гаснет и загорается N+1-ый и так далее до 10-го, после которого загорается 1, затем 2 и так далее до N-го, после чего начинается движение в обратную сторону: N-1-ый, N-2-ой,...,1-ый, 10-ый и далее снова до N-го. И так далее по кругу. Комментариев я там в тексте программы вроде достаточно много написал. |
Сообщ.
#117
,
|
|
|
trainer, а алгоритм для второй кнопки не как сделать не могу
а свитчей там ещё больше (это в моём примере где много свитч) Добавлено в : potor тестовую плату спаял только пример скомпилить не могу. |
Сообщ.
#118
,
|
|
|
Цитата trainer, а алгоритм для второй кнопки не как сделать не могу а свитчей там ещё больше (это в моём примере где много свитч) дык он же тебе для нескольких кнопок сделал? Цитата potor тестовую плату спаял только пример скомпилить не могу. что неполучается? что говорят компилятор и линкер? |
Сообщ.
#119
,
|
|
|
Создаю Project и что дальше делать не знаю
куда кад вставлять? Когда создаёшь Text вставляешь код В заголовке Project, build - нельзя нажать. Что делать? |
Сообщ.
#120
,
|
|
|
Если в IAR EWPIC так же, как и в IAR EWAVR, то нажимаешь меню File->New..., выбираешь source/text, вставляешь текст, нажимаешь File->SaveAs..., вводишь имя в виде имя_файла.c , нажимаешь Сохранить.
Если в проекте в разделе Common Sources этот файл не появился, то нажимаешь меню Project->Files..., выбираешь этот файл, нажимаешь Add, затем Done. Файл в проекте. Дальше - компиляция. |
Сообщ.
#121
,
|
|
|
В IAR для pic также.
Но у меня проблема счёлкаю project а там все кнопки нельзя нажать кроме двух последних (Librarian, Debugger).??????? |
Сообщ.
#122
,
|
|
|
незнаю, что то ты тупишь, домой приду посмотрю:)
|
Сообщ.
#123
,
|
|
|
Ну, не знаю...
У меня в IAR EWAVR даже при пустом проекте эти кнопки активны. |
Сообщ.
#124
,
|
|
|
Вот полюбуйтесь что у меня выдаёт.
(Я почему-то не смог прекрепить этот файл к сообщению выдовал ошибку может кто попробует, мне любопытно)Скачайте тут |
Сообщ.
#125
,
|
|
|
дык сначало надо проект создать, а потом уже к нему С файл прикркплять
Добавлено в : в меню file должно быть что то типа New WorckSpace, или New Project |
Сообщ.
#126
,
|
|
|
Создал я New Project
как к нему *.с файл прекрепить и что далее делать опиши??? |
Сообщ.
#127
,
|
|
|
ну ищи что то типа Add file to project
Добавлено в : посмотри вчерашний пост 120 от trainerа |
Сообщ.
#128
,
|
|
|
Нашёл Project->File
Теперь с чего начинать компилить.???? |
Сообщ.
#129
,
|
|
|
ты присоединил файл к проекту?
Добавлено в : тип процессора задал? Добавлено в : если все ок, то жмакаешь build и наблюдаешь кучу ошибок, а потом вываливаешь их сюда |
Сообщ.
#130
,
|
|
|
В 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???? |
Сообщ.
#131
,
|
|
|
смотри где у тебя находится файл pic16f84.h, и если его нет иши вайл с описаниями регистров
а вообще если он в каталоге твоего проекта пишут #include"pic16f84.h", а если в каталоге стандартных заголовков пишут #include<pic16f84.h>, но скорее всего он у тебя называется по другому, ищи, я на обед буду через час |
Сообщ.
#132
,
|
|
|
Нашол он правельно называеться 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 Что дальше?? |
Сообщ.
#133
,
|
|
|
ну, вроде скомпилил (правда с варнингами), посмотри на какие мтрочки кода он выдает варнинги
|
Сообщ.
#134
,
|
|
|
Всё удолил и повторил всё заново
Выдаёт: 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 |
Сообщ.
#135
,
|
|
|
видимо ты забыл в свойствах проекта задать тип контроллера, т е получается, что ты берешь заголовочный файл для PIC 16f84, а в проекте указан другой тип
|
Сообщ.
#136
,
|
|
|
Цитата Зачем? У тебя же в #132 уже откомпилировалось. bizar, 19.02.04, 13:37 Всё удолил и повторил всё заново |
Сообщ.
#137
,
|
|
|
Незнаю просто решил потренироваться.
Сейчас удолил строчку в библиотеке 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: direction = -1; for( i=1000; i != 0; i-- ) Добавлено в : Potor ты был прав... |
Сообщ.
#138
,
|
|
|
определи direction как signed char
|
Сообщ.
#139
,
|
|
|
Всё работает теперь осталось одна ошибка
for( i=1000; i != 0; i-- ) |
Сообщ.
#140
,
|
|
|
объяви i как unsigned int
Добавлено в : только в функции main конечно |
Сообщ.
#141
,
|
|
|
Цитата Или напиши:potor, 19.02.04, 14:06 определи direction как signed char direction = (unsigned char)-1; Ну что, типа, одним эмбеддером стало больше. А работает-то как задумано? |
Сообщ.
#142
,
|
|
|
Цитата Ну что, типа, одним эмбеддером стало больше да, вот только проверить на девайсе осталось:) |
Сообщ.
#143
,
|
|
|
Total number of errors - Это ошибки
Total number of warnings - а это про что?? |
Сообщ.
#144
,
|
|
|
Цитата Total number of errors - Это ошибки Total number of warnings - а это про что?? это придупреждение, грубо говоря компилятор "сомневается" правильно ли он скомпилировал некий участок кода |
Сообщ.
#145
,
|
|
|
Цитата Это просто предупреждения. Например, о том, что компилятор не уверен в правильности чего-то. Или предупреждает о потенциальной опастности каких-то конструкций. Или просто сообщает, что он что-то сделал. bizar, 20.02.04, 11:56 Total number of warnings - а это про что?? |
Сообщ.
#146
,
|
|
|
Всё откомпилил "Ошибок нет".
Теперь нужно вытащить *.hex или *.bin Как? |
Сообщ.
#147
,
|
|
|
если линкер не создал hex, смотри настройки линкера, там должно быть чтго то типа generate hex file, или create hex file
|
Сообщ.
#148
,
|
|
|
Нашёл только Generate linker listing
постави галочку и некаких изменений как мне быть? |
Сообщ.
#149
,
|
|
|
Смотри содержимое папки Debug\Exe или Release\Exe в зависимости от того, какой проект собираешь(debug или release)
|
Сообщ.
#150
,
|
|
|
В 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@ Что дальше делать???? |
Сообщ.
#151
,
|
|
|
В свойствах соответствующей версии проекта в категории XLINK, закладка Output, группа Format что указано?
|
Сообщ.
#152
,
|
|
|
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 выдал ошибки, поидее должно работать. В чём дело??? |
Сообщ.
#153
,
|
|
|
Цитата Нет, то , что написано там, нормально компилироваться не будет никогда. bizar, 22.02.04, 11:10 хотел попробовать исходник с сообщения #103 Добавлено в : Цитата Ну вот это и есть hex-файл bizar, 22.02.04, 11:10 Результат: |
Сообщ.
#154
,
|
|
|
В инете не могу нармального, обычного програматора для Pic 16f84 найти.
Схем море но они нерабочие 2 программатор собираю и облом. Скиньте схему точно рабочего прогромматора для PIC16F84, для программы ICPROG??? |
Сообщ.
#155
,
|
|
|
http://www.lancos.com/prog.html
подойдет, если у тебя PIC16F84A (там и схема и программа), а лучше задай этот вопрос на телесистемах людям, которые пиками занимаются, или на www.microchip.ru |
Сообщ.
#156
,
|
|
|
Собираю это воидино и должно работать???
|
Сообщ.
#157
,
|
|
|
возможно, не знаю, не пробовал:)
|
Сообщ.
#158
,
|
|
|
potor что за выход Select power ext/batt
их вместе соединять с обеих картинок? На сайте печатную плату не нашёл, (небеда сделаю) но ты её на том сайте не видел, а то время тратить неохота? |
Сообщ.
#159
,
|
|
|
Цитата Это не выход. Это переключатель - внешнее питание( с External power circuit, а тот в свою очередь с внешнего БП ) или батарейное( от BT1 ) bizar, 29.02.04, 07:55 что за выход Select power ext/batt |
Сообщ.
#160
,
|
|
|
Вроде всё пашет но чёто быстро он моргает.
Теперь нужно разобраться с обменном информации с компом. Подключаю PIC к COM порту, подрубаю две кнопки. При нажатии кнопки в моей проге на компе будет выведено какая кнопка была нажата. Пишим прошиву. Что посоветуете??? potor, trainer вы работали с COM портами??? |
Сообщ.
#161
,
|
|
|
Цитата Вроде всё пашет но чёто быстро он моргает. ну переделай подпрограмму задержки, в чем проблемы? например так: void tick(void) { for ( unsigned int i = 0xffff; i!=0; i--) for ( unsigned char j = 10; j!=0; j--); } на будующее вообще в восьмиразрядных контроллерах лучше меньше использовать тип int, как правило получается длинный код, тоесть оптимальнее так: 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а т е придется тебе программно, по битику передавать помочь помогу, но писать за тебя не буду:) теперь скажи какая у тебя тактовая частота |
Сообщ.
#162
,
|
|
|
8 Mhz
Что за UART??? |
Сообщ.
#163
,
|
|
|
Что за UART??? универсальный асинхронный приемопередатчик, каковым com и является ща прикину, как это лучше сделать передачу |
Сообщ.
#164
,
|
|
|
На какой скорости хочешь общаться с ПК?
|
Сообщ.
#165
,
|
|
|
в общем так:
1) для начала нам надо реализовать функию задрежки передачи следующего бита выглядеть она будет примерно так void TransmitBitDelay(void) { for (int i= число1; i!=0; i--) for (int j= число2; j!=0; j--); } как подобрать числа расскажу дальше 2)организуем передачу (предполагаем ,что передатчик подключен к RA0, 8 бит данных, проверки четности нет, 1 стоповый бит, на выходе RA0 стоит max232) 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 подбираещь числа таким образом, чтобы вышеуказанная ф-я выполнялась с частотой равной частоте передачи |
Сообщ.
#166
,
|
|
|
Цитата trainer @ 12.03.04, 17:26 На какой скорости хочешь общаться с ПК? А с какой лучше? |
Сообщ.
#167
,
|
|
|
Цитата Это зависит от задачи. С одной стороны, чем выше скорость - тем быстрее обмен. С другой стороны, чем выше скорость, тем больше ресурсов отъедает эмуляция последовательного порта. Обычно выбирают от 300 до 9600 бит/сек. Можно просто прикинуть необходимую скорость исходя из пропускной способности, времени реакции и реализуемого протокола. bizar, 12.03.04, 20:28 А с какой лучше? |
Сообщ.
#168
,
|
|
|
/*Вод что у меня преблезительно получилось*/
#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 */ } } } |
Сообщ.
#169
,
|
|
|
Цитата Лучше бы наверное так:bizar, 14.03.04, 11:19 do { TransmitBitDelay(); // задержка перед передачей следующего бита PORTA ^= (~Symbol) & 1; // выдаем очередной бит в COM Symbol >>= 1; //следующий бит count--; } while (count >0); do { TransmitBitDelay(); // задержка перед передачей следующего бита PORTA = (PORTA&0xfe)|(Symbol&1); // выдаем очередной бит в COM Symbol >>= 1; //следующий бит count--; } while (count >0); В main напортачил: Цитата Здесь цикл явно лишний: while(1) - это бесконечный циклbizar, 14.03.04, 11:19 while(1) { void TransmitByte(34) /* посылаем 34 */ } Цитата Здесь то же самое.bizar, 14.03.04, 11:19 while(1) { void TransmitByte(35) /* посылаем 35 */ } Ну и еще там несколько ошибок и лишних действий. Я не знаю, что ты задумал, но main можно написать так: 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 */ } } |
Сообщ.
#170
,
|
|
|
Цитата
Я не знаю, что ты задумал, Создаём две кнопки при нажатии которых pic будет посылать код соответствующей кнопки. Теперь по поводу числа potor чёт я несовсем понял????? #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 */ } } |
Сообщ.
#171
,
|
|
|
PORTA забыл проинициализировать
|
Сообщ.
#172
,
|
|
|
PORTA &= 0xfe; //передаем стартовый бит Народ а помоему это PORTB ?????? potor, дык про числа обьестни по понятней.. |
Сообщ.
#173
,
|
|
|
Цитата Народ а помоему это PORTB ?????? не понял????? Цитата дык про числа обьестни по понятней.. откомпили, зайди в отладчик и выложи сюда ассемблерный код ф-и TransmitBitDelay |
Сообщ.
#174
,
|
|
|
ессно перед тем как компилить подставь вместо чисел например 10
|
Сообщ.
#175
,
|
|
|
#include<io16f84.h> void TransmitBitDelay(void) { int i,j; for (i=10; i!=0; i--) for (j=10; j!=0; j--); } Выдаёт ошибку 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 Что делать??? |
Сообщ.
#176
,
|
|
|
скомпили весь проект, так оно у тебя компилится не будет:), укажи компилятору чтобы он создал файл .lst с ассемблерным кодом, и выложи его здесь? либо зайди в дебаггер, укажи чтобы он показал тебе ВЕСЬ ассемблерный код, он показывает так :
строка С асм асм асм асм строка С ... найди код ф-и TransmitBitDelay и выложи его сюда Добавлено в : т.е. понял меня? линкер тебе говорит, что обьявлена функция main, но нигде не описана, эта ф-я должна присутствовать обязательно, т к это точка входа в программу |
Сообщ.
#177
,
|
|
|
Цитата В проекте нет файла, содержащего функцию main. bizar, 25.03.04, 13:19 Выдаёт ошибку |
Сообщ.
#178
,
|
|
|
#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] |
Сообщ.
#179
,
|
|
|
ты крякнул IAR? он говорит, что у тебя лицензия закончилась
|
Сообщ.
#180
,
|
|
|
Увсё сделал
Ошибки count = 8;// счетчик передаваемых бит данных и 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 */ } } } Добавлено в : count = 8;// счетчик передаваемых бит данных Надо сделать int правельно я думаю??? |
Сообщ.
#181
,
|
|
|
Цитата unsigned char count=8; Цитата unsigned char Keys = (~PORTB) & (4|8); /* состояние кнопок на RB2-RB3. Ждёт нажатия */ определять такие ошибки пора бы уже и саму научиться:) |
Сообщ.
#182
,
|
|
|
potor, в тех местах так ошибки и остались
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 |
Сообщ.
#183
,
|
|
|
Цитата Для do нет соответствующего while. Или Keys >>= 1; стоит не там, где нужно bizar, 26.03.04, 11:38 do { tick(); /* НЕБОЛЬШОЙ ПРОМЕЖУТОК ВРЕМЕНИ, "не будем опрашивать кнопки слишком часто" */ Keys = (~PORTB) & (4|8); /* состояние кнопок на RB2-RB3. Ждёт нажатия */ } Keys >>= 1; while(PORTB & Bit(0)); /* если установлен бит 0, значит нажата кнопка на RB2 */ |
Сообщ.
#184
,
|
|
|
ПОПРОБУЙ ТАК:
Цитата 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 */ } } } |
Сообщ.
#185
,
|
|
|
Думаю нужно начать всё сначало?
Прикреплённый файл__________.rar (26.83 Кбайт, скачиваний: 417) |
Сообщ.
#186
,
|
|
|
в общем в моем IARe для AVR надо в режиме дебаггера сделать View/Disassembly, либо в Project/Options в закладке компилятора list ставишь галочку Assembler mnemonics, т е ты выслал не то, нужен ассемблерный код
|
Сообщ.
#187
,
|
|
|
potor, я этим покозал что ошибок море,
и не знаю как их исправить (уже всё перепробовал). |
Сообщ.
#188
,
|
|
|
бл...
unsigned char Keys Добавлено в : точку с запятой незабудь поставить:) |
Сообщ.
#189
,
|
|
|
на будующее, в микроконтроллерных компиляторах, ввиду их недоделанности, следует обращать внимание на первую ошибку, остальные генерятся как правило от балды:)
|
Сообщ.
#190
,
|
|
|
Ещё остались ошибки.
Прикреплённый файл__________.rar (21.64 Кбайт, скачиваний: 428) |
Сообщ.
#191
,
|
|
|
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:) |
Сообщ.
#192
,
|
|
|
В нём ошибка:
if(Keys & Bit(2)) Сдесь выдаёт ошибку. |
Сообщ.
#193
,
|
|
|
после #include <io16f84.h>
вставь строчку #define Bit(x) 1<<(x) дело в том что команды Bit нет, это макрос который мы определяем сами |
Сообщ.
#194
,
|
|
|
Ok всё скомпелил без ошибок
теперь зашить и проверить. |
Сообщ.
#195
,
|
|
|
неееет, зашить и проверить неполучится, сначала надо подобрать числа, т е десятки там не пройдут:)
|
Сообщ.
#196
,
|
|
|
повторюсь:
вышли сюда ассемблерный код функции TransmitBitDelay, я тебе обьясню как вычислить эти числа |
Сообщ.
#197
,
|
|
|
Я всё довно понял, времени просто не было
Прикреплённый файлwood.rar (1.71 Кбайт, скачиваний: 416) |
Сообщ.
#198
,
|
|
|
слуай, ты случайно в следующем коде точку с запятой после первого for не ставил???
void TransmitBitDelay(void) { for (int i= число1; i!=0; i--) // здесь точка с запятой ненужна for (int j= число2; j!=0; j--); } если не ставил, значит оптимизатор что то намудрил, уменьши уровень оптимизации и вышли еще раз:) Добавлено в : или попробуй вот так записать: void TransmitBitDelay(void) { for (int i= число1; i!=0; i--) { for (int j= число2; j!=0; j--); } } |
Сообщ.
#199
,
|
|
|
Млин откуда там точка с запятой взялась не понимаю
вроде всё правельно наберал. Ну ладно вот без неё. Прикреплённый файлwoodd.rar (2.46 Кбайт, скачиваний: 391) |
Сообщ.
#200
,
|
|
|
ok завтра на работе посмотрю:)
|
Сообщ.
#201
,
|
|
|
вот это больше на правду похоже, но извини, я опять намудрил:)
переделай функцию вот так, а то компилятор много избыточного кода вставляет: void TransmitBitDelay(void) { for (unsigned char i= число1; i!=0; i--) // здесь точка с запятой ненужна for (unsigned char j= число2; j!=0; j--); } Добавлено в : ссори вот так: void TransmitBitDelay(void) { unsigned char i,j for (i= число1; i!=0; i--) // здесь точка с запятой ненужна for (j= число2; j!=0; j--); } |
Сообщ.
#202
,
|
|
|
Кстати я там поменял:
void TransmitBitDelay(void) { int i,j for (i= число1; i!=0; i--) for (j= число2; j!=0; j--); } А зачем unsigned char? |
Сообщ.
#203
,
|
|
|
int занимает 2 байта, char 1 байт, контроллер восьмиразрядный, т е вся арифметика побайтовая, и если использовать тип int получается больше по коду, в твоем случае рационально использовать unsignrd char
Добавлено в : я тебе уже раньше писал, что int надо использовать по возможности реже |
Сообщ.
#204
,
|
|
|
Сообщ.
#205
,
|
|
|
сейчас, разбирусь с тем, что он накомпилил, и расскажу:)
|
Сообщ.
#206
,
|
|
|
;------------------------------------------------- этот код выполняется 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 |
Сообщ.
#207
,
|
|
|
Ok
если использовать 8Mhz = (8000000) Что лучше использовать 2Mhz или 8Mhz для передачи таких небольших чисел. Но чтобы не было ни каких задержек тормажений? |
Сообщ.
#208
,
|
|
|
нет, читайте доки, они рулез:)
один такт-8MHz машинный цикл состоит у твоего пика из четырех тактов, т е 2MHz т е это я тебе сказал для твоего кварца |
Сообщ.
#209
,
|
|
|
Один цикл при твоем кварце 2MHz=2000000Hz Мой кварц вобще-то 8Mhz т е это я тебе сказал для твоего кварца Что лучше использовать 2Mhz или 8Mhz для передачи таких небольших чисел. Но чтобы не было ни каких задержек тормажений? |
Сообщ.
#210
,
|
|
|
еше раз обьясняю, машинный цикл и тактовая частота разные вещи
считай машинным циклом время выполнения самой быстрой команды у PIC16 два типа команд, одни выполняются за один машинный цикл, другие за два, есть правда команды, время выполнение которых зависит от результата у PIC16 один машинный цикл = 4 такта, т е я тебе привел вычисления для кварца 8MHz |
Сообщ.
#211
,
|
|
|
Всё теперь осуществляем проект.
Ну нужно ещё прогу написать для приёма с COM порта. Документацию по настройки COM скачал. Короче potor, бли я даже не знаю как тебя отблагодорить. B) Правда вопросов у меня ещё море но сначало разберёмся с этим примером. |
Сообщ.
#212
,
|
|
|
Цитата Всё теперь осуществляем проект. Ну нужно ещё прогу написать для приёма с COM порта ненадо ничего писать, воспользуйся стандартным гипер терминалом для проверки:) |
Сообщ.
#213
,
|
|
|
potor, в гипере нужно поставить ждать звонка и всё?
|
Сообщ.
#214
,
|
|
|
нет, просто запустить, указав вместо модема номер com порта, попробуй нульмодемным кабелем соединить два com порта между собой, запусти два гипер терминала, настроенных на одну скорость с одинаковыми параметрами, в окне одного набери несколько символов с клавы, посмотри на окно другого, и все станет понятно
|
Сообщ.
#215
,
|
|
|
Провернул всё как ты сказал
жму ждать звонка, а на другом звонить ну и они не саеденяються тот бесконечно ждёт другой дозванивается. |
Сообщ.
#216
,
|
|
|
Цитата Провернул всё как ты сказал жму ждать звонка, а на другом звонить ну и они не саеденяються тот бесконечно ждёт другой дозванивается. не надо ждать звонка, и звонить тоже не надо просто соедини два кома кабелем, настрой их в терминале одинаково, набири в одном окне строку символов, она должна появиться в другом, если нет, тогда либо что то с COMом, либо с кабелем, кстати ты правильно кабель распаял? |
Сообщ.
#218
,
|
|
|
да, такой, но тебе достаточно просто 3 провода
2-3 3-2 5-5 |
Сообщ.
#219
,
|
|
|
Ещё я немогу печатать пока до кого ни будь не дозванюсь.??
|
Сообщ.
#220
,
|
|
|
скорее всего у тебя выключено эхо, главное, чтобы в другом терминале, что то появилось
Добавлено в : зайди в свойства\настройки\параметры ASCII, и поставь галочку перед - отображать введенные символы на экран |
Сообщ.
#221
,
|
|
|
Народ ! Буду признателен если кто нить надоумит как IAR подключить к
AVR Studio!? |
Сообщ.
#222
,
|
|
|
Цитата Small, 19.09.04, 16:44 Народ ! Буду признателен если кто нить надоумит как IAR подключить к AVR Studio!? Попробуйте в AVR Studio загрузить *.d90 с отладочной информацией. |
Сообщ.
#223
,
|
|
|
Приведите пример обработки прерывания, например по переполнению таймера под Atmel !!
|
Сообщ.
#224
,
|
|
|
На ассемблере(IAR EWAVR):
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 #pragma vector=TIMER0_OVF0_vect __interrupt void CommonInterruptHandler(void) { /* что-то делаем */ } |
Сообщ.
#225
,
|
|
|
Сообщ.
#226
,
|
|
|
кто работал с IAR for AVR 3.20C, подскажите как там в дебагере заставить срабатывать прерывания от таймеров тогда когда им положено, а не прописывать постоянно какую-то абстрактную частоту их появления в Simulator/Interrupts
|
Сообщ.
#227
,
|
|
|
В IAR-е, вроде (давно не юзал), можно файлик сделать с таймингами прерываний и по нему отлаживаться.
|
Сообщ.
#228
,
|
|
|
По симуляции периферии вообще и прерываний в частности IAR EWAVR слабоват по сравнению с AVR Studio, ПМСМ. Это, похоже, единственный его недостаток.
|
Сообщ.
#229
,
|
|
|
Цитата По симуляции периферии вообще и прерываний в частности IAR EWAVR слабоват по сравнению с AVR Studio, ПМСМ. Это, похоже, единственный его недостаток. это точно, ты можешь сконвертить отладочный файл для AVR Studio и отлаживать там |
Сообщ.
#230
,
|
|
|
Ладно, спасибо,
буду писать в AVR studio, там тоже есть С (а так хотелось С++ ) |
Сообщ.
#231
,
|
|
|
Цитата Moneyiac @ Можешь откомпилировать в IAR, а отлаживать под AVR Studio. Правда будут ли под AVR Studio видны прелести C++ - не знаю. буду писать в AVR studio, там тоже есть С (а так хотелось С++ ) |
Сообщ.
#232
,
|
|
|
Драсте всем кто нибудь пытался програмить контроллер Segnetics с помощью IAR systems. Начал разбираться с этим компилятором возникла куча проблемм прежде всего с настройками. Если кто сталкивался помогите.
|
Сообщ.
#233
,
|
|
|
IAR systems, почему-то не знает об Segnetics абсолютно ни чего, наверное шифруются. И гугль о Segnetics-ах ни чего сказать не смог. Кинь ссылку на документацию или на сайт.
У тебя возникли проблемы с IAR systems или с настройками компилятора? Собственно в чем проблемы, может быть ты всетаки расскажешь, shtirlizzz |
Сообщ.
#234
,
|
|
|
Цитата MeG @ Он просто неправильно написал. Signetics http://www.signetics.com/product.html И гугль о Segnetics-ах ни чего сказать не смог. |
Сообщ.
#235
,
|
|
|
А в ClassBiosSMH не используется? И вообще, о таких ошибках без полных исходников можно долго гадать.
|
Сообщ.
#236
,
|
|
|
у кого есть сама эта программа(iar ewpic)??? пишите. как тока будет она я сразу вступю в дискуссию. а пока очень очень очень нужна
|
Сообщ.
#237
,
|
|
|
Всем привет! Вот, на старости лет лет решил освоить программирование микроконтроллеров...
Попробовал себя в AvrStudio на асме - вроде все нормально. Решил освоить и С. Полазив по интернету остановил свой выбор на IAR. Методом научного тыка вроде разобрался с настройками. Но в один прекрасный момент вылезла такая проблема. Суть в следующем: Изголяюсь с камнем ATtiny45, а конкретно с его USI под TWI. Все вроде бы нормально, все получается, а вот когда я захотел прикрутить к TWI прерывания вылезла непонятка. В симуляторе начали вылазить ошибки о выходе куда-то за пределы кода. Подозрение пало на инициализацию векторов. IAR вектора инициализирует двухбайтовыми командами. Смотрю в даташит по ATtiny45. Вижу следующее: 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 и вижу следующее: /* 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 */ Вижу выравнивание на слово. Начинаю тормозить... Лезу в инклуды асма AvrStudio - вижу следующее: ; ***** 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 Потихоньку начинаю офигевать... Решил посмотреть что видно в дизассемблере AvrStudio - увидел вот это: ---- 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 Каждая команда занимает слово, но адресация почему то идет как побайтная. Вот тут я приехал. Вот может кто нибудь прояснить эту ситуацию? А то у меня уже мозги кипят. ================================================================================ И еще вопрос. IAR не генерит код(кроме области векторов) если в опциях не подключена никакая библиотека. А мне надо заставить компилятор генерить код без подключения библиотек. Исходников стандартных библиотек в моем IAR нет, только скомпилированные. Можно ли как-то заставить IAR генерить код без подключения библиотек? Или может у кого-то есть эти исходники? Поделитесь плиз? Я догадываюсь, что исходники есть наверное в инсталяторе IAR, но как их вытянуть оттуда пока не знаю. Наверное нужна более дорогая лицензия. |
Сообщ.
#238
,
|
|
|
Цитата ir0407 @ Не на байт, а на слово. Память программ при переходах адресуется пословно, младший бит адреса не указывается в коде команды и подразумевается равным 0. Ну или, если смотреть с другой стороны - адрес является порядковым номером 16-битного слова. Особенность архитектуры AVR. Смотрю в даташит по ATtiny45. Вижу следующее: Как видно - везде выравнивание вроде как на байт. |
Сообщ.
#239
,
|
|
|
Спасибо. А в каком документе на сайте Atmel-a можно найти эту инфу об особенностях архитектуры. А то я что-то никак не могу ничего такого найти. Инфы столько, что глаза разбегаются.
|
Сообщ.
#240
,
|
|
|
Вот уж не помню.
|
Сообщ.
#241
,
|
|
|
Цитата trainer @ Не на байт, а на слово. Память программ при переходах адресуется пословно, младший бит адреса не указывается в коде команды и подразумевается равным 0. Ну или, если смотреть с другой стороны - адрес является порядковым номером 16-битного слова. Особенность архитектуры AVR. вы уж уточняйте о каком адресе идет речь, а то у авр-а много адресных пространств и для каждой свои правила организации и свои инструкции для доступа. Собственно речь идет об указателе инструкций |
Сообщ.
#242
,
|
|
|
А там вроде бы на русском языке написано "Память программ", "при переходах"
|
Сообщ.
#243
,
|
|
|
Цитата ir0407 @ IAR не генерит код(кроме области векторов) если в опциях не подключена никакая библиотека. А мне надо заставить компилятор генерить код без подключения библиотек. Исходников стандартных библиотек в моем IAR нет, только скомпилированные. Исходники библиотек обычно имеются у версий компилятора "professional". Но, насколько я помню, если библиотека указана, но ничего из неё не используется, то в исполнимые коды ничего из такой библиотеки не включается. И это не только у IAR. Что касается тонкостей адресации. Использование С/C++ - компилятора как раз и даёт возможность не обращать на эти самые тонкости никакого внимания. Не помню, чтобы мне это понадобилось за последние xxx лет. |
Сообщ.
#244
,
|
|
|
Цитата ЫукпШ @ Но, насколько я помню, если библиотека указана, но ничего из неё не используется, то в исполнимые коды ничего из такой библиотеки не включается. Да, ничего не включается, но все равно в дампе присутствует небольшой код инициализации библиотеки. А мне бы хотелось посмотреть где это находится, как сделано и если нужно изменить под свои нужды. Цитата ЫукпШ @ Использование С/C++ - компилятора как раз и даёт возможность не обращать на эти самые тонкости никакого внимания. Теперь это я уже понял. Просто надо хорошо знать и умело применять опции компилятора и линкера. Цитата ЫукпШ @ Не помню, чтобы мне это понадобилось за последние xxx лет. Столько не живут. |
Сообщ.
#245
,
|
|
|
Цитата ir0407 @ Да, ничего не включается, но все равно в дампе присутствует небольшой код инициализации библиотеки. А мне бы хотелось посмотреть где это находится, как сделано и если нужно изменить под свои нужды. Не знаю, не замечал. Может речь идёт о стартапе ? Его исходники обычно имеются. Поищи файл cstartup (.s90 ?). Что касается стандартных процедур, то линкер IAR имеет "удобную" логику работы, а именно: если некая процедура обнаружена в юзерной программе, в библиотеке она не разыскивается. Это значит, можно переопределить любую стандартную процедуру. Например, если реализовать собственную putchar тогда стандартный printf будет пользовать именно её. В результате можно выводить данные куда захочешь. |
Сообщ.
#246
,
|
|
|
О, как! Не густо же тут вопросов однако... И мой был последним аж два года назад. Ну что ж, попробуем продолжить, т.к. я так и не поборол тогда IAR-овский компилятор, вернулся к своему любимому асму. Потом времени не было этим заниматься, потом желания... И вот теперь и время появилось и желание, но воз пока и ныне там же.
Вопрос состоит в следующем. В качестве учебного эксперимента решил переписать под IAR свой асмовый модуль под USART. И снова сразу же наткнулся на какие-то сишные грабли при передаче парметра в функцию. Делаю вот так: #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 не хочет. Подскажите плиз где я тут на грабли наступаю. Уже весь мануал по языку триста раз скурил, но по той скудной инфе что там есть никак не могу раздуплиться по работе с макросами. В чем мой косяк? |
Сообщ.
#247
,
|
|
|
Цитата ir0407 @ Естественно будет ругань. Убери символ = из макроопределений. Иначе у тебя после развертывания макросов получается ( = 14745600UL / (16 * = 57600) - 1) При компиляции идет ругань на указанную строчку в виде текста "expected expression". |
Сообщ.
#248
,
|
|
|
Гы... Ёкереный бабай... Точно! Вот что значит сила привычки. Спасибо большое.
|
Сообщ.
#249
,
|
|
|
Всю ветку прочитал.
Есть проект, написан в 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. |
Сообщ.
#250
,
|
|
|
Если в настройках проекта все идентично - разница может быть из-за разных версий компиляторов и/или библиотек
|
Сообщ.
#251
,
|
|
|
trainer версии сравнили - у меня поновей, по мнению напарника это не должно влиять. Также обратил внимание, что у меня нет прав на запись в каталоге программы IAR, в каталоге Program Files. Пытаюсь получить права администратора - у нас на работе это не просто сделать.
|
Сообщ.
#252
,
|
|
|
Цитата VLeshka @ А зачем тебе нужны права туда? Также обратил внимание, что у меня нет прав на запись в каталоге программы IAR, в каталоге Program Files. |
Сообщ.
#253
,
|
|
|
trainer только предположение, что это влияет. Другой теории, куда надо идти, нет.
|
Сообщ.
#254
,
|
|
|
Аааа... Ну тогда переустанови Windows. Точно поможет.
runtime у вас, очевидно, разного размера. IAR, если я правильно помню, в map-файлах умеет выдавать размеры откомпилированных функций и объектов. Можно сравнить. |
Сообщ.
#255
,
|
|
|
trainer переустановка помогла бы, особенно с установкой прав админа для меня.
Вобщем, на одном и том же комьпютере, "до меня", под логином администратора всё было нормально. Под моим логином, гостя, как мной и описано. В итоге просто "перебазировался" с приборами на свой компьютер с моими администраторскими правами. |
Сообщ.
#256
,
|
|
|
Воскрешу тему!
При построении проекта, в окне 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??? |