Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: RS-232
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
AnKing
На дисплее последовательно отображаются непонятные рандомные символы,вводя чтонить в гипертерминале отображается что-то определенное, но не совпадающее с тем что на кнопках... ввожу 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);
    }
}
XVR
Как минимум #define _ALTERNATE_PUTCHAR_ должно стоять ДО #include <stdio.h>
Палыч
Цитата(AnKing @ Oct 14 2010, 01:55) *
что это может быть?
Такое можно часто наблюдать при проблемах с общим проводом в RS232 - например, при обрыве.
AnKing
Цитата(XVR @ Oct 14 2010, 09:02) *
Как минимум #define _ALTERNATE_PUTCHAR_ должно стоять ДО #include <stdio.h>

поставил до....
жтмплей виснет вместе с контроллером если подключаю провод на прием в комп
зато из компа передается(на дисплее отображается последний введенный символ)
но всеравно введенное не совпадает с выводимым на дисплей

об обрыве какого провода идет речь?
GND?
Палыч
Цитата(AnKing @ Oct 14 2010, 18:38) *
об обрыве какого провода идет речь?
GND?
Да
AnKing
перепроверил все провода... все подключено, нигде обрывов нет... контроллер всеравно висит ... ничего не принимает и не передает
на спалил ли я max232?
XVR
Оторвите MAX232 от контролера и замкните оторванные TX/RX на MAX232. Если в Гипертерминале будут отображаться вводимые символы - то проблема в МК, если не будут - то в MAX или проводах
Александр77
Нескромный вопрос, а чем тактируете МК?
Применяйте ВСЕГДА внешний генератор/резонатор, это спасет от многих бед (из личного опыта)
AnKing
замкнул max со стороны контроллера... назад ничего не передается... в то время как если замкнуть перед МАХ то все идет обратно... Я там понял МАХ сдох... соответственно вопрос... как и почему он мог так умереть? ведь по сути эту микросхему не так легко убить?
может я неправильно настраиваю гипертерминал где-то?
Deka
При замыкании до макса гипертерминал ведь показывает - значит с ним всё в порядке.
XVR
Цитата(AnKing @ Oct 15 2010, 09:58) *
замкнул max со стороны контроллера... назад ничего не передается... в то время как если замкнуть перед МАХ то все идет обратно...
А MAX включен правильно? Входы с выходами не перепутали?

Цитата
может я неправильно настраиваю гипертерминал где-то?
Тогда бы и при замыкании перед MAX'ом тоже не работало бы

AnKing
Цитата
Применяйте ВСЕГДА внешний генератор/резонатор, это спасет от многих бед (из личного опыта)

Знал бы я еще как это делать blush.gif

У меня вот эта тестовая плата:
http://www.tupianguanjia.com/bin/3455/avri...8+_V20_Side.jpg

там стоит внешний резонатор уже.
А тактирование определяется фъюзами ведь?
у меня они все незапрограммированы
Deka
1. Проверить обвязку и подключение драйвера RS-232.
2. Подключить к драйверу только провода от COM порта компьютера.
3. Замкнуть ножки приёма-передачи на "логической" стороне драйвера.
4. Используя любую программу-терминал на любой скорости убедиться в наличии эха.
5. Снять закоротку приёма-передачи на "логической" стороне драйвера.
6. Подключить "логическу" передачу драйвера на приём контроллера.
7. Подключить "логический" приём драйвера на передачу контроллера.
8. Разобраться и правильно сконфигурировать контроллер для работы от правильного кварца.
9. Написать код отправляющий то, что примет.
10. Настроить программу-терминал на скорость контроллера.
11. Убедиться в наличии эха.
XVR
Проверьте каким RS232 кабелем подключена ваша плата к PC. Возможно вам нужен нуль-модемный кабель
AnKing
Цитата(Deka @ Oct 18 2010, 09:08) *
1. Проверить обвязку и подключение драйвера RS-232.
2. Подключить к драйверу только провода от COM порта компьютера.
3. Замкнуть ножки приёма-передачи на "логической" стороне драйвера.
4. Используя любую программу-терминал на любой скорости убедиться в наличии эха.
5. Снять закоротку приёма-передачи на "логической" стороне драйвера.
6. Подключить "логическу" передачу драйвера на приём контроллера.
7. Подключить "логический" приём драйвера на передачу контроллера.
8. Разобраться и правильно сконфигурировать контроллер для работы от правильного кварца.
9. Написать код отправляющий то, что примет.
10. Настроить программу-терминал на скорость контроллера.
11. Убедиться в наличии эха.


Закоротил контакты на логической стороне - нет эха...
до мах эхо есть....
купил на ebay отдельно только драйвер
http://cgi.ebay.com/ws/eBayISAPI.dll?ViewI...e=STRK:MEWNX:IT
закоротил на нем ноги после драйвера - все равно нет эха unsure.gif (питание на мах подключено естественно, светодиод power горит)
XVR
Дайте схему, как подключали драйвер
AnKing
Схемы нету но есть фотка

Нижний конец провода идет в комп
XVR
По фотке мало что видно, но попробуйте поменять местами 2й и 3й провода на раэъеме.
Надеюсь, что в Гипертерменале не забыли отключить Flow Control?
AnKing
flow control отключен
провода местами поменял, теперь моргают светодиоды приема и передачи на плате. НО в терминале все равно ничего нет

Вот схема подключения макса на stk48
XVR
Для вашего stk48:
1) Провода к PC должны идти один к одному (2й с stk на 2й на PC, 3-3, 5-5)
2) Поставьте перемычку на разъем MAX232.SIP (тот, что на схеме слева)
3) Не забудьте подать питание на stk48
4) Проверьте в Гипертерминале (с отключенным Flow Control)
AnKing
Цитата(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 конвертером - светодиоды приема/передачи моргают а в терминале тоже ничего.

Я уже и дополнительный контроллер в комп вставил с двумя ком портами(надеялся мот порты хреновые).... нет.... тот же результат...
XVR
Странно это. Осцилограф есть? Или хотя бы тестер? Посмотрите уровни сигналов на разъеме (2 и 3 ноги). Посмотрите отдельно с компа и с платки, а так же когда они соединены
Mike18
Цитата(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-м.
AnKing
Цитата(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
AnKing
Переписал все в 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);
    }
}
XVR
Неправильно выставлен делитель для USART (UBRR0). Туда надо не скорость записывать, а коэффициент деления - читайте DS smile.gif
AnKing
Цитата(XVR @ Oct 20 2010, 21:40) *
Неправильно выставлен делитель для USART (UBRR0). Туда надо не скорость записывать, а коэффициент деления - читайте DS smile.gif


не понимаю куда в этой формуле подставлять значения
я пока еще никак не могу понять какую мне частоту лучше выставлять
на stk48 стоит резонатор даташит на которыя я найти нигде не могу (n7.3728j - то что сверху на нем написано)
ставлю ту что по умолчанию - 4 000 000
Нельзя ли примерчик подкинуть пожалста?
rezident
Цитата(AnKing @ Oct 21 2010, 00:59) *
на stk48 стоит резонатор даташит на которыя я найти нигде не могу (n7.3728j - то что сверху на нем написано)
Это 7,3728МГц.
AnKing
В даташите при такой частоте и скорости 115200
UBRRn - 3
как это загнать в регистры?

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


Все понял... подставил 3 вместо baud и все покатило.... передает символ правильно...
теперь тока есть вопрос что такое
"../usart2.c:45: warning: implicit declaration of function 'printf'"
и как ето можно исправить чтобы выводить строки
XVR
Цитата
теперь тока есть вопрос что такое
"../usart2.c:45: warning: implicit declaration of function 'printf'"
Сделайте #include <stdio.h> в начале программы
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.