Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Нужен учитель
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > Образование в области электроники
Страницы: 1, 2, 3
ARV
Цитата(iosifk @ Apr 22 2013, 17:35) *
Почитайте о СКАДА системах, я об этом уже писал.
Почитайте журнал СТА, посмотрите на чем люди делают автоматизацию...
Почитайте о ОСРВ,
О промышленных интерфейсах,
О промышленных компьютерах...
О том, что такое надежность и чем она достигается..
О теории автоматического регулирования...

Вот, это для начала..

как по мне, так сразу и для конца...

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


David_Ali
Цитата(ARV @ Apr 22 2013, 19:53) *
как по мне, так сразу и для конца...

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

Но у вас ведь получилось :-)
ARV
Цитата(David_Ali @ Apr 22 2013, 19:37) *
Но у вас ведь получилось :-)
я о том и говорю - получилось, видимо, потому, что не знал, как все сложно sm.gif теперь, есличо, я тоже могу застращать начинающего ужасами составления ТЗ, проектирования потоков и т.п. умными вещами sm.gif

вас тут стращают неподецки, но вы помаленечку идите своим путем, как понимаете - от примитивного к простому и далее.


David_Ali
Цитата(ARV @ Apr 22 2013, 22:14) *
я о том и говорю - получилось, видимо, потому, что не знал, как все сложно sm.gif теперь, есличо, я тоже могу застращать начинающего ужасами составления ТЗ, проектирования потоков и т.п. умными вещами sm.gif

вас тут стращают неподецки, но вы помаленечку идите своим путем, как понимаете - от примитивного к простому и далее.

Спасибо вам за поддержку :-) Господь вам в помощь!
David_Ali
Добрый день. с блутузом и мегой разобрался, теперь у меня все работает как надо, и слава Богу, но появился один вопрос, как мне в С++ указать определенный пин определенного порта? у меня пока там вот это
----> if(data=='A')
{
PORTB=0xFF;
}
if(data=='B')
{
PORTB=0x00;
}
/////////////////////
а как мне отправить на конкретный пин? на асме знаю что 0B00000001 например, а тут как?
P.S прошу отвечать по вопросу, если кто знает, а не советовать мне читать дзен и постигать прекрасный мир который мне не известен.
и еще написал прогу для андроида для послылки определенных букв на блутуз, готовые кнопки просто если кому надо могу скинуть apk.
ARV
Цитата(David_Ali @ Apr 23 2013, 13:01) *
как мне в С++ указать определенный пин определенного порта?
смотрите здесь: http://arv.radioliga.com/content/category/6/33/49/
David_Ali
Цитата(ARV @ Apr 23 2013, 14:12) *

не нашел там ничего. ((
ARV
Цитата(David_Ali @ Apr 23 2013, 14:10) *
не нашел там ничего. ((
как это?!

а если вот так: http://arv.radioliga.com/content/view/187/49/ и вот так: http://arv.radioliga.com/content/view/188/49/ ???? так лучше?


David_Ali
Цитата(ARV @ Apr 23 2013, 15:26) *
как это?!

а если вот так: http://arv.radioliga.com/content/view/187/49/ и вот так: http://arv.radioliga.com/content/view/188/49/ ???? так лучше?

Спасибо вам огромнооое )) но я решил задачу проще )) Оb00000001 + калькулятор бин хекс =
if(data=='A')
{
PORTB=0x1;
ARV
если ваше спасибо я получил за то, что вынудил вас воспользоваться калькулятором, - то лучше не надо. если я добился именно этого, то оказал вам медвежью услугу, и вряд ли заслужил благодарности.
David_Ali
Цитата(ARV @ Apr 23 2013, 15:57) *
если ваше спасибо я получил за то, что вынудил вас воспользоваться калькулятором, - то лучше не надо. если я добился именно этого, то оказал вам медвежью услугу, и вряд ли заслужил благодарности.

да нет, что вы ) я бы не додумался до калькулятора если бы не прочитал там все, и вобще там инфа полезная.
ARV
я втайне надеялся, что мысль о калькуляторе у прочитавшего мои заметки вообще не возникнет sm.gif
David_Ali
Цитата(ARV @ Apr 23 2013, 16:52) *
я втайне надеялся, что мысль о калькуляторе у прочитавшего мои заметки вообще не возникнет sm.gif

Но почему же? Разве это не то? Просто мой компилятор не стал понимать некоторые вещи из тех примеров вот я взял калькулятор. :-)

Цитата(iosifk @ Apr 22 2013, 17:16) *

Читаю про Industrial Ethernet про скада прочитал. И не вижу там места для разработчика.. Это все готовые системы для пользования. А вот создать свой плк это уже почетное дело :-)
David_Ali
Ребята, ну кто нибудь скажите мне почему на меге8 вместо нормальной работы, он работает в режиме эха?? на меге16 все ОК. а тут что не пошлю все возвращает. вот код --->
#include <avr/io.h>
#include <avr/interrupt.h>


#define FOSC 8000000L//Тактовая частота
#define BAUD 9600L //Скорость порта
#define MYUBRR FOSC/16/BAUD-1


void USART_Transmit( unsigned char data );
void USART_Init( unsigned int ubrr);



//Обработка прерывания чтения USART
ISR(USART_RXC_vect)
{
int b;
b = UDR;
USART_Transmit( B ); //Отправляем то, что получили
}


//Инициализация модуля USART
void USART_Init( unsigned int ubrr)
{
//Задаем скорость работы USART
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;

UCSRB=(1<<RXEN)|( 1<<TXEN);
UCSRB |= (1<<RXCIE);



UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);



}


//Функция отправки данных
void USART_Transmit( unsigned char data )
{
while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема
UDR = data; //Начало передачи данных
}

int main(void)
{
unsigned char data;
PORTB=0x00;
DDRB=0xFF;

PORTD=0x00;
DDRD=0x00;
USART_Init (MYUBRR);
sei();

while(1)//вечный цикл
{


if(data=='A')
{
PORTB=0xFF;
}
if(data=='B')
{
PORTB=0x00;
}

}



}
P.S. и как пользоваться Codevision? Попробовал на нем писать у меня не получается НЕХ файл, а только асм.
_Артём_
Цитата(David_Ali @ Apr 23 2013, 21:40) *
Ребята, ну кто нибудь скажите мне почему на меге8 вместо нормальной работы, он работает в режиме эха??

Интересно, а как оно должно работать если у вас в коде

Код
//Обработка прерывания чтения USART
ISR(USART_RXC_vect)
{
int b;
b = UDR;
USART_Transmit( B );    //Отправляем то, что получили
}

каждый принятый байт обратно отсылается?


И кроме того, функция main странная:
Код
int main(void)
{
  unsigned char data;
   PORTB=0x00;
   DDRB=0xFF;

   PORTD=0x00;
   DDRD=0x00;
USART_Init (MYUBRR);
sei();

while(1)//вечный цикл
{
  

      if(data=='A')
      {
      PORTB=0xFF;
      }
      if(data=='B')
      {
      PORTB=0x00;
      }

}
}

В цикле while проверяется переменная data, которая есть локальная переменная функции. Её значение не может изменится и наверное оптимизатор все эти проверки выкинет.

Сделайте так:
Код
volatile unsigned char data;
//Обработка прерывания чтения USART
ISR(USART_RXC_vect)
{
//int b; // зачем тут int?
data = UDR;
USART_Transmit( data); //Отправляем то, что получили
}

void main ()
{
// инициализация
while (1) {
if (data=='A') {
// и так далее
}
}
}
David_Ali
Цитата(_Артём_ @ Apr 24 2013, 00:48) *
Интересно, а как оно должно работать если у вас в коде

Спасибо сейчас проверю, ну просто на меге 16 все работает, просто там пару изменений чисто по датащиту МК
David_Ali
не вышло опять ничего.. он все в режиме эха..
_Артём_
Цитата(David_Ali @ Apr 24 2013, 14:12) *
он все в режиме эха..

Эхо у вас по программе и должно быть. Если хотите чтобы пропало эхо, то закоментируйте строку с USART_Transmit.
Или не работает остальная программа?
David_Ali
Цитата(_Артём_ @ Apr 24 2013, 16:28) *
Эхо у вас по программе и должно быть. Если хотите чтобы пропало эхо, то закоментируйте строку с USART_Transmit.
Или не работает остальная программа?

осталное не работает, на атмеге 16 работает, а когда переделываю для 8ки не работает, от чего может быть? МК тоже разнве брал, все 8ки одно и тоже делают (
_Артём_
Цитата(David_Ali @ Apr 24 2013, 14:43) *
МК тоже разнве брал, все 8ки одно и тоже делают (

Как у вас сейчас программа выглядит?
Эхо идёт правильно?
В симуляторе не пробовали запускать?
David_Ali
Цитата(_Артём_ @ Apr 24 2013, 17:09) *
Как у вас сейчас программа выглядит?
Эхо идёт правильно?
В симуляторе не пробовали запускать?

Да эхо работает правильно. Но дело в том что когда я его отключаю оно все равно работает :-)
_Артём_
Цитата(David_Ali @ Apr 24 2013, 15:51) *
Но дело в том что когда я его отключаю оно все равно работает :-)

Может RX с TX закорочены?
Попробуйте стереть МК и посмотрите будут ли тогда ехо.
kovigor
Цитата(David_Ali @ Apr 24 2013, 14:43) *
осталное не работает, на атмеге 16 работает, а когда переделываю для 8ки не работает, от чего может быть? МК тоже разнве брал, все 8ки одно и тоже делают (

Коротыш на макетной плате м/у RXD и TXD ?
David_Ali
Цитата(kovigor @ Apr 24 2013, 20:56) *
Коротыш на макетной плате м/у RXD и TXD ?

да нет ничего не коротит.. что то с кодом кажет не так.. или с настройками блютуз модуля..
David_Ali
#include <avr/io.h>
#include <avr/interrupt.h>


#define FOSC 8000000L//Тактовая частота
#define BAUD 9600L //Скорость порта
#define MYUBRR FOSC/16/BAUD-1


void USART_Transmit( unsigned char data );
void USART_Init( unsigned int ubrr);



//Обработка прерывания чтения USART
ISR(USART_RXC_vect)
{
int b;
b = UDR;
USART_Transmit( b ) ;//Отправляем то, что получили
}


//Инициализация модуля USART
void USART_Init( unsigned int ubrr)
{
//Задаем скорость работы USART
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;

UCSRB=(1<<RXEN)|( 1<<TXEN); //разращён прием и передача
UCSRB |= (1<<RXCIE); //прерывание при чтении

//URSEL,UMSEL=0 асинхронный,UPM01=0 Parity нет, USBS=0 1 стоп бит,UCSZ012 = 3 8бит данных

UCSRC=(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0);


}


//Функция отправки данных
void USART_Transmit( unsigned char data )
{
while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема
UDR = data; //Начало передачи данных
}

int main(void)
{
USART_Init (MYUBRR);
sei();//разрешаем прерывания

while(1)//вечный цикл
{ }


}

вот это рабочий пример для меги16, тут же меняю порты и регистры для меги8, беру из ДШ, ничего не работает, возвращает все символы. как думаете изза чего?
kovigor
Цитата(David_Ali @ Apr 24 2013, 20:39) *
... или с настройками блютуз модуля..

Или. Например, в телефонных модемах был отключаемый режим эха (echo). Не ваш ли это случай ?
При наличии осциллографа проверить эту гипотезу очень просто - достаточно отключить передатчик модуля от приемника МК и на вход приемника модуля подать ваши символы. Если модуль тут же их возвращает (это и покажет осциллограф, но до МК эти возвращенные символы не дойдут), то вопрос оказывается исчерпанным ...
David_Ali
Цитата(kovigor @ Apr 25 2013, 00:36) *
Или. Например, в телефонных модемах был отключаемый режим эха (echo). Не ваш ли это случай ?
При наличии осциллографа проверить эту гипотезу очень просто - достаточно отключить передатчик модуля от приемника МК и на вход приемника модуля подать ваши символы. Если модуль тут же их возвращает (это и покажет осциллограф, но до МК эти возвращенные символы не дойдут), то вопрос оказывается исчерпанным ...

В таком случае другие МК тоже не работали бы. А они то работают.
ARV
Цитата(David_Ali @ Apr 25 2013, 08:02) *
В таком случае другие МК тоже не работали бы. А они то работают.
ваш последний продемонстрированный код ДОЛЖЕН всегда выдавать принятый символ. если он не выдает этот символ, то увидеть, что программа "работает" попросту невозможно, так как кроме этого ваша программа ничего не делает.

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

P.S. на сколько мне не изменяет память, в WinAVR принято тактовую частоту МК определять макросом F_CPU, а не FOSC... то есть в своей программе вы можете брать уже готовый макрос F_CPU, а не задавать его самостоятельно. кроме того, есть специальный модуль util/setbaud.h, который призван сделать за вас все вычисления констант для настройки модуля USART, рекомендую пользоваться.
David_Ali
Цитата(ARV @ Apr 25 2013, 14:34) *
ваш последний продемонстрированный код ДОЛЖЕН всегда выдавать принятый символ. если он не выдает этот символ, то увидеть, что программа "работает" попросту невозможно, так как кроме этого ваша программа ничего не делает.

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

P.S. на сколько мне не изменяет память, в WinAVR принято тактовую частоту МК определять макросом F_CPU, а не FOSC... то есть в своей программе вы можете брать уже готовый макрос F_CPU, а не задавать его самостоятельно. кроме того, есть специальный модуль util/setbaud.h, который призван сделать за вас все вычисления констант для настройки модуля USART, рекомендую пользоваться.

Я не тот код послал. Извините. Приду домой сразу вышлю.
David_Ali
Цитата(David_Ali @ Apr 25 2013, 19:19) *
Я не тот код послал. Извините. Приду домой сразу вышлю.

#include <avr/io.h>
#include <avr/interrupt.h>


#define FOSC 8000000L//Тактовая частота
#define BAUD 9600L //Скорость порта
#define MYUBRR FOSC/16/BAUD-1


void USART_Transmit( unsigned char data );
void USART_Init( unsigned int ubrr);




ISR(USART_RXC_vect)
{
int b;
b = UDR;
USART_Transmit( B );
}



void USART_Init( unsigned int ubrr)
{

UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;

UCSRB=(1<<RXEN)|( 1<<TXEN);
UCSRB |= (1<<RXCIE);



UCSRC=(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0);


}


void USART_Transmit( unsigned char data )
{
while ( !(UCSRA & (1<<UDRE)) );
UDR = data;
}

int main(void)
{
char data;
PORTB=0x00;
DDRB=0xFF;

PORTD=0x00;
DDRD=0x00;
USART_Init (MYUBRR);
sei();

while(1)
{

data=UDR;

if(data=='A')
{
PORTB=0x1;
}
if(data=='B')
{
PORTB=0x00;
}

}
}

вот это рабочий код на атмега16. на атмега восемь он не работает(естественно я меняю что надо по ДШ на мегу 8). кто знает что там нужно поменять скажите, и объясните почему!!)
прошу учить, а не поучать!
P.S. GGC AVRом компилирую. потому что код вижн не дает мне хекс файлов, хоть в настройках я и указываю оутпут файлы хексами. и как использовать <util/setbaud.h>??
_Артём_
Цитата(David_Ali @ Apr 25 2013, 19:38) *
вот это рабочий код на атмега16. на атмега восемь он не работает(естественно я меняю что надо по ДШ на мегу 8). кто знает что там нужно поменять скажите, и объясните почему!!)

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

Цитата(David_Ali @ Apr 25 2013, 19:38) *
ISR(USART_RXC_vect)
{
int b;
b = UDR;
USART_Transmit( B );
}
Какая такая переменная B? GCC не возражает?
Насчёт остального тут (проблемы с определением переменной data). Оптимизатор весь while из main выкинул.

тут
ARV
Цитата(David_Ali @ Apr 25 2013, 20:38) *
вот это рабочий код на атмега16. на атмега восемь он не работает(естественно я меняю что надо по ДШ на мегу 8). кто знает что там нужно поменять скажите, и объясните почему!!)
прошу учить, а не поучать!
P.S. GGC AVRом компилирую. потому что код вижн не дает мне хекс файлов, хоть в настройках я и указываю оутпут файлы хексами. и как использовать <util/setbaud.h>??

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

1. у вас есть прерывание ПО ПРИЕМУ символа. внутри обработчика этого прерывания вы незамедлительно считываете UDR и выдаете принятое обратно. это называется ЭХО. в терминале вы обязаны получать обратно то, что передали.


2. в основном цикле вы непрерывано и постоянно считываете UDR, при этом абсолютно не заботясь о том, есть там данные или нет. честно говоря, я никогда не интересовался, что будет происходить, если во время приема байта считывать UDR... это порочная практика. но могу предположить, что в меге8 UDR не имеет двойной буфферизации, а в меге16 он буфферизирован. т.е. при наличии двойной буфферизации до тех пор, пока что-то не будет принято, вы считываете НОЛЬ из буфера. если же буферизации нет, то что вы считываете во время приема - я не могу даже предположить (а читать даташит не хочется, лень).

3. итак, у вас есть две точки в программе, где вы НЕЗАВИСИМО считываете UDR. по-вашему, это нормально? приведу пример: по конвейеру едут пирожки, а по бокам конвейера стоят Вася и Петя. вы надеетесь, что им обоим достанется поровну пирожков, но на самом деле это зависит от ловкости каждого. Если Вася более ловкий, то Петя останется голодным, ну возможно, иной раз все-таки что-то и ему перепадет... так вот, обработчик прерывания - это у вас шустрый Вася, а основной цикл - тормоз Петя...

вам уже намекали, что нормальная практика - это либо работать с UDR исключительно через прерывания, либо исключительно из основного цикла. но вы решили поступить по-своему. обучение всегда начинается с того, что ученик строго следует наказам учителя, и только освоив учительские методы полностью, может попытаться пойти своим путем. рекомендую и в случае с МК поступать так же точно.

P.S. как пользоваться util/setbaud.h, написано в документации к WinAVR. так же можете почитать и мои скромные попытки рассказать об этом: http://www.simple-devices.ru/attachments/a...AVR_02_2011.pdf
так же есть еще немного по родственным темам: http://www.simple-devices.ru/articles/7-so...navr-console-io (тут как раз есть исходники с примером использования setbaud.h).


David_Ali
Цитата(ARV @ Apr 25 2013, 22:17) *
это не рабочий код.

Рабочий!! я его скомпилировал, залил в МК и все работает так как мне надо. как это не рабочий..

Цитата(_Артём_ @ Apr 25 2013, 22:11) *
Что-то вы или не то копипастите, или ещё что...
Ваш код не только работать не может, он даже не откомпилируется.


тут

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

Цитата(ARV @ Apr 25 2013, 22:17) *
P.S. как пользоваться util/setbaud.h, написано в документации к WinAVR. так же можете почитать и мои скромные попытки рассказать об этом: http://www.simple-devices.ru/attachments/a...AVR_02_2011.pdf
так же есть еще немного по родственным темам: http://www.simple-devices.ru/articles/7-so...navr-console-io (тут как раз есть исходники с примером использования setbaud.h).

Спасибо за информацию!
ARV
Цитата(David_Ali @ Apr 25 2013, 21:28) *
Рабочий!! я его скомпилировал, залил в МК и все работает так как мне надо. как это не рабочий..
читайте мои словесные излияния. если описанное мною вам и нужно - я пас, не жалуйтесь. так нормальные программисты не пишут, извините.
David_Ali
Цитата(ARV @ Apr 25 2013, 22:52) *
читайте мои словесные излияния. если описанное мною вам и нужно - я пас, не жалуйтесь. так нормальные программисты не пишут, извините.

Не доделанное добро это не есть добро.. Пас есть пас.. Спасибо за все. Сам разберусь.
Vetal-Soft
Для обмена по UART правильнее использовать FIFO буфер.
Вот пример под AVR Studio:
CODE
/* Файл main.c */
//#define F_CPU 16000000UL
#include <avr/io.h>
#include <stdio.h> // стандартная библиотека ввода/вывод
#include <avr/pgmspace.h> // утилиты пространства программ
#include "uart.h"

// Создаем поток для ввода/вывода на/с UART для использования стандартных
// функции ввод/вывода
FILE uart_file = FDEV_SETUP_STREAM(uart_put, uart_get, _FDEV_SETUP_RW);

int main (void)
{
uart_init(); // название Ф-ции говорит само за себя
stdout = stdin = &uart_file; // теперь стандартные потоки ссылаются на наш поток

char str[50];

printf_P(PSTR("Hello, World!\n\r"));
printf_P(PSTR("Input string:"));
scanf_P(PSTR("%49s"),&str);
printf_P(PSTR("%s\n\r"),str);
fprintf(&uart_file, "Bye-bye\n\r"); // Так можно выбирать с каким именно
// потоком работать (для примера)
while (1);
return 0;
}


CODE
/* file "uart.h" */
#ifndef UART
#define UART

#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>

#define UART_FIFO_SIZE 64 // Размер FIFO
#define UART_BAUD 9600 // Скороть UART

void uart_init(void);
int uart_get (FILE *stream);
uint8_t uart_test (void);
int uart_put (char d, FILE *stream);

#endif /* end UART */


CODE
/* file "uart.c" */
#include "uart.h"

typedef struct { // Структура для FIFO
uint8_t idx_w; // Указатель на конец очереди FIFO
uint8_t idx_r; // Указатель на начало очереди FIFO
uint8_t count; // Счетчик количества данных в FIFO
uint8_t buff[UART_FIFO_SIZE]; // Сам FIFO
} FIFO;

static volatile
FIFO txfifo, rxfifo;

/* Initialize UART */

void uart_init()
{
rxfifo.idx_r = 0;
rxfifo.idx_w = 0;
rxfifo.count = 0;
txfifo.idx_r = 0;
txfifo.idx_w = 0;
txfifo.count = 0;

UBRRL = (F_CPU / (16UL * UART_BAUD)) - 1; // Настраиваем скорость работы UART
UCSRB = _BV(RXEN)|_BV(RXCIE)|_BV(TXEN); // Включаем: прием, вызов прерывания по приему, передачу
}

uint8_t uart_test (void)
{
return rxfifo.count;
}

int uart_get (FILE *stream) // Ф-ция чтения FIFO для приемника
{
char d;
uint8_t i;

i = rxfifo.idx_r;
while(rxfifo.count == 0); // Ожидание входящих данных
d = rxfifo.buff[i++];
cli();
rxfifo.count--;
sei();
if(i >= UART_FIFO_SIZE)
i = 0;
rxfifo.idx_r = i;
uart_put(d,stream); // Эхо ответ
return d;
}

int uart_put (char d, FILE *stream) // Ф-ция записи в FIFO для передатчика
{
uint8_t i;

i = txfifo.idx_w;
while(txfifo.count >= UART_FIFO_SIZE); // ждем когда освободится место в FIFO
txfifo.buff[i++] = d;
cli();
txfifo.count++;
UCSRB |= _BV(UDRIE); // Включаем вызов прерывания по освобождению буфера передатчика
sei();
if(i >= UART_FIFO_SIZE)
i = 0;
txfifo.idx_w = i;
return 0;
}

ISR(USART_RXC_vect) // Прерывание по приему
{
uint8_t d, n, i;

d = UDR;
n = rxfifo.count;
if(n < UART_FIFO_SIZE) // Если FIFO заполнен данные начнут теряться
{
rxfifo.count = ++n;
i = rxfifo.idx_w;
rxfifo.buff[i++] = d;
if(i >= UART_FIFO_SIZE)
i = 0;
rxfifo.idx_w = i;
}
}

ISR(USART_UDRE_vect) // Прерывание по освобождению буфера передатчика
{
uint8_t n, i;

n = txfifo.count;
if(n) {
txfifo.count = --n;
i = txfifo.idx_r;
UDR = txfifo.buff[i++];
if(i >= UART_FIFO_SIZE)
i = 0;
txfifo.idx_r = i;
}
if(n == 0) // если FIFO пуст,
UCSRB &= ~_BV(UDRIE); // то выключаем вызов прерывания по освобождению буфера передатчика
}

David_Ali
Цитата(Vetal-Soft @ Apr 30 2013, 14:14) *
Для обмена по UART правильнее использовать FIFO буфер.

Спасибо большое, я обязательно попрактикую это сегодня же, я сам дописал с горем пополам свой код, все работает нормально, даже добавил туда еще функции. Теперь стоит эта штука на борту ВАЗ2107. Заводит ее, открывает закрывает окна, блокирует двери и прочие мелочи. Хоть и мелочи, но приятно. Даже маленький дисплей от нокиа показывает температуру в салоне(датчик тмпературы dht11), потом думаю встроить ее куда нибудь в более важную часть. Пока работы много время нет, но опыт с ней и приходит. Хочу подключить ко всему этому делу gsm sim900 и пару датчиков и сигнализацию получать в виде смс, просто самоучкой быть тяжеловато немного. В принципе как и всегда. Еще раз спасибо за ответ.
David_Ali
CODE

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

int TEMP16;
int T;
unsigned char temp;
void main(void)

{
DDRB=0x00;
PORTB=0xFF;
DDRB = 0x00;
DDRD=0xFF;
PORTD=0x00;
DDRC = 0x00;
PORTC = 0xFF;
ACSR=(1<<ACBG)|(1<<ACIE)|(1<<ACIS1)|(1<<ACIS0)|(1<<ACO);//инициализация компаратора
TEMP16 = 0;

while(1){ // бесконечный цикл
if (PINB.1 == 1 && TEMP16 == 1)
{ //
PORTD.3=1; // включаем 3 пин
delay_ms(500); // пауза 0.5 секунды
PORTD.3=0; // выключаем 3 пин
TEMP16 = 0;
}

if (PINB.1 == 0 && TEMP16 == 0)
{ //
PORTD.3=1; //включаем 3 пин
delay_ms(500); //пауза 0.5 секунды
PORTD.3=0; //выключаем 3 пин
delay_ms(500); //пауза 0.5 секунды
PORTD.3=1; // включаем 3 пин
delay_ms(500); //пауза 0.5 секунды
PORTD.3=0; //выключаем 3 пин
TEMP16 = 1;

}

if(PINB.2 == 0 && T == 0)
{

PORTD.2=1; // включаем второй пин
delay_ms(3000); // пауза 3 секунды
PORTD.2=0; //выключаем втрой пин
T = 1;

}

if(PINB.2==1 && T == 1)
{

PORTD.2=1; // включаем второй пин
delay_ms(3000); //пауза 3 секунды
PORTD.2=0; //выключаем втрой пин
T = 0;
}


temp = ACSR; // читаем ACSR
temp &= 0x20; // 5 бит компаратора

if(temp == 0x20) // если 1
PORTD.1=1;
else
PORTD.1=0; // если 0
}
}


Здравствуйте! эта штуковина у меня для получения данных о заряде аккумулятора, нескольких "прибамбасов" в виде мигания фарами и звука сирены. вопрос почему эти фнкции выполняются поочередно, если одновременно подать 0 или 1 на оба пина PB1 и PB0, ничего не просходит, а по отдельности работает.
P.S. спасибо за совет с CVavr, им реально удобно пользоватся.
Burner
Цитата
)) а что за классификация? можно ли узнать?

http://www.tomyself.ru/mpostsocio/msociostart/49-socio3part
Экстравертный этик. Вы - возможно, ЭИЭ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.