Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2008, 21:41   #1
Raptor
Пользователь
 
Регистрация: 24.11.2007
Сообщений: 50
По умолчанию Коментарии к проге на С для мк

Код:
#include <avr/io.h>
#include <avr/iom128.h>
#include <avr/interrupt.h>
#include <avr/signal.h>      
#include <math.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>

#define BIT0 0x01 
#define BIT1 0x02 
#define BIT2 0x04 
#define BIT3 0x08 
#define BIT4 0x10 
#define BIT5 0x20 
#define BIT6 0x40 
#define BIT7 0x80 

volatile unsigned long long taktis; //глоб пер числа тактов

/* функция обработки прерывания таймера*/

SIGNAL(SIG_OVERFLOW0)
{
 taktis=taktis+2048; //2048=8x256 
}

/*функция инициализации портов*/
void port_init(void)
{ 
 DDRA  = 0x00; 
 DDRB  = 0x00; 
 DDRC  = 0x00; 
 DDRD  = 0xFF; 
 DDRE  = 0x00; 
 DDRF  = 0x00; 
 DDRG  = 0x00; 

 PORTA  = 0x00;
 PORTB  = 0x00;
 PORTC  = 0x00; 
 PORTD  = 0x00; 
 PORTE  = 0x00; 
 PORTF  = 0x00; 
 PORTG  = 0x00; 

 return;
}

void init_devices(void)
{
 cli(); //запрещение всех прерываний
 XDIV  = 0x00; 
 XMCRA = 0x00; //внешняя память не используется
 MCUCR = 0x00; //не используются режимы экономии энергии
 port_init(); //инициализация портов

 EICRA = 0x00; 
 EICRB = 0x00; 
 EIMSK = 0x00; 
 ETIMSK = 0x00; 

 TCCR0 = 0b00000010; 
 TIMSK = 0b00000001; 
 sei(); 
 return; 
}

int main()
{
	init_devices();
	unsigned char m,i;
	i=0;
m=0x80;
while(1)
	{  
	if(taktis > 14745600)      //раз в сек
	{
	           PORTD=~(m>>i);    
		i++;
taktis = 0;
		if(i>=8) i=0;
	}
        }          
}
MK ATmega 128
Результат выполнения проги - бегающий огонек (влево).

Помогите, пожалуйста, с комментами. В частности:
1) Когда происходит переполнение таймера и вызывается функция SIGNAL?
2) Как происходит PORTD=~(m>>i) побитовое смещение?

Спасибо!

Последний раз редактировалось Raptor; 12.11.2008 в 00:39.
Raptor вне форума Ответить с цитированием
Старый 12.11.2008, 00:35   #2
maxvodo.dll
Пользователь
 
Аватар для maxvodo.dll
 
Регистрация: 24.10.2008
Сообщений: 17
По умолчанию

есть недосказанность. sei(); - где?
без нее непонятно как и где изменяется taktis
в бесконечном цикле она занудяется если > 14745600, вот где увеличивается непонятно.
maxvodo.dll вне форума Ответить с цитированием
Старый 12.11.2008, 00:41   #3
Raptor
Пользователь
 
Регистрация: 24.11.2007
Сообщений: 50
По умолчанию

sei() есть. Выделил bold. Разрешает все разрешенные прерывания.
taktis увеличивается в функции SIGNAL. Я так понял, что SIGNAL автоматически вызывается при переполнении таймера-счетчика0.

Последний раз редактировалось Raptor; 12.11.2008 в 00:49.
Raptor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по проге Smorodinka Microsoft Office Excel 7 06.06.2008 23:10
Ошибка в проге Detrix Помощь студентам 1 12.03.2008 08:28
Ассемблер. Факториал числа. Коментарии к программе Irwin Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 03.05.2007 13:52
ADO. коментарии в Memo Чайка БД в Delphi 2 19.04.2007 20:07