Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Светодиоды и AVR не дружат.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ps1x
В общем дело вот в чем, сегодня доехал таки до чипа и дипа и закупился необходимыми деталями.
Спаял простую схемку с одним диодом через резистор подключающимся к AVR MEGA8. Программу которая просто мигает этим диодом залил в МК. Все отлично зашилось через 5 проводков, диод замигал в опщем щастье! Захотелось большего, и припаял еще 3 диода все к порту C выводам 2,3,4,5. Записал в МК прошивку:

Цитата
#include <mega8.h>

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if (PORTC.5==0)
{
PORTC.5=1;
PORTC.4=0;
}
else
{
PORTC.5=0;
PORTC.4=1;
}
// Place your code here

}

// Declare your global variables here

void main(void)
{
PORTC.5=0;
PORTC.4=1;
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0
PORTB=0x00;
DDRB=0x01;

// Port C initialization
// Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State6=T State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0x3F;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 3,906 kHz
TCCR0=0x04;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")

while (1)
{
// Place your code here

};
}




В результате все диоды мигают одновременно с частотой таймера, хотя должны мигать только PC.4 и PC.5 ПООЧЕРЕДНО!
И еще момент такой, в ISIS все эмулируется нормально, т.е. помигивают только 2 диода поочередно, остальные не горят.

Помогите плз разобраться )
ps1x
Уже 11 человек посмотрели эту тему, неужели никто из них не знает в чем дело?
Кстати если это поможет понять проблему - пользуюсь Code Vision AVR.
AndyBig
По идее все верно, должны моргать поочередно РС4 и РС5...
Вообще-то, АВР очень даже дружит со светодиодами, так что где-то ошибка. Схему подключения можно глянуть?
ps1x
ДОБАВЛЕННО: И еще, попробовал прогнать програмку:

PORTC++;
delay_ms(500);
if (PORTC==200)
{PORTC=37;}

результаты весьма странные, получается инвертированый порт, т.е. если в программе PC.5 = 1 то в реальности светодиод не горит!!! (кстати выражение вида PORTC.5=1 компилируется, но результата не дает, равно как и PORTC.5=0 т.е. светодиоды не горят все или горят все)
Если заменить PORTC.5 на PORTC.4 то вообще ничего не мигает =(

Конечно можно, извиняюсь за некоторую неразборчивость схемы:
AndyBig
Во-первых, совет: светодиоды подключайте к контроллеру не анодом, а катодом - на землю мега вроде бы выносливее, чем от питания.
Во-вторых, какое напряжение питания у Вас на меге? Если 5 вольт, то 100 ом - это слишком мало для гасящего резистора, ток с вывода превысит максимально допустимый. Возможно, в этом проблема?
ps1x
Щас момент, не уходите спать, подпаяю еще один резюк...
Хотя они вроде довольно тускло горят....
ps1x
Резюк припаял но увы, чуда не случилось...
Странный момент в CVAVR я пишу PORTC.3=1 но нифига не работает, пишу PORTC=0b00100 тоже не пашет, а PORTC=0xBB работает, но наооборот ((( инвертируется) (?????????)

Еще кое-что интересное:
Если выполнить
PORTC=0xBB;
то загораются диоды подключенные к PC5 и PC2 хотя калькулятор дает следующее:
(HEX)0xBB=0b10111011
ps1x
Другой Мк тоже не работает корректно при записи PORTC.5=1 загораются все светодиоды (((
Laksus
Цитата
Все отлично зашилось через 5 проводков, диод замигал в опщем щастье!
...
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 3,906 kHz

То есть Вы утверждаете, что в состоянии различить мигание с частотой 3,906 kHz?
Александр
2006 03 21
ps1x
2 Laksus : Насколько я понял это делитель.
Впрочем, при выполнении данной программы диод мигал с периодом около секунды наверное, т.е. вполне различимо.

Еще одна проблема:
Попробовал подключить те самые 4 светодиода к порту Д. От 0 до 3.
При выполнении программы
PORTD=0xFF;
Загорается диод подключенный к порту PORTD.3 и все!!!!
Кто нибудь обьясните плз дебилу что это за хрень.
И еще почему не работает конструкция вида PORTD.3=1;????
ps1x
Как Вы думаете, что будет, если зашить в МК вот эту программу, и к выводам PORTD.0 и PORTD.1 подключить два светодиода на землю, через защитное сопротивление в 200 Ом???

Цитата
#include <mega8.h>
#include <delay.h>


interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{


}


void main(void)
{

PORTD=0x00;
DDRD=0xFF;
TCCR0=0x04;
TCNT0=0x00;
TIMSK=0x01;
ACSR=0x80;
SFIOR=0x00;

#asm("sei")

while (1)
{
PORTD.0=1;
PORTD.1=0;
delay_ms(100);
PORTD.1=1;
PORTD.0=0;
delay_ms(100);
};
}


А вот и не угадали, ничего не будет. (по крайней мере если компилировать в СV AVR и зашивать им же)
в общем я офигевваю smile3046.gif
Кто нибудь скажите пожалуйста, что же за фигня происходит.


Кстати, если

PORTD.0=1;
PORTD.1=0;
delay_ms(100);
PORTD.1=1;
PORTD.0=0;
delay_ms(100);

заменить на

PORTD++;

то загораются все 4 светодиода,
однако если заменить на

PORTD=0xFF;

то загорается светодиод PORTD.3

Вот схема подключения диодов:
ps1x
Может быть дело в фьюзах? Всю ночь бился ап стену и не смог заставить схемку правильно мигать лампочками. Наверно пора убить себя biggrin.gif .

УМНЫЕ ЛЮДИ УМОЛЯЮ ВАС, СКАЖИТЕ ЧТОЖЕ НУЖНО СДЕЛАТЬ ЧТОБЫ ОНО ЗАРАБОТАЛО!!!!!

И почему не получается PORTD.0=1?
WHALE
ОТ чего тактируется мега и фьзы в студию.
ILYCHOFF
Подключите сначала светодиоды нормально как Вам AndyBig писал, затем проверьте фьюзы см. даташит и кстати от чего тактируется мега.

Я сам начинал работу с контроллерами с такой же программы и тоже на CodeVision, но у меня вообще никаких проблем не было.

Все внимательно перепроверьте по себе знаю.

конструкция PORTD.1=1; прекрасно работает (в CodeVision разумеется).
ps1x
Мега тактируется от внутреннего осциллятора, а фьюзы все по нулям.
Диоды подключены так:

PORTD.0 ---> +диода ----> диод -----> 200 ом ----> Земля
и так для каждого пина порта D.

Разве это не правильно? wub.gif

ps Спасибо за отзывы.
ps1x
и еще, вот такой код

PORTD=0b00001000;

Вызывает зажигание светодиодов PD0-3. Остальные не горят (((

Не мог же контроллер (точнее два) спалиться так, что он как то работает но не правильно?
WHALE
Т0 -8-РАЗРЯДНЫЙ.Прескалер ты выбрал на 256,т.е Fвх Т0=3906hz.Прерывание по переполнению у тебя
будут возникать 3096/256=12hz.чего ты глазом не увидишь.Ставь прескалер на 1024-TCCR0=5,тогда
прерывния по переполнению будут возникать f=3,81hz и внутри надо сделать программный счетчик-
static unsigned char count;
if(++count>3) ----инвертируешь светодиоды.
Или используй Т1-он 16-разрядный.
Да,еще в опциях процента установлена частота проца 1Мгц?
Ты используешь встроенный программатор CV?фьюзы в 0-имеется в виду наверно в1 -галочки не стоят?
ps1x
Да на счет фьюзов именно так.
Использовал встроенный программатор.

Только что я по глупому спалил себе ЛПТ ohmy.gif .

И Мк тоже. Даже не спрашивайте как. Что делать в этом случае? Будет ли программатор работать с лпт на PCI платке? Или можно спаять USB программатор? Или мне лучше сразу повеситься? huh.gif huh.gif huh.gif
muravei
Цитата(ps1x @ Mar 21 2006, 10:00) *
Или мне лучше сразу повеситься? huh.gif huh.gif huh.gif

Это радикальнее.smile.gif
Я бы начал с с установки по ОТДЕЛЬНОМУ резистору на каждый вывод.
ps1x
Резисторы уже не помогут поскольку я спалил ЛПТ... Надо мне было думать раньше. Хотя они и так не помогли бы...
beer_warrior
Стоп, стоп.
Включение светодиодов!!!
Свтодиоды включаются катодом на кристалл, с резистором на питание
300...470 ом и КАЖДОМУ СВЕТОДИОДУ - СВОЙ РЕЗИСТОР.
Иначе в зависимости от кол-ва включенных светодиодов через резистор быдет идти ток от I до 4I и соответсвенно будет меняться напряжение в точке соединения резистора и диодов.
ps1x
Спасибо за сочувствие... )
Как вы думаете, заработает ли программатор через Вот эти контроллеры

А как тогда управлять светодиодами? Порты на вход?
muravei
Цитата(beer_warrior @ Mar 21 2006, 10:13) *
КАЖДОМУ СВЕТОДИОДУ - СВОЙ РЕЗИСТОР.

Я о том же.

Чего им управлять- резистор на +, к нему анод св. диода , катод к выводу АВРа.Порт на вывод.
Выводишь "1" -не горит, "0" -горит.

Цитата(ps1x @ Mar 21 2006, 10:19) *
Как вы думаете, заработает ли программатор через Вот эти контроллеры

Через ЛПТ-шный будет.
Не знаю , что у Вас за программатор, но сомниваюсь , что Вы спалили АВР.
Скорее "залочили" тогда нужен параллельный, или затерли идентификатор - тогда АВРеал.
ps1x
Программатор "5 проводков" ЛПТ спалил стабильно, один из двух МК должен быть жив и незалочен (по идее), второй паленый и залоченый ))) тоесть совсем ему туго досталось.
muravei
Цитата(ps1x @ Mar 21 2006, 10:38) *
Программатор "5 проводков" ЛПТ спалил стабильно, один из двух МК должен быть жив и незалочен (по идее), второй паленый и залоченый ))) тоесть совсем ему туго досталось.

В чем выражается паленость МК?
WHALE
ну так купи PCI плату с портами-350рублей.
defunct
Цитата(ps1x @ Mar 21 2006, 07:49) *
Мега тактируется от внутреннего осциллятора, а фьюзы все по нулям.
Диоды подключены так:

PORTD.0 ---> +диода ----> диод -----> 200 ом ----> Земля
и так для каждого пина порта D.

Разве это не правильно? wub.gif

Конечно не правильно.. должно быть PORT.X --> 270ом -> +диода -> GND
в программе:

DDRD = 0xFF;
PORTD = 0xFF; // на этой строчке "да будет свет"
defunct
Цитата(beer_warrior @ Mar 21 2006, 09:13) *
Свтодиоды включаются катодом на кристалл, с резистором на питание
300...470 ом и КАЖДОМУ СВЕТОДИОДУ - СВОЙ РЕЗИСТОР.

Включаются так как нужно, нужна инверсия - к питанию, не нужна - тогда к земле.
резисторы рассчитываются под конкретный тип диода, как Vcc / ток диода, для неярких (20ma) светодиодов - R = 250..270, для ярких 2ma - ~1kom.
ps1x
Паленость МК выражается тем что я по недосмотру "случайно замкнул около 10 выводов мк на +5 от молекса компьтера, при этом раздался характерный треск электрических разрядов biggrin.gif "
ps1x
Задачи на сегодня - съездить в институт, в чип и дип за еще одним МК и подпружиненой панелькой для программатора, купить PCI --> LPT... Попытать счастья еще разок.

p.s. Всем большое спасибо за советы!
defunct
Цитата(ps1x @ Mar 21 2006, 10:13) *
Паленость МК выражается тем что я по недосмотру "случайно замкнул около 10 выводов мк на +5 от молекса компьтера, при этом раздался характерный треск электрических разрядов biggrin.gif "

Так паленость МК, или паленость LPT?

Цитата
в чип и дип за еще одним МК и подпружиненой панелькой для программатора, купить PCI --> LPT... Попытать счастья еще разок.


МК поддерживают ISP программирование, зачем панельки, просто на целевой плате предусмотрите разъем 5 контактов (GND/RESET/SCK/MISO/MOSI), и купите касичку "широкий COM 25 контактов". Касичку перепаять в соответствии со схемой FunCard, одним концом подключить к LPT другим (тем что задумывался как на плату) - к целевой плате.

Ну и купите в чип-и-дипе за одно max232 и mega8535 чтобы собрать нормальный программатор - AVRISP.
muravei
Цитата(ps1x @ Mar 21 2006, 10:38) *
Программатор "5 проводков"

Судя повсему ISP...
ps1x
Паленость одного из двух МК и ЛПТ на материнке ((.
Вариант с ЛПТ на PCI не прокатил - программатор avreal и codevision с ним не дружат.

Теперь резонный вопрос где взять схемку STK-500? Он ведь через ком шьет? Или почем можно купить дешовый вариант? ну и желательно подсказать где... (в москве)
Petka
Цитата(ps1x @ Mar 22 2006, 17:30) *
Паленость одного из двух МК и ЛПТ на материнке ((.
Вариант с ЛПТ на PCI не прокатил - программатор avreal и codevision с ним не дружат.

Теперь резонный вопрос где взять схемку STK-500? Он ведь через ком шьет? Или почем можно купить дешовый вариант? ну и желательно подсказать где... (в москве)



когда-то давно я уже давал совет что делать если были сожжены линиии LPT порта.
варианты:
1) достать PCI LPT! AVReal через него умеет работать! хорошо читайте прилагаемый к нему readme
2) AVReal умеет использовать разные линии LPT порта, попробуйте выбрать в конфиге такие, которые остались живы.
defunct
Цитата
Теперь резонный вопрос где взять схемку STK-500? Он ведь через ком шьет?

выложил упрощенную схему в этой ветке
muravei
Цитата(ps1x @ Mar 22 2006, 17:30) *
Вариант с ЛПТ на PCI не прокатил - программатор avreal и codevision с ним не дружат.

Думаю, надо выбрать номер порта.
ps1x
Цитата
Думаю, надо выбрать номер порта.


)) Думаю, это первое что я сделал.
В общем решил проапгрейдить материнку и спаять нормальный STK-200 чтоб порт опять не спалить.
osnwt
Цитата(AndyBig @ Mar 21 2006, 00:51) *
Во-первых, совет: светодиоды подключайте к контроллеру не анодом, а катодом - на землю мега вроде бы выносливее, чем от питания.

Цитата(ILYCHOFF @ Mar 21 2006, 07:43) *
Подключите сначала светодиоды нормально как Вам AndyBig писал


Я, конечно, жутко извиняюсь, но, господа, неужели трудно перед тем, как давать советы (особенно категорические - "сначала сделай нормально"), заглянуть в datasheet и посмотреть, так ли это? Лично я всегда туда смотрю прежде, чем дать какой-либо совет.

Читаем в любой меге:

Цитата
Each output buffer has symmetrical drive characteristics with both high sink and source capability. The pin driver is strong enough to drive LED displays directly.

И картинки графиков входного и выходного токов портов подтверждают то же самое. Так, извините, зачем же наследие PIC-ов бездумно переносить на всё остальное? Таким бездумным советом (хорошо, если он сопровождается "вроде бы" - тогда вопроса нет) можно заставить человека перелопатить схему (и хорошо. если это макет, а не специально сделанная pcb) без видимого на то повода.

Поленившись заглянуть в даташит (сэкономив 1 минуту своего времени), можно потратить 15-30 минут времени чужого. Есть предложение внимательнее относиться к таким вещам.

Автору темы: светодиоды можно ставить так, как хочется. Ограничивающие резисторы, безусловно, нужны. Но полярность может быть любой, лишь бы можно было его зажечь.
otrog
Цитата
В общем решил проапгрейдить материнку и спаять нормальный STK-200 чтоб порт опять не спалить.

По моему Вам будет дешевле спаять SI-Prog и пользоваться PonyProg - уже несколько лет пользуюсь - Вещь!!

А по поводу светодиодов.
И действительно к Mege можно подключать светодиоды и анодом и катодом blink.gif .
Сам привык к AT90 так там если катодом, то макс. ток 20mA, а если анодом, то 3mA.
Но все равно крайне желательно по своему резистору на каждый светодиод.
Резистор рассчитывается так:
Сопротивление,Ом = (Напряжение питания,В - Падение напряжения на светодиоде,В - Падение напряжения на порте при заданном токе,В) / ток через светодиод,А

Падение напряжения на светодиоде и ток через светодиод - смотрится в параметрах светодиода
Падение напряжения на порте при заданном токе - смотрится в доке на Mega-у
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.