реклама на сайте
подробности

 
 
> RS-232, не передает обратно в компьютер
AnKing
сообщение Oct 13 2010, 21:55
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 2-02-08
Пользователь №: 34 686



На дисплее последовательно отображаются непонятные рандомные символы,вводя чтонить в гипертерминале отображается что-то определенное, но не совпадающее с тем что на кнопках... ввожу 1 - отображается 7 и тут же исчезает...
но это все работает только когда к контроллеру поделючен провод передачи
как только включаю провод на прием - контроллер замирает, на дисплее ничего не отображается... в гипертерминал ничего не отправляется... что это может быть?

Код
#include <mega48.h>

// Alphanumeric LCD Module functions
#include <alcd.h>

// Standard Input/Output functions
#include <stdio.h>

#include <delay.h>


#define LCD_CHARS_LINE 16

// Bit definitions from the USART control registers
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// Specify that a new putchar function will be used instead of the one from stdio.h
#define _ALTERNATE_PUTCHAR_


// Specify the output types
#define USART0 0
#define LCD 2

// This variable will specify to which peripheral the output of putchar will be directed
unsigned char poutput;

void putchar(char c)
{
switch (poutput)
       {
       case USART0: // the output will be directed to USART0
            while ((UCSR0A & DATA_REGISTER_EMPTY)==0);
            UDR0=c;
       break;

      
       case LCD:    // the output will be directed to the LCD
            lcd_putchar©;
       };
}

void main(void)
{

char k;


// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif


// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART0 Mode: Asynchronous
// USART Baud Rate: 9600
UCSR0A=0x00;
UCSR0B=0x18;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x33;

lcd_init(16);
  
while (1)
    {
    poutput=USART0;
    //printf("This is a test of USART%u.\r",0);
    k=getchar();
    putchar(k);
    //UDR0=3;
    delay_ms(100);
    poutput=LCD;
    lcd_clear();
    printf("-- %c --\n%u characters/line.",k,LCD_CHARS_LINE);
    }
}


Сообщение отредактировал AnKing - Oct 13 2010, 21:55
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 29)
XVR
сообщение Oct 18 2010, 19:53
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Дайте схему, как подключали драйвер
Go to the top of the page
 
+Quote Post
AnKing
сообщение Oct 19 2010, 04:39
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 2-02-08
Пользователь №: 34 686



Схемы нету но есть фотка

Нижний конец провода идет в комп
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 19 2010, 06:30
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



По фотке мало что видно, но попробуйте поменять местами 2й и 3й провода на раэъеме.
Надеюсь, что в Гипертерменале не забыли отключить Flow Control?
Go to the top of the page
 
+Quote Post
AnKing
сообщение Oct 19 2010, 15:06
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 2-02-08
Пользователь №: 34 686



flow control отключен
провода местами поменял, теперь моргают светодиоды приема и передачи на плате. НО в терминале все равно ничего нет

Вот схема подключения макса на stk48


Сообщение отредактировал AnKing - Oct 19 2010, 15:28
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 19 2010, 16:53
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Для вашего stk48:
1) Провода к PC должны идти один к одному (2й с stk на 2й на PC, 3-3, 5-5)
2) Поставьте перемычку на разъем MAX232.SIP (тот, что на схеме слева)
3) Не забудьте подать питание на stk48
4) Проверьте в Гипертерминале (с отключенным Flow Control)
Go to the top of the page
 
+Quote Post
AnKing
сообщение Oct 19 2010, 18:00
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 2-02-08
Пользователь №: 34 686



Цитата(XVR @ Oct 19 2010, 20:53) *
Для вашего stk48:
1) Провода к PC должны идти один к одному (2й с stk на 2й на PC, 3-3, 5-5)
2) Поставьте перемычку на разъем MAX232.SIP (тот, что на схеме слева)
3) Не забудьте подать питание на stk48
4) Проверьте в Гипертерминале (с отключенным Flow Control)

Поставил провода ровно (2-2, 3-3, 5-5)
поставил перемычку
в гипертерминале ничего назад не идет
питание на stk есть.

а с маленьким rs232toTTL конвертером - светодиоды приема/передачи моргают а в терминале тоже ничего.

Я уже и дополнительный контроллер в комп вставил с двумя ком портами(надеялся мот порты хреновые).... нет.... тот же результат...

Сообщение отредактировал AnKing - Oct 19 2010, 20:37
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 19 2010, 20:43
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Странно это. Осцилограф есть? Или хотя бы тестер? Посмотрите уровни сигналов на разъеме (2 и 3 ноги). Посмотрите отдельно с компа и с платки, а так же когда они соединены
Go to the top of the page
 
+Quote Post
Mike18
сообщение Oct 19 2010, 20:59
Сообщение #23


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 23-12-06
Из: Старых Васюков
Пользователь №: 23 821



Цитата(AnKing @ Oct 19 2010, 08:39) *
Схемы нету но есть фотка
...
Нижний конец провода идет в комп

Если на верхнем разъёме D-SUB "вилка" (похоже smile.gif), то этот разъём, IMHO, запаян "зеркально". laughing.gif
То есть провод GND, который должен быть запаян на 5-й выв. разъёма, запаян на 1-й выв., а тот,
который должен быть запаян на 2-й вывод, запаян на 4-й.
(Правильно, в P.S.)


P.S. Не, всё ещё хуже. rolleyes.gif
Кабель, судя по фотографии, должен быть "прямой".
То есть:
2-й выв. нижнего разъёма (на фотографии, коричневый провод) должен соединиться со 2-м выв. верхнего разъёма, а не с 3-м.
3-й(красный) - с 3-м, а не с 4-м.
5-й(жёлтый) - с 5-м, а не с 1-м.

Сообщение отредактировал Mike18 - Oct 19 2010, 21:33


--------------------
Время - материя тонкая и неточная...
Go to the top of the page
 
+Quote Post
AnKing
сообщение Oct 19 2010, 21:40
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 2-02-08
Пользователь №: 34 686



Цитата(Mike18 @ Oct 20 2010, 00:59) *
Если на верхнем разъёме D-SUB "вилка" (похоже smile.gif), то этот разъём, IMHO, запаян "зеркально". laughing.gif
То есть провод GND, который должен быть запаян на 5-й выв. разъёма, запаян на 1-й выв., а тот,
который должен быть запаян на 2-й вывод, запаян на 4-й.
(Правильно, в P.S.)


P.S. Не, всё ещё хуже. rolleyes.gif
Кабель, судя по фотографии, должен быть "прямой".
То есть:
2-й выв. нижнего разъёма (на фотографии, коричневый провод) должен соединиться со 2-м выв. верхнего разъёма, а не с 3-м.
3-й(красный) - с 3-м, а не с 4-м.
5-й(жёлтый) - с 5-м, а не с 1-м.


Спаял все как сказали и он заработал smile.gif
Есть только один вопрос
putchar(getchar()); - не передает все печатаемые символы а только выборочно.. например не передает 'a' англицкое
а printf() функция так вообще не работает
putchar('x'); - выводит зяпятую... и такого плана нестыковочки laughing.gif
Go to the top of the page
 
+Quote Post
AnKing
сообщение Oct 20 2010, 17:03
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 2-02-08
Пользователь №: 34 686



Переписал все в AVR Studio

Когда отправляю что-нибудь с контроллера (USART_Transmit('T')wink.gif
В терминале(RealTerm) курсор передвигается и моргает лампочка RxD
Но не передается символ.
И горит лампочка Break(Break is when RxD line is broken)
что там может быть брокен?


Код
#include <avr\io.h>
#include <util\delay.h>
#include <stdlib.h>
//#include <avr\interrupt.h>    

void USART_Transmit( unsigned char data )
{
// Wait for empty transmit buffer
while ( !( UCSR0A & (1<<UDRE0)) )
;
// Put data into buffer, sends the data
UDR0 = data;
}

unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSR0A & (1<<RXC0)) )
;
/* Get and return received data from buffer */
return UDR0;
}

void USART_Init( unsigned int baud )
{
// Set baud rate
UBRR0H = (unsigned char)(baud>>8);
UBRR0L = (unsigned char)baud;
// Enable receiver and transmitter
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
// Set frame format: 8data, 1stop bit
UCSR0C = (0<<USBS0)|(3<<UCSZ00);
}

int main (void)
{

DDRB=0x00;

USART_Init(9600);

while(1)
    {
    //USART_Transmit(USART_Receive());
    USART_Transmit('T');
    PORTB=0x00;
    _delay_ms(500);
    PORTB=0xFF;
    _delay_ms(500);
    }
}
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 20 2010, 17:40
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Неправильно выставлен делитель для USART (UBRR0). Туда надо не скорость записывать, а коэффициент деления - читайте DS smile.gif
Go to the top of the page
 
+Quote Post
AnKing
сообщение Oct 20 2010, 18:59
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 2-02-08
Пользователь №: 34 686



Цитата(XVR @ Oct 20 2010, 21:40) *
Неправильно выставлен делитель для USART (UBRR0). Туда надо не скорость записывать, а коэффициент деления - читайте DS smile.gif


не понимаю куда в этой формуле подставлять значения
я пока еще никак не могу понять какую мне частоту лучше выставлять
на stk48 стоит резонатор даташит на которыя я найти нигде не могу (n7.3728j - то что сверху на нем написано)
ставлю ту что по умолчанию - 4 000 000
Нельзя ли примерчик подкинуть пожалста?
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 20 2010, 19:04
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(AnKing @ Oct 21 2010, 00:59) *
на stk48 стоит резонатор даташит на которыя я найти нигде не могу (n7.3728j - то что сверху на нем написано)
Это 7,3728МГц.
Go to the top of the page
 
+Quote Post
AnKing
сообщение Oct 20 2010, 19:28
Сообщение #29


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 2-02-08
Пользователь №: 34 686



В даташите при такой частоте и скорости 115200
UBRRn - 3
как это загнать в регистры?

Цитата(AnKing @ Oct 20 2010, 23:21) *
В даташите при такой частоте и скорости 115200
UBRRn - 3
как это загнать в регистры?


Все понял... подставил 3 вместо baud и все покатило.... передает символ правильно...
теперь тока есть вопрос что такое
"../usart2.c:45: warning: implicit declaration of function 'printf'"
и как ето можно исправить чтобы выводить строки
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 20 2010, 20:43
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
теперь тока есть вопрос что такое
"../usart2.c:45: warning: implicit declaration of function 'printf'"
Сделайте #include <stdio.h> в начале программы
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd September 2025 - 12:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01488 секунд с 7
ELECTRONIX ©2004-2016