Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Проблем с UART(AVR)
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=8068
Страница 1 от 2

Автор:  nhadjinikolov [ Пет Авг 20, 2010 12:45 am ]
Заглавие:  Проблем с UART(AVR)

Здравейте!
Започнах да се занимавам с УАРТ на една атМега16. Четох някакви туториали, седнах и възоснова на даташийта си написах проста програма, която да плюе по едно 'А' всяка секунда. Свързах на бредборда тази схема и боцнах към серийния порт на лаптопа ми. Добавих и по един светодиод на Rx и Tx пиновете на мегата, за да мигат, когато има активност. За терминал използвам PuTTy. Отварям, но нищо не се показва.. Добавих функция да светва друг диод, когато получи главна буква от компа към мегата. Отново има активност на Рх пина, но контролера не го отразява софтуерно.
Странните неща, обаче не свършват до тук... Взех една букса ДБ9 и направих това, но никакво ехо не се вижда и с този лууп-бек...

Уж порта не е повреден, защото все пак получавам след МАХ232 ТТЛ активност :-k

Май нещо не съм донастроил, но кое и какво, вече не знам. От няколко вечери се мъча и така, и не успявам да измисля нещо, от което да идват тези проблеми...

Настройките са бодрейт 9200, 8 бита данни, 2 стопови, без проверка, без флоу контрол
Ето сорс на мегата:
Код:
#define F_CPU 3686400UL
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

#include <avr/io.h>
#include <util/delay.h>

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

unsigned char USART_Receive( void ){
   while ( !(UCSRA & (1<<RXC)) );
   return UDR;
}


int main(void){
   DDRB = 1; //signal

   UBRRH = (unsigned char)(BAUD_PRESCALE>>8);
   UBRRL = (unsigned char)BAUD_PRESCALE;
   UCSRB = (1<<RXEN)|(1<<TXEN);
   UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);

   PORTB = 1;
   _delay_ms(100); //flash after init
   PORTB = 0;
   
   while(1){
      if(USART_Receive()>'A' && USART_Receive()<'Z'){
         PORTB = 1;
         _delay_ms(100);
         PORTB = 0;
      }
   //   _delay_ms(1000);
   //   USART_Transmit('A');

   }
}


Благодаря предварително за помощта!

Автор:  Ники [ Пет Авг 20, 2010 12:57 am ]
Заглавие: 

В момента не съм много буден, но за уарт си имаше примери с АВР студиото и в даташита, даже корекции не съм правил, ползвах ги наготово, ако не си сигурен че проца пали правилно при стартиране си направи някаква индикация за това.

Автор:  nhadjinikolov [ Пет Авг 20, 2010 1:02 am ]
Заглавие: 

Кода, който съм написан е на база на този от даташийта. Пробвах с 2 атмеги(и двете 16) едната 8PU, другата 16PU.
Сега ще разгледам примера, който идва с GCC. За него не се бях сетил... Благодаря! :)

Автор:  michev [ Пет Авг 20, 2010 1:08 am ]
Заглавие: 

Не работи, защото имаш грешка в кода (логическа).
Проблема ти (по това време на денонощието виждам само 1 :) ) е в условието
Код:
if(USART_Receive()>'A' && USART_Receive()<'Z')

Така написано, трябва да дойдат 2 символа , един по голям аски от 65 и един с по малък от кода на Z, понеже четеш 2 пъти уарт-а.

Ей ти най елементарното решение
Код:
unsigned char buff = USART_Receive();
if  ( (buff >= 'A')  && (buff <= 'Z') ) {
....
}


успех!

Автор:  nhadjinikolov [ Пет Авг 20, 2010 1:46 am ]
Заглавие: 

Това е така, защото съм станал преди почти 20 часа, а трябваше да върна кода в състоянието, в което го описвам в поста по-горе :)
Иначе си беше с буфер, като го пробвах...
За последно го бях направил просто по-голямо от А :)

Пробвах с прекъсвания при RXC, обаче то дори не влиза в ПОП...

Автор:  michev [ Пет Авг 20, 2010 1:47 pm ]
Заглавие: 

Тъси проблема в хардуера (примерно тх и рх да си завъртял..Ако пък не си сигурен дали не си объркал някой извод на ком-ската букса, погледни по внимателно - изписани са със ситни номера изводите, на предната и част), защото програмата е ОК.
Тя е 90% 1:1 от дейташийта, а тя със сигурност работи.
До колкото помня, трябва в софта на ПЦ-то да чекнеш XON/XOFF flow controll-а.

Автор:  nhadjinikolov [ Пет Авг 20, 2010 11:11 pm ]
Заглавие: 

Ами до този момент уж всичко е добре, но положението е същото :(
Само едно нещо ме притеснява - кондензаторите на МАХ232 са 4.7 микро, а по даташиита ги дават 1 или 0,1. Утре ще ги сменя с 0,1, но пък съм виждал схеми, където ползват и 10 микро...
Има ли значение дали ползвам свързване само на Рх, Тх и земя или ще окъся и 7ми и 8ми и 4ти и 6ти?

Автор:  michev [ Съб Авг 21, 2010 12:21 am ]
Заглавие: 

Кондензаторите задължително 1:1 от дейташийта. Виж много внимателно кой е производителя, и му намери точно неговия дейташийт.
За окъсяването - мисля че не ти трябва... (все пак опитай различни варианти, че аз само усб-сериал (pl2303, ft232rl) съм бутал и там определено не съм окъсявал)

Автор:  Ники [ Съб Авг 21, 2010 12:43 am ]
Заглавие: 

Трябва да започнеш с абв-то, окъси RX и TX na MAX232, и от терминала на ПЦ каквото пратиш трябва да го получиш, така поне ще си изчистиш че терминала, ком порта и макс232 работят, и остава само проца.
Не ти трябва двоен стоп и тази скорост ако не е грешка 9200, я направи стандартна, въобще ползвай настройките които са масови 9600,8,1стоп, но парити,без хард и софт контрол

Автор:  nhadjinikolov [ Съб Авг 21, 2010 7:13 am ]
Заглавие: 

скоростта е 9600, просто съм объркал в началото :) в кода е 9600 :)
Аз при окъсяване на Рх и Тх още на изхода на ком порта не получавам нищо...

Автор:  Ники [ Съб Авг 21, 2010 9:53 am ]
Заглавие: 

ако си ме разбрал какво ти написах и си сигурен в отговора си за окъсяването на RX и TX и неработенето на терминала, не видях някъде в постовете това да си го упоменал, какъв софтуер какви 5 лева..

Смени терминала, или смени порта на УСБ ако трябва, изчисти си пътя извън процесора и тогава пак опитай със софта в него..

Автор:  amdatlon [ Съб Авг 21, 2010 11:49 am ]
Заглавие: 

Пробва с този , на мен доста работа ми свърши .

http://technet.microsoft.com/en-us/sysinternals/bb896644.aspx

Автор:  nhadjinikolov [ Нед Авг 22, 2010 7:51 pm ]
Заглавие: 

В първия пост съм написал, че ползвам PuTTy и ...
Цитат:
Настройките са бодрейт 9200, 8 бита данни, 2 стопови, без проверка, без флоу контрол

:)

Сложих 1 микро кондензатори на МАХ232, както пише в даташиита. Промяна няма.

Занесох си "системката" на друг компютър(на ХР с Хипертерминал, който съм го подкаралвал да работи с един ренесаски процесор) и там нищо не става... Праща до Рх пина и диода си мига, обаче и там абсолютно същото става.

Да не би проблема да е в това, че съм на бредборд и сигнала да се изменя прекалено много заради шумове и смущения?
Но пък аз когато окъсявах Рх и Тх на ком-порта го направих с женска букса, без дори да има кабел...

Автор:  michev [ Пон Авг 23, 2010 11:27 am ]
Заглавие: 

Пак ще се повторя - вместо да броиш изводите и да правиш грешки, обърни челото на буксата към теб и си виж номерата на изводите.
Сврържи правилните РХ и ТХ диретно на ком-а на компютъра, докато на терминалния софтуер започне да се изписва символа който си написал.
После сложи мах-а и повтори упражнението. След като тръгне и с мах-а, тогаз слагай контролера.
Сега се сетих и друго - ако ползваш ком-ски кабел, взет от УПС, имай в предвид, че той не е с пълния брой жила.
И махни диодите от РХ и ТХ :)

Автор:  Wise [ Пон Авг 23, 2010 2:19 pm ]
Заглавие: 

А сещаш ли се, че женската букса е огледална на мъжката?
Когато ги нанижеш двете краката им по номера съвпадат!
//когато гледаш женската откъм перата за запояване 1 е най-ляво, при мъжката е обратно

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/