Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Синхронизация mega8l с ПК через COM порт

Непрочитано 29.07.2008, 14:07  
ArtUrl1986
Вид на жительство
 
Аватар для ArtUrl1986
 
Регистрация: 29.11.2006
Сообщений: 342
Сказал спасибо: 242
Сказали Спасибо 15 раз(а) в 13 сообщении(ях)
ArtUrl1986 на пути к лучшему
По умолчанию Синхронизация 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 и т.д.
Подскажите, пожалуйста, как правильно написать программу приёмо/передатчика для ПК и может какую синхронизацию придумать надо с программой МК???
С нетерпением жду Вашей консультации, советов.
Реклама:
ArtUrl1986 вне форума  
Непрочитано 29.07.2008, 18:19  
Zemlyanov
Гражданин KAZUS.RUN
 
Регистрация: 17.09.2006
Сообщений: 633
Сказал спасибо: 78
Сказали Спасибо 69 раз(а) в 57 сообщении(ях)
Zemlyanov на пути к лучшему
По умолчанию

Если у вас установлен на МК кварц как указано в программе (4 Mhz) то причина ошибок при передаче в нем.Должен стоять кварц 11.0592 Mhz. Посмотрите даташит на МК там в разделе USART есть таблица зависимости ошибки при передаче от частоты кварца. CV тоже показывает процент ошибки при создании начального кода .
Zemlyanov вне форума  
Непрочитано 29.07.2008, 18:19  
Zemlyanov
Гражданин KAZUS.RUN
 
Регистрация: 17.09.2006
Сообщений: 633
Сказал спасибо: 78
Сказали Спасибо 69 раз(а) в 57 сообщении(ях)
Zemlyanov на пути к лучшему
По умолчанию

Если у вас установлен на МК кварц как указано в программе (4 Mhz) то причина ошибок при передаче в нем.Должен стоять кварц 11.0592 Mhz. Посмотрите даташит на МК там в разделе USART есть таблица зависимости ошибки при передаче от частоты кварца. CV тоже показывает процент ошибки при создании начального кода .
Zemlyanov вне форума  
Непрочитано 29.07.2008, 18:21  
ArtUrl1986
Вид на жительство
 
Аватар для ArtUrl1986
 
Регистрация: 29.11.2006
Сообщений: 342
Сказал спасибо: 242
Сказали Спасибо 15 раз(а) в 13 сообщении(ях)
ArtUrl1986 на пути к лучшему
По умолчанию

Я ж написал другая, профессионально так сказать прога читает и передаёт прекрасно, моя - нет. Так что "неправильность" МК можно с уверенность откинуть.
ArtUrl1986 вне форума  
Непрочитано 29.07.2008, 20:20  
domowoj
Почётный гражданин KAZUS.RUN
 
Аватар для domowoj
 
Регистрация: 09.12.2007
Адрес: Новосибирск
Сообщений: 1,019
Сказал спасибо: 10
Сказали Спасибо 71 раз(а) в 63 сообщении(ях)
domowoj на пути к лучшему
По умолчанию

Честно говоря, посмотришь на аватар автора
и читать его вирши нет ниК-К-Какой охоты.
__________________
И на камнях растут деревья!
domowoj вне форума  
Непрочитано 04.08.2008, 15:25  
ArtUrl1986
Вид на жительство
 
Аватар для ArtUrl1986
 
Регистрация: 29.11.2006
Сообщений: 342
Сказал спасибо: 242
Сказали Спасибо 15 раз(а) в 13 сообщении(ях)
ArtUrl1986 на пути к лучшему
По умолчанию

Сообщение от domowoj
Честно говоря, посмотришь на аватар автора
и читать его вирши нет ниК-К-Какой охоты.
Мда? Или знаний просто не хватает?
ArtUrl1986 вне форума  
Непрочитано 05.08.2008, 09:07  
EKuzmich
Прописка
 
Регистрация: 07.08.2005
Сообщений: 178
Сказал спасибо: 16
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
EKuzmich на пути к лучшему
По умолчанию

Попробуй через стандартный терминал
отправить и посмотреть что получаешь.
Я сильно не разбирался но думаю кварц
здесь не причем потому что буквы у вас
теже но стоят не в той последовательности.
если через терминал будет нормально значит с буфером
какой то косяк попробуй запустить в режиме отладки и посмотри по breakpoint'ам что у тебя в буфер попадает.
EKuzmich вне форума  
Непрочитано 05.08.2008, 10:47  
ArtUrl1986
Вид на жительство
 
Аватар для ArtUrl1986
 
Регистрация: 29.11.2006
Сообщений: 342
Сказал спасибо: 242
Сказали Спасибо 15 раз(а) в 13 сообщении(ях)
ArtUrl1986 на пути к лучшему
По умолчанию

Во, чувствуется человек понимающий нашёлся.
Попробовал через стандартный терминал - всё ок принимает. Но есть другой баг - когдя я запускаю скаажем программу в основном потоке всё тупо виснет. Поэтому как вы заметили наверное я запустил принятие данных в отдельном потоке (thread). Среда же Visual Studio 2005 почему - то не хочет отлаживать в step режиме фоновые потоки. Она по степ режиму доходит до кнопки, я её нажимаю, и всё, дальше всё работает самоя, я ничего не вижу...
ArtUrl1986 вне форума  
Непрочитано 05.08.2008, 14:00  
EKuzmich
Прописка
 
Регистрация: 07.08.2005
Сообщений: 178
Сказал спасибо: 16
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
EKuzmich на пути к лучшему
По умолчанию

если зависает в основном потоке, так на каком месте???
пошагово можно же посмотреть!?
EKuzmich вне форума  
Непрочитано 05.08.2008, 14:06  
ArtUrl1986
Вид на жительство
 
Аватар для ArtUrl1986
 
Регистрация: 29.11.2006
Сообщений: 342
Сказал спасибо: 242
Сказали Спасибо 15 раз(а) в 13 сообщении(ях)
ArtUrl1986 на пути к лучшему
По умолчанию

Не я может неправильно объяснил. Не знаю почему, но как только доходит до места
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ПИ
ArtUrl1986 вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PonyProg через СОМ порт - кабель ramilkazus Микроконтроллеры, АЦП, память и т.д 9 07.07.2009 12:17
Atmega 16 не работает кнопка через порт PC4 ? uriy-ch Микроконтроллеры, АЦП, память и т.д 16 14.01.2009 21:42
Связь с Winamp'ом через InfraRed порт Trojan Микроконтроллеры, АЦП, память и т.д 3 17.06.2005 05:23
синхронизация RS-232 pet Микроконтроллеры, АЦП, память и т.д 4 18.09.2004 17:34


Часовой пояс GMT +4, время: 19:26.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.