реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> AT91SAM7X256 Проблема с портом, Порт B21(выв.66) не работает как выход
MiDV
сообщение Feb 9 2011, 11:34
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 7-06-08
Пользователь №: 38 119



У меня такая проблема, над которой бьюсь уже несколько дней.
Если кратко - то есть прибор, в котором стоит AT91SAMX256. ВСЕ выводы задействованы.
Есть порт B21, который по идее должен управлять электронным ключом на биполярном транзисторе(BC847). Ключ подсаживает вывод другого девайса на землю.
В процессе работы программы на выводе ничего не происходит, никакого напряжения не появляется, соответственно ключ не срабатывает и девайс не включается.
Инициирую так:
#define Pin_ON B,21,H
.
.
.
pin_off(Pin_ON); pin_dir_out(Pin_ON);
.
.
.

Далее в программе его включаю:
.
.
.
pin_on(Pin_ON);
.
.
.

... и выключаю:
.
.
.
pin_off(Pin_ON);
.
.
.

Никакого шевеления не наблюдалось.
В процессе поиска выхода был выброшен транзистор, Контактные площадки коллектора и базы коротились и все заработало. Т.е. порт работает как вход. Далее в процессе ковыряния был взят порт(порт А29, выв. 75) , выполняющий аналогичные функции управления электронным ключом и засинхронизированы вот так:
#define Pin_ON B,21,H
#define Pin_MOD A,29,H
.
.
.
pin_off(Pin_ON); pin_dir_out(Pin_ON);
pin_off(Pin_MOD); pin_dir_out(Pin_MOD);
.
.
.
pin_on(Pin_ON);
pin_on(Pin_MOD);
.
.
.
pin_off(Pin_ON);
pin_off(Pin_MOD);
.
.
.
Вывод 75 работал как положено, а 66 - нет(((
В чем причина?
Есть аналогичная плата, там так же - т.е. баг в прошивке, а не в контроллере.
Кто может - помогите!!!!
Go to the top of the page
 
+Quote Post
Shein
сообщение Feb 9 2011, 14:03
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 4-03-07
Пользователь №: 25 855



Цитата(MiDV @ Feb 9 2011, 13:34) *
.
Вывод 75 работал как положено, а 66 - нет(((
В чем причина?
Есть аналогичная плата, там так же - т.е. баг в прошивке, а не в контроллере.
Кто может - помогите!!!!

Есть ли еще какие-нить ножки порта B управляемые через PIO? Они работают? Тактирование PIOB включено? Настроен ли вывод на управление от PIO? Приведенные строки мало что дают понять,что скрывается под макросами?
Вот работающий кусок кода из keil'овского примера на AT91SAM7x256-EK. Поочередно зажигает и гасит светодиоды.
Код
***
/*-----------------*/
/* LEDs Definition */
/*-----------------*/
#define AT91B_LED1            (1<<19)       // AT91C_PIO_PB19 AT91C_PB19_PWM0 AT91C_PB19_TCLK1
#define AT91B_LED2            (1<<20)       // AT91C_PIO_PB20 AT91C_PB20_PWM1 AT91C_PB20_PWM1
#define AT91B_LED3            (AT91C_PIO_PB21)       // AT91C_PIO_PB21 AT91C_PB21_PWM2 AT91C_PB21_PCK1
#define AT91B_LED4            (AT91C_PIO_PB22)       // AT91C_PIO_PB22 AT91C_PB22_PWM3 AT91C_PB22_PCK2
#define AT91B_NB_LEB          4
#define AT91B_LED_MASK        (AT91B_LED1|AT91B_LED2|AT91B_LED3|AT91B_LED4)
#define AT91D_BASE_PIO_LED       (AT91C_BASE_PIOB)

***

const int led_mask[] = { AT91B_LED1, AT91B_LED2, AT91B_LED3, AT91B_LED4 };

***
int main (void) {
  int i;

  // Enable the Clock of the PIO
  AT91C_BASE_PMC->PMC_PCER  = 1 << AT91C_ID_PIOA;
  AT91C_BASE_PMC->PMC_PCER  = 1 << AT91C_ID_PIOB;

  // Configure the PIO Lines corresponding to LED1..LED4 as Outputs
  AT91C_BASE_PIOB->PIO_PER  = AT91B_LED_MASK;
  AT91C_BASE_PIOB->PIO_OER  = AT91B_LED_MASK;

  // Clear the LED's. On the Board we must apply a "1" to turn off LEDs
  AT91C_BASE_PIOB->PIO_SODR = AT91B_LED_MASK;

  // Loop forever
  for (;;) {
    for (i = 0; i < AT91B_NB_LEB; i++) {
      AT91C_BASE_PIOB->PIO_CODR = led_mask[i];
      wait();
      AT91C_BASE_PIOB->PIO_SODR = led_mask[i];
      wait();
    }
    for (i = (AT91B_NB_LEB - 1); i >= 0; i--) {
      AT91C_BASE_PIOB->PIO_CODR = led_mask[i];
      wait();
      AT91C_BASE_PIOB->PIO_SODR = led_mask[i];
      wait();
    }
  }
}
Go to the top of the page
 
+Quote Post
MiDV
сообщение Feb 9 2011, 14:15
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 7-06-08
Пользователь №: 38 119



Да, на этом же порт подключены светодиоды индикации режима работы.
Они задаются этими же макросами.
Например:
#define Pin_OUT2 B,14,H
pin_off(Pin_OUT2); pin_dir_out(Pin_OUT2);
Далее зажигаем светодиод:
pin_on(Pin_OUT1);
Гасим:
pin_off(Pin_OUT1);
Причем светодиоды катодами на земле, т.е. контроллер делает пин выходом и переводит в 1.
Т.Е. засада не здесь(((
Go to the top of the page
 
+Quote Post
MiDV
сообщение Feb 10 2011, 07:39
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 7-06-08
Пользователь №: 38 119



Пользовался еще и следующим кодом:
#define _setH(port,bit) AT91C_BASE_PIO##port##->PIO_SODR = (1<<bit)
#define _setL(port,bit) AT91C_BASE_PIO##port##->PIO_CODR = (1<<bit)
.
.
.
_setH(B,21);
.
.
.
_setL(B,21)
Результат тот же(((
Go to the top of the page
 
+Quote Post
Shein
сообщение Feb 10 2011, 09:58
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 4-03-07
Пользователь №: 25 855



Цитата(MiDV @ Feb 9 2011, 13:34) *
Есть порт B21, который по идее должен управлять электронным ключом на биполярном транзисторе(BC847). Ключ подсаживает вывод другого девайса на землю.

Между выводом и базой резистор есть?

Если, при убранном транзисторе, попробовать пвесить на выход подтягивающий резистор к питанию 5-10к, и попробовать его переключать? Что видим?


Go to the top of the page
 
+Quote Post
MiDV
сообщение Feb 10 2011, 11:00
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 7-06-08
Пользователь №: 38 119



Да, на 10к. Если повесить - видим, что когда включен - напруги нет, а когда выключен - есть.

Сейчас пробую смотреть J-Link + IAR. Может посоветуете инфу про эту связку. Просто до этого не юзал такое...
Go to the top of the page
 
+Quote Post
Shein
сообщение Feb 10 2011, 16:44
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 4-03-07
Пользователь №: 25 855



Цитата(MiDV @ Feb 10 2011, 13:00) *
Да, на 10к. Если повесить - видим, что когда включен - напруги нет, а когда выключен - есть.


Похоже у контроллера подгорел выход.
При работе порта на выход и установки его в лог "1", открывается "верхний" выходной транзистор, который фвктически замыкает вывод на питание с очень малым сопротивлением. (см. типовую схему КМОП выхода)
Если нет токоограничивающего резистора между выводом контроллера и базой биполярного транзистора, то при подачи на вывод лог."1", на базу фактически прийдет питание через малое сопротивление открытого выходного транзистора контроллера. Какое напряжение база-эммитер может быть у биполярного транзистора? правильно ~0,7В. Чем ограничен ток в цепи? правильно - ничем. Фактически получаем состязание, кто раньше здохнет, выход контроллера или транзистор. Транзистор оказался крепче.

Когда вешаем внешний резистор, то он как бы работает вместо вместо того выходного транзистора.

Многие контроллеры, а-ля 51-е, AVR-ки,PIC, допускают прямое подключение выхода порта к базе биполярного транзистора. Там конструкция выхода сделана так, что обеспечивается ограничение тока.

Цитата(MiDV @ Feb 10 2011, 13:00) *
Сейчас пробую смотреть J-Link + IAR. Может посоветуете инфу про эту связку. Просто до этого не юзал такое...

По IAR подсказать ничего не смогу. Исторически так сложилось, что я "подсел" на Keil. sm.gif
Тут на форуме полно тем, так что найти не проблема.

update.
Кстати, на тех выводах, где светодиоды тоже нужны резисторы. Хотя и без них может работать - на светодиоде падение напряжения больше, но это "не хороший", рискованный режим для выхода порта.

Сообщение отредактировал Shein - Feb 10 2011, 16:50
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 09:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016