اطلاعیه

Collapse
No announcement yet.

پروگرم کردن AVR بدون کامپیوتر

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    پروگرم کردن AVR بدون کامپیوتر

    سلام
    مداری میخوام که بتونم بدون کامپیوتر میکرو AVR رو پروگرم کنم . (بصورت ISP )
    نحوه کار به این صورت باشه که من برنامه خودم رو روی یک مداری ( که احتمالا شمال یک میکرو و یک MMC یا EEprom ) از طریق کامپیوتر بریزم و حالا مدارم رو ببرم
    و میکروهای خودم رو با اون برنامه ای که توی برد Portable هستش پروگرم کنم .

    من همچین مداری میخوام . کسی داره ؟؟؟ یا پروتکل های پروگرم کردن ISP رو کسی داره ؟؟

    #2
    پاسخ : پروگرم کردن AVR بدون کامپیوتر

    توی دیتا شیت اونها هستش
    من خودم دارم روی hvpp کار میکنم
    هنوز کارم تموم نشده ولی همچین پیچیده هم نیست
    isp رو مطالعه کردم خیلی ساده تر ازhvpp هستش

    دیدگاه


      #3
      پاسخ : پروگرم کردن AVR بدون کامپیوتر

      نمونه خارجی شو پیدا کردم 170 دلار بود . ولی میخوام خودم بسازم .
      کسی اطلاعات یا نقشه داره ؟؟

      دیدگاه


        #4
        پاسخ : پروگرم کردن AVR بدون کامپیوتر

        سلام
        فکر کنم لینکی که گذاشتم ،همون چیزیه که شما دنبالش هستید ،امیدوارم که مفید باشه :bye


        http://www.projects-lab.com/?p=330

        دیدگاه


          #5
          پاسخ : پروگرم کردن AVR بدون کامپیوتر

          این چیزی که دوستمون گذاشتند با Boot Loader پروگرام می کنه، اگر می خواهید به صورت ISP پروگرام کنید از توابع موجود در برنامه ی زیر استفاده کنید (CodeVision)

          کد:
          
          #include <mega163.h>
          #include <stdio.h>
          #include <stdlib.h>
          #include <delay.h>
          
          //lcd port = PORTC
          #asm
           .equ __lcd_port=0x15
          #endasm
          #include <lcd.h>
          
          //timeout values for tasks
          #define t1 25
          
          //width in characters of LCD display
          #define LCDwidth 16
          
          //states of user state machine
          #define U_INIT_STATE    0
          #define U_RELEASE_STATE  1
          #define U_DB_PRESS_STATE  2
          #define U_PRESS_STATE   3
          #define U_DB_RELEASE_STATE 4
          
          //btn0 and btn1 constants for getkey
          #define BTN_CYCLE 1
          #define BTN_PROG 2
          
          #define SCK  PORTA.7
          #define MISO PINA.5
          #define MOSI PORTA.6
          #define RESET PORTA.4
          
          #define SCK_PERIOD 1
          
          void task1(void);			//user state machine
          void initialize(void);			//all the usual mcu stuff
          unsigned char getkey(void);		//scan the push buttons
          
          void GetNames(void);
          void GetFile(void);
          unsigned char ReceiveByte(void);
          void SendByte(unsigned char val);
          
          unsigned char EnterProgMode(void);
          void ChipErase(void);
          void ProgFlashWord(unsigned int addr, unsigned int val);
          unsigned char SendRecv(unsigned char out);
          void ExitProgMode(void);
          
          unsigned int htoi(unsigned char *str, unsigned char num);
          
          char lcd_buffer[17];			// LCD display buffer 
          
          unsigned char reload;			//timer 0 reload to set t1 mSec
          unsigned char time1;			//timeout counter for task1
          
          unsigned char u_state;			//state variable for user state machine
          unsigned char butnum;			//push button number pressed
          unsigned char currFile;
          
          unsigned char file[8][9];
          unsigned char fileCount;
          
          //**********************************************************
          //timer 0 overflow ISR
          interrupt [TIM0_OVF] void timer0_overflow(void)
          {
           //reload to force 1 mSec overflow
           TCNT0 = reload;
          
           //decrement the times if they are not already zero
           if (time1>0) --time1;
          }
          
          //**********************************************************
          //Entry point and task scheduler loop
          void main(void)
          {
           initialize();
          
           //main task scheduler loop
           while(1)
           {  
            if (time1==0)    task1();
           }
          }
          
          //**********************************************************
          //Task subroutines
          //Task 1 - execute user state machine
          void task1(void)
          {
           //reset the task timer
           time1=t1;
           
           switch(u_state)
           {
            case U_INIT_STATE:
             butnum = getkey();		//get key pressed on key pad
             u_state = U_RELEASE_STATE;
             break;
            case U_RELEASE_STATE:
             if (butnum == 0)			//check if key is pressed
              butnum = getkey();		//get key pressed on board
             else
              u_state = U_DB_PRESS_STATE;
             break;
            case U_DB_PRESS_STATE:
             if (getkey() == butnum)		//check if key is still pressed
             {
              if (butnum == BTN_CYCLE)
              {
               //select next file
               if (++currFile >= fileCount)
                currFile = 0;
               
               //display current file on lcd
               lcd_clear();
           	   lcd_gotoxy(0, 0);
           	   lcd_puts(&file[currFile][0]);
              }
              else
              {
               lcd_clear();
               lcd_gotoxy(0, 0);
               lcd_putsf("Programming...");
               
               //disable interrupts so they will not interfere with timing during programming
               #asm
               cli
               #endasm
               
               //get rom file from slave and program chip
               GetFile();
               
               //reenable interrupts
               #asm
               sei
               #endasm
               
               //redisplay current file on lcd
               lcd_clear();
           	 lcd_gotoxy(0, 0);
           	 lcd_puts(&file[currFile][0]);
              }
              
              u_state = U_PRESS_STATE;
             }
             else
             {
              butnum = getkey();		//get key pressed on board
              u_state = U_RELEASE_STATE;
             }
             break;
            case U_PRESS_STATE:
             if (getkey() == 0)		//check if key is released
              u_state = U_DB_RELEASE_STATE;
             break;
            case U_DB_RELEASE_STATE:
             if (getkey() == 0)		//check if key is still released
              u_state = U_RELEASE_STATE;
             else
              u_state = U_PRESS_STATE;
             break;
           }
          }
          
          //*******************************
          //Get key pressed by user
          unsigned char getkey(void)
          {
           //determine if btn7 or btn6 is pressed
           if (PIND.7 == 0)
            return 2;
           else if (PIND.6 == 0)
            return 1;
           else
            return 0;
          }
          
          //*******************************
          //Block until byte received from UART
          unsigned char ReceiveByte(void)
          {
           //send ACK (value doesn't matter)
           SendByte(0x00);
           
           //wait for receive complete
           while((UCSRA & 0x80) != 0x80);
           
           //get byte
           return UDR;
          }
          
          void SendByte(unsigned char val)
          {
           //wait for UDR empty
           while((UCSRA & 0x20) != 0x20);
           
           //send byte
           UDR = val;
          }
          
          //*******************************
          //Get file names from hard drive mcu
          void GetNames(void)
          {
           unsigned char i, j;
           
           //request list of file names from slave
           SendByte('L');
           
           fileCount = ReceiveByte();
           
           //receive each file name
           for(i = 0; i < fileCount; i++)
           {
            //receive each char of name
            for(j = 0; j < 8; j++)
             file[i][j] = ReceiveByte();
             
            //make last character null
            file[i][8] = '\0';
           } 
          }
          
          void GetFile(void)
          {
           unsigned long fileSize, i;
           unsigned char j;
           unsigned char s_addr[6], s_val[4];
           unsigned int addr, val;
           
           //attmept to enter programming mode
           if (!EnterProgMode())
           {
            lcd_clear();
            lcd_gotoxy(0, 0);
            lcd_putsf("Not Connected");
            delay_ms(2000);
            
            ExitProgMode();
            
            return;
           }
           
           //request file from slave
           SendByte(currFile);
           
           //first 4 bytes == file size (lsb first)
           fileSize = ReceiveByte();
           fileSize |= ((unsigned long) ReceiveByte()) << 8;
           fileSize |= ((unsigned long) ReceiveByte()) << 16;
           fileSize |= ((unsigned long) ReceiveByte()) << 24;
           
           //clear flash memory
           ChipErase();
           
           //read each byte of file
           for(i = 0; i < fileSize; i += 13)
           {
            //extract address from byte stream
            for(j = 0; j < 6; j++)
             s_addr[j] = ReceiveByte();
          
            //discard ':' in line
            ReceiveByte();
            
            //extract data value from byte stream
            for(j = 0; j < 4; j++)
             s_val[j] = ReceiveByte();
             
            //discard carriage return and line feed at end of line
            ReceiveByte();
            ReceiveByte();
            
            //convert address + val string to integers
            addr = htoi(s_addr, 6);
            val = htoi(s_val, 4);
            
            //program val at address in flash of target mcu
            ProgFlashWord(addr, val);
            
            lcd_gotoxy(0, 1);
            sprintf(lcd_buffer, "%d%%", 100*i/fileSize);
            lcd_puts(lcd_buffer);
           }
           
           ExitProgMode();
          }
          
          unsigned char EnterProgMode(void)
          {
           unsigned char i, echo = 0;
           
           //set reset low to enter programming mode
           RESET = 0;
           delay_ms(20);
           
           for(i = 0; i < 32; i++)
           {
            //send program enable instruction
            SendRecv(0xac);
            SendRecv(0x53);
            echo = SendRecv(0x00);
            SendRecv(0x00);
           
            //if echo != 0x53, give SCK a positive pulse and retry
            if (echo != 0x53)
            {
             SCK = 1;
             delay_us(SCK_PERIOD);
             SCK = 0;
            }
            else
             return 1;
           }
          
           //no device connected (failure)
           return 0;
          }
          
          void ChipErase(void)
          {
           //send chip erase instruction
           SendRecv(0xac);
           SendRecv(0x80);
           SendRecv(0x00);
           SendRecv(0x00);
           delay_ms(10);
            
           //give reset a positive pulse, and restart programming
           RESET = 1;
           EnterProgMode();
          }
          
          unsigned char SendRecv(unsigned char out)
          {
           unsigned char i, in = 0;
           
           for(i = 7; i != 0xff; i--)
           {
            MOSI = (out >> i) & 1;	//output bit
            delay_us(SCK_PERIOD);
            SCK = 1;			//set clock high
            delay_us(SCK_PERIOD);	//read bit
            in |= MISO << i;
            SCK = 0;			//set clock low
           }
           
           return in;
          }
          
          void ProgFlashWord(unsigned int addr, unsigned int val)
          {
           //send program mem instruction (low byte)
           SendRecv(0x40);
           SendRecv(addr >> 8);
           SendRecv(addr);
           SendRecv(val);
           delay_ms(5);
           
           //send program mem instruction (high byte)
           SendRecv(0x48);
           SendRecv(addr >> 8);
           SendRecv(addr);
           SendRecv(val >> 8);
           delay_ms(5);
          }
          
          void ExitProgMode(void)
          {
           //set reset high to exit programming mode
           RESET = 1;
          }
          
          unsigned int htoi(unsigned char *str, unsigned char num)
          {
           unsigned char i, j;
           unsigned int result = 0;
           
           //convert string with hex digits to an integer
           for(i = num - 1, j= 0; j < 4; i--, j++)
           {
            if ((str[i] >= 'A')&& (str[i] <= 'F'))
             result |= ((unsigned int) (str[i] - 'A' + 10)) << (j * 4);
            else if ((str[i] >= '0') && (str[i] <= '9'))
             result |= ((unsigned int) (str[i] - '0')) << (j * 4);
           }
           
           return result;
          }
          
          
          //*******************************
          //Set it all up
          void initialize(void)
          {
           lcd_init(LCDwidth);		//initialize the display
           lcd_clear();			//clear the display
           lcd_gotoxy(0, 0);
           lcd_putsf("Loading...");
           
           //set up the ports
           DDRA = 0xdf;					//PORTA is an output, except MISO (Pin 5) is an input
           PORTA = 0x30;					//RESET = 1, else = 0, Pin 5 pullup on
           
           //set up serical communication
           UCSRB = 0x10 | 0x8;		//enable Tx, Rx
           UBRR = 25;			   //baud = 9600, using a 4 MHz crystal 
           
           //set up timer 0
           reload = 256-128;		//value for ~1 Msec (@ 4Mhz)
           TCNT0 = reload;
           TIMSK=1;			//turn on timer 0 overflow ISR
           TCCR0=3;	    		//prescalar to 64
           
           //init the task timers
           time1 = t1;
           
           //retrieve file names from slave
           GetNames();
          
           //init state machine
           u_state = U_INIT_STATE;
           currFile = 0;
           
           //display current file on lcd
           lcd_clear();
           lcd_gotoxy(0, 0);
           lcd_puts(&file[currFile][0]);
           
           //crank up the ISRs
           #asm
              sei
           #endasm
          }
          There is nothing so practical as a good theory. — Kurt Lewin, 1951

          دیدگاه


            #6
            پاسخ : پروگرم کردن AVR بدون کامپیوتر

            اون بوت لودر کارش چیه ؟؟ دقیق میشه بگید چی کار میکنه ؟؟ فکر کنم برای پروگرم کردن توسط بوت لودر حتما از قبل باید یک برنامه تو میکرو ریخته باشیم
            ولی من میخوام میکرو های خام و غیر خام رو هم بشه پروگرم کرد.

            دیدگاه


              #7
              پاسخ : پروگرم کردن AVR بدون کامپیوتر

              سلام
              برای استفاده از بوت لودر باید از قبل یه برنامه رو توی میکرو بریزیم

              دیدگاه


                #8
                پاسخ : پروگرم کردن AVR بدون کامپیوتر

                پیش از این در مورد Boot Loader دوستان در این لینک بحت کرده اند
                فکر کنم فعلا کارتو راه بندازه
                http://www.eca.ir/forum2/index.php?topic=11817.msg51409
                Reveng will surely come... Your hard time are ahead
                // - - - - - - - - - -
                برگه های کتاب به منزله بالهایی هستند که روح ما را به عالم نور و روشنایی پرواز میآ*دهند. فرانسوا ولتر
                // - - - - - - - - - -
                اگر برای هرچیزی به غیر از علاقه ی شدیدتان به الکترونیک تلاش کنید ، خیلی دور نخواهید رفت / خیلی هم خوب نخواهید شد.
                // - - - - - - - - - -

                دیدگاه


                  #9
                  پاسخ : پروگرم کردن AVR بدون کامپیوتر

                  با سلام و تشکر از آقای سپاس یار
                  اگر ممکنه مداری که این برنامه باهاش کار میکنه رو بزارین.
                  ممنون
                  http://imenbazar.com

                  دیدگاه

                  لطفا صبر کنید...
                  X