اطلاعیه

Collapse
No announcement yet.

مشکل در استفاده از usart و lcd

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

    مشکل در استفاده از usart و lcd


    با سلام

    من یه پروژه با پرت سریال و ال سی دی نوشتم. lcd هم کار میکنه ولی داخل کیل باید در ادرس زیر
    options for target / linker
    تیک ude memory layout from target dialog رو زده باشم تا lcd کار کنه این تیکو میزنم دیگه پرت سریال و پایه های ورودی خروجی کار نمیکنه . وقتی برش میدارم پرت سریال و پایه های ورودی خروجی کار میکنه ولی دیگه lcd کار نمیکنه.!!!!!! :cry:

    چی کاری انجام بدم؟
    عامل کلیدی تمام موفقیتها " عمل کردن" است

    #2
    پاسخ : مشکل در استفاده از usart و lcd

    با چه میکرویی؟؟؟
    ال سی دی به کدوم پورت وصله؟؟
    بالاخره lcd دیت راه افتاد؟؟
    مبارکه!!!
    تشکر لازمه! دکمه رو فشار بده دیگه!!
    موفق باشیدددددد!!

    دیدگاه


      #3
      پاسخ : مشکل در استفاده از usart و lcd

      AT91SAM 7S256
      یه پورت که بیشتر نداره همون A
      نه میگم که مشکل داره ....

      خیلی وقت ندارم .لطفا کمک کنید :cry2: :cry2:
      عامل کلیدی تمام موفقیتها " عمل کردن" است

      دیدگاه


        #4
        پاسخ : مشکل در استفاده از usart و lcd

        میشه برنامتون رو با هدر های مربوطه بگدارید؟؟
        تاکی وقت دارید؟
        تشکر لازمه! دکمه رو فشار بده دیگه!!
        موفق باشیدددددد!!

        دیدگاه


          #5
          پاسخ : مشکل در استفاده از usart و lcd

          تا پس فردا

          #include <AT91SAM7S256.h>
          #include <pio.h>
          #include <delay.h>
          #include <usart.h>
          #include <stdio.h>
          #define LCD_PORT_A
          #define LCD_RS 22
          #define LCD_E 21

          #define LCD_DB4 16
          #define LCD_DB5 15
          #define LCD_DB6 14
          #define LCD_DB7 13
          #include <lcd.h>
          int main (void) {
          char r,s;
          int t;
          usart0_init(2,9600);
          PORTA_INPUT=PA0;
          PULL_UP_A= PA0;
          lcd_init();
          lcd_clear();
          cursor_off();
          lcd_gotoxy(1,4);
          lcd_putsf("WELLCOME"
          delay_ms(800);
          while(1){
          start:
          if (PINA(0)==1) goto start;
          run:
          if (PINA(0)==0) goto run;
          lcd_clear();
          lcd_gotoxy(1,2);
          lcd_putsf("please wait"
          delay_ms(200);
          sendchar(0);
          delay_ms(50);
          sendchar(84);
          r = getkey();
          s = getkey();
          t=(r*256);
          t=(t+s);

          if (t==0){
          lcd_clear();
          lcd_gotoxy(1,2);
          lcd_putsf("please less"
          lcd_gotoxy(2,1);
          lcd_putsf("the distance"
          delay_ms(800);
          goto start;
          }
          else if (t<=17){
          lcd_clear();
          lcd_gotoxy(1,1);
          lcd_putsf("please increase"
          lcd_gotoxy(2,1);
          lcd_putsf("the distance"
          delay_ms(800);
          goto start;
          }
          else{
          lcd_clear();
          lcd_gotoxy(1,1);
          lcd_putsf("distance = "
          lcd_gotoxy(1,12);
          lcd_puts(t);
          lcd_gotoxy(2,7);
          lcd_putsf("cm"
          delay_ms(800);
          goto start;
          }
          }
          }
          عامل کلیدی تمام موفقیتها " عمل کردن" است

          دیدگاه


            #6
            پاسخ : مشکل در استفاده از usart و lcd

            اینم هدرLCD بعدیشم مال USART هست



            #ifndef lcd_INCLUDED_
            #define lcd_INCLUDED_
            #ifdef LCD_PORT_A
            #define PIO_enable *AT91C_PIOA_PER
            #define PIO_SetOutput *AT91C_PIOA_SODR
            #define PIO_ClearOutput *AT91C_PIOA_CODR
            #define PIO_CfgOutput *AT91C_PIOA_OER
            #endif

            #ifndef F_CPU
            #define F_CPU 18432000
            #endif
            #define clcd_minDelay() cwait(F_CPU/800000)
            #define clcd_Delay() cwait(F_CPU/800000)
            void lcd_init(void);
            void lcd_putchar(char ch);
            void lcd_command(char cmd);
            void lcd_gotoxy(char x, char y);
            void lcd_clear(void);
            void lcd_clear_line(char y);
            void lcd_shift_left(char n);
            void lcd_shift_right(char n);
            void lcd_puts(int num);
            void lcd_putsf(char* data);
            void lcd_define_char(const char *pc,char char_code);
            //================================================== =======
            void cwait (volatile int t) {
            for (;t; t--);
            }
            // ================================================== ==========================
            void setD4567(char val)
            {
            PIO_ClearOutput =((1<<LCD_DB4)|(1<<LCD_DB5)|(1<< LCD_DB6)|(1<<LCD_DB7));
            if (val & 0x80)
            PIO_SetOutput =(1<<LCD_DB7) ;
            if (val & 0x40)
            PIO_SetOutput =(1<<LCD_DB6);
            if (val & 0x20)
            PIO_SetOutput =(1<<LCD_DB5);
            if (val & 0x10)
            PIO_SetOutput =(1<<LCD_DB4);
            }
            // ================================================== ==========================
            void lcd_putchar(char ch)
            {
            PIO_SetOutput =(1<<LCD_RS);
            setD4567(ch);
            PIO_SetOutput=(1<<LCD_E);
            clcd_minDelay();
            PIO_ClearOutput=(1<<LCD_E);
            clcd_minDelay();
            setD4567(ch<<4);
            PIO_SetOutput=(1<<LCD_E);
            clcd_minDelay();
            PIO_ClearOutput=(1<<LCD_E);
            clcd_Delay();
            }
            // ================================================== ==========================
            void lcd_command(char cmd) //Sends Command to LCD
            {
            PIO_ClearOutput=(1<<LCD_RS);
            setD4567(cmd);
            PIO_SetOutput =(1<<LCD_E);
            clcd_minDelay();
            PIO_ClearOutput=(1<<LCD_E);
            clcd_minDelay();
            setD4567(cmd<<4);
            PIO_SetOutput =(1<<LCD_E);
            clcd_minDelay();
            PIO_ClearOutput =(1<<LCD_E);
            clcd_Delay();
            }
            // ================================================== ==========================
            void lcd_init()
            {
            PIO_enable =0XFFFFFFFF;
            PIO_CfgOutput = ((1<<LCD_RS)|(1<<LCD_E)|(1<<LCD_ DB4)|(1<<LCD_DB5)|(1<<LCD_DB6)|(1<& lt;LCD_DB7));
            clcd_Delay();
            setD4567(0);
            setD4567((1<<5)|(1<<4));
            PIO_SetOutput=(1<<LCD_E);
            clcd_minDelay();
            PIO_ClearOutput =(1<<LCD_E);
            clcd_Delay();
            setD4567((1<<5)|(1<<4));
            PIO_SetOutput =(1<<LCD_E);
            clcd_minDelay();
            PIO_ClearOutput =(1<<LCD_E);
            clcd_Delay();
            setD4567(1<<5);
            PIO_SetOutput =(1<<LCD_E);
            clcd_minDelay();
            PIO_ClearOutput =(1<<LCD_E);
            clcd_Delay();
            lcd_command(0x28);
            lcd_command(0x0c);
            clcd_Delay();
            }
            void lcd_gotoxy(char y, char x) //Cursor to X Y position
            {
            char DDRAMAddr;
            x=x-1;
            switch(y)
            {
            case 1: DDRAMAddr = 0x00+x; break;
            case 2: DDRAMAddr = 0x40+x; break;
            case 3: DDRAMAddr = 0x14+x; break;
            case 4: DDRAMAddr = 0x54+x; break;
            default: DDRAMAddr = 0x00+x;
            }
            lcd_command(1<<7 | DDRAMAddr);
            }
            // ================================================== ==========================
            void lcd_define_char(const char *pc,char char_code)
            {
            char a , i;
            a = ((char_code<<3)|0x40) & 0xff;
            for (i = 0; i < 8 ;i++)
            {
            lcd_command(a++);
            clcd_Delay();
            lcd_putchar(pc[i]);
            clcd_Delay();
            }
            }
            // ================================================== ==========================
            void lcd_clear(void) //Clears LCD
            {
            lcd_command(0x01);
            lcd_command(0x02);
            clcd_Delay();
            clcd_Delay();
            }
            //================================================== ==========
            void lcd_shift_left(char n) //Scrol n of characters Right
            {
            char i;
            for (i = 0 ; i < n ; i++)
            {
            lcd_command(0x1E);
            clcd_Delay();
            }
            }
            //================================================== ======
            void lcd_shift_right(char n) //Scrol n of characters Left
            {
            char i;
            for (i = 0 ; i < n ; i++)
            {
            lcd_command(0x18);
            clcd_Delay();
            }
            }
            //================================================== ==========================
            void lcd_puts(int num)
            {
            int i,j;
            int p,f=0;
            char ch[5];
            for(i=0;i<5;i++)
            {
            p=1;
            for(j=4-i;j>0;j--)
            p = p*10;
            ch[i] = (num/p);
            if (num>=p && !f){
            f=1;
            }
            num =num - ch[i] *p ;
            ch[i] = ch[i] +48;
            if(f) lcd_putchar(ch[i]);
            }
            }
            // ================================================== ==========================
            void lcd_putsf(char* data) //Outputs string to LCD
            {
            char *p;
            p = data;
            if (!p)
            return;
            for(; *p ; )
            {
            lcd_putchar(*p);
            p++;
            }
            }
            //================================================== ===========
            void Display_off(void)
            {
            lcd_command(0x08);
            clcd_Delay();
            }
            //================================================== ===========
            void Display_on(void)
            {
            lcd_command(0x0C);
            clcd_Delay();
            }
            //================================================== ===========
            void cursor_off(void)
            {
            lcd_command(0x0C);
            clcd_Delay();
            }
            //================================================== ===========
            void cursor_on(void)
            {
            lcd_command(0x0E);
            clcd_Delay();
            }
            //================================================== ===========
            void cursor_blink(void)
            {
            lcd_command(0x0F);
            clcd_Delay();
            }
            #endif











            //usart.h revision v1.0


            #ifndef uart_H
            #define uart_H
            #include <stdio.h>
            #define echo 0 //if echo=0 then echo off and if echo=1 then echo on
            #ifndef F_CPU
            #define F_CPU 18432000
            #endif

            int a,sync=1 ,Async=2 , mode;
            int BARD_RATE1,BARD_RATE0;


            void usart0_init(unsigned long usart0_mode,unsigned long usart0_Baud0)
            {
            mode=0;
            *AT91C_PMC_PCER|=(1<<AT91C_ID_US0);
            *AT91C_PIOA_PDR|=(AT91C_PA5_RXD0 | AT91C_PA6_TXD0); //Disable I/O,PA5=RXD0,PA6=TXD0
            *AT91C_PIOA_ASR|=(AT91C_PIO_PA5 | AT91C_PIO_PA6); // define peripheral A select regidtry //Select PIO set A (hamun uart)
            *AT91C_US0_CR=0XAC; //RESET UART
            *AT91C_US0_IDR = 0xFFFF; // all usart0 interrupts disabled
            *AT91C_US0_RTOR = 0; // receiver time-out (disabled)
            *AT91C_US0_TTGR = 0; // transmitter timeguard (disabled)
            switch (usart0_mode)
            {
            //for Synchronous mode***for Synchronous mode***for Synchronous mode***for Synchronous mode***for Synchronous mode***for Synchronous mode***for Synchronous mode***
            case 1:
            *AT91C_US0_MR = (AT91C_US_USMODE_NORMAL | AT91C_US_PAR_NONE |AT91C_US_CLKS_EXT | AT91C_US_CHRL_8_BITS | AT91C_US_SYNC |AT91C_US_CKLO ); // 8-bit characters
            //USART Mode Register=Normal MODE , No parity , External (SCK) , Character Length: 8 bits , Synchronous Mode Select ,
            // attention :in This mode if USCLKS does not select the external clock SCK the USART drives the SCK pin (CLKO bit in US0_MR)
            //Oversampling Mode=8 , The NACK is not generated , The USART does not filter the receive line ,
            //if you use other Selected Clock , this line is true:
            //*AT91C_US0_BRGR=(((M_crystal*73/14)/2)/usart0_Baud0); //BARD RATE
            *AT91C_US0_CR=0X50; //SET UART
            *AT91C_US0_FIDI = 0; // FI over DI Ratio Value (disabled)
            *AT91C_US0_IF = 0; // IrDA Filter value (disabled)
            break;
            //for Asynchronous mode***for Asynchronous mode***for Asynchronous mode***for Asynchronous mode***for Asynchronous mode***for Asynchronous mode***
            case 2 :
            *AT91C_US0_MR = (AT91C_US_USMODE_NORMAL | AT91C_US_PAR_NONE | // no parity
            0x3 << 6); // 8-bit characters //8bit,No,1Bit Stop
            *AT91C_US0_IDR = 0xFFFF; // all usart0 interrupts disabled
            *AT91C_US0_BRGR=(((F_CPU*73/14)/2)/16/usart0_Baud0) ; //BARD RATE
            *AT91C_US0_CR=0X50; //SET UART
            *AT91C_US0_FIDI = 0; // FI over DI Ratio Value (disabled)
            *AT91C_US0_IF = 0; // IrDA Filter value (disabled)
            break;
            }}
            void usart1_init(unsigned long usart1_mode,unsigned long usart1_Baud0)
            {
            mode=1;

            *AT91C_PMC_PCER|=(1<<AT91C_ID_US1);
            *AT91C_PIOA_PDR|=(AT91C_PA21_RXD1 | AT91C_PA22_TXD1); //Disable I/O,PA5=RXD0,PA6=TXD0
            *AT91C_PIOA_ASR|=(AT91C_PIO_PA21 | AT91C_PIO_PA22); // define peripheral A select regidtry //Select PIO set A (hamun uart)
            *AT91C_US1_CR=0XAC; //RESET UART
            *AT91C_US1_IDR = 0xFFFF; // all usart0 interrupts disabled
            *AT91C_US1_RTOR = 0; // receiver time-out (disabled)
            *AT91C_US1_TTGR = 0; // transmitter timeguard (disabled)
            switch (usart1_mode)
            {
            //for Synchronous mode***for Synchronous mode***for Synchronous mode***for Synchronous mode***for Synchronous mode***for Synchronous mode***for Synchronous mode***
            case 1:
            *AT91C_US1_MR = (AT91C_US_USMODE_NORMAL | AT91C_US_PAR_NONE |AT91C_US_CLKS_EXT | AT91C_US_CHRL_8_BITS | AT91C_US_SYNC |AT91C_US_CKLO ); // 8-bit characters
            //USART Mode Register=Normal MODE , No parity , External (SCK) , Character Length: 8 bits , Synchronous Mode Select ,
            // attention :in This mode if USCLKS does not select the external clock SCK the USART drives the SCK pin (CLKO bit in US0_MR)
            //Oversampling Mode=8 , The NACK is not generated , The USART does not filter the receive line ,
            //if you use other Selected Clock , this line is true:
            //*AT91C_US0_BRGR=(((M_crystal*73/14)/2)/usart0_Baud0); //BARD RATE
            *AT91C_US1_CR=0X50; //SET UART
            *AT91C_US1_FIDI = 0; // FI over DI Ratio Value (disabled)
            *AT91C_US1_IF = 0; // IrDA Filter value (disabled)
            break;
            //for Asynchronous mode***for Asynchronous mode***for Asynchronous mode***for Asynchronous mode***for Asynchronous mode***for Asynchronous mode***
            case 2 :
            *AT91C_US1_MR = (AT91C_US_USMODE_NORMAL | AT91C_US_PAR_NONE | // no parity
            0x3 << 6); // 8-bit characters //8bit,No,1Bit Stop
            *AT91C_US1_IDR = 0xFFFF; // all usart0 interrupts disabled
            *AT91C_US1_BRGR=(((F_CPU*73/14)/2)/16/usart1_Baud0) ; //BARD RATE
            *AT91C_US1_CR=0X50; //SET UART
            *AT91C_US1_FIDI = 0; // FI over DI Ratio Value (disabled)
            *AT91C_US1_IF = 0; // IrDA Filter value (disabled)
            break;
            }}

            // device specific header file



            int sendchar (int ch) { /* Write character to Serial Port */
            if (mode==0) {
            if (ch == '\n&#039 { // Check for CR
            while (!((*AT91C_US0_CSR) & AT91C_US_TXRDY)); // Wait for Empty Tx Buffer
            *AT91C_US0_THR = '\r';
            }
            while (!((*AT91C_US0_CSR) & AT91C_US_TXRDY)); // Wait for Empty Tx Buffer
            return (*AT91C_US0_THR = ch);
            }
            else{
            if (ch == '\n&#039 { // Check for CR
            while (!((*AT91C_US1_CSR) & AT91C_US_TXRDY)); // Wait for Empty Tx Buffer
            *AT91C_US1_THR = '\r';
            }
            while (!((*AT91C_US1_CSR) & AT91C_US_TXRDY)); // Wait for Empty Tx Buffer
            return (*AT91C_US1_THR = ch);
            } // Output CR
            }
            // Transmit Character


            int getkey (void) {
            if (mode==0) {
            while (!((*AT91C_US0_CSR) & AT91C_US_RXRDY)); // Wait for Empty Rx Buffer
            return (*AT91C_US0_RHR );
            }
            else{
            while (!((*AT91C_US1_CSR) & AT91C_US_RXRDY)); // Wait for Empty Rx Buffer
            return (*AT91C_US1_RHR );
            } // recieve Character
            }


            #pragma import(__use_no_semihosting_swi) // disable semihosting


            struct __FILE { int handle; /* Add whatever you need here */ };
            FILE __stdout;
            FILE __stdin;
            // simplified fputc version that only redirects STDOUT
            int fputc(int ch, FILE *f) {
            // redirect STDOUT
            return (sendchar(ch));
            }
            // simplified fgetc version that only redirects STDIN
            int fgetc(FILE *f) {
            volatile int in;
            #if echo
            in=sendchar(getkey());
            #else
            in=getkey();
            #endif
            if (in==0x000D){
            in=0x000A;}
            return (in);
            // redirect STDIN
            // return (sendchar(getkey()));
            }


            int ferror(FILE *f) {
            /* Your implementation of ferror */
            return EOF;
            }


            void _ttywrch(int ch) {
            sendchar (ch);
            }

            void _sys_exit(int return_code) {
            while (1); /* endless loop */
            }
            #endif

            عامل کلیدی تمام موفقیتها " عمل کردن" است

            دیدگاه


              #7
              پاسخ : مشکل در استفاده از usart و lcd

              سلام!
              میشه یه لطفی کنی فایل کامل پروژه با تمامی هد هاتون رو در قالب یک فایل زیپ بفرستید؟
              منم وقتم محدوده!
              ببخشیدا جسارت نباشه!
              تشکر لازمه! دکمه رو فشار بده دیگه!!
              موفق باشیدددددد!!

              دیدگاه


                #8
                پاسخ : مشکل در استفاده از usart و lcd

                اگه من آفلاین شدم نگران نباشید 5 دقیقه بعدش بر می گردم چون اینجا دایل پم و نمیشه همش آنلاین باشم!
                منتظر فایلتون هستم!
                تشکر لازمه! دکمه رو فشار بده دیگه!!
                موفق باشیدددددد!!

                دیدگاه


                  #9
                  پاسخ : مشکل در استفاده از usart و lcd

                  اقا چه طوری فایل ZIP بزارم جایی برای اپلود هس؟؟؟؟!!!!!
                  عامل کلیدی تمام موفقیتها " عمل کردن" است

                  دیدگاه


                    #10
                    پاسخ : مشکل در استفاده از usart و lcd

                    آقا برات یه پیغام دادم دیدید؟؟؟
                    تشکر لازمه! دکمه رو فشار بده دیگه!!
                    موفق باشیدددددد!!

                    دیدگاه


                      #11
                      پاسخ : مشکل در استفاده از usart و lcd

                      بله اینهمه پلود سنتر مثل 4shared.com
                      mediafire.com
                      upload.iranblog.com
                      بازم می خواهید؟؟
                      تشکر لازمه! دکمه رو فشار بده دیگه!!
                      موفق باشیدددددد!!

                      دیدگاه

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