Thông báo

Collapse
No announcement yet.

help ATmega16

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

  • help ATmega16

    em muốn dùng 1 chân AT 16 để thực hiện chương trình khi chân đó ở mức cao thì giao tiếp MT còn ở mức thấp thì mạch hiển thị bình thường(em làm mạch AT 16 hiển thị trên LCD, để hai chế độ,1 chế độ hiển thị bình thường trên LCD 1 chế độ kiểm tra 1 chân nếu ở mức cao thì giap tiếp MT) mong các cao thủ chỉ bảo.
    Thanks

  • #2
    Về hardware:
    - giao tiếp với LCD: có thể dùng 7 pin của 1 port bất kỳ.
    - giao tiếp với máy tính: sử dụng MAX232.
    - pin chọn chế độ: có thể là bất cứ pin nào còn lại.
    Về firmware:
    - giao tiếp với LCD: có thể sử dụng thư viện lcd của CodeVisionAVR.
    - giao tiếp với máy tính: có thể sử dụng thư viện stdio của CodeVisionAVR.
    - pin chọn chế độ: cứ mặc định để là input, đọc giá trị lôgic trong thanh ghi PINx.

    Thân mến,
    blackmoon.

    Comment


    • #3
      Nguyên văn bởi blackmoon Xem bài viết
      Về hardware:
      - giao tiếp với LCD: có thể dùng 7 pin của 1 port bất kỳ.
      - giao tiếp với máy tính: sử dụng MAX232.
      - pin chọn chế độ: có thể là bất cứ pin nào còn lại.
      Về firmware:
      - giao tiếp với LCD: có thể sử dụng thư viện lcd của CodeVisionAVR.
      - giao tiếp với máy tính: có thể sử dụng thư viện stdio của CodeVisionAVR.
      - pin chọn chế độ: cứ mặc định để là input, đọc giá trị lôgic trong thanh ghi PINx.

      Thân mến,
      blackmoon.
      trước tiên em cảm ơn bác blackmoon. Mạch về phần cứng là ổn bác ạ, nhưng em gặp vấn đề ở chỗ là khi em để một chân để chọn chế độ(giao tiếp hoặc không giao tiếp), nhưng không có tác dụng( cụ thể là em để set một chân của VDK bằng 1, chân kia để không, dùng một dăm để nối khi cần, em muốn thiết kế sao cho khi để không cắm dăm thì mạch chạy chế độ debug bình thường- hiển thị chữ và nhiệt độ trên LCD, khii cắm dăm thì giao tiếp với máy tính thông qua cổng RS232 dùng giao diện Terminal của codevision)
      có lẽ code của em có vấn đề.
      Do code chạy theo ý tưởng trên lỗi nên em dành viết code theo kiểu hiện chữ trên LCD 1 lần rùi giao tiếp. Vậy em phải sửa code như thế nào mới có thể dùng tác động ngoài( dùng dăm cắm) để chọn chế độ giao tiếp hợac không giao tiếp máy tính vậy. mong sớm nhận được hồi âm của các pác

      Comment


      • #4
        Nguyên văn bởi taiphong Xem bài viết
        trước tiên em cảm ơn bác blackmoon. Mạch về phần cứng là ổn bác ạ, nhưng em gặp vấn đề ở chỗ là khi em để một chân để chọn chế độ(giao tiếp hoặc không giao tiếp), nhưng không có tác dụng( cụ thể là em để set một chân của VDK bằng 1, chân kia để không, dùng một dăm để nối khi cần, em muốn thiết kế sao cho khi để không cắm dăm thì mạch chạy chế độ debug bình thường- hiển thị chữ và nhiệt độ trên LCD, khii cắm dăm thì giao tiếp với máy tính thông qua cổng RS232 dùng giao diện Terminal của codevision)
        có lẽ code của em có vấn đề.
        Do code chạy theo ý tưởng trên lỗi nên em dành viết code theo kiểu hiện chữ trên LCD 1 lần rùi giao tiếp. Vậy em phải sửa code như thế nào mới có thể dùng tác động ngoài( dùng dăm cắm) để chọn chế độ giao tiếp hợac không giao tiếp máy tính vậy. mong sớm nhận được hồi âm của các pác
        Em chưa hiểu ý bác lắm, một chân VXL thì chưa đủ để giao tiếp MT (cần tối thiểu 2 chân) cũng như với LCD. Như vậy ý đồ tiết kiệm chân IC của bác có vẻ không hay lắm vì cũng đã mất một chân để set jumper rồi.

        Còn nguyên nhân bác làm không chạy thì bác nên kiểm tra lại khi chuyển giữa chế độ MT/LCD bác có config lại chân dùng chung là output/input chưa.
        Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
        Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

        Comment


        • #5
          Đọc port của AVR

          Nguyên văn bởi taiphong Xem bài viết
          trước tiên em cảm ơn bác blackmoon. Mạch về phần cứng là ổn bác ạ, nhưng em gặp vấn đề ở chỗ là khi em để một chân để chọn chế độ(giao tiếp hoặc không giao tiếp), nhưng không có tác dụng( cụ thể là em để set một chân của VDK bằng 1, chân kia để không, dùng một dăm để nối khi cần, em muốn thiết kế sao cho khi để không cắm dăm thì mạch chạy chế độ debug bình thường- hiển thị chữ và nhiệt độ trên LCD, khii cắm dăm thì giao tiếp với máy tính thông qua cổng RS232 dùng giao diện Terminal của codevision)
          có lẽ code của em có vấn đề.
          Do code chạy theo ý tưởng trên lỗi nên em dành viết code theo kiểu hiện chữ trên LCD 1 lần rùi giao tiếp. Vậy em phải sửa code như thế nào mới có thể dùng tác động ngoài( dùng dăm cắm) để chọn chế độ giao tiếp hợac không giao tiếp máy tính vậy. mong sớm nhận được hồi âm của các pác
          Có lẽ bạn hơi phức tạp hóa vấn đề.
          Việc dùng jumper để xác định chế độ không cần phải dùng đến 2 pin của chip. Nếu nối theo kiểu của bạn sẽ phải lăn tăn ở chuyện config đầu vào/ra cho 2 pin đó (bạn muốn đưa ra 0/1 nhưng cũng lại muốn đọc giá trị vào nữa), chưa kể đến việc đãng trí quên mất trở hạn dòng nối giữa hai pin thì sẽ quá tải...
          Đơn giản thế này, bạn dùng 1 pin thôi, config nó cố định là input.
          Về hardware:
          - pin này nối pull up bởi 1 điện trở khoảng 10K lên Vcc.
          - cũng pin này bạn để jumper nối xuống đất. Khi bỏ jumper thì pin được kéo lên mức cao nhờ điện trở pull up. Khi cắm jumper vào thì pin được kéo về mức thấp.
          Về firmware:
          - thứ nhất, đừng chuyển pin đó làm output, cứ luôn để input như cấu hình ban đầu.
          - thứ hai, xác định chế độ = kiểm tra cắm jumper hay không = đọc mức lôgic ở pin đó là 0 hay 1? Một lỗi dễ nhầm khi mới dùng AVR đó là giá trị lôgic ở pin được thể hiện trong thanh ghi PINx, không phải trong thanh ghi PORTx. Vì vậy bạn phải đọc PINx chứ không phải PORTx.
          Có thể ví dụ thế này (CodeVisionAVR, pin sử dụng = PC1):
          if(PINC.1)
          {
          // nếu PINC.1 = 1 tức là KHÔNG có jumper
          ...
          }
          else
          {
          // nếu PINC.1 = 0 tức là CÓ jumper
          ...
          }

          Thân mến,
          blackmoon.

          Comment


          • #6
            Nguyên văn bởi blackmoon Xem bài viết
            Có lẽ bạn hơi phức tạp hóa vấn đề.
            Việc dùng jumper để xác định chế độ không cần phải dùng đến 2 pin của chip. Nếu nối theo kiểu của bạn sẽ phải lăn tăn ở chuyện config đầu vào/ra cho 2 pin đó (bạn muốn đưa ra 0/1 nhưng cũng lại muốn đọc giá trị vào nữa), chưa kể đến việc đãng trí quên mất trở hạn dòng nối giữa hai pin thì sẽ quá tải...
            Đơn giản thế này, bạn dùng 1 pin thôi, config nó cố định là input.
            Về hardware:
            - pin này nối pull up bởi 1 điện trở khoảng 10K lên Vcc.
            - cũng pin này bạn để jumper nối xuống đất. Khi bỏ jumper thì pin được kéo lên mức cao nhờ điện trở pull up. Khi cắm jumper vào thì pin được kéo về mức thấp.
            Về firmware:
            - thứ nhất, đừng chuyển pin đó làm output, cứ luôn để input như cấu hình ban đầu.
            - thứ hai, xác định chế độ = kiểm tra cắm jumper hay không = đọc mức lôgic ở pin đó là 0 hay 1? Một lỗi dễ nhầm khi mới dùng AVR đó là giá trị lôgic ở pin được thể hiện trong thanh ghi PINx, không phải trong thanh ghi PORTx. Vì vậy bạn phải đọc PINx chứ không phải PORTx.
            Có thể ví dụ thế này (CodeVisionAVR, pin sử dụng = PC1):
            if(PINC.1)
            {
            // nếu PINC.1 = 1 tức là KHÔNG có jumper
            ...
            }
            else
            {
            // nếu PINC.1 = 0 tức là CÓ jumper
            ...
            }

            Thân mến,
            blackmoon.
            thanks pác. em hiểu ý pác rùi. Thực ra em đang làm đồ án về LCD có giao tiếp cổng COM, nhưng tiếc là mạch em in xong rùi (em đặt mạch in mà) nên nếu làm lại theo cách pác em lại phải câu dây . thui em đành để chế độ LCD chạy một lần rùi giao tiếp mt(tuy không tôi ưu lắm, nhưng đành chịu)

            Comment


            • #7
              code chạy một lần rùi giao tiếp MT(giao tiếp sử dụng Terminal của Codevision)
              /************************************************** ***
              This program was produced by the
              CodeWizardAVR V1.24.4 Standard
              Automatic Program Generator
              © Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l.
              http://www.hpinfotech.com
              e-mail:office@hpinfotech.com

              Project :
              Version :
              Date : 3/21/2008
              Author : PHONG
              Company : DHBK
              Comments:


              Chip type : ATmega16
              Program type : Application
              Clock frequency : 8.000000 MHz
              Memory model : Small
              External SRAM size : 0
              Data Stack size : 256
              ************************************************** ***/
              #include <mega16.h>
              #include <delay.h>
              // Alphanumeric LCD Module functions
              #asm
              .equ __lcd_port=0x18 ;PORTB
              #endasm
              #include <lcd.h>
              #include <stdlib.h>
              #include <stdio.h>
              #include <string.h>

              // Declare your global variables here
              unsigned char i; //bien dem de chay chu
              typedef unsigned char byte;
              unsigned int temperature;
              int C;
              char *tempstr;
              char *text=" DAI HOC BK HN ";

              /* table for the user defined character
              arrow that points to the top right corner */
              flash byte char0[8]={
              0b0001100,
              0b0010010,
              0b0010010,
              0b0001100,
              0b0000000,
              0b0000000,
              0b0000000,
              0b0000000};

              /* function used to define user characters */
              void define_char(byte flash *pc,byte char_code)
              {
              byte i,a;
              a=(char_code<<3) | 0x40;
              for (i=0; i<8; i++) lcd_write_byte(a++,*pc++);
              }

              void USART_Khoitao();
              void khoi_tao_ADC(void);
              void PC_COM();
              void display(char *chu);
              unsigned int doc_ADC(void);

              void main(void)
              {
              khoi_tao_ADC();
              lcd_init(16);
              define_char(char0,0);
              temperature=~doc_ADC();
              // C=500*(temperature/1024);
              C = (temperature-558.6)/2048;
              lcd_gotoxy(0,0);
              lcd_putsf("DH BACH KHOA HN");
              delay_ms(500);
              lcd_putsf("DO AN K50")
              lcd_clear();
              lcd_putsf("NHIET DO :");
              itoa(C,tempstr);
              lcd_puts(tempstr);
              lcd_putchar(0);
              delay_ms(500);
              delay_ms(500);
              lcd_clear();
              PC_COM();
              }
              void USART_Khoitao()
              {
              // USART initialization
              // Communication Parameters: 8 Data, 1 Stop, No Parity
              // USART Receiver: On
              // USART Transmitter: On
              // USART Mode: Asynchronous
              // USART Baud rate: 4800
              UCSRA=0x00;
              UCSRB=0x18;
              UCSRC=0x86;
              UBRRH=0x00;
              UBRRL=0x0C;
              printf("Ket noi cong COM da duoc thuc hien\r");
              }

              unsigned int doc_ADC(void)
              {
              unsigned int value;

              ADCSRA = ADCSRA | 0x40; // bat dau chuyen doi

              while( (ADCSRA & 0x10) == 0 ); // cho cho den khi chuyen doi //thanh cong

              value = ADCW; //lay gia tri ADC
              ADCSRA = ADCSRA | 0x10; // xoa co
              return value;
              }
              void khoi_tao_ADC(void)
              {
              ADMUX = 0x01; // chon kenh 0
              ADMUX = ADMUX | 0x40; // chon dien ap nguong
              ADMUX = ADMUX | 0x20;
              ADCSRA = 0x07; // chon tan so thach anh
              ADCSRA = ADCSRA | 0x80;
              }
              void display(char *chu)
              {
              lcd_init(16);//khoi tao lcd 16 cot 2 dong
              //i=16;
              while (1)
              {
              lcd_gotoxy(0,0);
              lcd_puts(chu);
              delay_ms(500);
              lcd_clear();
              };
              }
              void PC_COM()
              {char ctrl;
              char *strinput,*a;
              USART_Khoitao();
              printf("\r Chuong trinh giao tiep voi may tinh \r");
              printf("\r Xin vui long an : \r");
              printf("\r 1 - Cap nhat thong tin hien thi tren LCD \r");
              printf("\r 2 - De xem nhiet do hom nay la bao nhieu do \r");
              printf("\r 3 - De biet thong tin ve tac gia \r");
              printf("\r 4 - De Hien Thi Thong Tin Tren LCD \r");
              while(1)
              {printf("\r Lua chon cua quy khach la : ");
              ctrl = getchar();
              temperature=~doc_ADC();
              // C=500*(temperature/1024);
              C = (temperature-558.6)/2048;
              switch (ctrl)
              {
              case '1' : { printf("\r Thong tin moi : ");
              a = gets(strinput,32);
              printf("\r Thong tin da duoc cap nhat! \r");} break;
              case '2' : {
              printf("\r Nhiet do tai thoi diem hien tai la : \r");
              printf("%i do\r",C);} break;
              case '3' : { printf("\r BT LON THIET BI NGOAI VI - NHOM THSD - INPG03 \r");}break;
              case '4' : { display(a); } break;
              default : printf("Wrong - command ! Please Check");
              }
              }
              }

              Comment


              • #8
                Nguyên văn bởi taiphong Xem bài viết
                code chạy một lần rùi giao tiếp MT(giao tiếp sử dụng Terminal của Codevision)
                .........
                C = (temperature-558.6)/2048;
                lcd_gotoxy(0,0);
                lcd_putsf("DH BACH KHOA HN");
                delay_ms(500);
                lcd_putsf("DO AN K50")
                lcd_clear();
                lcd_putsf("NHIET DO :");
                .....................................
                Mình nghĩ bạn nên cho dòng in đậm xuống sau nữa đi.
                Về ý tưởng của bạn thì mình nghĩ là k cần thiết phải dùng jumper và 2pin để chọn chế độ .
                Đối với 1 con khủng như AT 16 thì mình vẫn có thể làm việc với LCD và giao tiếp MT đồng thời. Còn nếu bạn vẫn muốn dùng jumper thì nên theo ý cao thủ blackmoon (cao thủ đầu có mủ này trốn biệt đi đâu lâu thế???). Kinh nghiệm câu cắt cấy trên mạch là:
                - quan sát và tận dụng các đường mạch có thể để hàn luôn linh kiện;
                - nên 3C ở mặt dưới.
                Chúc bạn làm tốt đồ án!

                Vote hộ tớ với. Thanks!

                Comment


                • #9
                  Nguyên văn bởi va_hien Xem bài viết
                  Mình nghĩ bạn nên cho dòng in đậm xuống sau nữa đi.
                  Về ý tưởng của bạn thì mình nghĩ là k cần thiết phải dùng jumper và 2pin để chọn chế độ .
                  Đối với 1 con khủng như AT 16 thì mình vẫn có thể làm việc với LCD và giao tiếp MT đồng thời. Còn nếu bạn vẫn muốn dùng jumper thì nên theo ý cao thủ blackmoon (cao thủ đầu có mủ này trốn biệt đi đâu lâu thế???). Kinh nghiệm câu cắt cấy trên mạch là:
                  - quan sát và tận dụng các đường mạch có thể để hàn luôn linh kiện;
                  - nên 3C ở mặt dưới.
                  Chúc bạn làm tốt đồ án!
                  pác cho em hỏi thêm muốn cho chữ chạy từ trái wa thì làm tn?(theo em nghĩ dùng biến i cho giảm dần theo kiểu i--?? nhưng viết lệnh tn?)
                  nói thật là em chả được học gì về VDK, C cũng không biết nốt(trước khi làm đồ án vi em hoc CD thôi)

                  Comment


                  • #10
                    Nguyên văn bởi taiphong Xem bài viết
                    pác cho em hỏi thêm muốn cho chữ chạy từ trái wa thì làm tn?(theo em nghĩ dùng biến i cho giảm dần theo kiểu i--?? nhưng viết lệnh tn?)
                    nói thật là em chả được học gì về VDK, C cũng không biết nốt(trước khi làm đồ án vi em hoc CD thôi)
                    Về mảng này thì mình chưa làm bao h cả.

                    Theo mình nghĩ thì sẽ là thế này:
                    - Dùng một mảng có chiều dài=n+1 (n: số kí tự trên 1 dòng của LCD; ki tự cuối là kí tự kết thúc chuỗi).
                    - Dùng ngắt timer để set một biến bit.
                    - Trong hàm main sẽ kiểm tra bit đó khi nào =1 thì thực hiện viết ra màn hình mảng kí tự. Mỗi lần viết xong thì tự động dịch trái mảng đó (nhét thêm kí tự vào cuối).

                    Có một số cách khác nữa mong các bạn khác nói thêm.

                    Vote hộ tớ với. Thanks!

                    Comment


                    • #11
                      Nguyên văn bởi va_hien Xem bài viết
                      Về mảng này thì mình chưa làm bao h cả.

                      Theo mình nghĩ thì sẽ là thế này:
                      - Dùng một mảng có chiều dài=n+1 (n: số kí tự trên 1 dòng của LCD; ki tự cuối là kí tự kết thúc chuỗi).
                      - Dùng ngắt timer để set một biến bit.
                      - Trong hàm main sẽ kiểm tra bit đó khi nào =1 thì thực hiện viết ra màn hình mảng kí tự. Mỗi lần viết xong thì tự động dịch trái mảng đó (nhét thêm kí tự vào cuối).

                      Có một số cách khác nữa mong các bạn khác nói thêm.
                      Sao phải làm thế hả em.
                      Sử dụng kết hợp lệnh Cursor or Display shiftEntry mode set để dịch màn là tốt nhất.
                      AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                      Xem thêm tại Online Store ---> Click here
                      Mob: 0982.083.106

                      Comment


                      • #12
                        Cái kiểu chữ chạy e chưa làm bao h vì k có nhu cầu. Cách của a hay đấy. Lúc nào cần e sẽ sang hỏi anh

                        Vote hộ tớ với. Thanks!

                        Comment


                        • #13
                          /************************************************** ***
                          This program was produced by the
                          CodeWizardAVR V1.24.4 Standard
                          Automatic Program Generator
                          © Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l.
                          http://www.hpinfotech.com
                          e-mail:office@hpinfotech.com

                          Project :
                          Version :
                          Date : 3/17/2008
                          Author : PHONG
                          Company : DHBK
                          Comments:


                          Chip type : ATmega16L
                          Program type : Application
                          Clock frequency : 8.000000 MHz
                          Memory model : Small
                          External SRAM size : 0
                          Data Stack size : 256
                          ************************************************** ***/

                          #include <mega16.h>
                          #include <delay.h>
                          // Alphanumeric LCD Module functions
                          #asm
                          .equ __lcd_port=0x18 ;PORTB
                          #endasm
                          #include <lcd.h>

                          // Declare your global variables here
                          unsigned char i; //bien dem de chay chu
                          char flash *str="NGUYEN TAI PHONG";

                          void main(void)
                          {
                          lcd_init(16);//khoi tao lcd 16 cot 2 dong
                          i=16;
                          while (1)
                          {
                          // Place your code here
                          i--;
                          lcd_gotoxy(i,1);
                          lcd_putsf(str);

                          if(i==0) {i=16; lcd_gotoxy(0,1);lcd_putsf("DO AN TOT NGHIEP");}
                          lcd_gotoxy(0,0);
                          lcd_putsf("DH BACH KHOA HN");
                          delay_ms(100);

                          };
                          }
                          làm như vậy mạch chạy ngon lành() chạy trái wa , nhưng chỉ chạy một xâu thui, bùn chít được. các pác cao thủ chạy đâu hết rùi không bít??? chác pác blackmoon đi luyên công ở đâu rùi!!!

                          Comment


                          • #14
                            Nguyên văn bởi VNarmy Xem bài viết
                            Sao phải làm thế hả em.
                            Sử dụng kết hợp lệnh Cursor or Display shiftEntry mode set để dịch màn là tốt nhất.
                            vậy phải viết lệnh ntn hả pác???
                            em có đọc tài liệu về kon LCD có thấy nói về phần đấy nhưng chưa nghiên cứu kỹ , mong pác chỉ bảo

                            Comment


                            • #15
                              Nguyên văn bởi VNarmy Xem bài viết
                              Sao phải làm thế hả em.
                              Sử dụng kết hợp lệnh Cursor or Display shiftEntry mode set để dịch màn là tốt nhất.
                              pác xem ho em vậy trong phần code của em phải sửa thế nào ạ.(code ở trang 1 ý pác)

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X