Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.222.96.135] |
|
Страницы: (18) [1] 2 3 ... 17 18 все ( Перейти к последнему сообщению ) |
Сообщ.
#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 Может я тебя не правельно понял. |