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

Пытаюсь написать код на Си для Avr


HOT ICE

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

Нет ошибаешься ты скачал Datasheet на мегу8????

Почему не переписал инициализацию внешних прерывание для atmega8

// External Interrupt(s) initialization

// INT0: Off

// INT1: On

// INT1 Mode: Rising Edge

GICR|=0x80;

MCUCR=0x0C;

GIFR=0x80;

Я вижу ты поставил частоту 12,000000 MHz, как думаешь, на сколько будет задержка если ты написал delay_ms(100);???

Я к тому спрашиваю, чтобы ты знал что компилятор не все за тебя считает.

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

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

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

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

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

Изображения в теме

Сейчас отвечу на твои вопросы:

Прерывания я же переписал?Теперь если залью в Мегу,будет работать??

Короче вот как должно быть:

/*****************************************************

Date : 23.01.2007

Chip type : ATmega8

Program type : Application

Clock frequency : 12,000000 MHz

Memory model : Small

External SRAM size : 0

Data Stack size : 256

*****************************************************/

#include <mega8.h>

#include <delay.h>

/* Глобальные переменные */

// f_on - флаг состояния двигателя

// f_on = 1 - двигатель включен

// f_on = 0 - двигатель ВЫключен

unsigned char f_on;

/* Инициализация порта */

void port_init()

{

PORTB=0x00;

DDRB=0x00;

PORTC=0x00;

DDRC=0xFF; // сдесь ты правильно сделал

PORTD=0x00;

DDRD=0x00;

}

/* Инициализация внешних прерываний */

void int_init()

{

// External Interrupt(s) initialization

// INT0: Off

// INT1: On

// INT1 Mode: Rising Edge

GICR|=0x80;

MCUCR=0x0C;

GIFR=0x80;

}

/* Инициализация аналогового компаратора (его выключение) */

void an_comp_init()

{

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

SFIOR=0x00;

}

/* Функция включения работы двигателя */

void engine_on()

{ //мотор1 вперёд//

PORTC.0=1;

PORTC.1=0;

//мотор2 вперёд//

PORTC.2=1;

PORTC.3=0;

delay_ms(100); // Мала у тебя задержка 6,25 миллисекунд (ты ее даже не почувствуешь) Поставь delay_ms(12 000); (Задержка на 1 сек)

//мотор 1 стоп //

PORTC.0=0;

PORTC.1=0;

delay_ms(100); // Мала у тебя задержка 6,25 миллисекунд (ты ее даже не почувствуешь) Поставь delay_ms(12 000); (Задержка на 1 сек)

//и так по кругу туда сюда ето примерно,главное что правильно???

//Потому как функцыональность буду потом задавать полную

// А так у тебя сдесь все правильно

}

/* Функция ВЫключения работы двигателя */

void engine_off() //Вот ета строка віделяется как ошибка

{

//Тут я писать так понимаю должен ето - ну да правильно понимаешь

PORTC.0=0;//стоп

PORTC.1=0;

PORTC.2=0;//стоп

PORTC.3=0;

}

/* Прерывание от вывода PB2(INT1) */

interrupt [EXT_INT1] void ext_int1_isr()

{

// Это прерывание возникает когда на выводе PD3 идет фронт сигнала

// Слежующие две строчки нужны для управления двигателем;

// я надеюсь что ты поймешь для чего они нужны если нет ТО ПИШИ,РАЗЬЯСНЮ

if (f_on) f_on = 0;

else f_on = 1;

if (f_on) engine_on(); // Включение

else engine_off(); // Выключение

}

void main()

{

#asm("cli"); // Запрет всех прерываний

port_init();

int_init();

an_comp_init();

f_on=0; // Двигатель выключен (обнуление флага)

#asm("sei"); // Разрешение внешних прерываний }

while(1); // Ты забыл поставить этот бесконечный цикл, а то потом будешь говорить что МК нестабильно работает...

}

Так с прогой разобрались... Теперь если зальешь в мегу8 работать будет...

Нажму кнопкой пока PB2.произойдёт прерывание и вместо моторов пока светодиоды поставлю то они начнут светиться?

Кнопку подключаешь не к PB2 а PD3 теперь... и другой конец кнопки к плюсу питания.

Ты бы мне схему показал как ты светодиоды будешь подключать??? То-ли к плюсу, то-ли к минусу, то-ли ...???

И еще не забывай что у обычной кнопки есть такое не хорошее явление как "дребезг" контактов, так что я тебе не советую подключать ее напрямую к PD3, ты конечно подключением ничего не испортишь, дело в том что при нажатии на кнопку один раз, из-за "дребезга" пойдет серия коротких импульсов, человек их не замечает, а вот МК будет заходить в прерывание не один раз, а несколько, короче НЕСТАБИЛЬНОСТЬ будет. Я тебе советую использовать или генератор на 0,1 Гц или с помощью цифровых схем собрать аппаратный подавитель этого "дребезга".

Что здесь - interrupt [EXT_INT1] void ext_int1_isr() показывает на то что прерывание произойдёт от PB2???Очень хочу понять!!!

Нет не правильно понимаешь прерывание произойдет от PD3.

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

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

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

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

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

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

/* Функция включения работы двигателя */

void engine_on()

{ //мотор1 вперёд//

PORTC.0=1;

//мотор2 вперёд//

PORTC.2=1;

delay_ms(3000);

//мотор 1 стоп //

PORTC.0=0;

PORTC.1=1;

delay_ms(3000);

}

Я ЗАЛИЛ!!!Прерывание работает и круто!Спасибо!!!!Только вот етот код выше не выполняется бесконечно!Доходит до PORTC.1=1;и зацыкливается,не начинает всё заново!Что делать?

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

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

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

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

Если ты хочешь чтобы он в функцию engine_on() выполнял все время, пока f_on = 1 (двигатель включен), нужно сделать так (измененное я обозначил зеленым цветом):

/*****************************************************

Date : 23.01.2007

Chip type : ATmega8

Program type : Application

Clock frequency : 12,000000 MHz

Memory model : Small

External SRAM size : 0

Data Stack size : 256

*****************************************************/

#include <mega8.h>

#include <delay.h>

/* Глобальные переменные */

// f_on - флаг состояния двигателя

// f_on = 1 - двигатель включен

// f_on = 0 - двигатель ВЫключен

unsigned char f_on;

/* Инициализация порта */

void port_init()

{

PORTB=0x00;

DDRB=0x00;

PORTC=0x00;

DDRC=0xFF; // сдесь ты правильно сделал

PORTD=0x00;

DDRD=0x00;

}

/* Инициализация внешних прерываний */

void int_init()

{

// External Interrupt(s) initialization

// INT0: Off

// INT1: On

// INT1 Mode: Rising Edge

GICR|=0x80;

MCUCR=0x0C;

GIFR=0x80;

}

/* Инициализация аналогового компаратора (его выключение) */

void an_comp_init()

{

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

SFIOR=0x00;

}

/* Функция включения работы двигателя */

void engine_on()

{ //мотор1 вперёд//

if (f_on)

{PORTC.0=1;

PORTC.1=0;

//мотор2 вперёд//

PORTC.2=1;

PORTC.3=0;

delay_ms(100); // Мала у тебя задержка 6,25 миллисекунд (ты ее даже не почувствуешь) Поставь delay_ms(12 000); (Задержка на 1 сек)

//мотор 1 стоп //

PORTC.0=0;

PORTC.1=0;

delay_ms(100); // Мала у тебя задержка 6,25 миллисекунд (ты ее даже не почувствуешь) Поставь delay_ms(12 000); (Задержка на 1 сек)

//и так по кругу туда сюда ето примерно,главное что правильно???

//Потому как функцыональность буду потом задавать полную

// А так у тебя сдесь все правильно

}

}

/* Функция ВЫключения работы двигателя */

void engine_off() //Вот ета строка віделяется как ошибка

{

//Тут я писать так понимаю должен ето - ну да правильно понимаешь

PORTC.0=0;//стоп

PORTC.1=0;

PORTC.2=0;//стоп

PORTC.3=0;

}

/* Прерывание от вывода PB2(INT1) */

interrupt [EXT_INT1] void ext_int1_isr()

{

// Это прерывание возникает когда на выводе PD3 идет фронт сигнала

// Слежующие две строчки нужны для управления двигателем;

// я надеюсь что ты поймешь для чего они нужны если нет ТО ПИШИ,РАЗЬЯСНЮ

if (f_on) f_on = 0;

else f_on = 1;

if (f_on==0) engine_off(); // Выключение

}

void main()

{

#asm("cli"); // Запрет всех прерываний

port_init();

int_init();

an_comp_init();

f_on=0; // Двигатель выключен (обнуление флага)

#asm("sei"); // Разрешение внешних прерываний }

while(1) engine_on();

}

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

Ё-маёёёёё!!!Я наверно LPT спалил :( !!!!

У меня на принтер с блокнота выводятся данные

,и картинки!Атмега прошивается,авот как ксерокс он не работает теперь я сканером сканил раньше и принтер выводил,а теперь лампочка ошибки мигат :(:(:( !!!Ето значит что порт згорел???

Как ето проверить:::???

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

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

лучшеб ты втыкал эти резисторы в СОМ порт, его слажнее спалить (8рез, 3 диода - вот и весь программатор)

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

Ё-маёёёёё!!!Я наверно LPT спалил !!!!

У меня на принтер с блокнота выводятся данные

,и картинки!Атмега прошивается,авот как ксерокс он не работает теперь я сканером сканил раньше и принтер выводил,а теперь лампочка ошибки мигат !!!Ето значит что порт згорел???

Как ето проверить:::???

Ну чего, могу тебя только поздравить, я думаю LPT порт никак не проверишь (только подключением принтера), я специально чтобы не спалить свой LPT порт собрал программатор на микросхеме 74HC244(аналог КР1564АП5), а вот теперь понимаю, что правильно сделал потратив один день на сбор программатора, зато сейчас программирую спокойно...

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

лучшеб ты втыкал эти резисторы в СОМ порт, его слажнее спалить (8рез, 3 диода - вот и весь программатор)

Твой программатор для PIC-ов??? Просто я не встречал такого простого программатора <<8рез, 3 диода>> для AVR, да еще для COM порта...

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

Твой программатор для PIC-ов??? Просто я не встречал такого простого программатора <<8рез, 3 диода>> для AVR, да еще для COM порта...

вот оно: http://avr.nikolaew.org/progr.htm

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

Твой программатор для PIC-ов??? Просто я не встречал такого простого программатора <<8рез, 3 диода>> для AVR, да еще для COM порта...

вот оно: http://avr.nikolaew.org/progr.htm

Понял, спасибо, сейчас посмотрю...

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

Счас посмотрим...

Я попробовал ДОБАВИТЬ В КОД ЕЩЁ ПРЕРЫВАНИЕ INT0!Посмотри пожалуйсто!ПРАВИЛЬНО ИЛИ НЕТ?????Очень нужно!!!

Короче, ты издеваешься что-ли... Это что такое...

ñäåñü òû ïðàâèëüíî ñäåëàë
, я понимаю что кодировка русских букв CodeVisionAVR друрая, но ты же мог перекодировать русские буквы в Windows-1251(ANSI)...
/* ÐÀÁÎÒÀ ÄÂÈÃÎÒÅËÅÉ ÂÎ ÂÐÅÌß ÏÐÅÐÛÂÀÍÈß INT0!!!

void engine_mozgi()

daley_ms(300)

{PORTD.0=~PIND.0;ÅÑËÈ ÒÓÒ ÁÛËÀ "1" ÍÓÆÍÎ ×ÒÎÁ ÏÎËÓ×ÈËÑß "0" íàîáîðîò!?????ÒÎåñòü äâèæêè áóäóò êðóòèòòüñÿ â ïðîòèâîïîëîæíóþ ñòîðîíó!ÏÐÀÂÈËÜÍÎ???

PORTD.2=~PIND.1;Çäåñü òîæå ñàìîå! ÏÐÀÂÈËÜÍÎ????????? È ÍÓÆÍÎ ×ÒÎÁ ÏÎÑËÅ ÂÛÏÎËÍÅÍÈß ÅÒÎÃÎ ÏÅÐÅÕÎÄÈËÎ Îáðàòíî!â íà÷àëî âñåõ ïðîöåññîâ!

}

По внимательнее... где сдесь у тебя */

daley_ms(300)
- а это что за строчка??? Тут несколько ошибок, во-первых функция не так написана, во-вторых она совсем не там стоит, а в третьих ТЫ ГДЕ В БЛОКНОТЕ ЧТО ЛИ ПИШЕШЬ, компилятором иногда надо ведь пользоваться...

Еще... ты используешь два прерывания, тогда зачем ты весь порт D настраиваешь на выход

DDRD=0xFF;

Вот эта сткочка вообще ничего хорошего не делает

if (mozgi) mozgi=1;
должен остановиться основной код и выполниться код от прерывания абсолютно противоположный тому что был для моторов(ну я в коде описал)И после выполнения Начать выполнять основной код сначала!
- а сам хоть понял что ты тут написал :)
void int_init()

{

// External Interrupt(s) initialization

// INT0: On

// INT0 Mode: Rising Edge

// INT1: On

// INT1 Mode: Rising Edge

GICR|=0xC0;

MCUCR=0x0F;

GIFR=0xC0;

}

- ну хоть сдесь ты правильно сделал, хоть это радует...

Вот еще советую скачать PROTEUS, и сходить сюда http://forum.cxem.net/...

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

Вот перекодировал!Извеняюсь за то что получилось!!!!!Вот посмотри!!!ОК????

/*****************************************************

Date : 23.01.2007

Chip type : ATmega8

Program type : Application

Clock frequency : 12,000000 MHz

Memory model : Small

External SRAM size : 0

Data Stack size : 256

*****************************************************/

#include <mega8.h>

#include <delay.h>

/* Глобальные переменные */

// f_on - флаг состояния двигателя

// f_on = 1 - двигатель включен

// f_on = 0 - двигатель ВЫключен

unsigned char f_on;

unsigned char mozgi;

/* Инициализация порта */

void port_init()

{

PORTB=0x00;

DDRB=0x00;

PORTC=0x00;

DDRC=0xFF; // сдесь ты правильно сделал

PORTD=0xF3;

DDRD=0xF3;

}

/* Инициализация внешних прерываний */

void int_init()

{

// External Interrupt(s) initialization

// INT0: On

// INT0 Mode: Rising Edge

// INT1: On

// INT1 Mode: Rising Edge

GICR|=0xC0;

MCUCR=0x0F;

GIFR=0xC0;

}

/* Инициализация аналогового компаратора (его выключение) */

void an_comp_init()

{

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

SFIOR=0x00;

}

//РАБОТА ДВИГОТЕЛЕЙ ВО ВРЕМЯ ПРЕРЫВАНИЯ INT0!!!

void engine_mozgi()

{PORTD.0=~PIND.0;//ЕСЛИ ТУТ БЫЛА "1" НУЖНО ЧТОБ ПОЛУЧИЛСЯ "0" наоборот!?????ТОесть движки будут крутитться в противоположную сторону!ПРАВИЛЬНО???

PORTD.1=~PIND.1;//Здесь тоже самое! ПРАВИЛЬНО????????? И НУЖНО ЧТОБ ПОСЛЕ ВЫПОЛНЕНИЯ ЕТОГО ПЕРЕХОДИЛО Обратно!в начало всех основных процессов!

}

/* Функция включения работы двигателя */

void engine_on()

{ //мотор1 вперёд//

if (f_on)

{PORTD.0=1;

//мотор2 вперёд//

PORTD.2=1;

delay_ms(500); //

PORTD.0=0;

PORTD.1=1;

delay_ms(500); //

}

}

/* Функция ВЫключения работы двигателя */

void engine_off() //Вот ета строка віделяется как ошибка

{

//Тут я писать так понимаю должен ето - ну да правильно понимаешь

PORTD.1=0;//стоп

PORTD.1=0;//стоп

}

/* Прерывание от вывода PD2(INT0) */

interrupt [EXT_INT0] void ext_int0_isr()

{ // Это прерывание возникает когда на выводе PD3 идет фронт сигнала

if (mozgi) mozgi=1;

}

/* Прерывание от вывода PB3(INT1) */

interrupt [EXT_INT1] void ext_int1_isr()

{

// Это прерывание возникает когда на выводе PD3 идет фронт сигнала

// Слежующие две строчки нужны для управления двигателем;

// я надеюсь что ты поймешь для чего они нужны если нет ТО ПИШИ,РАЗЬЯСНЮ

if (f_on) f_on = 0;

else f_on = 1;

if (f_on==0) engine_off(); // Выключение

}

void main()

{

#asm("cli"); // Запрет всех прерываний

port_init();

int_init();

an_comp_init();

f_on=0; // Двигатель выключен (обнуление флага)

#asm("sei"); // Разрешение внешних прерываний }

while(1) engine_on();

}

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

Ты же поможеш мне???? :) !!!!Если задолбал очень извеняюсь!!!!Просо мне ето очень нужно!мне интерестно!Уже от монитора аж глаза вылазят! :)

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

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

Я хотел бы узнать как ты подключил двигатели к порту D.

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

И лучше вообще пришли мне свою схему, как ты все подключил...

Можешь прислать свою схему на mail: ig_net@dom.raid.ru...

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

Теперь смотрим код:

/*****************************************************
Date : 23.01.2007

Chip type : ATmega8
Program type : Application
Clock frequency : 12,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>

/* Глобальные переменные */
unsigned char f_on=0; // Можно обойтись и без второй переменной

/* Инициализация порта */
void port_init()
{
PORTB=0x00;
DDRB=0x00; 

PORTC=0x00;
DDRC=0xFF; 

PORTD=0xF3;
DDRD=0xF3;
} 

/* Инициализация внешних прерываний */
void int_init()
{
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: On
// INT1 Mode: Rising Edge
GICR|=0xC0;
MCUCR=0x0F;
GIFR=0xC0;
}

/* Инициализация аналогового компаратора (его выключение) */
void an_comp_init()
{
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
} 

/* Функция включения работы двигателя */
void engine_on()
{ 
if (f_on) 
{
 //мотор1 вперёд
 PORTD.0=1;  
 //мотор2 вперёд
 PORTD.2=1;
 delay_ms(500);  
 PORTD.0=0;
 PORTD.1=1;
 delay_ms(500);  
}
} 

/* Функция ВЫключения работы двигателя */
void engine_off() 
{
PORTD.1=0;//стоп
PORTD.1=0;//стоп
}

/* Прерывание от вывода PD2(INT0) */
interrupt [EXT_INT0] void ext_int0_isr()
{ 
// Это прерывание возникает когда на выводе PD2 идет фронт сигнала
PORTD.0=~PIND.0;
PORTD.1=~PIND.1; 
}

/* Прерывание от вывода PB3(INT1) */
interrupt [EXT_INT1] void ext_int1_isr()
{
// Это прерывание возникает когда на выводе PD3 идет фронт сигнала
if (f_on) f_on = 0;
  else f_on = 1;
if (f_on==0) engine_off(); // Выключение
}

void main()
{
#asm("cli"); // Запрет всех прерываний
port_init();
int_init();
an_comp_init();
#asm("sei"); // Разрешение внешних прерываний

while(1) engine_on();
}

PORTD.0=~PIND.0; //ЕСЛИ ТУТ БЫЛА "1" НУЖНО ЧТОБ ПОЛУЧИЛСЯ "0" наоборот!?????ТОесть движки будут крутитться в противоположную сторону!ПРАВИЛЬНО???

PORTD.1=~PIND.1; //Здесь тоже самое! ПРАВИЛЬНО????????? И НУЖНО ЧТОБ ПОСЛЕ ВЫПОЛНЕНИЯ ЕТОГО ПЕРЕХОДИЛО Обратно!в начало всех основных процессов!

Ну здесь ты все правильно делаешь... Вот только формулировка -

ТОесть движки будут крутитться в противоположную сторону!
не совсем правильная, ну например PD0=1 - двигатель работает, PD0=0 - он стоит, он не как не может врашаться в противоположную сторону. То же самое и со вторым двигателем... Или, может тебе так и надо сделать, просто ты не так выразился? Изменено пользователем IGRISE
Ссылка на комментарий
Поделиться на другие сайты

Прошу прощения за то что лезу к Вам со своими проблемами. Понравился мне этот топик !

Ситуация такая:

поставили мне на работе (наружная реклама) задачу сделать контроллер для управления

трансформаторами неона 4 канала. Режимы прстейшие типа запускаем один канал на некоторый

промежуток времени потом второй первый тушим включается третий и.т д

Это просто пример. Алгоритмы самые разнообразные по желанию клиента.

Перелопатил кучу информации и решил сделать изделие

на основе AVR ATtiny2313. Разработал схему (инет помагал) вытравил плату и уже даже спаял

(До написания программы даже не дошел)

И после включения сразу наткнулся на ПРОБЛЕМУ блок питания не выдает стабильных 5В даже

при нагрузке одной тиньки без обвеса. Падение идет до 3.1 В стабилизатор начинает пищать

или дребезжать незнаю как это описать. При тестировании в Pony Prog МК оказывается забитым

каким то кодом стирание все устраняет. Уже поменял почти все детали результат тот же.

БП специально делал по бестрансформаторной схеме

для уменьшения габаритов а также понравилась не критичность ко входной напруге.

Схему БП прикрепил.

Что делать не знаю может здесь кто нибудь поможет.

Извиняюсь если не в тему!

post-19743-1171144324_thumb.jpg

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

Я тебе могу сказать, если ты изменишь свой блок питания на трансформаторый, то все у тебя будет в норме, я не использовал такие микросхемы как LNK, но могу с уверенностью сказать, что от этой микросхемы идет хорошая помеха (вроде 66 кГц, может даже и ниже). Не зря ведь перед ней стоят фильтры, которые не пропускают высокочастотные помехи в сеть, а вот МК ими и давится... Можешь конечно попробывать поставить конденсатор перед МК по питанию 0,1 мкф (но это если бы у тебя не падало напряжение), я не думаю что он сильно поможет, но некоторые говорят что помогает... Может у тебя все получится, но лучше используй трансформаторные БП, можешь даже импульсный соорудить, намного лучше получится, чем с применением микросхемы LNK...

Можно тебя спросить: Где ты вычитал что такой блок питания подойдет для питания МК???

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

А то, что ты выбрал ATtiny2313 это хорошо, как раз для таких задач ее и применяют...

И еще: Я тебе советую (это только мое личное мнение) используй или собери другой блок питания, просто потом сам будешь мучаться когда МК нестабильно работать, или сбрасываться, тем более как ты говоришь в ее Flash память что-то записывается самопроизвольно...

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

Тут загвоздка вот в чем: глубина корпуса для контроллера

составляет 25мм, а если буду использовать корпус для 8-ми

каналов то 22мм(он длиннее но тоньше). Куда я всуну трансформатор?

Фотка внизу пока без сил. симисторов.

Что то создавать надо только под 2 этих корпуса. Они удобные тем что разъем

питания и на исполнители находится как бы вне верхней крышки

что обеспечивает легкий доступ не требуя откручивания и разбирания самого блока

0.1 мкФ проблему не устраняет.

По поводу того где вычитал Я не вычитал я видел собраную и многократно испытаную

схему на PIC 16

LNK пищит (на слух) около 15-18 кГц.

Сейчас попробую накидать какую нибудь програмку на СИ и всетаки втиснуть в МК

Потом буду у Вас узнавать как надо ПРАВИЛЬНО писать.

post-19743-1171190952_thumb.jpg

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

Пиши если что не понял...

Привет,залил я код в микруху но он работает не правильно.

При подаче питания на МК програма не должна работать пока не произойдёт прерывание на PD3!А она сразу начинает работать и вообще не реагирует на прерывания!

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

Что-то уведомления по почте не приходят :(

Привет,залил я код в микруху но он работает не правильно.

Ну как не правильно, какие условия были поставленны, так код и работает, как ты мне сказал, чтобы при прерывании от PD2 двигатели вращались в противоположную сторону... По программе они так и делают... Т. е при подаче импульса по фронту сигнала программа идет в прерывание и исполняет вот этот код:

PORTD.0=~PIND.0;
PORTD.1=~PIND.1;

Программа один раз исполнит и ждет следующего прерывания от PD2... вот и все, или я тебя не понимаю или ты меня не понимаешь.

При подаче питания на МК програма не должна работать пока не произойдёт прерывание на PD3!А она сразу начинает работать и вообще не реагирует на прерывания!

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

void port_init()

{

PORTB=0x00;

DDRB=0x00;

PORTC=0x00;

DDRC=0xFF;

PORTD=0x00;

DDRD=0xF3;

}

При подаче питания на МК програма не должна работать пока не произойдёт прерывание на PD3!

А вот сдесь, ты или пошутил, или сделал отпечатку, программа всегда работает, она может не выполнять какую-то функцию, но она всегда что-то да делает...

вообще не реагирует на прерывания

А я тебя предупреждал, что дребезг контактов не хорошая штука... (Но дребезг можно подавлять программно, код просто по сложнее будет).

Вот я тебе еще прикрепил схему, надеюсь ты так все сделал:

post-18659-1171260632_thumb.jpg

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

По поводу того где вычитал Я не вычитал я видел собраную и многократно испытаную

схему на PIC 16

Ну тогда тебе придется спрашивать у тех кто эту схему собирал...

LNK пищит (на слух) около 15-18 кГц.

Это ведь такого писка почти не слышно...

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

Я тебя понял, что ты хотел сделать:

Ты видимо хотел сделать не так: (обозначено красным цветом)

{PORTD.0=~PIND.0;//ЕСЛИ ТУТ БЫЛА "1" НУЖНО ЧТОБ ПОЛУЧИЛСЯ "0" наоборот!?????ТОесть движки будут крутитться в противоположную сторону!ПРАВИЛЬНО???

PORTD.1=~PIND.1;//Здесь тоже самое! ПРАВИЛЬНО????????? И НУЖНО ЧТОБ ПОСЛЕ ВЫПОЛНЕНИЯ ЕТОГО ПЕРЕХОДИЛО Обратно!в начало всех основных процессов!

А так:

{PORTD.0=~PIND.0;//ЕСЛИ ТУТ БЫЛА "1" НУЖНО ЧТОБ ПОЛУЧИЛСЯ "0" и наоборот!ТОесть движки будут крутитться в противоположную сторону!ПРАВИЛЬНО???

PORTD.1=~PIND.1;//ЕСЛИ ТУТ БЫЛ "0" НУЖНО ЧТОБ ПОЛУЧИЛСЯ "1" и наоборот! И НУЖНО ЧТОБ ПОСЛЕ ВЫПОЛНЕНИЯ ЕТОГО ПЕРЕХОДИЛО Обратно!в начало всех основных процессов!

Если я тебя правильно понял, то держи тогда другой код программы:

/*****************************************************
Date : 23.01.2007

Chip type : ATmega8
Program type : Application
Clock frequency : 12,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>

/* Глобальные переменные */
unsigned char f_on=0, f_mozgi=0; 

/* Инициализация порта */
void port_init()
{
PORTB=0x00;
DDRB=0x00; 

PORTC=0x00;
DDRC=0xFF; 

PORTD=0x00;
DDRD=0xF3;
} 

/* Инициализация внешних прерываний */
void int_init()
{
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: On
// INT1 Mode: Rising Edge
GICR|=0xC0;
MCUCR=0x0F;
GIFR=0xC0;
}

/* Инициализация аналогового компаратора (его выключение) */
void an_comp_init()
{
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
} 

/* Функция включения работы двигателя */
void engine_on()
{ 
if (f_on) 
{
 #asm("cli");
 //мотор1 вперёд
 PORTD.0=1;  
 //мотор2 вперёд
 PORTD.1=1;
 delay_ms(500);  
 PORTD.0=0;
 PORTD.1=1;
 delay_ms(500);
 #asm("sei");  
}
} 

/* Функция ВЫключения работы двигателя */
void engine_off() 
{
PORTD.0=0;//стоп
PORTD.1=0;//стоп
}

/* Прерывание от вывода PD2(INT0) */
interrupt [EXT_INT0] void ext_int0_isr()
{ 
// Это прерывание возникает когда на выводе PD2 идет фронт сигнала
if (f_mozgi) 
{ 
 PORTD.0=1; 
 PORTD.1=0;
 f_mozgi=0;
}
else
{
 PORTD.0=0; 
 PORTD.1=1;
 f_mozgi=1;
}   
}

/* Прерывание от вывода PD3(INT1) */
interrupt [EXT_INT1] void ext_int1_isr()
{
// Это прерывание возникает когда на выводе PD3 идет фронт сигнала
if (f_on) f_on = 0;
  else f_on = 1;
if (f_on==0) engine_off(); // Выключение
}

void main()
{
#asm("cli"); // Запрет всех прерываний
port_init();
int_init();
an_comp_init();
#asm("sei"); // Разрешение внешних прерываний

while(1) engine_on();
}

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

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

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

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

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

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

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

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

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

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

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

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