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

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

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

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

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

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

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

Закрытая тема
Опции темы
Непрочитано 29.07.2008, 14:07   #1
ArtUrl1986
Вид на жительство
 
Аватар для ArtUrl1986
 
Регистрация: 29.11.2006
Сообщений: 350
Сказал спасибо: 242
Сказали Спасибо 16 раз(а) в 14 сообщении(ях)
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   #2
Zemlyanov
Гражданин KAZUS.RU
 
Регистрация: 17.09.2006
Сообщений: 633
Сказал спасибо: 78
Сказали Спасибо 69 раз(а) в 57 сообщении(ях)
Zemlyanov на пути к лучшему
По умолчанию

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

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

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

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

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

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

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

если зависает в основном потоке, так на каком месте???
пошагово можно же посмотреть!?
EKuzmich вне форума  
Непрочитано 05.08.2008, 14:06   #10
ArtUrl1986
Вид на жительство
 
Аватар для ArtUrl1986
 
Регистрация: 29.11.2006
Сообщений: 350
Сказал спасибо: 242
Сказали Спасибо 16 раз(а) в 14 сообщении(ях)
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
Синхронизация surgutw Делимся опытом 1 10.06.2005 15:32
синхронизация RS-232 pet Микроконтроллеры, АЦП, память и т.д 4 18.09.2004 17:34


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot