Отговори на тема  [ 25 мнения ]  Отиди на страница 1, 2  Следваща
Проблем с UART(AVR) 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Яну 11, 2010 3:27 am
Мнения: 14
Мнение Проблем с 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:45 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
В момента не съм много буден, но за уарт си имаше примери с АВР студиото и в даташита, даже корекции не съм правил, ползвах ги наготово, ако не си сигурен че проца пали правилно при стартиране си направи някаква индикация за това.


Пет Авг 20, 2010 12:57 am
Профил
Ранг: Минаващ
Ранг: Минаващ

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


Пет Авг 20, 2010 1:02 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение 
Не работи, защото имаш грешка в кода (логическа).
Проблема ти (по това време на денонощието виждам само 1 :) ) е в условието
Код:
if(USART_Receive()>'A' && USART_Receive()<'Z')

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

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


успех!


Пет Авг 20, 2010 1:08 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Яну 11, 2010 3:27 am
Мнения: 14
Мнение 
Това е така, защото съм станал преди почти 20 часа, а трябваше да върна кода в състоянието, в което го описвам в поста по-горе :)
Иначе си беше с буфер, като го пробвах...
За последно го бях направил просто по-голямо от А :)

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


Пет Авг 20, 2010 1:46 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

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


Пет Авг 20, 2010 1:47 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

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


Пет Авг 20, 2010 11:11 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение 
Кондензаторите задължително 1:1 от дейташийта. Виж много внимателно кой е производителя, и му намери точно неговия дейташийт.
За окъсяването - мисля че не ти трябва... (все пак опитай различни варианти, че аз само усб-сериал (pl2303, ft232rl) съм бутал и там определено не съм окъсявал)


Съб Авг 21, 2010 12:21 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
Трябва да започнеш с абв-то, окъси RX и TX na MAX232, и от терминала на ПЦ каквото пратиш трябва да го получиш, така поне ще си изчистиш че терминала, ком порта и макс232 работят, и остава само проца.
Не ти трябва двоен стоп и тази скорост ако не е грешка 9200, я направи стандартна, въобще ползвай настройките които са масови 9600,8,1стоп, но парити,без хард и софт контрол


Съб Авг 21, 2010 12:43 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Яну 11, 2010 3:27 am
Мнения: 14
Мнение 
скоростта е 9600, просто съм объркал в началото :) в кода е 9600 :)
Аз при окъсяване на Рх и Тх още на изхода на ком порта не получавам нищо...


Съб Авг 21, 2010 7:13 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
ако си ме разбрал какво ти написах и си сигурен в отговора си за окъсяването на RX и TX и неработенето на терминала, не видях някъде в постовете това да си го упоменал, какъв софтуер какви 5 лева..

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


Съб Авг 21, 2010 9:53 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Чет Мар 19, 2009 8:33 pm
Мнения: 804
Мнение 
Пробва с този , на мен доста работа ми свърши .

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


Съб Авг 21, 2010 11:49 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Яну 11, 2010 3:27 am
Мнения: 14
Мнение 
В първия пост съм написал, че ползвам PuTTy и ...
Цитат:
Настройките са бодрейт 9200, 8 бита данни, 2 стопови, без проверка, без флоу контрол

:)

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

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

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


Нед Авг 22, 2010 7:51 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

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


Пон Авг 23, 2010 11:27 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Дек 19, 2004 6:26 pm
Мнения: 1628
Местоположение: Сливен
Мнение 
А сещаш ли се, че женската букса е огледална на мъжката?
Когато ги нанижеш двете краката им по номера съвпадат!
//когато гледаш женската откъм перата за запояване 1 е най-ляво, при мъжката е обратно


Пон Авг 23, 2010 2:19 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 25 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни