|
RS-232, не передает обратно в компьютер |
|
|
|
Oct 13 2010, 21:55
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 29)
|
Oct 14 2010, 14:38
|
Участник

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

|
Цитата(XVR @ Oct 14 2010, 09:02)  Как минимум #define _ALTERNATE_PUTCHAR_ должно стоять ДО #include <stdio.h> поставил до.... жтмплей виснет вместе с контроллером если подключаю провод на прием в комп зато из компа передается(на дисплее отображается последний введенный символ) но всеравно введенное не совпадает с выводимым на дисплей об обрыве какого провода идет речь? GND?
Сообщение отредактировал AnKing - Oct 14 2010, 14:40
|
|
|
|
|
Oct 14 2010, 15:46
|
Участник

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

|
перепроверил все провода... все подключено, нигде обрывов нет... контроллер всеравно висит ... ничего не принимает и не передает на спалил ли я max232?
|
|
|
|
|
Oct 15 2010, 05:58
|
Участник

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

|
замкнул max со стороны контроллера... назад ничего не передается... в то время как если замкнуть перед МАХ то все идет обратно... Я там понял МАХ сдох... соответственно вопрос... как и почему он мог так умереть? ведь по сути эту микросхему не так легко убить? может я неправильно настраиваю гипертерминал где-то?
|
|
|
|
|
Oct 15 2010, 12:11
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(AnKing @ Oct 15 2010, 09:58)  замкнул max со стороны контроллера... назад ничего не передается... в то время как если замкнуть перед МАХ то все идет обратно... А MAX включен правильно? Входы с выходами не перепутали? Цитата может я неправильно настраиваю гипертерминал где-то? Тогда бы и при замыкании перед MAX'ом тоже не работало бы
|
|
|
|
|
Oct 15 2010, 19:07
|
Участник

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

|
Цитата Применяйте ВСЕГДА внешний генератор/резонатор, это спасет от многих бед (из личного опыта) Знал бы я еще как это делать  У меня вот эта тестовая плата: http://www.tupianguanjia.com/bin/3455/avri...8+_V20_Side.jpgтам стоит внешний резонатор уже. А тактирование определяется фъюзами ведь? у меня они все незапрограммированы
Сообщение отредактировал AnKing - Oct 15 2010, 19:38
|
|
|
|
|
Oct 18 2010, 19:34
|
Участник

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

|
Цитата(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закоротил на нем ноги после драйвера - все равно нет эха  (питание на мах подключено естественно, светодиод power горит)
|
|
|
|
|
Oct 19 2010, 04:39
|
Участник

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

|
Схемы нету но есть фотка  Нижний конец провода идет в комп
|
|
|
|
|
Oct 19 2010, 15:06
|
Участник

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

|
flow control отключен провода местами поменял, теперь моргают светодиоды приема и передачи на плате. НО в терминале все равно ничего нет Вот схема подключения макса на stk48
Сообщение отредактировал AnKing - Oct 19 2010, 15:28
|
|
|
|
|
Oct 19 2010, 18:00
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 19 2010, 20:59
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 23-12-06
Из: Старых Васюков
Пользователь №: 23 821

|
Цитата(AnKing @ Oct 19 2010, 08:39)  Схемы нету но есть фотка ... Нижний конец провода идет в комп Если на верхнем разъёме D-SUB "вилка" (похоже  ), то этот разъём, IMHO, запаян "зеркально". То есть провод GND, который должен быть запаян на 5-й выв. разъёма, запаян на 1-й выв., а тот, который должен быть запаян на 2-й вывод, запаян на 4-й. (Правильно, в P.S.) P.S. Не, всё ещё хуже. Кабель, судя по фотографии, должен быть "прямой". То есть:2-й выв. нижнего разъёма (на фотографии, коричневый провод) должен соединиться со 2-м выв. верхнего разъёма, а не с 3-м. 3-й(красный) - с 3-м, а не с 4-м. 5-й(жёлтый) - с 5-м, а не с 1-м.
Сообщение отредактировал Mike18 - Oct 19 2010, 21:33
--------------------
Время - материя тонкая и неточная...
|
|
|
|
|
Oct 19 2010, 21:40
|
Участник

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

|
Цитата(Mike18 @ Oct 20 2010, 00:59)  Если на верхнем разъёме D-SUB "вилка" (похоже  ), то этот разъём, IMHO, запаян "зеркально". То есть провод GND, который должен быть запаян на 5-й выв. разъёма, запаян на 1-й выв., а тот, который должен быть запаян на 2-й вывод, запаян на 4-й. (Правильно, в P.S.) P.S. Не, всё ещё хуже. Кабель, судя по фотографии, должен быть "прямой". То есть:2-й выв. нижнего разъёма (на фотографии, коричневый провод) должен соединиться со 2-м выв. верхнего разъёма, а не с 3-м. 3-й(красный) - с 3-м, а не с 4-м. 5-й(жёлтый) - с 5-м, а не с 1-м. Спаял все как сказали и он заработал  Есть только один вопрос putchar(getchar()); - не передает все печатаемые символы а только выборочно.. например не передает 'a' англицкое а printf() функция так вообще не работает putchar('x'); - выводит зяпятую... и такого плана нестыковочки
|
|
|
|
|
Oct 20 2010, 17:03
|
Участник

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

|
Переписал все в AVR Studio Когда отправляю что-нибудь с контроллера (USART_Transmit('T')  В терминале(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); } }
|
|
|
|
|
Oct 20 2010, 18:59
|
Участник

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

|
Цитата(XVR @ Oct 20 2010, 21:40)  Неправильно выставлен делитель для USART (UBRR0). Туда надо не скорость записывать, а коэффициент деления - читайте DS  не понимаю куда в этой формуле подставлять значения я пока еще никак не могу понять какую мне частоту лучше выставлять на stk48 стоит резонатор даташит на которыя я найти нигде не могу (n7.3728j - то что сверху на нем написано) ставлю ту что по умолчанию - 4 000 000 Нельзя ли примерчик подкинуть пожалста?
|
|
|
|
|
Oct 20 2010, 19:28
|
Участник

Группа: Участник
Сообщений: 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'" и как ето можно исправить чтобы выводить строки
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|