[image]

Микроконтроллеры AVR - применение и Краткий Курс - часть 10

 
1 19 20 21 22 23 38
UA Non-conformist #29.03.2012 21:07  @GOGI#29.03.2012 20:27
+
-
edit
 

Non-conformist

аксакал

Да, ресеты были соединены. При поданном трёхвольтовом питании устройства, на "D5" поступает + 2,4 В. При питании от моста на "D5" имеем 0,00 В.

> У тебя эта часть программы не отрабатывает ...
Не понял - что нужно сделать? Или ты без компа сейчас?
   
RU GOGI #29.03.2012 21:17  @Non-conformist#29.03.2012 21:07
+
-
edit
 
А ты не пробовал прошивать тот первый вариант, который я выкладывал, который отображает при мигании в обе стороны?
   11.011.0
UA Non-conformist #29.03.2012 22:28  @GOGI#29.03.2012 21:17
+
-
edit
 

Non-conformist

аксакал

Нет. Там строки менять надо было, а тогда у меня на работе компилятора не было. Завтра попробую.
   
UA Non-conformist #29.03.2012 22:36  @Non-conformist#29.03.2012 22:28
+
-
edit
 

Non-conformist

аксакал

Попробовал скомпилить модифицированный тобой исходник. Кажет следующие ошибки:

Error[Pe020]: identifier "PIND_PIND5" is undefined
Error[Pe020]: identifier "PIND_PIND3" is undefined
Error[Pe020]: identifier "PIND_PIND4" is undefined
   
UA Non-conformist #29.03.2012 22:42  @Non-conformist#29.03.2012 22:36
+
-
edit
 

Non-conformist

аксакал

Проверил - галка "Enable bit definitions ..." стоит.
   
RU GOGI #30.03.2012 06:06  @Non-conformist#29.03.2012 22:36
+
-
edit
 
Non-conformist> Попробовал скомпилить модифицированный тобой исходник. Кажет следующие ошибки:
Так ты строчки-то замени, которые я говорил.
   
UA Non-conformist #30.03.2012 09:44  @GOGI#20.03.2012 07:16
+
-
edit
 

Non-conformist

аксакал

Заменил, скомпилил без ошибок, прошил. Теперь после подачи питания порт "В" остаётся погашенным, и включается только после кратковременного замыкания на массу PD3. Все восемь светодиодов одновременно включаются; постоянно, не мигая, светятся примерно одну секунду, и так же одновременно выключаются. Замыкание на массу PD2 ни к чему не приводит - и без отпускания кнопки питания, и через переподачу питания.

Связи по UART по-прежнему нет. Пробовал уменьшать и вообще выключать буферы FIFO - без последствий. Поменял местами провода, сделал RXD><RXD TXD><TXD (предположив, что попутаны надписи на плате моста) - без изменений. Ресеты устройства и моста висят в воздухе. Питание устройства от моста 3,3 В.
   
RU GOGI #30.03.2012 09:51  @Non-conformist#30.03.2012 09:44
+
-
edit
 
Non-conformist>Замыкание на массу PD2 ни к чему не приводит - и без отпускания кнопки питания, и через переподачу питания.
А ты дефайны изменил? В первоначальной программе ведь было PD4 и PD3. А теперь PD2 и PD2. В общем, ты проект выложи, а то у меня на этом компьютере нет.
Ты терминальную программу поставил? Сейчас будем отлаживать, тебе понадобится видеть, что приходи на ком-порт.
   
UA Non-conformist #30.03.2012 09:56  @GOGI#30.03.2012 09:51
+
-
edit
 

Non-conformist

аксакал

GOGI> А ты дефайны изменил?
Нед... Меняю...

GOGI> Ты терминальную программу поставил?
Нед... Сейчас ксанов монитор буду искать.
Прикреплённые файлы:
 
   
UA Non-conformist #30.03.2012 10:10  @Non-conformist#30.03.2012 09:56
+
-
edit
 

Non-conformist

аксакал

Поменял. Теперь устройство нормально реагирует на оба контакта маятника! Ксанов монитор установил. В общем, к отладке готов!

зы: Сейчас пойду пробегусь по работе - буду доступен минут через сорок.
   
RU GOGI #30.03.2012 10:47  @Non-conformist#30.03.2012 10:10
+
-
edit
 
замени main.c файлом в аттаче.
Подключи плату к USB мосту, но только тремя пинами, TXD, RXD и GND, а питание подай от батареи. Смотри, что будет в мониторе. Потом подключи полностью к USB мосту (батарею отключи предварительно) и еще раз посмотри, что будет в мониторе.
Прикреплённые файлы:
main.c (скачать) [4,5 кБ]
 
 
   
UA Non-conformist #30.03.2012 11:10  @GOGI#30.03.2012 10:47
+
-
edit
 

Non-conformist

аксакал

GOGI> замени main.c файлом в аттаче.
Заменил, скомпилировал, прошил с теми же настройками проекта и теми же фьюзами МК.

GOGI> Подключи плату к USB мосту, но только тремя пинами, TXD, RXD и GND, а питание подай от батареи. Смотри, что будет в мониторе.
В мониторе выставил COM1, 9600, чётность не проверять, HEX - Ascii, проверять контрольную сумму. Ничего нет ни в логе, ни в строке.

GOGI> Потом подключи полностью к USB мосту ...
То же самое - ничего нет.
   
UA Non-conformist #30.03.2012 11:33  @Non-conformist#30.03.2012 11:10
+
-
edit
 

Non-conformist

аксакал

Мост и монитор работают: замыкаю RXD><TXD, печатаю "1", и "1" принимаю. А с мигалкой пока глухо...
   
RU GOGI #30.03.2012 11:39  @Non-conformist#30.03.2012 11:33
+
-
edit
 
Очередная правка. Теперь при подключении к мосту (все четыре пина) должен светиться светодиод на B0
Прикреплённые файлы:
main.c (скачать) [4,5 кБ]
 
 
   
UA Non-conformist #30.03.2012 11:57  @GOGI#30.03.2012 11:39
+
-
edit
 

Non-conformist

аксакал

При подключении к мосту светится PB0. После отключения от моста и подачи батарейного питания 3 В все светодиоды остаются погашенными. Попробовал испытать монитором устройство со светящимся светодиодом. Отсылаю "1" - ничего не принимаю.
   
RU GOGI #30.03.2012 13:10  @Non-conformist#30.03.2012 11:57
+
-
edit
 
Я немножко протупил, вот с таким исходником попробуй по разному подключать под контролем монитора
Прикреплённые файлы:
main.c (скачать) [4,5 кБ]
 
 
   
UA Non-conformist #30.03.2012 13:53  @GOGI#30.03.2012 13:10
+
-
edit
 
UA Non-conformist #30.03.2012 19:18  @Non-conformist#30.03.2012 13:53
+
-
edit
 

Non-conformist

аксакал

Пока суд да дело, я тут из своей мигалки "бегущий огонь" кагбэ сделал. ))

Учебный курс. Понятие переменной. Побитовый сдвиг влево. Побитовая инверсия. Оператор ветвления if...else.

ChipEnable.ru - сайт посвященный электронике, микроконтроллерам и программированию. Программирование микроконтроллеров AVR на Си в среде IAR Embedded Workbench, WinAvr, CodeVision

// chipenable.ru
 

Прикреплённые файлы:
 
   
Это сообщение редактировалось 30.03.2012 в 19:53
UA Non-conformist #31.03.2012 11:20  @Non-conformist#30.03.2012 19:18
+
-
edit
 

Non-conformist

аксакал

Non-conformist> Пока суд да дело, я тут из своей мигалки "бегущий огонь" кагбэ сделал. ))
Есть контакт!!! В другую сторону огонёк побежал! ))

//программа бегущего светодиода
#include <ioavr.h>
#include <intrinsics.h>


int main(void)
{
unsigned char led = 128;
DDRB = 255;

while(1){
PORTB = ~led;
__delay_cycles(400000);
led = led>>1;
if (led == 0)
led = 128;
}
}

Да... Экстатическое состояние прямо... Уж такого и не припомню! Наверное, только с моментом запуска детекторного приёмника можно сравнить. Хотя, конечно, уже не то... ТО - оно было вообще за гранью понимания, как чудо. Помню как телефон разобрал, чтобы увидеть, где же всё-таки звук начинается. )) Не увидел, и от этого всё вокруг стало только чудеснее. ))
   
RU Ignis Caelum #31.03.2012 15:54  @Non-conformist#31.03.2012 11:20
+
-
edit
 

Ignis Caelum

опытный

библиотечка функций для получения в программах задержки на нужное время.
для работы требуется объявить константу cFOSC, равную тактовой частоте процессора в проекте.
в проект подлинковываются только функции, объявленные в проекте.
например для использовании функции задержки на 1 мкСекунду(_delay_1us) надо написать: "#define __delay_1us"
Прикреплённые файлы:
 
   17.0.963.8317.0.963.83
UA Non-conformist #31.03.2012 16:34  @Ignis Caelum#31.03.2012 15:54
+
-
edit
 

Non-conformist

аксакал

А как эту библиотеку подключить, например, в иаровский проект? Или такой вопрос некорректен? И ещё вопрос - как мне получить задержку, например, в одну минуту, в десять минут, в один час? Если в тактах писать, то имхо какое-то невменяемое число получится... Похоже, в таком случае надо задействовать счётчики, по типу логических ИС?
   
RU Ignis Caelum #31.03.2012 20:34  @Non-conformist#31.03.2012 16:34
+
-
edit
 

Ignis Caelum

опытный

Non-conformist> А как эту библиотеку подключить, например, в иаровский проект? .
1. Можно скопировать текст и вставить как обычные функции. Я думаю Гоги может подсказать корректный синтаксис.

2. С помощью приведенных функций можно получить максимальную задержку в 1 минуту (65 535 мСек).

3. На внутренних счетчиках Атмеги можно получить получить событие с частотой до 1 раз в 8,4 секунды (для частоты процессора 8 Мгц). или до 1 раза в 2048 секунды (34 минуты) если использовать внешний часовой кварц. Все остальное - программная обработка.
   17.0.963.8317.0.963.83
UA Non-conformist #01.04.2012 18:57  @Ignis Caelum#31.03.2012 20:34
+
-
edit
 

Non-conformist

аксакал

Спасибо!

***
Пытаюсь заставить огонёк метаться туда-сюда по порту, но что-то пока не особо получается:
code c
  1. //"туда-сюда"
  2. #include <ioavr.h>
  3. #include <intrinsics.h>
  4.  
  5.  
  6. int main(void)
  7. {
  8.   unsigned char led = 128;
  9.   DDRB = 255;
  10.  
  11.   while(1){
  12.     PORTB = ~led;
  13.     __delay_cycles(400000);
  14.   a:led = led>>1;
  15.     if (led == 0)
  16.       led = led<<1;
  17. if (led == 128)
  18. goto a;
  19.   }
  20. }
   
RU Balancer #01.04.2012 19:02  @Non-conformist#01.04.2012 18:57
+
-
edit
 

Balancer

администратор
★★★★★
Non-conformist> if (led == 0)
Non-conformist> led = led<<1;

Если led уже == 0, то любой его сдвиг так и будет оставлять 0 :)

Тут нужна ещё одна переменная, указатель направления смещения. В духе:
code c
  1. unsigned char mask = 1; // выводимая битовая маска
  2. int dir = 1; // Направление сдвига, 1 — влево, -1 — вправо
  3.  
  4. while(1)
  5. {
  6.     do_output(mask); // Выводим нашу битовую маску
  7.  
  8.     if(dir>0) // Сдвигаемся влево
  9.     {
  10.         mask << 1;
  11.         if(mask == 0x80) // Достигли крайнего положения
  12.             mask = -mask; // меняем направление сдвига
  13.     }
  14.     else // Сдвигаемся вправо
  15.     {
  16.         mask >> 1;
  17.         if(mask == 1) // достигли правого положения
  18.             mask = -mask; // меняем направление
  19.     }
  20.  
  21.     do_delay(); // задержка, сколько нам там надо
  22. }
   
UA Non-conformist #01.04.2012 19:22  @Balancer#01.04.2012 19:02
+
-
edit
 

Non-conformist

аксакал

> Если led уже == 0, то любой его сдвиг так и будет оставлять 0 :)
Вон оно что... Спасибо! Но такое

...
a:led = led>>1;
if (led == 1)
led = led<<1;
if (led == 128)
goto a;
...

тоже пробовал, ибо что-то нехорошее насчёт нуля подсознательно подозревал. В случае if (led == 1) огонёк однократно пробегает от старшего разряда, и останавливается гореть постоянно на втором справа разряде (подозреваю, что "1" из ряда-порта "64 32 16 8 4 2 1 0"). Передёрнешь питание - опять пробежка и неподвижно светящийся второй справа разряд.

Разбираюсь с масками и с изменением направления...
   
1 19 20 21 22 23 38

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