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