Thông báo

Collapse
No announcement yet.

xin cho em hỏi cách làm giao tiếp COM cho AVR

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • xin cho em hỏi cách làm giao tiếp COM cho AVR

    xin cho em hỏi cách làm giao tiếp COM cho AVR với

    em đang làm tiểu luận cần tới phần này mà ko biêt phải làm thế nào, mong các bác chỉ giáo.

    nội dung là, đọc tín hiệu từ cảm biến nhiệt độ qua ADC của AVR từ đó lấy các giá trị này vào VC (ko phải dạng GUI mà chỉ sử dụng giá trị đó cho một số thuật toán thực hiện trong VC console), cảm ơn các bác nhiều
    Last edited by nghoang; 12-09-2007, 20:37.

  • #2
    ai giúp em với, em cần rất gấp cảm ơn mọi người đã quan tâm

    Comment


    • #3
      chuyen nay thi da co codevision ho tro het roi con gi. ban su dụng cac ham cua no ho tro la xong.
      sau day la mot doan code vi du ban tham khao them se thuc hien duoc thoi:
      #include <90s8515.h>
      #include <stdio.h>

      /* quartz crystal frequency [Hz] */
      #define xtal 4000000L

      /* Baud rate */
      #define baud 9600

      void main(void) {
      char k;

      /* initialize the UART's baud rate */
      UBRR=xtal/16/baud-1;

      /* initialize the UART control register
      RX & TX enabled, no interrupts, 8 data bits */
      UCR=0x18;

      while (1) {
      /* receive the character */
      k=getchar();
      /* and echo it back */
      putchar(k);
      };
      }

      If you intend to use other peripherals for Input/Output, you must modify accordingly the getchar and putchar functions like in the example below:

      #include <stdio.h>

      /* inform the compiler that an alternate version

      of the getchar function will be used */
      #define _ALTERNATE_GETCHAR_

      /* now define the new getchar function */
      char getchar(void) {
      /* write your code here */

      }

      /* inform the compiler that an alternate version
      of the putchar function will be used */
      #define _ALTERNATE_PUTCHAR_

      /* now define the new putchar function */
      void putchar(char c) {
      /* write your code here */

      }

      Comment


      • #4
        Cách làm giao tiếp COM cho AVR (Xin trợ giúp em với)

        thanks bác nhiều lắm, nhưng em ko hiểu cách để đưa nó sang Visul C bác nhỉ????

        vã lại khi chạy thì mình vừa đọc vào COM vừa chạy chương trình xử lý trong Visual C vậy cách nào để đọc tín hiệu từ COM vào Visual C vậy ạ???

        cảm tạ bác nhiều lắm

        Comment


        • #5
          doi voi cong com khi ban truyen len thi no tự động dịch vào bộ đệp nhận. ta đùng ngắt tràn của bộ đêm nhận để nhận dữ liệu từ avr gửi lên

          Comment


          • #6
            tức là trong Visul C nó cho đọc lệnh này ạ??? cảm ơn bác, nhưng chưa rõ cách làm sao nữa

            Comment


            • #7
              chào bạn
              mình cũng đã từng làm như bạn roài.
              Mình thực hiện giao tiếp giữa Atmega8 với PC okie trên ngôn ngữ C
              nếu bạn quan tâm có thể vào luồng này:
              http://dientuvietnam.net/forums/showthread.php?t=6955
              http://dientuvietnam.net/forums/showthread.php?t=6552
              Chúc bạn thành công...

              Comment


              • #8
                mình trình bày laịc cho rõ hơn cái mình đang cần, cảm ơn bạn nhiều lắm lắm lắm.


                chào các anh, em đang cần làm gấp 1 cái chương trình sử dụng VC++ để đọc tín hiệu từ COM vào, có ai biết ko chỉ em với.

                công việc là:

                Tín hiệu cần đọc từ cảm biến >> ADC > AVR>> qua MAX>> COM > Chường trình console (tức không phải là 1 GUI). vì em cần dùng giá trị này nhằm thực hiện thuật toán trong chương trình viết trong VC++ chứ ko cần làm GUI làm gì, mong các anh cứu giúp. xin đa tạ

                Comment


                • #9
                  chào bạn
                  nói chung chương trình cực dễ, ngày trước mình cũng làm quá trình điều khiển nhiệt độ y như bạn nói
                  Tín hiệu từ cảm biến (LM335) được đưa vào chân Analog của VĐK (Atmega8), sau đó dc truyền lên máy tính thông qua RS232.
                  Nói chung là tính toán thôi.
                  còn quá trình truyền nhận thông qua cổng COM không khó chút nào... dựa vào các thanh ghi của nó thôi. Bạn nên tham khảo thêm cuốn Kĩ thuật ghép nối máy tính của thày Ngô Diên Tập bên Bách khoa đó.
                  Okie

                  Comment


                  • #10
                    em ở sài gòn, căng quá bác ạ, bác giúp em với, em tính thức trắng đêm để cố làm cho xong, vì còn có 2 hôm nữa là phải nộp (em bị trể lại từ học kỳ trước)

                    đa tạ bác nhiều!!!

                    Comment


                    • #11
                      em ở sài gòn, căng quá bác ạ, bác giúp em với, em tính thức trắng đêm để cố làm cho xong, vì còn có 2 hôm nữa là phải nộp (em bị trể lại từ học kỳ trước)

                      đa tạ bác nhiều!!!
                      thấy pác căng quá mình lục lại máy tính post luôn file cho bạn tham khảo với bài điều khiển nhiệt độ của mình giao tiếp qua cổng COM dùng Atmega8 (mình dùng trình dịch Code Vision AVR).
                      code của 2 cái đây:
                      AVR:

                      Code:
                      #include <mega8.h>     
                      #include<delay.h>	   
                      #include<math.h>		
                      #include <stdio.h> 		
                      
                      
                      #define ADC_VREF_TYPE 0x00
                      -------------th? t?c d?c ADC t? kênh adc_input---------------
                      unsigned int read_adc(unsigned char adc_input)
                      {
                      ADMUX=adc_input|ADC_VREF_TYPE;
                      ADCSRA|=0x40; 		///b?t d?u bi?n d?i
                      		//// d?i cho quá trình bi?n d?i hoàn thành
                      while ((ADCSRA & 0x10)==0);
                      ADCSRA|=0x10;
                      return ADCW;	/// luu giá tr? d?c du?c vào thanh ghi d? li?u c?a ADC(ADCW)
                      }	///k?t thúc th? t?c
                      
                      ------------th? t?c truy?n m?t byte d? li?u t? vi di?u khi?n lên máy tính-------------
                      void u_t(unsigned char i)
                      {
                      	while((UCSRA & 0x20)==0); 	/// d?i cho b? d?m truy?n không có kí t? nào trong dó
                      	UDR = i;      ///B?t d?u truy?n
                      }
                      --------------th? t?c hi?n th? led 7 thanh  s? 1 --------------
                      void l2(unsigned char i)
                      {
                      i=i<<4;
                      PORTD=i;
                      PORTD.3=1;
                      }
                      ------------th? t?c hi?n th? led 7 thanh s? 2------------------
                      void l1(unsigned char i)
                      {
                      i=i<<4;
                      PORTD=i;
                      PORTD.2=1;
                      }
                              
                      -----------B?T Ð?U CHUONG TRÌNH CHÍNH---------------
                      void main(void)
                      {
                      --------khai báo các bi?n c?n thi?t---------------
                      unsigned char a,b,re,i; 
                      unsigned int adc;
                      --------kh?i t?o các d?u vào ra cho các c?ng----------
                      
                      	///C?ng B làm c?ng ra
                      PORTB=0x00;
                      DDRB=0xff;
                      
                      	///C?ng làm c?ng vào 
                      PORTC=0x00;
                      DDRC=0x00;
                      
                      	///C?ng D làm c?ng ra
                      PORTD=0x00;
                      DDRD=0xff;
                      	///không s? d?ng Timer/Counter 1
                      TCCR0=0x00;
                      TCNT0=0x00;
                      TCCR1A=0x00;
                      TCCR1B=0x00;
                      TCNT1H=0x00;
                      TCNT1L=0x00;
                      ICR1H=0x00;
                      ICR1L=0x00;
                      OCR1AH=0x00;
                      OCR1AL=0x00;
                      OCR1BH=0x00;
                      OCR1BL=0x00;
                      	///Không s? d?ng Timer/Cuonter 2
                      
                      ASSR=0x00;
                      TCCR2=0x00;
                      TCNT2=0x00;
                      OCR2=0x00;
                      
                      	/// không s? d?ng ng?t ngoài
                      // INT0: Off
                      // INT1: Off
                      MCUCR=0x00;
                      
                      TIMSK=0x00;
                      
                      ---------kh?i t?o giá tr? cho c?ng UART---------
                      // các thông s? : 8 bit d? li?u, 1 bit stop, Không ki?m tra party
                      // Cho phép b? nh?n d? li?u ho?t d?ng
                      // Cho phép b? truy?n d? li?u h?at d?ng
                      // Ch?n ch? d? ho?t d?ng: ch? d? ngu?i dùng
                      // T?c d? truy?n baud: 9600 bit/s
                      UCSRA=0x00;
                      UCSRB=0x18;
                      UCSRC=0x86;
                      UBRRH=0x00;
                      UBRRL=0x33;
                      
                      	///không s? d?ng b? so sánh analog
                      ADMUX=ADC_VREF_TYPE;
                      /////kh?i d?ng ADC s?n sàng ho?t d?ng
                      ADCSRA=0x86;
                      ACSR=0x80;
                      SFIOR=0x00;
                      
                      ---------------------------------------------------------
                      back:
                      adc=read_adc(0x00);			////d?c adc t? kênh 0 luu vào bi?n adc
                      			/// tính ra di?n áp t?i kênh s? 0 ti?p t?c vào bi?n adc
                      adc=ceil((double)(adc*(float)((float)(5000)/(float)(1023))));
                      			/// t? di?n áp tính ra nhi?t d?, luu vào bi?n adc
                      adc=ceil((float)(adc-2732)/(float)(10));
                      			///tách adc thành a và b sao cho (adc=10*a+b) dùng d? hi?n th? lên led
                      b=adc%10;
                      a=(adc-b)/10;
                      ---------d?i d? li?u du?c truy?n t? máy tính truy?n xu?ng vdk, trong quá trình d?i hi?n th? giá tr? nhi?t d? trên led 7 thanh. Khi có d? li?u g?i xu?ng, luu d? li?u d?c du?c vào bi?n re --------------
                      while((UCSRA & 0x80)==0)
                      	{
                      	l2(a);
                      	delay_ms(3);
                      	l1(b);
                      	delay_ms(3);
                      	}
                      re=UDR;
                      	------ki?m tra xem s? di?u khi?n t? máy tính g?i xu?ng là s? nào, can c? vào dó d? làm các công vi?c tuong ?ng----
                      if (re==1) {PORTB.0=1;PORTB.1=0;}		//b?t qu?t và t?t dèn
                      if (re==2) {PORTB.0=0;PORTB.1=1;}		//t?t qu?t và b?t dèn
                      if (re==3) {PORTB.0=0;PORTB.1=0;}		//t?t c? qu?t và dèn
                      
                      ---------vòng l?p hi?n th? led trong vòng 60ms-----------
                      i=10;
                      while (i>0)
                            {        
                      	l2(a);
                      	delay_ms(3);
                      	l1(b);
                      	delay_ms(3);
                      	i--;
                            };
                      -----truy?n giá tr? nhi?t d? t? vi di?u khi?n lên máy tính-----------
                      u_t (adc);
                      goto back;	// tr? l?i d? ti?p t?c di?u khi?n
                      }		//k?t thúc chuong trình
                      C:
                      Code:
                      #include "stdlib.h"
                      #include "stdio.h"
                      #include "conio.h"
                      #include "graphics.h"
                      #include "dos.h"
                      
                      #define com1 0x3f8
                      #define lcr com1+3
                      #define lsr com1+5
                      #define txdata com1
                      int temp;
                      
                      // Thiet lap thong so cho cong Com
                      void set_up(void)
                      {
                        outp(lcr,0x80);//Dat bit so 7 cua LCR len 1 de chot so chia
                        outp(com1,0x0c);// chon toc do Baud la 9600
                        outp(lcr,0x03);// chon cac thong so: khung truyen 8 bit. khong kiem tra Party
                      	       // xoa bit 7 de thiet lap bo dem truyen nhan, su dung 1 bit Stop
                      }
                      
                      void send_c(int ch)
                      {
                       char status;
                       do
                        {
                         status=inp(lsr) & 0x40;
                      	// kiem tra bit thu 6 xem qua trinh truyen da xong chua
                        } while (status!= 0x40);
                             // khi da truyen xong thi gui
                       outport(txdata,(char) ch);
                      }
                      
                      int rec_c(void)
                      {
                       char status;
                       do
                        {
                          status=inp(lsr) & 0x01; // kiem tra xem co ki tu nao o bo dem khong, neu co thi doc
                      } while (status!= 0x01);
                        return ((int)inportb(txdata));// tra ve gia tri doc duoc.
                      }
                      
                      
                      void main(void)
                      {
                       int gd,gm,x,y,i,j,X,Y,hsy=4,dec,sign,k,inc;
                       char *str1;
                       gd=DETECT;
                       initgraph(&gd,&gm,"");
                       set_up();
                       tt:
                       setbkcolor(1);
                       directvideo=0;
                       gotoxy(20,12); printf("\n        Moi ban nhap nhiet do can on dinh: ");
                       scanf("%d",&temp);
                       send_c(3);
                       cleardevice;clearviewport();
                       gotoxy(20,2); printf("DO THI QUAN SAT SU THAY DOI CUA NHIET DO.");
                       gotoxy(30,28); printf("Sinh vien: Van Hung- Duc Tho- Thanh Tuan- DKH 45");
                       gotoxy(30,29); printf("Phone: 0978.150187");
                      
                       setcolor(14);
                       line(120,100,120,400);
                       line(120,400,620,400);
                       settextjustify(1,1);
                       outtextxy(98,400,"0");
                       outtextxy(98,340,"15");
                       outtextxy(98,280,"30");
                       outtextxy(98,220,"45");
                       outtextxy(98,160,"60");
                       outtextxy(98,140,"65");
                       // thoi gian.
                       outtextxy(120,410,"0");
                       outtextxy(170,410,"10");
                       outtextxy(220,410,"20");
                       outtextxy(270,410,"30");
                       outtextxy(320,410,"40");
                       outtextxy(520,410,"80");
                       outtextxy(570,410,"90");
                       outtextxy(90,100,"Nhiet");
                       outtextxy(90,110,"do");
                       outtextxy(590,420,"Thoi gian(s)");
                      
                       setviewport(120,100,600,400,1);
                       setlinestyle(3,0,1);
                       setcolor(9);
                       for (i=20;i<=480;i+=20) // ve duong doc
                        line(i,20,i,300);
                       for (j=20;j<=280;j+=20) // ve duong ngang
                        line(0,j,480,j);
                       setcolor(14);
                       setlinestyle(0,0,3);
                       line(0,0,0,300);
                       line(0,400,600,400);
                       settextjustify(0,0);
                       str1=fcvt(temp,0,&dec,&sign);
                       outtextxy(5,300-temp*hsy,str1);
                       setlinestyle(0,0,1);
                       setcolor(4);
                       line(0,300-temp*hsy,620,300-temp*hsy);
                       X=0;
                       setlinestyle(0,0,1);
                       setcolor(14);
                       moveto(0,300-rec_c()*hsy);
                       do
                         {
                          inc=rec_c(); // inc nhiet do do dc
                          Y=inc;
                          x=X;y=-Y*hsy+300;
                          lineto(x,y);
                          X++;
                          delay(200);
                          if (inc>temp)
                            send_c(1);
                          if (inc<temp)
                            send_c(2);
                          if (inc==temp)
                            send_c(3);
                      //    if (X>480)
                         }
                       while(!kbhit());
                      
                       getch();
                       restorecrtmode();
                       clrscr();
                       textmode(80); textcolor(14); textbackground(1);
                       gotoxy(20,12); printf("Ban co muon tiep tuc qua trinh dieu chinh moi khong?");
                       gotoxy(20,13); printf("Nhan ENTER de tiep tuc, ESC de thoat: ");
                       k=getch();
                       if (k==13)
                       {
                        setgraphmode(getgraphmode()); goto tt;
                       }
                       else goto thoat;
                       thoat:
                      }
                      chúc bạn thành công
                      Attached Files

                      Comment


                      • #12
                        cảm ơn bác vô cùng, em đang test thử luôn đây ạ, đa tạ bác nhiều lắm..


                        Em đang test... đang test bài mẫu của bác....

                        Bác tốt với em quá.... huhu Em thật vui và xúc động

                        Chúc bác luôn mạnh khỏe và thành công

                        Comment


                        • #13
                          bác ơi, em thử mà ko được, hình như code C này ko tương thích với Visual C phải ko vậy???


                          Em làm như sau:

                          trên con AVR em khởi taọ Project sau đó lưư tên 3 file như bình thường rồi chọn vào: Save generate & exist

                          sau đó xóa các dòng mà codevission đã khởi tạo và copy toàn bộ cái file AVR của bác paste vào, dịch.

                          Trên Visual C em tạo cpp ở dạng empty project sau đó add sourrce file của bác (C file) vào nhưng ko được bác ạ.

                          Em làm vậy đúng ko bác????

                          Comment


                          • #14
                            À, em dùng con AVR 128 bác ạ., em đã set các thông số như #include <mega8.h> , vv mà vẫn ko được.


                            mong bác trợ giúp em với

                            Comment


                            • #15
                              chào bạn
                              bạn phải bình tĩnh.
                              cái này mình làm mất hơn 1 tháng đấy nên bạn cũng không thể Load cái là chạy ngay đâu.
                              Mình là dân điện tử mà. Phải kiên nhẫn.
                              trước hết bạn phải cho mạch đúng. chú ý: giao tiếp RS232, mạch điều khiển quạt , đèn (cái này có thể thay bằng 2 con Led đơn).
                              bạn nên tạo 1 project mới và nghiền ngẫm nhé.
                              mình chỉ giúp bạn thế nhé cho bạn có ý thức làm mà (tốt cho bạn đó)
                              thuật toán dễ mà.
                              chúc bạn thành công.

                              Comment

                              Về tác giả

                              Collapse

                              nghoang Tìm hiểu thêm về nghoang

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X