Перейти к содержанию

Вопросы от начинающих по МК


Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

Обязательно. У полевика затвор обладает огромной ёмкостью, порт при переключении лог.уровней оказывается практически в состоянии КЗ, и хоть эта ёмкость не такая большая но импульсные токи текущие через вывод порта выше предельно допустимых, и в конце концов на 1000-м или 10000-м переключении он таки сдохнет.

Надо ограничить ток резистором из расчёта чтобы он гарантированно(в режиме К.З.) не превышал 40мА, номинал резистора определяется в таком случае по закону Ома - R = U/I = 5В/0.04А = 125ом. С учётом того что ток импульсный, можно брать резистор порядка 100 Ом.

Шунтирующий резистор нужен чтобы убрать потенциал по постоянному току когда вывод транзистора "висит в воздухе" такое случается когда контроллер находится в состоянии сброса или перевёл порт в третье состояние. Из-за высокого сопротивления затвора транзистора по постоянному току(десятки, сотни гигаом) напряжение будет на нём гулять от малейшего изменения электростатического поля, например от человека вставшего с кресла и наэлектризовавшегося в следствие сжатия-расширения пластика, или от трения одеждой о него. Да даже волосы погладишь рукой и получишь чувствительное для полевика изменение электрического поля. А для него в таком варианте включения очень плохо, если он зависнет в полуоткрытом состоянии то по закону джоуля-ленца просто перегреется и сгорит.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Столкнулся с такой интересной проблемой. Потребовалась мне дополнительная Мега8 для экспериментов и пришлось вытащить ее из Лаб. БП. После окончания тестирования МК прошил и вернул в БП, но теперь при отсутствии нагрузки на дисплей выводилось, что в нагрузке течет ток в районе 10мА и сопротивление нагрузки порядка 500Ом, причем эти параметры скачут(хотя на выводе ADC который меряет ток нагрузки стабильно 0.55В), а так же выводило на дисплей, что напряжение на выходе БП занижено на 0.4В. Всю голову сломал как такое может быть. Потом присмотрелся на МК с которыми проводил опыты, а они оказывается разные, одна ATMEGA8-16PU, другая ATMEGA8A-PU. Прошиваю ATMEGA8-16PU вставляю в БП и теперь на дисплей все выводит нормально как раньше, ток 0, сопротивление нагрузки не вычисляется, напряжение на выходе БП соответствует показанию мультиметра, на лапке ADC те же 0.55В.

Как такое может быть?

Или это всего лишь мой первый опыт столкновения в глючной МК?

(Int RC 8MHz, АЦП: делитель на 128, внут. опорное 2.56в)

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Надо ограничить ток резистором из расчёта чтобы он гарантированно(в режиме К.З.) не превышал 40мА,

Почему имено 40мА? И как рассчитать шунтирующий резистор?

Ссылка на комментарий
Поделиться на другие сайты

Почему имено 40мА? И как рассчитать шунтирующий резистор?

Максимально допустимый ток пина порта обозначен в даташите на контроллер.

Расчета шунтирующего затвор-исток резистора в общем то нет. Номинал выбирают, исходя из компромисса между потреблением тока цепью затвора при открывании ключа (при батарейном питании это существенно) и скоростью запирания ключа в худшем случае при включении, когда на затворе исходно оказался отпирающий потенциал (по тем или иным причинам). Скорость запирания определит время нахождения ключа в активном режиме. Теоретически это может привести к его выходу из строя из-за перегрева (это зависит от нагрузки ключа). На практике величина этого резистора находится в диапазоне от 10 до 100 кОм и особого значения не имеет.

Я практически всегда ставлю 10 кОм в сетевых устройствах и 100 кОм в батарейных.

Есть еще один резон выбора этого резистора. Емкость Миллера (емкость затвор-сток) при ВЫКЛЮЧЕНИИ транзистора приводит к выбросу напряжения на затворе (паразитное отпирание). При высоком напряжении в цепи стока это напряжение может превышать допустимое для затвор-исток и привести к пробою затвора. Или затягивание выключения ложным отпиранием к сквозным токам при работе мостовой или полумостовой схемы.

В таком случае расчет затворной цепи заметно сложнее. Но к Вашему случаю это не относится.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Всем здрасте, скачал Атмел студия 7, при создании нового проекта, нужно выбрать в списке МК, но моего там нет AT89s51 (Атмел), в протеусе есть только 89с51 (выводы одинаковые) какой мне в студии выбирать мк?

Ссылка на комментарий
Поделиться на другие сайты

при чтении переменных инт возникают прерывания и после выполнения прерывания теряется старший байт данной переменной.подскажите, есть ли способы борьбы, кроме запрета прерываний перед чтениями?

Ссылка на комментарий
Поделиться на другие сайты

Можно попробовать спецификатор volatile применить, возможно поможет

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

LexSancho, немного не понятно, о чём идёт речь. Хоть бы пример привели.

Если речь идёт об атомарном доступе, то кроме запрета прерываний, вариантов нет.

Ссылка на комментарий
Поделиться на другие сайты

Alex,

есть функция, в нее передаются переменные. в одной из этих переменных содержится значение 512. во время вызова этой функции происходит прерывание, после выхода из обработчика прерывания продолжает вызывается функция, но переданное ей число 255(или около того) вместо 512.

я подозреваю, что возникло прерывание между чтением старшего и младшего байта и в обработчике использовался регистр, в котором уже хранилось значение младшего(или старшего) байта той переменной, оно затерлось, потому до функции дошло только 255(или около того)

оптимизации отключены

волатиле прописано всем переменным

Изменено пользователем LexSancho
Ссылка на комментарий
Поделиться на другие сайты

Ребят, подскажите почему у меня на порту D не горят светодиоды. Может это как-то связано с таймером. Делаю гирлянду. И еще почему-то от быстрого нажатия на кнопку не срабатывает прерывание, приходится ее зажимать на доли секунд. Месяц назад начал изучать данное направление, прошу сильно не ругать.

Код:

//Atmega8A

#define F_CPU 8000000

#include <avr/io.h>

#include <util/delay.h>

#include <stdlib.h>

int i;

unsigned char rab;

void interrupt()

{

GICR = 0b10000000; //разрешить внешние прерывания

MCUSR |= 0b00001100; //прерывания по восходящему фронту

SREG |=0b10000000; //разрешает общие прерывания

}

void wait1(void)

{ TCNT1 = 0x1ff;

while (TCNT1<1562) {}

}

void preset()

{

DDRB = 0xFF; // PORTB устанавливаем на выход

PORTB = 0xFF; // PORTB = OFF

DDRC = 0xFF; // PORTC устанавливаем на выход

PORTC = 0x00; // PORTC = OFF

DDRD = 0xF7; // PORTD устанавливаем на выход кроме PD3

PORTD = 0x08; // PORTD = OFF

TCNT1H=0; //обнуляем регистр TCNT1

TCNT1L=0;

TCCR1A = 0x00;

TCCR1B = 0x05;

ACSR = 0x80;

}

void prog1()

{

PORTB = 0xFF;

wait1();

PORTB = 0x00;

wait1();

PORTD = PORTD & 0b11110111;

wait1();

PORTD = PORTD | 0b00001000;

wait1();

PORTC = 0xFF;

wait1();

PORTC = 0x00;

wait1();

}

void prog2()

{

rab = 0b10000000;

wait1();

while (i==1)

{

rab = rab >> 1;

PORTB = rab;

wait1();

if (rab == 0b00000001)

{

PORTB = 0b10000000;

wait1();

rab = 0b10000000;

}

if (PIND&(1<<PD3))

break;

}

}

void prog3()

{

PORTB = 0x00;

while (i==2)

{

PORTB = 0b10101010;

wait1();

PORTB = 0b01010101;

wait1();

PORTC = 0b10101010;

wait1();

PORTC = 0b01010101;

wait1();

if (PIND&(1<<PD3))

{

i = 0;

return prog1();

}

}

}

int main(void)

{

preset();

i = 0;

rab = 0x00;

while (1)

{

if (PIND&(1<<PD3))

i=i+1;

if (i == 0)

prog1();

if (i == 1)

prog2();

if (i == 2)

prog3();

}

}

d14b232c1e76bb417502428d6a3aa1b4.jpg

Изменено пользователем AlexRepair
Ссылка на комментарий
Поделиться на другие сайты

Форматирование ужасно, понять где начинается и заканчивается каждый блок трудно. Осмысленных комментариев 1, бесполезных 9. Такую запись стоит исправить

GICR = 0b10000000; //разрешить внешние прерывания

MCUSR |= 0b00001100; //прерывания по восходящему фронту

SREG |=0b10000000; //разрешает общие прерывания

хотя бы на

MCUSR |= (1<<ICS11 | 1<<ICS10); // Int1 по нарастающему фронту
GICR = (1<<INT1); // после исправления записи комментарий становится ненужным - из кода все понятно
sei(); // лучше использовать специальный макрос, чем вручную лазить в SREG, к тому же это нагляднее

Кроме того, прерывание вы разрешили, но вот его обработчика не видно. Странно, что оно вообще работало, а не сбрасывалось при нажатии. А, понятно. Функция Interrupt(), настраивающая прерывания, даже ни разу не вызывается. Таймер тоже нигде не используется. Обработчик прерывания в avr-gcc выглядит почти как функция: ISR(INT1_vect){...}. Точные названия векторов смотрите в iom8.h, там же человеческие имена регистров и битов, впрочем их лучше смотреть в даташите.

Если вы не используете прерывания, не объявляете обработчик, не настраиваете их, зачем писать обратное?

Сами процедуры световых эффектов лучше оформить в виде конечного автомата, то есть чтобы один вызов соответствовал одному "кадру" анимации. Например, функция для бегущего по PORTB огня

void func1(){
 static char state = 0; // модификатор static означает, что при выходе из функции значение этой переменной не будет потеряно
 state <<= 1; // побитовый сдвиг влево
 if( state == 0 )state = 0b00000001; //если число 0b10000000 сдвинуть влево на 1 разряд, произойдет переполнение и оно обнулится. В таком случае загружаем в него константу
 PORTB = state;
}

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Здравствуйте всем!

Нужна помощь - не могу разобраться...

первая попытка программирования мк - блин комом

для первого эксперимента по программированию нарисовал прогу простейшую (в АС7)

проверка на симуляторе (АС7) показала работоспособность программы

нарисовал в протеусе схему - эмуляция тож показала работоспособность проги

начал пробовать программировать МК (мега8а)... а она не работает

прикладываю прогу:

.include "m8def.inc" ; Используем ATMega8

.list

;= Start macro.inc ========================================

; Тут будут наши макросы, потом.

;= End macro.inc ========================================

; RAM =====================================================

.DSEG ; Сегмент ОЗУ

;.org 0x00060 ;перепрыгивыаем область регистров (для мега8- 60)

.org sram_start ;то-же самое но дерективой для любой МК

perem1: .byte 2 ; определена метка слова данных (2 байта)

.org 0x00100

perem2: .byte 2

; EEPROM ==================================================

.ESEG ; Сегмент EEPROM

;globaldata: db 10 ;определена метка в нестираемой памяти (10 байт)

; FLASH ===================================================

.CSEG ; Кодовый сегмент.ORG 0x0000 начало таблицы векторов

RJMP Start1 ;перепрыгиваем таблицу векторов.вектор 0 reset

reti ;rjmp iiaddr1 ;внешнее прерывание 0 (вектор 1)

reti ;rjmp iiaddr2 ;внешнее прерывание 1 (вектор 2)

reti ;совпадение таймера/счетчика Т2 (вектор 3)

RETI ;переполнение таймера/счетчика Т2 (вектор 4)

RETI ;захват таймера/счетчика Т1 (вектор 5)

RETI ;совпадение (А) таймера/счетчика Т1 (вектор 6)

RETI ;совпадение (В) таймера/счетчика Т1 (вектор 7)

RETI ;переполнение таймера/счетчика Т1 (вектор 8)

rjmp timer00 ;переполнение таймера/счетчика Т0 (вектор 9)

RETI ;передача по SPI завершена PI,STC ;(вектор 10)

RETI ; USART прием завершен USART,RXC ;(вектор 11)

RETI ; регистр данных USART пуст USART,IDRE ;(вектор 12)

RETI ; USART передача завершена (вектор 13)

RETI ; преобразование АЦП завершено (вектор 14)

RETI ; EEPROM готово (вектор 15)

RETI ; аналоговый кампаратор ANA_COMP ;(вектор 16)

RETI ; прерывание от модуля TWI (вектор 17)

RETI ; готовность SPM (вектор 18)

.ORG 0x00050 ; пустое место до 100

vivdata: .db $6,$5b,$4f,$66,$6d,$7d,$7,$7f,$5f,$3f

.ORG 0x0070 ; Начало основной программы

Start1:

LDI R16,Low(RAMEND) ; Инициализация стека загрузка в р16 верха озу младший байт

OUT SPL,R16 ; Обязательно!!! загружаем в стековый регистр младший байт

ldi r16, high (Ramend) ;загружаем в р16 старший байт верха озу

out sph, r16 ;загружаем в стековый регистр старший байт

;конфигурируем выводы порта d на выход

ldi r21,$ff

out ddrd, r21 ;порт d выход

ldi r21,$80 ;в начале нулевые значения

out portd, r21 ;все выключено (0)

;конфигурируем выводы порта b

ldi r21, 0b11001011 ;выводы прерываний 0 и 1 на вход, остальные на выход

out ddrb,r21

ldi r21, 0b00110100 ;выходы 0, входы с подтягивающими резисторами

out portb, r21

;конфигурируем таймер/счетчик 1

ldi r21, 1 ;разрешаем прерывание от Т0, остальные запрещаем

out TIMSK, r21 ; конфигурируем

ldi r21, 0b0000101; устанавливаем пределитель Т0 на 1024

out tccr0, r21 ; конфигурируем

ldi r20, 00 ;регистр 20 делитель таймера на 4

ldi r22,0 ;регистр 22 текущее значение и начальный бит включения диода

ldi r23, 4 ;регистр 23 переменная делителя таймера

;ldi r30, $9f

;add r30, r23

;lpm r24,z

;out portd, r24 ;включаем индикацию начальной скорости

sei ;разрешаем прерывания

st1:nop ;конец начальной конфигурации

rjmp st1 ; ожидаем прерывания

timer00:

in r1, sreg

push r1

cp r20,r23 ;если менее 4 в рег 20, пропускаем переход и увеличиваем рег 20

brne st5

rcall viv

st5:inc r20

pop r1

out sreg, r1

reti

viv: ;вывод индикациии после изменения

clr r20

ldi r30, $a0

add r30, r22

cpi r22, $a

brne st6

clr r22

rjmp st4

st6:inc r22

st4:lpm r24,z

out portd, r24 ;включаем индикацию начальной скорости

ret

....

прога вырезана для пробы у уменьшена из другой для пробы программирования

она последовательно зажигает цифры на индикаторе (3 шт) от 1 до 9 и далее с начала

при загрузке предварительно зажигаются точки на индикаторе

в протейсе и эмуляторе АС7 все ОК

на плате сначала зажигаются точки, а потом вместо перебора цифр зажигаются все диоды на индикаторе и ничего не меняется (зависает)

причем как на паяной плате, так и на программаторе

запись вроде в норме (сохранял записанный файл из МК и дизассемблировал ... вроде все ок

мож кто подскажет по проге гдето явно косяк сам не вижу

чотел проект вставить - не получается

Хз как тут файлы (архивные вставлять

Ссылка на комментарий
Поделиться на другие сайты

Во-первых, индексный регистр Z (R30,R31) 16-битный и обращаться с ним нужно как с 16-битным. Что у Вас - ldi r30, $a0, а где r31? Адрес не прописывается, поэтому в порт выводится белиберда, а не ячейка массива.

Во-вторых, вызывать подпрограмму из обработчика прерывания - еще то извращение, но раз уж так решили, то обратите внимание на r20. После rcall viv, где Вы его сбрасываете, он сразу же, по возвращению из viv, будет инкрементирован на 1, т.е. будет "съеден" один такт задержки.

Ссылка на комментарий
Поделиться на другие сайты

1. тактирование одинаковое (я для пробы внутреннее 1 МГц оставлял - т.е. ничего менять не надо было в фьюзах)

2. R31 нулевой всегда здесь - потому не трогал но все равно спасибо - щас замечания погляжу внимательно

у меня вопрос тогда - по прерыванию переполнения надо вывод на индикацию проще вроде через салл (пожно и jmp.. ща попробую

еще вопрос - чем съеденный такт может повредить обработке и выполнению... ну чуть дольше будет но вроде виснуть не должен

попробовал вместо call - rjmp - тоже самое

тут можно файлы вставлять??? я не смог

хотел архив проекта вставить

Ссылка на комментарий
Поделиться на другие сайты

все!!!

вроде разобрался ...почти...

заработало

при включении в регистрах мусор

вкючил в прогу код очистки памяти

и все заработало...

есть вопрос только не пойму

пока ковырялся - менял инструкцию call на jmp при выводе значения ( старожил говорил извращение, я пробовал поменять...)

так вот c call работает, а вот с jmp нет - перестает включаться обработчик прерывания Т0

с этим пока не разобрался

Ссылка на комментарий
Поделиться на другие сайты

Извращение - вызывать подпрограммы в обработчике прерывания. Вы наверное не так меня поняли.

Смысл в том, что в прерывании нужно находиться как можно меньше по времени. Типа выставил признак (флаг) сработавшего прерывания и... бегом обратно в главный цикл. Там все и сделаете. А у Вас получается наоборот, в главном цикле "пустота", зато в прерываниях вся обработка, да еще и с вызовом подпрограмм. Будете развивать свою программу, таким образом, дойдете и до циклов задержки в прерываниях. А потом будете "чесать репу" почему все так плохо работает. Учитесь изначально правильно организовывать алгоритм и все будет гораздо проще.

Ссылка на комментарий
Поделиться на другие сайты

Вачдог активен, он в программе предусмотрен?. В протеусе точно прописана ссылка на рабочую прошивку?

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • У меня написано в клетке 50 вольт для графика на трансформаторе. На транзисторе в базе амплитуда не более 3.5 вольт в минус, в плюс примерно 0.7 вольт. Последний график с нагрузкой это запитка уже напрямую от сети без нагрузочной лампы.  Спасибо за ответ. 
    • Ничего серьезного в вопросе не вижу. Соленоиды миллионами в мире работают не сутками и не неделями А ГОДАМИ. Все что работает всегда греется., и должно. А вот какая температура это другой вопрос. А эта штучка вообще  смешная. Система отталкивающей магнитной левитации.docx
    • Ну на плате с смд деталями, всё компактно, всё рядышком и  проводники конечно уже но и значительно короче. Если конечно не тянуть связь с одного конца платы на другой.
    • Почему нигде нет масштаба по оси Y ? График напряжения на базе - какая амплитуда в минус на базе ключа при пробое ? Он держит не более 8..9 вольт, больше -7 вольт не должно быть ни при каком раскладе. Транзисторы раскачки - проверьте ОБА на пробой. Проверьте базовые цепи обоих ключей на одинаковость. на первой осциллограмме не вижу никаких проблем. Колебания в паузах от индуктивности намагничивания первичной обмотки трансформатора. Это всегда будет в режиме холостого хода. Чтобы был прямоугольник, необходимо, чтобы через дроссель ток не падал до нуля - то есть, режим неразрывного тока дросселя. Для этого необходимо увеличить его индуктивность. нагружать источник, запитанный от резистора - нельзя ! ключи должны быть из одной партии, убедитесь что ничего не пробито. Емкости высоковольтных электролитов тоже должны быть одинаковыми. Проверьте на высыхание. Схема выпрямления должна быть двухтактной - это на всякий случай
    • @READART Согласен, некорректно выразился. Батарейно-зависимое хранилище вот совсем без внешнего резерва не припомню, как правило какой-то модуль хранения есть хотя бы как докупаемая опция. Опция дублирования программы на карту памяти есть у большинства ПЛК со слотом для карты, DELTA и Allen-bradley точно умеют. Да, и все же есть разница ионистор или АКБ/батарейка. С последними и пара лет хранения не проблема. З.Ы. А нет вспомнил. ОВЕН, будь он не ладен. И еще вроде кто-то ругался на PLC Saia-Burgess.
    • Стоваттный резистор в колоночку - и можно обходиться без отопления.
    • Не совсем так. Батарейка в ПЛК - весьма распространенное явление, причем нередко в ПЛК отсутствует карта памяти или иное хранилище рабочей программы, в результате чего после исчерпания батарейкой своего ресурса станок уходит в небытие. В этом плане приятен omron - в части его ПЛК рабочая программа хранится и в SRAM, и на карте, а пользователь с помощью микрика может выбирать откуда ему загружаться. 
  • Похожий контент

×
×
  • Создать...