Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прием данных на Атмеге
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Vny4ek
Здрастье, есть у меня такая проблема.
Атмега, и приемник на 433Мгц ну от сигналки. Вот на ножку чипа приходит сигнал с приемника. Подскажите как выглядеть будет программа что бы просто записать принятые данные в виде единиц и нулей. Пакет приходит так:
"
Вся передача опирается на элемнтарный отрезок времени названный Те и равный обычно 400мкс. (документацией нормирован разброс от 280мкс до 620мкс).

Итак передаваемый пакет:
Он состоит из преамбулы (длиться 23Те, и нужна для того, чтоб оторвать приемник сиги от сладостного прослушивания помех), за ней следует заголовок пакета (header) – равен 10Те, и нужен для того чтоб проц в сиге смог определить длительность Те у принимаемого пакета данных… Затем идут собственно данные (66 бит или 198Те), и наконец Guard Time – время для того чтобы сига переварила принятое (39Те).


Теперь о передаче данных.. бит передается за время равное 3Те.. В течении 1-го Те передается обязательно высокий уровень (красная часть), 2-е Те это собственно значение передаваемого бита (только инвертированное, те лог1 = низкий уровень, а лог0 соответственно = высокий уровень) – синяя часть.. И наконец в течении 3-го Те передается обязательный низкий уровень (зеленая часть)..

"

ВОТ! хочется попроще и оптимальный прием пакета
Dog Pawlowa
Цитата(Vny4ek @ Nov 19 2008, 13:26) *
Здрастье, есть у меня такая проблема...

Проблема у Вас какая - не хочется программировать? biggrin.gif
Есть два варианта:
1. легкий : подсказываю - можно обнаружить начало передачи по тайм-ауту, использовать таймер в режиме захвата, записать все интервалы переходов в массив и их спокойненько обработать после приема посылки.
2. жесткий: вообще-то у меня и исходники есть, на которые я потратил некоторое время...
Vny4ek
нет проблема не в этом. Хочется просто не догоню как начать, мало опыта, а для ознакомления исходниками не поделитесь? Если конечно на С они а если для Кодвижена то вообще самолет!!!
Dog Pawlowa
Цитата(Vny4ek @ Nov 19 2008, 13:58) *
а для ознакомления исходниками не поделитесь?

Нет, не поделюсь. Я только со своими дипломниками исходниками делюсь smile.gif
Спрашивайте конкретно - буду отвечать. А так... у меня проблема...дайте исходники - вы ничему и не научитесь.
Vny4ek
ок, если можно по подробней с чего начать, программу
vvvvv
Идея такая. Настраиваешь вход с радиоканала на прерывание по перепаду, неважно с нуля в единицу или наоборот.
Настраиваешь таймер, лучше 16 битный, чтобы он постоянно по циклу считал.
При изменении уровня на линии проц попадает в прерывание PCINT.
Первым делом считываешь показание таймера, а сам таймер обнуляешь.
Конечно в первом перепаде показания таймера от балды.
Но вот во втором, ты уже попадешь в PCINT и таймер покажет длину импульса.
Все есть длина импульса, осталось проверить наш это импульс или нет, т.е. ширина импульса скажем больше 0.5Te и меньше 1.5Te.
Ведь преамбула с определенной частотойю, ширина импульса Te, верно?
Далее если скажем есть 10 попаданий в размеры преамбулы, проц принимает решение, что идет преамбула.
Все устанавливаем флаг, я в преамбуле.
Далее, если слишком большая пауза, проц определяет срыв преамбулы, сбрасывается флаг преамбулы, проц опять в ожидании пакета.
Если с преамбулой все ОК, проц ждет заголовок пакета.
Как я понял заголовок пакета это пауза 10 Te.
Т.е. при очередном PCINT в таймере лежит значение 10 Te. Проверяем что это значение в пределах 9Te и 11Te.
Если да, значит пришел заголовок.
Проц сбрасывает флаг преамбулы и устанавливает флаг приема данных.
Теперь попадая в прерывание PCINT проц будет по этому флагу знать, что
может быть длина импульса Te, а может быть 2Te, ведь это режим приема данных.
Ну и все, теперь осталось проверять какая длительность после перепада из 0 в 1. Если =2Te значит пришел бит "0", если = Te пришел бит "1".
Конечно после "0" будет перепад из 1 в 0 = Te, а после "1" перепад из 1 в 0 = 2Te, их проверяем и пропускаем, ждем перепада из 0 в 1.
Если же очередная длительность больше 3Te, или меньше 0.5Te значит это помеха или срыв пакета, проц уходит опять на начало, в ожидание новой преамбулы нового пакета.
Единственное замечание, без цифрового осциллографа это будет очень трудно сделать.
Исходников не жалко, но там совсем другой протокол, скорее запутает.
Начинай писать прямо свое по вышеописанному алгоритму. Сработает точно.
Vny4ek
СПАСИБО большое! То что надо, я потихоньку начинаю, писать, если что подскажете по ходу. Толковый ответ!
Vny4ek
будьте добры ткните носом в апноут, желательно что бы я понял что в кодвижене надо делать. Спасибо!
Vny4ek
Уважаемые, подскажите, обязательно ли в данном примере использовать таймер? (опыта с ними пока мало) может кто поможет начинающему "vvvvv" написал все внятно но многое у меня из за синтаксиса чтоли не проходит, будьте добры помогите начать. Причем я не прошу сделать за меня, я прошу помочь разобраться.
SasaVitebsk
А что тут непонятного?
Инициализация таймера например normal-Fclk/1. Это зависит от частоты процессора. То есть надо посчитать сколько будет занимать один твой Те в "тиках" таймера.
Для указанного и проца mega8 инициализация будет такой:

TCCR1B=1;

Чтение в прирывании:

i = TCNT1;

При том что i - 16 бит без знака.

Для вычисления длины импульса надо учитывать кольцо. То есть учитывать то обстоятельство, что после значения таймера 65535 следует значение 0.

Допустим предыдущее знаение будет i1. Длина импульса результирующая l (16 бит со знаком), тогда вычисление следующее:

l=i-i1; // вычесть из текущего значения таймера предыдущее
if(l<0)l+=65536; // учесть перехлёст
xemul
Майкрочип описАл процесс приема Keeloq не в одном даташите (естесно, под PIC'и, но с достаточным количеством комментариев).
http://www.google.com/search?hl=ru&rls...BC%D0%B0+Keeloq
в одной из первых найденных ссылок
http://www.microchip.ru/phorum/read.php?f=...23&t=141823
достаточно информации для размышления.
Я бы не стал углубляться в идею работать по прерыванию от приемника - не будете вылезать из прерываний, а толку получится чуть.
Vny4ek
to:SasaVitebsk спасибо большое, я потихоньку начинаю понимать, давайте я начну делать а если Вам не сложно вы поправите и скажете где ошибся
to:xemul да я видел апноут, причем принять пакет с ним у меня успешно получается, но там не считается насколько мне известно точно время одного TE, а мне это важно т.к. он может отличаться, да и опять же цель самому (пусть и кривовато) разобраться и научиться. спасибо за помощь.
И что значит не углублятся в прерывания? Можно ли мою задачу решить без использования таковых? ну например используя оператор if (PINA.0==1) {запуск отсчета счтиающего длительность импульса} или я не прав? без прерываний тут не обойтись?
xemul
Цитата(Vny4ek @ Apr 29 2009, 16:39) *
to:xemul да я видел апноут, причем принять пакет с ним у меня успешно получается, но там не считается насколько мне известно точно время одного TE, а мне это важно т.к. он может отличаться, да и опять же цель самому (пусть и кривовато) разобраться и научиться.

Считается. Te = Th/10.
Цитата
И что значит не углублятся в прерывания? Можно ли мою задачу решить без использования таковых? ну например используя оператор if (PINA.0==1) {запуск отсчета счтиающего длительность импульса} или я не прав? без прерываний тут не обойтись?

Достаточно прерывания от 8-битного таймера.
Для ловли хидера настраиваете таймер на интервал TE_MIN/2, ждете -\____/-, удовлетворяющий допускам на Th (по каждому прерыванию таймера if(!PINA.0) Th += TE_MIN/2; else Th = 0;), вычисляете Te.
Дальше можно по аппноту, но лучше переложить аппнот на использование прерываний.
Vny4ek
Я уже не первый день не могу никак освоить эти таймеры, будьте добры доступным языком объясните пожалуйста, книги я читал, но там либо нет таких задач, либо ассемблер.
Сейчас я не пойму как при изменении уровня из 0 в 1 и через некторое время снова в 0, (____|---?---|____)запустить таймер, который измерит длинну импульса (пусть даже в такатх процессора,а не в секунадх). Пожалуйста подскажите наиболее доступно, т.к. я начинающий. Если кто-нибудь даст ссылку или выложит учебник с примерами в кодвижене буду ОЧЕНЬ благодарен.
Vny4ek
Ребят, ну подскажите пожалуйста.
rezident
Таймер не нужно запускать по перепаду. Таймер должен всегда работать с (авто)переполнением. Перепад на входе фиксируется в регистре захвата (capture). Беззнаковая разность двух соседних значений, полученных из регистра захвата, дает длительность между фронтами в тактах таймера. Поделите эту разность на частоту тактирования таймера и получите длительность импульса в привычных единицах измерения времени. Следует только помнить, что максимальный период измеряемого импульса зависит от периода переполнения таймера. Если его (периода переполнения) не хватает для ваших задач, то разрядность таймера можно расширить программно. Для этого заводите программный счетчик (бОльшей разрядности, чем позволяет аппаратно таймер), который нужно инкрементировать на величину разрядности таймера при его переполнении. А по прерыванию от фронта импульса значение из регистра захвата суммируете со значением программного счетчика и для расчета периода используете уже это полученное число.
Vny4ek
А можно пример привести, для кодвижена, принцип я понял достаточно хорошо но на практике начать разбираться с ним никак не смогу.
Я думаю людям с опытом не сложно в кодвижене простой исходник написать, жалательно откоментировав, то что я не понял. Все ведь начинали и не сразу все освоили. Спасибо заранее.
rezident
Предлагаю сделать наоборот. Вы предоставляете свой исходник с комментариями "непоняток". А мы тут его пытаемся поправить и прокомментировать. Потому, что я, например, программируя на Си, с AVR знаком лишь "шапочно", а с CodeVison вообще практически дел не имел. Как вы считаете, не слишком ли "жирно" с вашей стороны требовать, чтобы для этого был освоен "недокомпилятор Си" CodeVison и изучен AVR? wink.gif
Vny4ek
ок, я полностью с вами согласен.
у меня есть пример приема этого кода, рабочий вот выложу часть может вы поможете:
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=135;
RFBit=RfIn;
\\\\\\\\\\
TCCR0=0x02;
TCNT0=0x00;
вот не могу понять что означает это, это прерывание по таймеру вроде, и почему вы кодвижен не долюбливаете? я понимаю что он скорее для начинающих, может мне не стоит в его сторону даже изначально смотреть, а начинать изучать другой компилятор?
rezident
Не нужно обрывков. Приводите ваш пример программы целиком.
Судя по заголовку функции, да, это прерывание от переполнения TIMER0.
Vny4ek
Вот привожу пример кода, для приема. Насколько мне известно тут длительность задана а не измеряется.
CODE
#include <mega8.h>
#include <stdio.h>
#include <delay.h>
#include <String.h>

#define TRFreset 0
#define TRFSYNC 1
#define TRFUNO 2
#define TRFZERO 3

#define NBIT 65

#define HIGH_TO -10
#define LOW_TO 10
#define SHORT_HEAD 20
#define LONG_HEAD 45

#define RfIn PIND.4

typedef unsigned char byte;

bit RFFull;
bit RFBit;
int RFcount;
byte Bptr,BitCount,RFstate,Buf[9];
/////////////// receive /////////////////////////////////
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=135;
RFBit=RfIn;

if (RFFull)
return;
/////////////////////////////////////////////////////////
switch(RFstate)
{
case TRFUNO:
if ( RFBit == 0)
{
RFstate= TRFZERO;
}
else
{
RFcount--;
if (RFcount < HIGH_TO) RFstate = TRFreset;
}
break;
//////////////////////////////////////////////////////////
case TRFZERO:
if (RFBit)
{
RFstate= TRFUNO;
Buf[Bptr] >>= 1;
if ( RFcount >= 0)
{
Buf[Bptr]+=0x80;
}
RFcount = 0;
if ((++BitCount & 7) == 0) Bptr++;

if (BitCount == NBIT)
{
printf("Reseive signal:");
printf("%02X%02X%02X%02X%02X%02X%02X%02X", Buf[0],Buf[1],Buf[2],Buf[3],Buf[4],Buf[5],Buf[6],Buf[7]);
printf("\n\r");

RFstate = TRFreset;
RFFull = 1;
}
}
else
{
RFcount++;
if ( RFcount >= LOW_TO)
{
RFstate = TRFSYNC;
Bptr = 0;
BitCount = 0;
}
}
break;
///////////////////////////////////////////////////////////
case TRFSYNC:
if ( RFBit)
{
if ((RFcount < SHORT_HEAD)||(RFcount >= LONG_HEAD))
{
RFstate = TRFreset;break;
}
else
{
RFcount =0;RFstate= TRFUNO;
}
}
else
{
RFcount++;
}
break;
/////////////////////////////////////////////////////////////
case TRFreset:
default:
RFstate = TRFSYNC;
RFcount = 0;
Bptr = 0;
BitCount = 0;
break;
} // switch
//////////////////////////////////////////////////////////////
if(RFFull)
{
RFstate = TRFreset;
RFFull=0;
}
/////////////////////////////////////////////////////////////
} // receive
////////////////// main ////////////////////////////////////
void main(void)
{
PORTD=0x10;
DDRD=0x00;

TCCR0=0x02;
TCNT0=0x00;

TIMSK=0x01;

UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

////////////////////////////////////////////////////////////
printf(" WAIT SIGNAL!\n\r");
printf("\n\r");
////////////////////////////////////////////////////////////
#asm("sei")
}// main
Dog Pawlowa
Цитата(Vny4ek @ May 4 2009, 07:57) *
Вот привожу пример кода, для приема. Насколько мне известно тут длительность задана а не измеряется.

Осталось вот это:
Цитата(rezident)
Вы предоставляете свой исходник с комментариями "непоняток".


А вообще-то Вам описали алгоритм, и Вы ответили:
"я потихоньку начинаю понимать, давайте я начну делать а если Вам не сложно вы поправите и скажете где ошибся"
Что же Вы действительно САМИ начали делать, кроме выкладывания чужих исходников?
Vny4ek
не понятно мне следующее: как отследить изменение уровня, и по этому событию запустить таймер, далее его остановить при переходе уровня из 1 в 0
Ну у самого получилось сделать обработку обычного прерывания из 0в1 на ножке int0 по которому например получается зажечь светодиод, но вот с таймером никак даже начать не могу...
Dog Pawlowa
Цитата(Vny4ek @ May 4 2009, 13:02) *
не понятно мне следующее: как отследить изменение уровня, и по этому событию запустить таймер, далее его остановить при переходе уровня из 1 в 0

Я опять процитирую уважаемого rezidentа:
"Таймер не нужно запускать по перепаду. Таймер должен всегда работать с (авто)переполнением. Перепад на входе фиксируется в регистре захвата (capture). Беззнаковая разность двух соседних значений, полученных из регистра захвата, дает длительность между фронтами в тактах таймера..."

Вот пример запуска постоянно работающего таймера в ATmega32:
Код
void BackgroundInit()
{ TCCR0=0;    //stop TC0
  TCCR0 = 1 << WGM01; // ClearTimertoCompare mode, TC0 top on OCR0
  TCNT0 = 0x01;       // initial value TC0
  OCR0 = 249;         // TOP   250 kHz/(249+1)=1 kHz
  TIMSK = TIMSK & ~(1 << TOIE0) | (1 << OCIE0);
  TIFR |= (1 << OCF0) | (1 << TOV0);
}

Добавьте инициализацию схем захвата.
Vny4ek
Здраствуйте, я разбираюсь с одним кодом, задача такая: Получить код от приемника в формате кейлог, и по событию отправить его же (отправка кода происходит при полностью полученном коде), дальше хочу научиться записывать в ячейки полученные коды, для сравнения, но пока передача не проходит, смотрю осцилографом, а передаются только нули (вижу по однотипным импульсам в теле пакета) подскажите в чем дело?
CODE
#include <mega8.h>
//#include <my_lcd.c>
#include <stdio.h>
#include <delay.h>
#include <String.h>

#define TRFreset 0
#define TRFSYNC 1
#define TRFUNO 2
#define TRFZERO 3

#define NBIT 65
#define TE 400
#define HIGH_TO -10
#define LOW_TO 10
#define SHORT_HEAD 20
#define LONG_HEAD 45
#define RFOut PORTC.7
#define RfIn PINB.0
#define Btn PINB.2
typedef unsigned char byte;
typedef signed int sbyte;
typedef signed long word;
#pragma warn- //директива для инициаизации еепрома
eeprom byte EprBuf0 [65];
eeprom byte EprBuf1 [65];
eeprom byte EprBuf2 [65];

eeprom byte eep_ring;
#pragma warn+ //директива для инициаизации еепрома




byte i;
bit RFFull;
bit RFBit;
int RFcount;
byte Bptr,BitCount,RFstate,Buf[9];



void Transmit(byte*b,byte u)
{
byte g=0,j=0,counts;
{
for(;u>0;u--)
counts = b[9];
for (i = 0; i < 12; i ++) //преамбула
{
RFOut = 1;
delay_us(TE);
RFOut = 0;
delay_us(TE);
}
delay_ms(4); // хедер
for (i=0;i<8;i++) // цыкл вывода байтов
{
g = b[i]; // считаем буфер
for (j=0;j<8;j++) // цикл вывода битов в байте
{
RFOut = 1; // вывод бита
delay_us(TE);
if (g&1)
RFOut = 0;
delay_us(TE);
RFOut = 0;
delay_us(TE);
g >>= 1;
}
}

delay_ms(10); // гуард тайм
} //end for u
} //end Transmi


/////////////// receive /////////////////////////////////
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=135;
RFBit=RfIn;

if (RFFull)
return;
/////////////////////////////////////////////////////////
switch(RFstate)
{
case TRFUNO:
if ( RFBit == 0)
{
RFstate= TRFZERO;
}
else
{
RFcount--;
if (RFcount < HIGH_TO) RFstate = TRFreset;
}
break;
//////////////////////////////////////////////////////////
case TRFZERO:
if (RFBit)
{
RFstate= TRFUNO;
Buf[Bptr] >>= 1;
if ( RFcount >= 0)
{
Buf[Bptr]+=0x80;
}
RFcount = 0;
if ((++BitCount & 7) == 0) Bptr++;

if (BitCount == NBIT)
{


printf("Reseive signal:");
printf("%02X%02X%02X%02X%02X%02X%02X%02X",
Buf[0],Buf[1],Buf[2],Buf[3],Buf[4],Buf[5],Buf[6],Buf[7]);
printf("\n\r");
Transmit(Buf,1);
RFstate = TRFreset;
RFFull = 1;
}
}
else
{
RFcount++;
if ( RFcount >= LOW_TO)
{
RFstate = TRFSYNC;
Bptr = 0;
BitCount = 0;
}
}
break;
///////////////////////////////////////////////////////////
case TRFSYNC:
if ( RFBit)
{
if ((RFcount < SHORT_HEAD)||(RFcount >= LONG_HEAD))
{
RFstate = TRFreset;break;
}
else
{
RFcount =0;RFstate= TRFUNO;
}
}
else
{
RFcount++;
}
break;
/////////////////////////////////////////////////////////////
case TRFreset:
default:
RFstate = TRFSYNC;
RFcount = 0;
Bptr = 0;
BitCount = 0;
break;
} // switch
//////////////////////////////////////////////////////////////
if(RFFull)
{
RFstate = TRFreset;
RFFull=0;
}
/////////////////////////////////////////////////////////////
} // receive
////////////////// main ////////////////////////////////////






void main(void)
{

PORTD=0x10;
DDRD=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x7F;
DDRC=0xFF;
TCCR0=0x02;
TCNT0=0x00;

TIMSK=0x01;

UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

////////////////////////////////////////////////////////////
printf(" WAIT SIGNAL!\n\r");
printf("\n\r");
////////////////////////////////////////////////////////////
#asm("sei")
}// main
XVR
1. В main нет зацикливания в конце
2. printf в обработчик прерывания не ставят
3. Передачу с задержками внутри тоже не рекомендуется ставить в обработчик прерывания
4. Непонятно предназначение конструкции for(;u>0;u--) counts = b[9]; в начале функции передачи
5. SM в прерывании не смотрел - на первый взгляд нечто монстрообразное (хоть бы коментарии написал rolleyes.gif )
Vny4ek
да я взял уже работающий пример, прием работает корректно, в УАРТ выводит коды, но вот по сути после того как принят последний бит, должна сразу стартовать передача, это происходит, но передаются нули. Я думаю может нужно, принятое в какойнибудь временный буфер присваивать, а уже от туда отправлять? Или действительно может дело в пункте 3. Я если честно до сих пор не понял доконца некоторых элементов этого кода, содраны с официальных аппноутов вроде.
Vny4ek
Здравствуйте, подскажите плиз. Вообщем я пытаюсь принять сигнал с приемника, ну там есть элементы логическое 1=400мкс а 0=800мкс, ну хочу данные принять и пакет еще приходит с преамбулой (12шт логических 1 затем пауза 4милисекунд) мне важно что бы знать в какой фазе сейчас прием. Я покажу элемент кода, откоментируйти плиз что я не так делаю
Код
while (1)
      {  
      if (PINA.0==0) {
      i=0;
      s=0;
      };
  
for (i=0;PINA.0==1;i++) {
        delay_us(1);
       s=i;
    };      
          
     printf("Dlitelnost  ____|---|____=");
             printf("%u",s);
      printf("\n\r");

      };


Подаю в протеусе сигнал где первый импульс, как и последующие имеет длинну около 400-800мкс, но в уарт выводятся значения произвольные от 1до 100, что я делаю не так? Если запускаю генератор достаточно медленный на 50милисекунд например он показывает длинну, а вот реальный пакет отправляю через audio генератор, не хочет.
знаю что правильно организовать прием по перрыванию, но пока освоить не могу, их хорошо.
Vny4ek
Ребят, ну подскажите плиз, я понимаю что не лучшее решение, мне главное что бы работало, а если не будет то скажите почему. Код ведь минимален не сложно оценить.
SasaVitebsk
Блин. Во что лень делает....

Первый пост ноябрь 2008, на дворе конец июня 2009. 7 месяцев!!!!!! smile3046.gif

1) Возьмите себя в руки (максимум день).
2) Почитайте не примеры, а документацию на выбранный вами камень. (максимум 2 дня).
3) Перечитайте ответы спецов по данной теме. (пол дня)
3) Выкиньте чужое и напишите своё. Но чтобы вы понимали что там написано. (Максимум неделя)
Goodefine
Простите что вмешиваюсь, но возникла похожая проблема (надо удаленно помочь человеку победить протокол RF модуля). Модуль от радиосигнализации имеет один сигнальный провод. Никто его в "лицо" не узнает? Хотелось бы узнать, что у него на выходе, иначе буду делать сниффер...
Vny4ek
Goodefine, узнаю в лицо точно! Я с ним ковырялся именно с таким же (выдрал из сломанной сиги), потом понял что он не фонтан и купил телеконтроллевские. Я так понимаю нужна разпиновка? Вечером скажу точно т.к. дома он впаян к макетке, помню только что антенна крайняя ного, но это я думаю и без меня уже нашли, остальное вечером ок? на выходе у него то что принял из эфира, этот приемник из дешевой сигналки и принимает как правило пакеты keylog формат посылки я вроде описывал в перовом посте ну где сначала преамбула затем хедер затем пакет
Vny4ek
Ребят вот я начал потихоньку тут понимать что происходит, в терминал при подаче пакета выводит значения таймера. Подскажите дальше как правильно обработать, думал вчера целый день не выходит sad.gif

CODE
#include <mega8.h>

#include <stdio.h>
unsigned long int i,;
bit s=0;
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
// Place your code here



i = TCNT1;

printf("I=");
printf("%u",i);
printf("\n\r");

}


// Declare your global variables here

void main(void)
{
// 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=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

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

// 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: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x03;
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: On
// INT1 Mode: Falling Edge
GICR|=0x80;
MCUCR=0x08;
GIFR=0x80;

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

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

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

};
}

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