Thông báo

Collapse
No announcement yet.

Hỏi đáp Mật khẩu sử dụng EEPROM nội trong ATmega16

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

  • Hỏi đáp Mật khẩu sử dụng EEPROM nội trong ATmega16

    Hiện tại em đang làm đồ án về xuất nhập mật khẩu , và em dự định dùng EEPROM nội trong ATmega16 để ghi và truy xuất mật khẩu .

    Thuật toán của em là :
    - Khai báo một mảng trống trong eeprom tên là a[] ( không định địa trỉ trong EEPROM )
    - Kiểm tra :
    + (1) Nếu mảng a[] không có dữ liệu , tiến hành nhập dữ liệu ( mật khẩu 6 số ) , bằng cách quét ma trận phím và lưu ký tự của phím vào mảng a[]
    + (2) Nếu mảng a[] có dữ liệu , tiến hành quét phím , lưu giá trị vào một mảng b[] và so sánh với a[] , nếu đúng => mk đúng , còn không thì ngược lại .

    *Khó khăn của em :
    - Chưa hiểu rõ cách khai báo một mảng trong EEPROM , không biết đúng hay sai .
    - Không biết giá trị của các phần tử của a[] trong EEROM khi chưa gán giá trị , mặc định bằng bao nhiêu .
    - Mô Phỏng bằng Proteus , vi điều khiển luôn chuyển sang (2) tức là đã có dữ liệu sẵn trong EEPROM rồi .
    - Không hiểu khi khởi động con chip nhiều lần , mảng a[] có chỉ đúng vào địa chỉ lần đầu tiên của nó hay không , hay lại chuyển sang một vùng địa chỉ khác trong eeprom

    Rất mong các bác đọc CODE dưới đây em viết và giải thích cho em . Em mới lần mò học AVR nên nhiều cái không rõ lắm .
    Sau đây là phần Code chính


    Code:
    #include <mega16.h>
    #include <stdio.h>
    #include <delay.h>   
    #asm
       .equ __lcd_port=0x1B ;PORTA
    #endasm
    #include <lcd.h>
    
    #define KEYPAD_DDR DDRB
    #define KEYPAD_PORT PORTB
    #define KEYPAD_PIN PINB
    
    unsigned char hang[4]={0x0E,0x0D,0x0B,0x07};
    unsigned char matran[4][4]=
                    {'7','8','9','/',
                    '4','5','6','*',
                    '1','2','3','-',
                    'N','0','=','+'};
                               
    unsigned char key=0;
    unsigned char checkpad();
    int t=0;
    int x=0;
    
    
    eeprom unsigned char a[6] ;
    unsigned char b[6];
    void main(void)
    {
            
            KEYPAD_PORT=0x0f;// Khoi tao cac Port cua chip cho viec quet led
            KEYPAD_DDR=0xf0;
            lcd_init(16);                 
            _lcd_ready();
            
            /*********** Vong lap kiem tra cac gia tri cua mang a[] trong eeprom*******************/
            
            for(t=0;t<6;t++) 
            {
                    if(a[t]==0)
                    x++;
            }
            // Neu x=6 => mang a[]=0 voi moi (t)=> eeprom  chua duoc nap du lieu
            // neu x!=0 => eeprom da duoc nap du lieu 
            
            
            if(x==6) // Khi mang a[]=0 voi moi gia tri (t) , bat dau qua trinh nap du lieu vao eeprom 
            {
                            
                    lcd_putsf("Chua co MK ");
                    delay_ms(500);
                    lcd_clear();
                    lcd_putsf(" Moi ban dat MK ");
                    delay_ms(500);
                    lcd_clear();
                    lcd_gotoxy(0,0);
                    lcd_putsf("MK gom 6 so ");
                            
                    lcd_gotoxy(0,1);
                            
                    /********************** Vong lap nap du lieu cho eeprom**************************/
                            
                    for(t=0;t<6;t++)
                    {
                            do
                            {
                                    key=checkpad();
                                    if(key)lcd_putchar(key);
                            }
                            while(!key);
                            key=a[t];
                            _lcd_write_data(0x06);
                            delay_ms(500);
                    }
                    
                    if(t==6)delay_ms(500);
                    lcd_clear();
                    lcd_gotoxy(0,0); 
                    lcd_putsf("ban da nhap xong mat khau");
                            
                    /***********************Ket thuc viec nap du lieu*********************************/
            }
            else 
            {   
                    lcd_putsf("Moi ban dat mat khau");
                    delay_ms(2000);
                    lcd_clear();
                    lcd_gotoxy(0,0);
                    lcd_putsf("Mk gom 6 so : ");
                    lcd_gotoxy(0,1);
                    for(t=0;t<6;t++)
                    {
                            do
                            {
                                    key=checkpad();
                                    if(key!=0)lcd_putchar(key);
                                            
                            }
                            while(!key);
                            key=b[t];
                            _lcd_write_data(0x06);
                            delay_ms(500);
                    }
                            
                    if(t==6)delay_ms(500);
                    lcd_clear();
                    lcd_gotoxy(0,0);
                            
                    t=0;
                    while((a[t]==b[t])&&(t<6))
                    {
                            t++;
                    }
                    if(t==5) lcd_putsf("ban da nhap dung mk ");
                    else lcd_putsf("ban da nhap sai mk");
                     
                    }  
                    
                    
                     
    }                
                    
    unsigned char checkpad()
    {
            int i,j,keyin;
            for(i=0;i<4;i++)                                                                
            {
                    
                    KEYPAD_PORT=0xff-(1<<(i+4));
                    delay_ms(10);
                    keyin=KEYPAD_PIN&0x0f;
                    if(keyin!=0x0f)
                    {
                            for(j=0;j<4;j++)
                            if(keyin==hang[j]) return matran[j][i];
                            
                    }
            }
            return 0;
    }

  • #2
    Cần gì phải khai báo mảng trong EEPROM? chỉ cần các hàm ghi/đọc EEPROM là OK rồi. Code đọc/ghi phang từ trong datasheet là chạy như ma đuổi thôi.
    Giá trị mặc định trong EEPROM luôn là 0xFF.
    Trước tiên nên ghi các giá trị mật khẩu đúng vào 6 địa chỉ trong EEPROM (mật khẩu cố định)
    - Khai báo 1 mảng đệm dùng để chứa 6 Byte mật khẩu đọc được từ 6 địa chỉ trong EEPROM nói trên. Mảng này được cập nhật khi khởi động hệ thống. Càng hạn chế ghi/đọc càng tốt.
    - Khai báo thêm 1 mảng 6 phần tử chứa giá trị của phím bấm
    Sau khi nhận được tín hiệu của nút OK thì so sánh.

    Comment


    • #3
      Nguyên văn bởi Multi System Xem bài viết
      Cần gì phải khai báo mảng trong EEPROM? chỉ cần các hàm ghi/đọc EEPROM là OK rồi. Code đọc/ghi phang từ trong datasheet là chạy như ma đuổi thôi.
      Giá trị mặc định trong EEPROM luôn là 0xFF.
      Trước tiên nên ghi các giá trị mật khẩu đúng vào 6 địa chỉ trong EEPROM (mật khẩu cố định)
      - Khai báo 1 mảng đệm dùng để chứa 6 Byte mật khẩu đọc được từ 6 địa chỉ trong EEPROM nói trên. Mảng này được cập nhật khi khởi động hệ thống. Càng hạn chế ghi/đọc càng tốt.
      - Khai báo thêm 1 mảng 6 phần tử chứa giá trị của phím bấm
      Sau khi nhận được tín hiệu của nút OK thì so sánh.
      Cảm ơn anh , nhưng em muốn có một chương trình có thể thay đổi mật khẩu được ngay khi chạy cơ ( quyền Admin ) , em không muốn chỉ tạo một mật khẩu cố định không thay đổi được , mong anh gợi ý

      Comment


      • #4
        Muốn sao chả được !
        Lập 1 chương trình quét phím, khi có tín hiệu của phím Setup thì nhảy vào chương trình cài đặt để lấy giá trị của phím bấm sau khi ấn OK thì ghi các giá trị phím bấm đấy vào các địa chỉ cũ trong EEPROM.
        Vậy là đã đổi được mật khẩu.

        Comment


        • #5
          Nguyên văn bởi Multi System Xem bài viết
          Muốn sao chả được !
          Lập 1 chương trình quét phím, khi có tín hiệu của phím Setup thì nhảy vào chương trình cài đặt để lấy giá trị của phím bấm sau khi ấn OK thì ghi các giá trị phím bấm đấy vào các địa chỉ cũ trong EEPROM.
          Vậy là đã đổi được mật khẩu.
          em cũng muốn làm như thế mà , nhưng khó khăn của em là phần thuật toán em đã nêu ở bài đầu tiên , về việc khai báo mảng dữ liệu a[] trong eeprom , và em không biết Proteus có thể mô phỏng được không , khi tắt đi bặt lại , dữ liệu lưu trong eeprom của chip ảo trong proteus có dữ nguyên không , hay bị xóahết .
          thuật toán của em viết khá rõ ràng , mong anh đọc và chỉ ra những chỗ bất hợp lý của em , cảm ơn anh .

          Comment


          • #6
            bạn hay khỏi tạo giá trị ban đầu cho êprom.
            eeprom unsigned char a[6] ={0};
            khi đó khi ban đầu chạy các giá trị trong mảng =0 ->ban hay nhạp mật khẩu......

            còn khi mô phỏng thì hình như proteus không nhận giá trị êprom khởi tạo đâu,nên giá trị sẽ mặc định là 0xff.
            chỉ khi có thao tác ghi dữ liệu vào eeprom thì khi khởi tắt đi chạy lại proteus nhận giá trị êprom đã lưu.
            để mô phỏng thì nên thêm đoạn code khởi tạo để ghi giá trị êprom ban đầu: Kiểm tra 6 fan tử đó nếu tất cả == 0xff thì clear nó đi.
            email:trangonthuocthom@gmail.com

            Comment


            • #7
              Ủa, chương trình thiết kế sao kỳ cục vậy? Không thấy cái vòng lặp chính đâu cà?
              Đã bỏ nghề về quê chăn gà...

              Comment


              • #8
                Thế thì anh chịu thôi!
                Anh không học cái căn bản nên chẳng bao giờ làm thuật toán, nghĩ sao lập trình vậy.
                Cũng chẳng bao giờ mô phỏng bằng máy tính. Làm cái mạch thật lập trình cho sướng tay, sướng mắt.

                Comment


                • #9
                  Nguyên văn bởi Katecka Xem bài viết
                  Ủa, chương trình thiết kế sao kỳ cục vậy? Không thấy cái vòng lặp chính đâu cà?
                  em mới viết qua một đoạn mã quét phím , nạp xuất eeprom thôi anh à

                  Comment


                  • #10
                    Vô ích, làm kiểu này cả năm nữa cũng không xong, ít nhất phải test được từng phần:
                    -thử ghi một string lên eeprom, hiển thị nó lên lcd
                    -thử nhập một string bằng quét phím
                    khi nào hai phần đều đã thực hiện được khi đó hãy làm một cái như sau

                    begin:
                    -khởi tạo một mảng trên eeprom
                    lặp vô hạn:
                    -nhập một string từ quét phím
                    -so sánh 2 string, hiển thị kết quả lên lcd

                    xong hết chừng đó mới tính chuyện ghi ngược vào eeprom
                    Đã bỏ nghề về quê chăn gà...

                    Comment


                    • #11
                      Nguyên văn bởi Katecka Xem bài viết
                      Vô ích, làm kiểu này cả năm nữa cũng không xong, ít nhất phải test được từng phần:
                      -thử ghi một string lên eeprom, hiển thị nó lên lcd
                      -thử nhập một string bằng quét phím
                      khi nào hai phần đều đã thực hiện được khi đó hãy làm một cái như sau

                      begin:
                      -khởi tạo một mảng trên eeprom
                      lặp vô hạn:
                      -nhập một string từ quét phím
                      -so sánh 2 string, hiển thị kết quả lên lcd

                      xong hết chừng đó mới tính chuyện ghi ngược vào eeprom
                      Vâng , cảm ơn anh , em cũng đang text thử phần ghi một số ký tự từ eeprom sang LCD , code của em như sau :

                      Code:
                      #include <mega16.h>
                      #include <stdio.h>
                      #include <delay.h>   
                      #asm
                         .equ __lcd_port=0x1B ;PORTA
                      #endasm
                      #include <lcd.h>
                      int t;
                      eeprom unsigned char a[6]={'a','b','c'};
                      
                      void main(void)
                      {        
                      
                              _lcd_ready();
                              lcd_init(16);         
                              while(1)
                              {
                                      lcd_gotoxy(0,0);
                                      for(t=0;t<3;t++)
                                      {
                                              lcd_putchar(a[t]);
                                              _lcd_write_data(0x06);
                                      }
                              }
                      }
                      nhưng không biết sai ở đâu mà cái màn hình lcd nó hiện ra như thế này

                      Click image for larger version

Name:	1.gif
Views:	1
Size:	13.5 KB
ID:	1351332

                      em mới tìm hiểu , còn nhiều bỡ ngỡ ,mong anh giải đáp dùm

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X