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

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


HOT ICE

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

ВОТ СООБСТВЕННО КОД,он примитивный но мне нужно знать правильно ли я думаю!Просто я овичёк в етом деле,и многого не знаю,возможно ничего :)

Chip type : ATmega16

Program type : Application

Clock frequency : 1 MHz

Memory model : Small

External SRAM size : 0

Data Stack size : 256

*/

// I/O register definitions for ATmega16

#include <mega16.h>

// Standard Input/Output functions

// delay functions

#include <delay.h>

void main(void){

while(1){

//Крутить мотор 1 и 2 вперёд//

PORTD.1=1;//сигнал для первого мотра

PORTD.2=0;//Для первого

PORTD.3=1; //Аналогично для второго

PORTD.4=0;

//Остановить первый мотор через 5 микросек

delay_ms(500);

PORTD.1=1;

PORTD.2=1;

delay_ms(250);//не работать 2,5 мс И потом опять работать

}

}

1)"+"ето выс лог уровень да?

Вообщем код етот мне нужен для моего первого робота,если то что я написал правильно то буду писать дальше и более глобально!

Спасибо

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

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

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

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

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

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

вопщем разбрись с задержками.. помоему в функции данные в милисекундах и 500 милисек никак не равно 5 микросекундам...

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

«Как сердцу выразить себя? … Мысль изреченная есть ложь!»

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

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

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

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

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

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

вопщем разбрись с задержками.. помоему в функции данные в милисекундах и 500 милисек никак не равно 5 микросекундам...

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

Да-да,в задержках я розберусь я их наглядно написал!Мне главное то что код правильно сделан!Теперь буд писать его дальше!А ещё скажите пожалуйста как мне написать код чтоб мое устройство включалось от прерывании(Типа хлопок и с микрофона идёт сигнал в МК)и после етого начинает работать весь мой код!И чтоб выключить также можна было!Спасибо

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

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

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

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

А ещё вопрос!У меня есть не нужный DVD привод!Можно его както использовать в качестве самого простейшего проигрователяфильмов,хоть в какомто формате? :)

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

можно канешно и железку к нему приделать чтобы все но тот же монитор выводить.. но ты промучаешься с этим пол жизни :)

вообще ты же не в блокноте я думаю код пишешь? найди софт с эмулятором.. компилируй проверяй.. зогоняй в протеус к примеру там смотри все что касается електроники... все оч удобно ..

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

1) определяешь название функции обабатчока прерывания:

#pragma interrupt_handler <название функции обработчика>:<номер прерывания по ДШ> треугольные скобки ессно не нужны...

например #pragma interrupt_handler int0:1

2) описываешь саму функцию.. ну раз уж ты хоть что то пишешь на си то я думаю и с функциями знаком так что писать не буду :)

к примеру у тебя на сколько я помню в тексте прошивки while(1) и в теле цилка все действия... можно сделать while(stat) и переменную stat в теле функции-обработчика прерывания приравнивать то к 0 то к 1... таким образом включая\выключая...

«Как сердцу выразить себя? … Мысль изреченная есть ложь!»

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

  • 2 недели спустя...
можно канешно и железку к нему приделать чтобы все но тот же монитор выводить.. но ты промучаешься с этим пол жизни :)

вообще ты же не в блокноте я думаю код пишешь? найди софт с эмулятором.. компилируй проверяй.. зогоняй в протеус к примеру там смотри все что касается електроники... все оч удобно ..

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

1) определяешь название функции обабатчока прерывания:

#pragma interrupt_handler <название функции обработчика>:<номер прерывания по ДШ> треугольные скобки ессно не нужны...

например #pragma interrupt_handler int0:1

2) описываешь саму функцию.. ну раз уж ты хоть что то пишешь на си то я думаю и с функциями знаком так что писать не буду :)

к примеру у тебя на сколько я помню в тексте прошивки while(1) и в теле цилка все действия... можно сделать while(stat) и переменную stat в теле функции-обработчика прерывания приравнивать то к 0 то к 1... таким образом включая\выключая...

Спасибо!!!Попробую двигаться дальше!Кстати я хотел запрограмировать ATmega8 подключил 5 проводков к LPT и питание к ней от 3 пальцев!А прога не видет!Что мне делать???Какой лутше собрать програматор(подешевле) ато покупать дорого!

ПОДСКАЖИТЕ КТОНИБУДЬ ПОЖАЛУСТА-САЙТ ИНЕТ МАГАЗИНА ПО ДЕТАЛЯМ В УКРАИНЕ!КИЕВЕ

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

можно канешно и железку к нему приделать чтобы все но тот же монитор выводить.. но ты промучаешься с этим пол жизни :)

вообще ты же не в блокноте я думаю код пишешь? найди софт с эмулятором.. компилируй проверяй.. зогоняй в протеус к примеру там смотри все что касается електроники... все оч удобно ..

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

1) определяешь название функции обабатчока прерывания:

#pragma interrupt_handler <название функции обработчика>:<номер прерывания по ДШ> треугольные скобки ессно не нужны...

например #pragma interrupt_handler int0:1

2) описываешь саму функцию.. ну раз уж ты хоть что то пишешь на си то я думаю и с функциями знаком так что писать не буду :)

к примеру у тебя на сколько я помню в тексте прошивки while(1) и в теле цилка все действия... можно сделать while(stat) и переменную stat в теле функции-обработчика прерывания приравнивать то к 0 то к 1... таким образом включая\выключая...

Чтото у меня не получается!А ето ты мне на языке Си пример показал???Если не сложно очень прошу пожалуйста!Напиши подробней на языке Си простейший пример!Только подробнее объясни ато я совсем новенький и нифига не шарю,но хочется творить :)

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

HOT ICE почему сразу не пишешь каким компилятором программируешь микроконтроллер. Ну я так понимаю, что судя по коду программы, ты используешь компилятор CodeVisionAVR. Если это так, то строка типа << #pragma interrupt_handler int0:1 >> или ей подобные у тебя все равно не про катит. И еще, как подключены у тебя двигатели к МК??? И через что эти двигатели подключенны???

Немного переделан:

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

Chip type : ATmega16

Program type : Application

Clock frequency : 1 MHz

Memory model : Small

External SRAM size : 0

Data Stack size : 256

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

#include <mega16.h>

#include <delay.h>

void main(void)

{

while(1)

{

//Крутить мотор 1 и 2 вперёд//

PORTD.1=1;//сигнал для первого мотра

PORTD.2=0;//Для первого

PORTD.3=1; //Аналогично для второго

PORTD.4=0;

//Остановить первый мотор через 5 микросек

delay_ms(5);

PORTD.1=1;

PORTD.2=1;

delay_us(2500);//не работать 2,5 мс И потом опять работать

}

}

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

СПАВСИБО Код понял!Я даже уже сотворил програматор(Радости было :) пол дня по разному мигал диодами)!ДА ДА Я НА CODEVisionAVR вишу!!!

Двигатели подключены будут через драйвер L293D если смогу его купить,ну или через чтото подобное!Тоесть использовано будет 4 порта!Чтоб вперёд и назад могли независимо крутиться,ну и потом ещё хочу много доробатывать если смогу!Ет я хочу в Техникум принести учителю может она мне автоматом защитает сразу :)Да кстати я перешол на ATmega8!!!

Только мне ещё очень нужно пример прерывания при нажатии кнопки(чтоб после етого вся програ включалась,и так же выключалась),опиши если не сложно!Етого я воопще понять не могу :(

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

Chip type : ATmega16

Program type : Application

Clock frequency : 1 MHz

Memory model : Small

External SRAM size : 0

Data Stack size : 256

*/

// I/O register definitions for ATmega16

#include <mega16.h>

// Standard Input/Output functions

// delay functions

#include <delay.h>

void main(void){

while(1){

//Крутить мотор 1 и 2 вперёд//

PORTD.1=1;//сигнал для первого мотра

PORTD.2=0;//Для первого

PORTD.3=1; //Аналогично для второго

PORTD.4=0;

//Остановить первый мотор через 5 микросек

delay_ms(500);

PORTD.1=1;

PORTD.2=1;

delay_ms(250);//не работать 2,5 мс И потом опять работать

}

}

помоему это обсолютно некорректная программа...

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

тебе нужно для каждого двигателя задействовать только одну ногу микроконтроллера, и на эту ногу подкличать не двигатель, атранзистор по схеме ОЭ, а уж в цепь поллектора включить двигатель...

... и еще прежде чем дергать ногами микроконтроллера нужно описать какие ноги в порту будут входом а какие выходом:

DDRA=0b11111111; - где стоит еденица будет выход, где ноль (которого сдесь нет) будет вход...

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

DDRA=0b11111110;

if (PORTA.0==1){

//сдесь весь код программы... и т.д.

}

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

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

DDRA=0b11111110;

if (PORTA.0==1){

//сдесь весь код программы... и т.д.

}

С двигателями я розобрался уже,как подключать и всё такое и с внешним устройством реагирующим на хлопок тоже почти!

А за код спасибо!

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

Ну вот тебе и программа:

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

Date : 23.01.2007

Chip type : ATmega16

Program type : Application

Clock frequency : 1,000000 MHz

Memory model : Small

External SRAM size : 0

Data Stack size : 256

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

#include <mega16.h>

#include <delay.h>

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

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

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

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

unsigned char f_on;

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

void port_init()

{

PORTA=0x00;

DDRA=0x00;

PORTB=0x00;

DDRB=0x00; // <<ОБРАТИ ВНИМАНИЕ>> можешь использовать любые выводы

// микроконтроллера кроме вывода PB2, к которому ты должен

// подключить источник сигнала (Например: выход усилителя,

// кнопку к этому выводу я тебе подключать не советую, т. к.

// тогда придется подавлять дребезг контактов)

// Дребезг контактов можно устранить или аппаратно или

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

// тогда я не показываю как это делается.

PORTC=0x00;

DDRC=0x00;

PORTD=0x00;

DDRD=0x00;

}

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

void int_init()

{

/* Немного опишу: */

// Включено прерывание от вывода PB2 по фронту сигнала (Rising Edge

// (если тебе не нравиться прерывание по фронту сигнала можешь сделать

// по срезу для этого нужно настроить регистр MCUCSR=0x00 )

// Я включил прерывание от этого вывода т. к. вижу, что для управления

// двигателем ты используешь выводы PD2 и PD3.

// INT0: Off

// INT1: Off

// INT2: On

// INT2 Mode: Rising Edge

GICR|=0x20;

MCUCR=0x00;

MCUCSR=0x40;

GIFR=0x20;

}

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

void an_comp_init()

{

// Analog Comparator: Off

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

ACSR=0x80;

SFIOR=0x00;

}

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

void engine_on()

{

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

В этой функции у тебя должен быть код для включения двигателей

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

}

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

void engine_off()

{

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

В этой функции у тебя должен быть код для ВЫключения двигателей

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

}

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

interrupt [EXT_INT2] void ext_int2_isr(void)

{

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

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

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

if (f_on) f_on = 0;

else f_on = 1;

}

void main(void)

{

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

port_init();

int_init();

an_comp_init();

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

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

while (1)

{

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

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

}

}

Надеюсь разбрешься (ОНА РАБОЧАЯ СРАЗУ ГОВОРЮ)

Maniak прав в том, что ты не рационально используешь 4 вывода МК вместо двух. Я еще бы добавил, что вместо транзистора использовал <<оптическую развязку>>, чтобы в МК не проникали помехи от двигателей. Хотя решать тебе(просто потом можешь столкнуться с проблемами).

ЭЭЭ немного перестарался с крупным шрифтом, зато прикольно получилось. :D

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

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

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

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

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

ДА ЭТ ТОЧНО ПРИКОЛЬНО ПОЛУЧИЛОСЬ :D !!!

Ты здесь может опечатался // f_on = 1 - двигатель ВЫключен?Место 1 нужно 0???

Спасибо что своё время потратил,чтоб розъяснить мне!

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

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

if (f_on) f_on = 0;

else f_on = 1;?

Я роспечатаю етот код теперь,возьму по языку Си учебник!И буду розбираться что за что отвечает!

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

Вот прога без очепятки!!!

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

Date : 23.01.2007

Chip type : ATmega16

Program type : Application

Clock frequency : 1,000000 MHz

Memory model : Small

External SRAM size : 0

Data Stack size : 256

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

#include <mega16.h>

#include <delay.h>

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

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

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

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

unsigned char f_on;

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

void port_init()

{

PORTA=0x00;

DDRA=0x00;

PORTB=0x00;

DDRB=0x00; // <<ОБРАТИ ВНИМАНИЕ>> можешь использовать любые выводы

// микроконтроллера кроме вывода PB2, к которому ты должен

// подключить источник сигнала (Например: выход усилителя,

// кнопку к этому выводу я тебе подключать не советую, т. к.

// тогда придется подавлять дребезг контактов)

// Дребезг контактов можно устранить или аппаратно или

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

// тогда я не показываю как это делается.

PORTC=0x00;

DDRC=0x00;

PORTD=0x00;

DDRD=0x00;

}

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

void int_init()

{

/* Немного опишу: */

// Включено прерывание от вывода PB2 по фронту сигнала (Rising Edge

// (если тебе не нравиться прерывание по фронту сигнала можешь сделать

// по срезу для этого нужно настроить регистр MCUCSR=0x00 )

// Я включил прерывание от этого вывода т. к. вижу, что для управления

// двигателем ты используешь выводы PD2 и PD3.

// INT0: Off

// INT1: Off

// INT2: On

// INT2 Mode: Rising Edge

GICR|=0x20;

MCUCR=0x00;

MCUCSR=0x40;

GIFR=0x20;

}

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

void an_comp_init()

{

// Analog Comparator: Off

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

ACSR=0x80;

SFIOR=0x00;

}

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

void engine_on()

{

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

В этой функции у тебя должен быть код для включения двигателей

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

}

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

void engine_off()

{

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

В этой функции у тебя должен быть код для ВЫключения двигателей

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

}

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

interrupt [EXT_INT2] void ext_int2_isr()

{

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

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

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

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);

}

Сейчас обьясню как работает эта программа:

При включении питания микроконтроллера, МК попадает в главную функцию void main(), где сначала запрещаются все прерывания #asm("cli"), а за тем происходит инициализация (настройка): всех портов port_init(), настраиваются внешние прерывания int_init() выключается аналоговый компаратор (это нужно для уменьшения потребления МК), сбрасывается флаг f_on=0, и затем настройка периферии МК заканчивается и можно теперь разрешить все прерывания #asm("sei"). Затем микроконтроллер идет на исполнения цикла while (1), этот цикл будет выполнятся бесконечно, т. е до тех пор пока к микроконтроллеру подключено питание. В этом цикле сейчас я убрал условие if (f_on) и как видишь, перебросил его в перывание, это сделано для того, чтобы МК несколько раз не проверял это условие, конечно и по другому можно сделать, но это отбросим... не буду я тебе забивать голову всякой ерундой. Вернемся к программе: И так МК находится в бесконечном цикле, далее пусть на вход МК PB2 поступит один импульс от внешней схемы (я не знаю, что именно у тебя будет(но внешняя схема, как ты понимаешь должна формировать импульс не любой формы, а только прямоурольной стандарт TTL, т. е логоческий ноль должен соответствовать уровню напряжения 0...0.7 В, а логическая еденица 4...5 Вольт)), дак вот по фронту этого сигнала МК идет на прерывание interrupt [EXT_INT2] void ext_int2_isr(), где он выполняет два условия, сначала он заходит в условие if (f_on) сдесь он проверяет состояние глобальной переменной f_on, если f_on == 1(т. е если наша глобальная переменная равна еденицы), то выполняется код f_on = 0;, если f_on == 0](т. е если наша глобальная переменная равна нулю), то выполняется код f_on = 0;. Как ты помнишь наша переменная равнялась нулю, т. к мы ее обнуляли, то выполняется код f_on = 1;, т. е нашей переменной присваивается еденица (т. е это будет знак того, что двигатель должен включится), дальше МК идет на выполнение другово условия if (f_on), как ты помнишь у нас f_on равняется еденицы, значит условие выполнится и мы попадем в функцию engine_on();, в которой должен содержаться код включения двигателя, и все МК выходит из прерывания и идет в бесконечный цикл while (1), где он будет находится всегда, пока на выводе PB2 не появится следующий сигнал. По фронту следующего сигнала МК опять идет в прерывание interrupt [EXT_INT2] void ext_int2_isr(), где проверяются два условия, как ты помнишь теперь у нас переменная f_on равняется еденице значит выполнится код f_on = 0;, а после этого во втором условии выполнится функция engine_off(), где должен содержаться код выключения двигателя. Затем МК выходит из прерывания в бесконечный цикл, и там остается до следующего фронта сигнала...и. т. д. (все повторяется). Как видишь в прерывании есть два одинаковых условия, значит их можно объединить, получится:

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

else { f_on = 1; engine_on(); } // Включение

Даже так код красивее смотрится :)

Ну я надеюсь что я тебе все обьяснил, потому что я понимаю что книга по С++ мало тебе поможет, она ведь по СИ, а не по микроконтроллерам. Если где-то меня не понял, то пиши обьясню.

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

Ну я надеюсь что я тебе все обьяснил, потому что я понимаю что книга по С++ мало тебе поможет, она ведь по СИ, а не по микроконтроллерам. Если где-то меня не понял, то пиши обьясню.

ОК!!!Спасибо!

В теле форума читал и начал понимать,как только появится время полностью роздуплюсь!Установлю под ATmega8 порты!И тогда отпишусь!Проверишь!ДА ещё!У тебя случайно нет файла в котором кратко описаны функцыи для СИ?Чтоб на 2-х листиках напечатать??

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

В теле форума читал и начал понимать,как только появится время полностью роздуплюсь!Установлю под ATmega8 порты!И тогда отпишусь!Проверишь!

Выкладывай, проверю!!!

ДА ещё!У тебя случайно нет файла в котором кратко описаны функции для СИ?Чтоб на 2-х листиках напечатать??

А вот сдесь я тебя совсем не понял, ты имеешь ввиду вообще описание всех функций на СИ(Например: как объявляются и создаются локальные переменные, или как возвратить переменную из функции, где должны распологаться функции, или как функции вообще устроены), или тебе нужны описания функций CodeVisionAVR для этих микроконтроллеров. Или... я просто не могу тебя понять, поконкретнее пожалуйста...

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

Я могу сказать, если у тебя пока с функциями полохо получается, то для твоей задачки, можно их и не использовать, просто писать программу пока в главной функции void main() и все, для меня использование функций намного удобнее, программа универсальнее получается. Могу даже дать пример: Один раз мне понадобилось использовать встроенную энерго независимую память EEPROM, написал я две функции: одну для записи в память, а другую для чтения из нее. И теперь оформил эти две функции одним файлом <eeprom.h> и, когда теперь использую EEPROM мне не надо заново описывать как читать или записывать в EEPROM а просто включаю этот файл с двумя функциями #include <eeprom.h> и пользуюсь...

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

Да для CodeVisionAVR,описание вкратце(что делает,и как происать) если есть такое!!!

Я вот ещё купил 7-и сегметных индикаторов 4 шт!И хочу выводить на них символы!Можно както прописать что например для буквы"А"нужно подать еденицу на определенные контакты??? ну типа A=0101110!Типа так!

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

Да для CodeVisionAVR,описание вкратце(что делает,и как происать) если есть такое!!!

Дак все написано в хелпе по CodeVisionAVR, правда на английском, но это тоже не проблема - сейчас столько электронных переводчиков!!!

Я вот ещё купил 7-и сегметных индикаторов 4 шт!И хочу выводить на них символы!Можно както прописать что например для буквы"А"нужно подать еденицу на определенные контакты??? ну типа A=0101110!Типа так!

Можно, почему нельзя.

Пишешь после строк включения в программу файлов вот эту строку <<#define A 0x2E>>.

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

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

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 <mega16.h>

#include <delay.h>

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

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

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

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

unsigned char f_on;

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

void port_init()

{

PORTA=0x00;

DDRA=0x00;

PORTB=0x00;

DDRB=0x00; // <<ОБРАТИ ВНИМАНИЕ>> можешь использовать любые выводы

// микроконтроллера кроме вывода PB2, к которому ты должен

// подключить источник сигнала (Например: выход усилителя,

// кнопку к этому выводу я тебе подключать не советую, т. к.

// тогда придется подавлять дребезг контактов)

// Дребезг контактов можно устранить или аппаратно или

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

// тогда я не показываю как это делается.

PORTC=0x00;

DDRC=0xFF;

PORTD=0x00;

DDRD=0x00;

}

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

void int_init()

{

/* Немного опишу: */

// Включено прерывание от вывода PB2 по фронту сигнала (Rising Edge

// (если тебе не нравиться прерывание по фронту сигнала можешь сделать

// по срезу для этого нужно настроить регистр MCUCSR=0x00 )

// Я включил прерывание от этого вывода т. к. вижу, что для управления

// двигателем ты используешь выводы PD2 и PD3.

// INT0: Off

// INT1: Off

// INT2: On

// INT2 Mode: Rising Edge

GICR|=0x20;

MCUCR=0x00;

MCUCSR=0x40;

GIFR=0x20;

}

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

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);

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

PORTC.0=0;

PORTC.1=0;

delay_ms(100);

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

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

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

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

{

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

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

PORTC.1=0;

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

PORTC.3=0;

}

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

interrupt [EXT_INT2] void ext_int2_isr()//Вот ета строка віделяется как ошибка

{

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

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

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

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"); // Разрешение внешних прерываний }

} } //скобки как ошибка

Блин я какойто дурачина наверно!Я не задолбал??? :)

Посмотри пожалуйста что я там наизменял!Те строки на которых у меня ошибки я подписал!

Ты мне очень помогаеш я даже смог вывести на индикатор то что хотел!!! :)

Кстати а как создать библиотеку .H ???

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

Красным цветом я отметил ошибки:

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

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 <mega16.h>

#include <delay.h>

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

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

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

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

unsigned char f_on;

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

void port_init()

{

PORTA=0x00;

DDRA=0x00;

PORTB=0x00;

DDRB=0x00; // <<ОБРАТИ ВНИМАНИЕ>> можешь использовать любые выводы

// микроконтроллера кроме вывода PB2, к которому ты должен

// подключить источник сигнала (Например: выход усилителя,

// кнопку к этому выводу я тебе подключать не советую, т. к.

// тогда придется подавлять дребезг контактов)

// Дребезг контактов можно устранить или аппаратно или

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

// тогда я не показываю как это делается.

PORTC=0x00;

DDRC=0xFF;

PORTD=0x00;

DDRD=0x00;

}

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

void int_init()

{

/* Немного опишу: */

// Включено прерывание от вывода PB2 по фронту сигнала (Rising Edge

// (если тебе не нравиться прерывание по фронту сигнала можешь сделать

// по срезу для этого нужно настроить регистр MCUCSR=0x00 )

// Я включил прерывание от этого вывода т. к. вижу, что для управления

// двигателем ты используешь выводы PD2 и PD3.

// INT0: Off

// INT1: Off

// INT2: On

// INT2 Mode: Rising Edge

GICR|=0x20;

MCUCR=0x00;

MCUCSR=0x40;

GIFR=0x20;

}

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

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);

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

PORTC.0=0;

PORTC.1=0;

delay_ms(100);

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

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

} // Ты забыл поставить эту скобку, скобка в си это самое главное, это начало и конец программы никогда не забывай

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

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

{

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

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

PORTC.1=0;

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

PORTC.3=0;

}

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

interrupt [EXT_INT2] void ext_int2_isr()//Вот ета строка віделяется как ошибка

{

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

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

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

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); // Ты забыл поставить этот бесконечный цикл, а то потом будешь говорить что МК нестабильно работает...

} //скобки как ошибка // А вот сдесь зачем тебе две скобки,

И вот еще:

Chip type : ATmega8

#include <mega16.h>

Вроде ты перешел на ATmega8, а в программу включаешь файл mega16.h, это ведь тоже БОЛЬШАЯ ошибка.

И еще, советую скачать Datasheet на Atmega8!!! А уж потом и о другом поговорим.... (К примеру просто: ты перешел на ATmega8, а прерывания у него от INT2 НЕТ. Так что придется переписать прерывание от INT2:

interrupt [EXT_INT2] void ext_int2_isr()//Вот ета строка віделяется как ошибка

{

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

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

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

if (f_on) f_on = 0;

else f_on = 1;

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

else engine_off(); // ВЫключение Вот ета строка віделяется как ошибка

}

Изменено пользователем 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>

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

// 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()

{

// INT0: Off

// INT1: Off

// INT2: On

// INT2 Mode: Rising Edge

GICR|=0x20;

MCUCR=0x00;

MCUCSR=0x40;

GIFR=0x20;

}

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

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);

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

PORTC.0=0;

PORTC.1=0;

delay_ms(100);

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

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

} //

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

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

{

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

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

PORTC.1=0;

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

PORTC.3=0;

}

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

interrupt [EXT_INT1] void ext_int1_isr()

{

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

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

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

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); // Ты забыл поставить этот бесконечный цикл, а то потом будешь говорить что МК нестабильно работает...

}

Прерывания я же переписал?Теперь если залью в Мегу,будет работать??Нажму кнопкой пока PB2.произойдёт прерывание и вместо моторов пока светодиоды поставлю то они начнут светиться?Что здесь - interrupt [EXT_INT1] void ext_int1_isr() показывает на то что прерывание произойдёт от PB2???Очень хочу понять!!!

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

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

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

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

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

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

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

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

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

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

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

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