roboforum.ru

Технический форум по робототехнике.


COM порт vs МК

Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать.
Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил.
Робот своими руками. Самодельный робот.

COM порт vs МК

Сообщение KiCom » 19 ноя 2005, 20:58

Продолжение темы про управление сервоприводами от компьютера. Вообщем разобрался с сервами не через ШИМ но вообщем работает. Вопрос как осуществляеться отправка с COM порта в МК.
Как я себе это представляю:
Мы как-то отправляем с компьютера и как-то принимаем это в МК. Причем как я понимаю с COM порта идет число в двоичном виде а не отдельный байты как в LPT. но как-то нужно считать это число в МК не scanf() же?
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение -= Александр =- » 20 ноя 2005, 01:32

В чем под МК и под ПК пишешь?
В МК все это на прерываниях делается, а для отправки есть функции тима putchar(a)  и puts(a) а для приема ставишь в обработчике прерывания чтение нужного регистра в переменную.
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение KiCom » 20 ноя 2005, 06:33

На ПК пишу в Си под ДОС, МК -  ImageCraft.
puts(a) и putchar(a) это отправка с МК в ПК. А как отправить с ПК? Даже если перенаправить stdout, то puts() и putсhar() всеравно пойдут на монитор а не на COM порт.
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение -= Александр =- » 20 ноя 2005, 07:30

Почитай в хелпе про работу как с файлами - это проще.
А вот файлик как сложнее, но круче, через железо. Делал для ВС3.0
Вложения
SERIAL.CPP
(3.41 КиБ) Скачиваний: 448
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение KiCom » 20 ноя 2005, 08:41

Посмотрел файлик вроде понял на уровне что куда записать чтобы заработало но еще интересно понять как это работает, можно несколько вопросов:
1) 2 stop-bits чем отличаестья от 1 stop bit?
2) что такое parity
Как с МК ведб он должне быть готов к принятию этих данных или он все врямя готов? Еще торможу с МК (у меня tinny 2313) можно и там примерчик?
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение -= Александр =- » 20 ноя 2005, 15:24

KiCom писал(а):Посмотрел файлик вроде понял на уровне что куда записать чтобы заработало но еще интересно понять как это работает, можно несколько вопросов:
1) 2 stop-bits чем отличаестья от 1 stop bit?
2) что такое parity
Как с МК ведб он должне быть готов к принятию этих данных или он все врямя готов? Еще торможу с МК (у меня tinny 2313) можно и там примерчик?


1) обычно ставится 1 стоп-бит. Но можно и 2, это смотря как ты в МК настроишь.
2) контроль четности. Иногда помогает поймать ошибку, при связи на большие расстояния.

Обычно ставят 8-N-1 - 8 бит данных, без контроля четности, 1 стоп-бит.

Еще тебе нужен хитрый кварц. Я где-то про него говорил. Не попню какой у тебя, я в примере выставлю 7.3728 МГц.

На МК смотри в Application Builder - он сам тебе все сделает. Вот пример:
Код: Выделить всёРазвернуть
//ICC-AVR application builder : 20.11.2005 13:21:11
// Target : T2313
// Crystal: 7.3728Mhz

#include <iot2313v.h>
#include <macros.h>

void port_init(void)
{
PORTA = 0x00;
DDRA  = 0x00;
PORTB = 0x00;
DDRB  = 0xFF;
PORTD = 0x00;
DDRD  = 0x01;
}

//TIMER1 initialize - prescale:256
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 500mSec
// actual value: 499,965mSec (0,0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop timer
TCNT1H = 0xC7; //set count value
TCNT1L = 0xC1;
OCR1AH  = 0x38; //set compare value
OCR1AL  = 0x3F;
OCR1BH  = 0x38; //set compare value
OCR1BL  = 0x3F;
TCCR1A = 0x00;
TCCR1B = 0x04; //start Timer
}

#pragma interrupt_handler timer1_ovf_isr:6
void timer1_ovf_isr(void)
{
 PORTD^=0b1; //Моргаем диодом на PD0 чтоб понять что работает.
//TIMER1 has overflowed
TCNT1H = 0xC7; //reload counter high value
TCNT1L = 0xC1; //reload counter low value
}

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0,0%)
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UBRRH = 0x00; //set baud rate upper
UBRRL = 0x2F; //set baud rate lower
UCSRA = 0x00;
UCSRC = 0x06;
UCSRB = 0xD8; //enable
}

#pragma interrupt_handler uart0_rx_isr:8
void uart0_rx_isr(void)
{
char a;
a=UDR; //Важно: после прочтения этого регистра он сам обнуляется.
       //Нужно сразу читать в переменную, а потом уже с ней работать.
putchar(a); //Отправить обратно
PORTB=a; //Выставить в порт
//uart has received a character in UDR
}

#pragma interrupt_handler uart0_tx_isr:10
void uart0_tx_isr(void)
{
//character has been transmitted
}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();
uart0_init();

MCUCR = 0x00;
GIMSK = 0x00;
TIMSK = 0x80;
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

void main(void)
{
 init_devices();
}
Вложения
1.jpg
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение -= Александр =- » 20 ноя 2005, 15:29

Вообще я все что с ком-портом связано обычно в проге RS232PRO отлаживаю, но накрайняк стандартный гипер-терминал сойдет. Да и в ICC свой терминал есть, хоть и убогиий.
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение KiCom » 21 ноя 2005, 21:11

Собрал, работает но как-то странно :), значения посылаю через RS232PRO как ты и советовал, тыкаю по клаве символов 10 потом нажимаю enter что какието светодиоды погаснут какието не погаснут вообщем мистика такзакономерность и не выявил. Я что число FF включить весь PORTB а число 00 выключить его.
Мигающий светод на ножке PD0 я не ставил т.к. он занят RXD.
А да еще компилятор упорно не хочет обрабатывать функцию putchar(); что можно с этим сделать?
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение -= Александр =- » 21 ноя 2005, 22:14

Напиши вот это в начало, может в этом дело:
Код: Выделить всёРазвернуть
#include <CONIO.H>
#include <STDIO.H>

А моргание диода вообще выруби, может мешает, че-то я не сообразил что там RXD...

Еще: проверь на какую частоту прога на компе работает - я делал 9600 бит/сек...
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение KiCom » 22 ноя 2005, 17:27

Убрал мигание но это не помогло. Библиотели conio.h у меня нет прикрепи ее пожалалуйста, Вообще он ведет себя странно на еденичные символы не реагирует, но если написать целую цепочку одних и тех же символов то он срабатывает, но если написать эту строчку еще раз то загоряться уже другие светодиоды и так каждый раз по новому. Без putchar ту не как не обойтись.
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение -= Александр =- » 23 ноя 2005, 00:47

1)У меня все без библиотек работает.
2)Какой версии у тебя компилер?
3)Какой кварц?
4)Прошиты ли фузы проца под кварц?
5)На какой битрейт настроена прога на компе?
6)Вообще настройки порта на компе?
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение KiCom » 23 ноя 2005, 06:31

2) Версия 7.03 Built Oct 2 2005
3) 11.059 мгц
4) Нет, не прошивал , какие биты надо прошить?
5) 9600 в AppBuild ставил такоеже значение
6) Скорость: 9600
   Биты данных: 8
   Четность: нет
   Стоповые биты: 1
   Управление потоком: нет
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение -= Александр =- » 23 ноя 2005, 07:13

В ICC жмешь на кнопку программатора (самая правая кнопка). В окне пишешь в поле fuse bits (справа вверху) значение 0xD9EF и жмешь кнопку "W"

Советую перед этим нажать кнопку R и запомнить что там по-дефолту было.

Без этого у тебя кварц отключен и частота проца 1 МГц от внутреннего генератора. Потому 9600 получается через одно нехорошее место и ничерта не работает.  :wink:

А про putchar завтра попробую на 7-ой версии. Я в 6-ой этот примерчик делал...
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение KiCom » 24 ноя 2005, 12:53

Прошил я фьюзы но всеравно работать не стало, может я что. Как ты и говорил, сначало я нажал кнопочку read (напровтив надписи fuse bits) появилось число 0xFFDF62 думаю странно, как-то символов многовато, потом нажал на кнопочку read напротив надписи lock bits там появилось число 0x00FF вот оно мне как-то больше понравилось :) и я туда вписал то что ты мне говорил, после этого контролер вообще отказался работать :) говорит нет контролера проверть кабель и питание.
Но т.к. у меня ьыл второй МК теперь я решил написать в окошечке напротив Loks bits вписал я туда число нажал W компилятор говорит мо все ок. Нажимаю кнопочку R а там появляеться число 0xFFDF62 то что было изначально тоетсь ничего не понменялось. Но при этом контролер работает тоесть в него можно что-то прошить, но с COM портам все теже глюки что и раньше тоесть кварц не включен. Собственно где я накосячил? Вот что я нашел в ДШ по этому поводу:
Вложения
1.gif
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение -= Александр =- » 24 ноя 2005, 17:43

Хм... А я думал что тут как у всех... Оказывается че-то свое... Щас даташит гляну... Короче выстави CKSEL так как там написано для кварца...
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

След.

Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11