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

Программирование Микроконтроллера Atmega8515 В Среде Avr Studio 4.0


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

Добрый день всем пользователям данного форума, я новенький, не судите строго. Учусь в институте, препод задал задание запрагроммировать микроконтроллер на языке Ассамблер. Нужна Ваша помошь, потому как я совершенно не понимаю с какой стороны подойти к данной задаче.

Сама задача:

Определить время нажатого состояния кнопки SW2 в секундах в диапазоне от 0 до 15 секунд.

Отобразить результат в двоичном коде на светодиодах LED0... LED3 после отпускания кнопки.

Кнопки подключены к порту B, а светодиоды - к порту С.

Временные задержки формировать аппаратным способом(с помошью таймеров)

P.S.

Может быть кто нибудь меня сможет выручить, буду очень благодарен, заранее спасибо.

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

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

...задание запрагроммировать микроконтроллер на языке Ассамблер. ... не понимаю с какой стороны подойти к данной задаче.

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

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

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

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

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

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

...задание запрагроммировать микроконтроллер на языке Ассамблер. ... не понимаю с какой стороны подойти к данной задаче.

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

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

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

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

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

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

данную программу необходимо сдать через неделю

А полный курс вам вчера прочитали?

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

Я учусь на заочном, курс прошли за три лекции, только теория. Не осуждайте, но для меня теории не достаточно, особенно по такому предмету, который касается программирования. Поэтому прошу помощи.

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

Никто вам в помощи не отказывает. Начните писать, будут вопросы - милости просим. А всё за вас никто делать не будет.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

Я учусь на заочном, курс прошли за три лекции, только теория. Не осуждайте, но для меня теории недостаточно...

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

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

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

Не квалифицированный, но везучий электрик знает в лицо всех архангелов.

Прогресс сделал розетки недоступными для большинства детей. Умирают только самые одаренные.

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

fxtimoxa, задание при старании на два от силы на три дня. Есть два способа решения, первый - заплатить деньги

и всё решается (самый простой), второй - взять умную книгу (можно с интернета) с командами на Ассемблере и

главное, написать подробный алгоритм (самое сложное) желаемого хода программы, по завершению с помощью

книги перевести алгоритм в Ассемблерные команды и задача решена (лично я работаю с PIC-ами).

Удачи.

Я не говорю панацеи - я предлагаю варианты

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

Белов А В разработка устройств на микроконтроллерах, там есть примеры программ на ассемблере и С если пошевелить мозгами можно из примеров сложить то что требуется.

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

Возвращаясь к теме программирования, написал на языке C, но не мону понять почему я не могу вывести значение seconds на диоды?

Вот данный код:

#include <avr/interrupt.h>

#include <stdio.h>

#include <avr/io.h>

#define F_CPU 1000000UL

#include <util/delay.h>

#define BUTTON_PIN_NUMB 2

unsigned int ovfCounter;

unsigned char timerFlag;

void init(void);

void valueOutput(unsigned int t);

int main(void){

init();

unsigned char pressFlag = 0;

while(1){

if(PINB&(1<<BUTTON_PIN_NUMB))

{

if(pressFlag==1)

{

valueOutput(ovfCounter);

timerFlag = 0;

ovfCounter = 0;

}

pressFlag = 0;

}

else{

if(pressFlag == 0)

{

_delay_ms(50);

if(!(PINB&(1<<BUTTON_PIN_NUMB)))

{

pressFlag = 1;

timerFlag = 1;

}

}

}

}

}

void init(void){

DDRB&=~(1<<BUTTON_PIN_NUMB);

PORTB|=1<<BUTTON_PIN_NUMB;

DDRC|=(1<<0)|(1<<1)|(1<<2)|(1<<3);

PORTC&=~((1<<0)|(1<<1)|(1<<2)|(1<<3));

/*DDRB=0;

PORTB=0xFF;

DDRC=0xFF;

PORTC=0b11110000;*/

TIMSK|=1<<TOIE0;

TCCR0=0b00000101;

DDRA=0xFF;

timerFlag = 0;

ovfCounter = 0;

sei();

}

void valueOutput(unsigned int value){

unsigned char seconds=value/1000;

PORTC=seconds;/*?????????????????*/ Непонятно для меня место

}

ISR(TIMER0_OVF_vect){

if (timerFlag==1){

ovfCounter++;

}

}

схему собрал в PROTEUS, но диоды не горят.

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

препод задал задание запрагроммировать микроконтроллер на языке Ассамблер.

Понравится ли преподу схема на С?

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

почему я не могу вывести значение seconds на диоды?

Потому что это, к сожалению, набор команд, а не программа.

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

Я не раздаю удочки. Я продаю рыбу.

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

написал на языке C

PORTC=seconds;/*?????????????????*/ Непонятно для меня место

Одно из двух, либо писал не сам, либо писал под наркозом.

На, двоечник! Не знаю как в Протеусе, а в Студии 4.18 это работает. Учи ассемблер!

/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.8 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

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

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

#define F_CPU 1000000UL
#define BUTTON_PIN_NUMB 2

unsigned char pressFlag, timerFlag;
unsigned int ovfCounter;

void init(void)
{DDRB&=~(1<<BUTTON_PIN_NUMB);
PORTB|=1<<BUTTON_PIN_NUMB;
DDRC|=(1<<0)|(1<<1)|(1<<2)|(1<<3);
PORTC&=~((1<<0)|(1<<1)|(1<<2)|(1<<3));
TCCR0=(1<<CS01);
TIMSK=(1<<TOIE0);
timerFlag = 0;
ovfCounter = 0;
#asm("sei")
}

//interval 1 ms
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{TCNT0=132;
if(timerFlag==1) ovfCounter++;
}

void main(void)
{init();
pressFlag = 0;
while(1)
{if((PINB&(1<<BUTTON_PIN_NUMB))!=0)
{if(pressFlag==1)
{PORTC=ovfCounter/1000;
timerFlag = 0;
ovfCounter = 0;
};
pressFlag = 0;
}
else
{if(pressFlag == 0)
{delay_ms(50);
if((PINB&(1<<BUTTON_PIN_NUMB))==0)
{pressFlag = 1;
timerFlag = 1;
};
};
};
};
}

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

  • 4 недели спустя...

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

.list

.include "m8515def.inc"

.def temp = R16

.def count = R17

.def timer = R18

.def button = R19

.def null = R20

.def one = R21

.cseg

.org 0x00

rjmp INI

.org 0x04

rjmp TIM1_COMPA

INI:

ldi temp, high(RAMEND)

out SPH, temp

ldi temp, low(RAMEND)

out SPL, temp

ldi temp, 0b11111111 ;Записываем все единицы в temp

out DDRC, temp ;Устанавливаем все порты
C
на вывод

ldi temp, 0b00000000 ;Записываем все нули в temp

out DDRB, temp ;Устанавливаем все порты
B
на ввод

ldi temp, (1<<PB2)

out PORTB, temp

ldi temp, (1<<PB2)

out PINB, temp

;------
--
Устанавливаем значение предделителя 1024--
--------------------------

ldi temp,0b00000000

out TCCR1A,temp

ldi temp,0b00000101

out TCCR1B,temp

;
Устанавливаем значение после деления в регистр сравнения (976)----
-

ldi temp,0b00000011

out OCR1AH,temp

ldi temp,0b11010000

out OCR1AL, temp

;-------------------------------------------------------------------------------------------------

ldi temp, 0b01000000 ;Разрешить прерывание совпадения таймера А

out TIMSK, temp

sei ;Разрешить глобальное прерывание

MAIN:
;-------------------------------------------------------------------------------------

out TCNT1H, null

out TCNT1L, null

in button, PINB ;Слушаем кнопку на нажати

cpi button, 0 ;Сравниваем при нажатии с 0, если нажата выполняем

;след. команду, если не нажата, идем в начало и снова слушаем

breq LOOP ;Метка

rjmp MAIN ;Метка

LOOP:
;-------------------------------------------------------------------------------------

in button, PINB ;Проверяем на нажатие

cpi button,1 ;Убеждаемся, что кнопка не отпущена

breq LED ;Метка

rjmp LOOP ;Метка

TIM1_COMPA:
;-------------------------------------------------------------------

INC count ;Увеличиваем значение count на +1

out TCNT1H, null ;Обнуляем регистры

out TCNT1L, null ; Обнуляем регистры

reti ;Выходим из прерывания

LED:
;-------------------------------------------------------------------------------------

cpi count,15 ;Сравниваем значение count с 15

BRSH LED2 ;Если больше 15, то идем LED2

BRLO LED1 ;Иначе идем LED1

LED1:
;-------------------------------------------------------------------------------------

out PORTC, count ;Выводим на порты значение count

clr count ;Очищаем count

rjmp MAIN ;Идем по метке

LED2:
;------------------------------------------------------------------------------ ldi

temp , 15 ;Записываем в
temp
15

out PORTC, temp ;Выводим на порты C значение 15

clr count ; Очищаем count

rjmp MAIN ; Идем по метке

Хочу спросить, будет ли работать эта программа на плате STK500, 18 июня буду сдавать. Хочу быть уверен, но без Вас наврятли смогу.

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

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

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

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

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

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

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

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

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

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

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