Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
29.07.2008, 14:07
|
|
Вид на жительство
Регистрация: 29.11.2006
Сообщений: 350
Сказал спасибо: 242
Сказали Спасибо 16 раз(а) в 14 сообщении(ях)
|
Синхронизация mega8l с ПК через COM порт
Ребята, гуру, помогите, пожалуйста новичку с сфере МК / ПК. Затея - заставить общаться МК с ПК. Программа до тупости простая
Код:
|
/************************************************** ***
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 29.07.2008
Author :
Company :
Comments:
Chip type : ATmega8L
Program type : Application
Clock frequency : 4,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
************************************************** ***/
#include ‹mega8.h›
#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)
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE‹256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// Standard Input/Output functions
#include ‹stdio.h›
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func6=In Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=0 State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x20;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
PORTC.5=1;
while (1)
{
// Place your code here
putchar(getchar());
};
} |
т.е. "отдай что принял".
Advanced Serial Port Monitor (программа для тестов что ли передачи и приёма данных по КОМ порту) принимает и передаёт все прекрасно.
Но моя программа на Си шарпе
Код:
|
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
namespace WindowsApplication3
{
public partial class Form1 : Form
{
public string tratratra = "";
public string perenos = "
";
public Form1()
{
InitializeComponent();
}
public void sc1()
{
this.tb.Text = "blablabla";
}
public void ScanKeyboard()
{
string str2 = "COM1";
System.IO.Ports.SerialPort s1;
s1 = new System.IO.Ports.SerialPort("COM1", 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);
while (!s1.IsOpen)
{
try
{
s1.Open();
}
catch
{
}
Thread.Sleep(1);
}
//this.tb.Text = this.tb.Text + "Порт открыт. " + perenos + "Попытаемся принять данные";
s1.DtrEnable = true;
s1.RtsEnable = false;
//this.pb.Value += 5;
byte[] buffer = new byte[777];
byte[] buffer1 = new byte[2];
byte num = 0;
int bufff = 0;
string buf="";
Keys escape = Keys.D0;
while (true)
{
/*while (bufff‹1)
{
s1.Read(buffer, 0, buffer.Length);
bufff=System.BitConverter.ToInt32(buffer, buffer.Length);
}*/
string str = "shakti";
byte[] arrByte = new byte[str.ToCharArray().Length];
int i = 0;
foreach (char ch in str.ToCharArray())
{
arrByte[i] = (byte)ch;
i++;
}
s1.Write(arrByte, 0, arrByte.Length);
s1.Read(buffer, 0, arrByte.Length);
System.Text.ASCIIEncoding enc = new ASCIIEncoding();
try
{
buf = enc.GetString(buffer);
}
catch (DecoderFallbackException dfex)
{
//do something
}
//tratratra += "+++"+buf;
tratratra += buf;
bufff = 0;
}
}
private void Button1_Click(object sender, EventArgs e)
{
new Thread(new ThreadStart(this.ScanKeyboard)).Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
tb.Text += tratratra;
tratratra = "";
}
}
} |
Передаёт слово shakti а принимает чепуху в виде tishak akshati и т.д.
Подскажите, пожалуйста, как правильно написать программу приёмо/передатчика для ПК и может какую синхронизацию придумать надо с программой МК???
С нетерпением жду Вашей консультации, советов.
|
|
|
|
29.07.2008, 18:19
|
|
Гражданин KAZUS.RU
Регистрация: 17.09.2006
Сообщений: 633
Сказал спасибо: 78
Сказали Спасибо 69 раз(а) в 57 сообщении(ях)
|
Если у вас установлен на МК кварц как указано в программе (4 Mhz) то причина ошибок при передаче в нем.Должен стоять кварц 11.0592 Mhz. Посмотрите даташит на МК там в разделе USART есть таблица зависимости ошибки при передаче от частоты кварца. CV тоже показывает процент ошибки при создании начального кода .
|
|
|
|
29.07.2008, 18:19
|
|
Гражданин KAZUS.RU
Регистрация: 17.09.2006
Сообщений: 633
Сказал спасибо: 78
Сказали Спасибо 69 раз(а) в 57 сообщении(ях)
|
Если у вас установлен на МК кварц как указано в программе (4 Mhz) то причина ошибок при передаче в нем.Должен стоять кварц 11.0592 Mhz. Посмотрите даташит на МК там в разделе USART есть таблица зависимости ошибки при передаче от частоты кварца. CV тоже показывает процент ошибки при создании начального кода .
|
|
|
|
29.07.2008, 18:21
|
|
Вид на жительство
Регистрация: 29.11.2006
Сообщений: 350
Сказал спасибо: 242
Сказали Спасибо 16 раз(а) в 14 сообщении(ях)
|
Я ж написал другая, профессионально так сказать прога читает и передаёт прекрасно, моя - нет. Так что "неправильность" МК можно с уверенность откинуть.
|
|
|
|
29.07.2008, 20:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 09.12.2007
Адрес: Новосибирск
Сообщений: 1,021
Сказал спасибо: 10
Сказали Спасибо 70 раз(а) в 63 сообщении(ях)
|
Честно говоря, посмотришь на аватар автора
и читать его вирши нет ниК-К-Какой охоты.
__________________
И на камнях растут деревья!
|
|
|
|
04.08.2008, 15:25
|
|
Вид на жительство
Регистрация: 29.11.2006
Сообщений: 350
Сказал спасибо: 242
Сказали Спасибо 16 раз(а) в 14 сообщении(ях)
|
Сообщение от domowoj
|
Честно говоря, посмотришь на аватар автора
и читать его вирши нет ниК-К-Какой охоты.
|
Мда? Или знаний просто не хватает?
|
|
|
|
05.08.2008, 09:07
|
|
Прописка
Регистрация: 07.08.2005
Сообщений: 178
Сказал спасибо: 16
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Попробуй через стандартный терминал
отправить и посмотреть что получаешь.
Я сильно не разбирался но думаю кварц
здесь не причем потому что буквы у вас
теже но стоят не в той последовательности.
если через терминал будет нормально значит с буфером
какой то косяк попробуй запустить в режиме отладки и посмотри по breakpoint'ам что у тебя в буфер попадает.
|
|
|
|
05.08.2008, 10:47
|
|
Вид на жительство
Регистрация: 29.11.2006
Сообщений: 350
Сказал спасибо: 242
Сказали Спасибо 16 раз(а) в 14 сообщении(ях)
|
Во, чувствуется человек понимающий нашёлся.
Попробовал через стандартный терминал - всё ок принимает. Но есть другой баг - когдя я запускаю скаажем программу в основном потоке всё тупо виснет. Поэтому как вы заметили наверное я запустил принятие данных в отдельном потоке (thread). Среда же Visual Studio 2005 почему - то не хочет отлаживать в step режиме фоновые потоки. Она по степ режиму доходит до кнопки, я её нажимаю, и всё, дальше всё работает самоя, я ничего не вижу...
|
|
|
|
05.08.2008, 14:00
|
|
Прописка
Регистрация: 07.08.2005
Сообщений: 178
Сказал спасибо: 16
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
если зависает в основном потоке, так на каком месте???
пошагово можно же посмотреть!?
|
|
|
|
05.08.2008, 14:06
|
|
Вид на жительство
Регистрация: 29.11.2006
Сообщений: 350
Сказал спасибо: 242
Сказали Спасибо 16 раз(а) в 14 сообщении(ях)
|
Не я может неправильно объяснил. Не знаю почему, но как только доходит до места
private void Button1_Click(object sender, EventArgs e)
{
new Thread(new ThreadStart(this.ScanKeyboard)).Start();
}
Как только запускается new Thread(new ThreadStart(this.ScanKeyboard)).Start();
я перестаю видеть что происходит в переменных.
Но то что они чем-то наполянются - это очевидно, т.к. что то же в окошко выкидывается.
Кстати, кварц 4 МГц, микруха Атмега8Л-8ПИ
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:43.
|
|