Jump to content

    

David_Ali

Участник
  • Content Count

    63
  • Joined

  • Last visited

Community Reputation

0 Обычный

About David_Ali

  • Rank
    Участник
  • Birthday 04/30/1988
  1. 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, им реально удобно пользоватся.
  2. Цитата(Vetal-Soft @ Apr 30 2013, 14:14) Для обмена по UART правильнее использовать FIFO буфер. Спасибо большое, я обязательно попрактикую это сегодня же, я сам дописал с горем пополам свой код, все работает нормально, даже добавил туда еще функции. Теперь стоит эта штука на борту ВАЗ2107. Заводит ее, открывает закрывает окна, блокирует двери и прочие мелочи. Хоть и мелочи, но приятно. Даже маленький дисплей от нокиа показывает температуру в салоне(датчик тмпературы dht11), потом думаю встроить ее куда нибудь в более важную часть. Пока работы много время нет, но опыт с ней и приходит. Хочу подключить ко всему этому делу gsm sim900 и пару датчиков и сигнализацию получать в виде смс, просто самоучкой быть тяжеловато немного. В принципе как и всегда. Еще раз спасибо за ответ.
  3. Цитата(ARV @ Apr 25 2013, 22:52) читайте мои словесные излияния. если описанное мною вам и нужно - я пас, не жалуйтесь. так нормальные программисты не пишут, извините. Не доделанное добро это не есть добро.. Пас есть пас.. Спасибо за все. Сам разберусь.
  4. Цитата(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). Спасибо за информацию!
  5. Цитата(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>??
  6. Цитата(ARV @ Apr 25 2013, 14:34) ваш последний продемонстрированный код ДОЛЖЕН всегда выдавать принятый символ. если он не выдает этот символ, то увидеть, что программа "работает" попросту невозможно, так как кроме этого ваша программа ничего не делает. есть предложение перестать тратить попусту время всех, кто пытается вам помочь, за счет демонстрации "полноценного" исходника, а не усеченного каким-то способом (я подозреваю, что вы его слегка укорачиваете, прежде чем выложить здесь), причем в варианте "работает" и в варианте "не работает". заниматься догадками о том, что и как вы меняете, что у вас есть "работает", а что нет, нет совершенно никакого желания. P.S. на сколько мне не изменяет память, в WinAVR принято тактовую частоту МК определять макросом F_CPU, а не FOSC... то есть в своей программе вы можете брать уже готовый макрос F_CPU, а не задавать его самостоятельно. кроме того, есть специальный модуль util/setbaud.h, который призван сделать за вас все вычисления констант для настройки модуля USART, рекомендую пользоваться. Я не тот код послал. Извините. Приду домой сразу вышлю.
  7. Цитата(kovigor @ Apr 25 2013, 00:36) Или. Например, в телефонных модемах был отключаемый режим эха (echo). Не ваш ли это случай ? При наличии осциллографа проверить эту гипотезу очень просто - достаточно отключить передатчик модуля от приемника МК и на вход приемника модуля подать ваши символы. Если модуль тут же их возвращает (это и покажет осциллограф, но до МК эти возвращенные символы не дойдут), то вопрос оказывается исчерпанным ... В таком случае другие МК тоже не работали бы. А они то работают.
  8. #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, беру из ДШ, ничего не работает, возвращает все символы. как думаете изза чего?
  9. Цитата(kovigor @ Apr 24 2013, 20:56) Коротыш на макетной плате м/у RXD и TXD ? да нет ничего не коротит.. что то с кодом кажет не так.. или с настройками блютуз модуля..
  10. Цитата(_Артём_ @ Apr 24 2013, 17:09) Как у вас сейчас программа выглядит? Эхо идёт правильно? В симуляторе не пробовали запускать? Да эхо работает правильно. Но дело в том что когда я его отключаю оно все равно работает :-)
  11. Цитата(_Артём_ @ Apr 24 2013, 16:28) Эхо у вас по программе и должно быть. Если хотите чтобы пропало эхо, то закоментируйте строку с USART_Transmit. Или не работает остальная программа? осталное не работает, на атмеге 16 работает, а когда переделываю для 8ки не работает, от чего может быть? МК тоже разнве брал, все 8ки одно и тоже делают (
  12. не вышло опять ничего.. он все в режиме эха..
  13. Цитата(_Артём_ @ Apr 24 2013, 00:48) Интересно, а как оно должно работать если у вас в коде Спасибо сейчас проверю, ну просто на меге 16 все работает, просто там пару изменений чисто по датащиту МК
  14. Ребята, ну кто нибудь скажите мне почему на меге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? Попробовал на нем писать у меня не получается НЕХ файл, а только асм.
  15. Цитата(ARV @ Apr 23 2013, 16:52) я втайне надеялся, что мысль о калькуляторе у прочитавшего мои заметки вообще не возникнет Но почему же? Разве это не то? Просто мой компилятор не стал понимать некоторые вещи из тех примеров вот я взял калькулятор. :-) Цитата(iosifk @ Apr 22 2013, 17:16) Читаю про Industrial Ethernet про скада прочитал. И не вижу там места для разработчика.. Это все готовые системы для пользования. А вот создать свой плк это уже почетное дело :-)