Thông báo

Collapse
No announcement yet.

STM32F103C8T6 mạch cho người mới làm quen ARM ( dev board ) chỉ có I/O

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

  • Em patch được rồi, nhưng sao bản mới này cũng không support mạch nạp Jlink ARM-OB STM32 bác nhỉ .Thanks !
    Phạm Duy Quý

    PN:0973291335


    Dám nghĩ,dám nói,dám làm

    Comment


    • Nguyên văn bởi dquy05 Xem bài viết
      Anh Quế Dương ơi, em cài bản 3 của anh thì ok, đã gỡ để cài bản 4 thì không patch được anh à. Anh cho em hỏi là bản 4 cũng không hỗ trợ mạch nạp J link chế độ SW đúng không anh ? Cám ơn anh nhiều
      Nguyên văn bởi dquy05 Xem bài viết
      Em patch được rồi, nhưng sao bản mới này cũng không support mạch nạp Jlink ARM-OB STM32 bác nhỉ .Thanks !
      mạch nạp jlink thì sài phần mềm nạp của hãng vừa nhanh vừa ngon hơn, dùng được swd ... chứ thằng mikroc nó kinh doanh cả mạch nạp nên nó không support mode swd cho các mạch hãng khác.
      Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

      Comment


      • Nguyên văn bởi queduong Xem bài viết
        Lỗi gì , sao không post lỗi lên ??? Nhà nhà , người người dùng có thấy lỗi đâu , mỗi của cậu lỗi ??? nên cần xem lại cờ rắc ( chưa cờ rắc thì nó báo demo limit ( chữ màu đỏ) , xem code chương trình .v..v đã chuẩn chưa !
        Lỗi đây bác ạ, còn 1 vấn đề nữa là mạch này em không hàn tụ 104 vào chân NRST thì ok mạch chạy tốt. USB kết nối đc, duy chỉ có nút RESET là vô tác dụng @_@ em cũng chưa tìm ra được nguyên nhân.

        Mạch của em đây, chắc là ko có vấn đề gì đâu nhỉ

        Comment


        • Nguyên văn bởi edunguyen Xem bài viết
          Lỗi đây bác ạ, còn 1 vấn đề nữa là mạch này em không hàn tụ 104 vào chân NRST thì ok mạch chạy tốt. USB kết nối đc, duy chỉ có nút RESET là vô tác dụng @_@ em cũng chưa tìm ra được nguyên nhân.

          Mạch của em đây, chắc là ko có vấn đề gì đâu nhỉ

          --- Đầu tiên về phần cứng : Mình cũng có làm 1 cách mạch thế này để " tự học " nên khẳng định là không có lỗi ( vì mạch đơn giản chỉ là I/O )

          Mình cũng làm 1 cái như thế này để nghịch ... khẳng định là nó chạy tốt nút RESET . ( mạch mình làm cũng thủ công = bàn là với hàn tay thôi ... không có gì cao sang ! ) Mình để nguyên ảnh để bạn tự so với mạch của bạn !
          http://qdec.neq3.com/IMG_0116.JPG
          http://qdec.neq3.com/IMG_0118.JPG

          --- Về phần mềm :
          Chắc trong quá trình tạo code wizard ... bạn Chích vào chỗ " sử dụng All library ( Recomemnt )) nên ở trong hình nó mới click vào một đống thư viện thế kia .
          Nó cũng chẳng là vấn đề gì ... nhưng nhìn " rối mắt " mà không biết là ta đã sài những cái gì , dùng những cái gì . Tốt nhất khi tạo code , hay làm project mới ... bạn sử dụng NOne ( không dùng thư viện ) . Sau đó vào trong muốn dùng USB , LCD, UART ..v..v dùng cái nào thì ta đánh dấu vào cái đó ... cho đỡ nhức mắt và dễ dàng kiểm soát . Khi dịch cũng sẽ nhanh hơn !

          Theo như ở trên hình : Tất cả các dòng màu xanh, màu tím đều không thuộc về lỗi ( mà chỉ là thông tin hay cảnh báo )...
          Bạn không dùng TFT thì bỏ nó đi , nó dịch ra kêu cảnh báo thế kia ... nhức mắt lắm .
          Những cảnh báo đó không quá ảnh hưởng tới chương trình chạy . Ta chỉ quan sát những chỗ màu đỏ ( Lỗi ) .

          Ở đây tôi đã nhìn thấy lỗi ở phần USB ... đây là lỗi của người dùng , lỗi thông báo rằng thiếu file mô tả USBdsc.c ( Mỗi một giao thức USB đều có phần mô tả ( descriptor ) cho biết nó làm việc theo kiểu nào : Interrupt USB hay Polling , HID hay Bulk , keyboard , mouse, device .v..v và trong file mô tả này có VID , PID hay thông tin của thiết bị .

          Bạn đã Add file mô tả của bạn USBdsc.c vào Project của bạn chưa ??? Chắc chắn là chưa vì nhìn lỗi nó báo thiếu ( extern ) ở đó !

          Click image for larger version

Name:	usb.jpg
Views:	1
Size:	95.0 KB
ID:	1389005

          Đây là nội dung trong file USBdsc.c
          Code:
          const unsigned int USB_VENDOR_ID = 0x1304;
          const unsigned int USB_PRODUCT_ID = 0x2244;
          const char USB_SELF_POWER = 0x80;            // Self powered 0xC0,  0x80 bus powered
          const char USB_MAX_POWER = 50;               // Bus power required in units of 2 mA
          const char HID_INPUT_REPORT_BYTES = 64;
          const char HID_OUTPUT_REPORT_BYTES = 64;
          const char USB_TRANSFER_TYPE = 0x03;         //0x03 Interrupt
          const char EP_IN_INTERVAL = 1;
          const char EP_OUT_INTERVAL = 1;
          
          const char USB_INTERRUPT = 1;
          const char USB_HID_EP = 1;
          const char USB_HID_RPT_SIZE = 33;
          
          /* Device Descriptor */
          const struct {
              char bLength;               // bLength         - Descriptor size in bytes (12h)
              char bDescriptorType;       // bDescriptorType - The constant DEVICE (01h)
              unsigned int bcdUSB;        // bcdUSB          - USB specification release number (BCD)
              char bDeviceClass;          // bDeviceClass    - Class Code
              char bDeviceSubClass;       // bDeviceSubClass - Subclass code
              char bDeviceProtocol;       // bDeviceProtocol - Protocol code
              char bMaxPacketSize0;       // bMaxPacketSize0 - Maximum packet size for endpoint 0
              unsigned int idVendor;      // idVendor        - Vendor ID
              unsigned int idProduct;     // idProduct       - Product ID
              unsigned int bcdDevice;     // bcdDevice       - Device release number (BCD)
              char iManufacturer;         // iManufacturer   - Index of string descriptor for the manufacturer
              char iProduct;              // iProduct        - Index of string descriptor for the product.
              char iSerialNumber;         // iSerialNumber   - Index of string descriptor for the serial number.
              char bNumConfigurations;    // bNumConfigurations - Number of possible configurations
          } device_dsc = {
                0x12,                   // bLength
                0x01,                   // bDescriptorType
                0x0200,                 // bcdUSB
                0x00,                   // bDeviceClass
                0x00,                   // bDeviceSubClass
                0x00,                   // bDeviceProtocol
                0x40,                   // bMaxPacketSize0
                USB_VENDOR_ID,          // idVendor
                USB_PRODUCT_ID,         // idProduct
                0x0001,                 // bcdDevice
                0x01,                   // iManufacturer
                0x02,                   // iProduct
                0x00,                   // iSerialNumber
                0x01                    // bNumConfigurations
            };
          
          /* Configuration 1 Descriptor */
          const char configDescriptor1[]= {
              // Configuration Descriptor
              0x09,                   // bLength             - Descriptor size in bytes
              0x02,                   // bDescriptorType     - The constant CONFIGURATION (02h)
              0x29,0x00,              // wTotalLength        - The number of bytes in the configuration descriptor and all of its subordinate descriptors
              1,                      // bNumInterfaces      - Number of interfaces in the configuration
              1,                      // bConfigurationValue - Identifier for Set Configuration and Get Configuration requests
              0,                      // iConfiguration      - Index of string descriptor for the configuration
              USB_SELF_POWER,         // bmAttributes        - Self/bus power and remote wakeup settings
              USB_MAX_POWER,          // bMaxPower           - Bus power required in units of 2 mA
          
              // Interface Descriptor
              0x09,                   // bLength - Descriptor size in bytes (09h)
              0x04,                   // bDescriptorType - The constant Interface (04h)
              0,                      // bInterfaceNumber - Number identifying this interface
              0,                      // bAlternateSetting - A number that identifies a descriptor with alternate settings for this bInterfaceNumber.
              2,                      // bNumEndpoint - Number of endpoints supported not counting endpoint zero
              0x03,                   // bInterfaceClass - Class code
              0,                      // bInterfaceSubclass - Subclass code
              0,                      // bInterfaceProtocol - Protocol code
              0,                      // iInterface - Interface string index
          
              // HID Class-Specific Descriptor
              0x09,                   // bLength - Descriptor size in bytes.
              0x21,                   // bDescriptorType - This descriptor's type: 21h to indicate the HID class.
              0x01,0x01,              // bcdHID - HID specification release number (BCD).
              0x00,                   // bCountryCode - Numeric expression identifying the country for localized hardware (BCD) or 00h.
              1,                      // bNumDescriptors - Number of subordinate report and physical descriptors.
              0x22,                   // bDescriptorType - The type of a class-specific descriptor that follows
              USB_HID_RPT_SIZE,0x00,  // wDescriptorLength - Total length of the descriptor identified above.
          
              // Endpoint Descriptor
              0x07,                   // bLength - Descriptor size in bytes (07h)
              0x05,                   // bDescriptorType - The constant Endpoint (05h)
              USB_HID_EP | 0x80,      // bEndpointAddress - Endpoint number and direction
              USB_TRANSFER_TYPE,      // bmAttributes - Transfer type and supplementary information    
              0x40,0x00,              // wMaxPacketSize - Maximum packet size supported
              EP_IN_INTERVAL,         // bInterval - Service interval or NAK rate
          
              // Endpoint Descriptor
              0x07,                   // bLength - Descriptor size in bytes (07h)
              0x05,                   // bDescriptorType - The constant Endpoint (05h)
              USB_HID_EP,             // bEndpointAddress - Endpoint number and direction
              USB_TRANSFER_TYPE,      // bmAttributes - Transfer type and supplementary information
              0x40,0x00,              // wMaxPacketSize - Maximum packet size supported    
              EP_OUT_INTERVAL         // bInterval - Service interval or NAK rate
          };
          
          const struct {
            char report[USB_HID_RPT_SIZE];
          }hid_rpt_desc =
            {
               {0x06, 0x00, 0xFF,       // Usage Page = 0xFF00 (Vendor Defined Page 1)
                0x09, 0x01,             // Usage (Vendor Usage 1)
                0xA1, 0x01,             // Collection (Application)
            // Input report
                0x19, 0x01,             // Usage Minimum
                0x29, 0x40,             // Usage Maximum
                0x15, 0x00,             // Logical Minimum (data bytes in the report may have minimum value = 0x00)
                0x26, 0xFF, 0x00,       // Logical Maximum (data bytes in the report may have maximum value = 0x00FF = unsigned 255)
                0x75, 0x08,             // Report Size: 8-bit field size
                0x95, HID_INPUT_REPORT_BYTES,// Report Count
                0x81, 0x02,             // Input (Data, Array, Abs)
            // Output report
                0x19, 0x01,             // Usage Minimum
                0x29, 0x40,             // Usage Maximum
                0x75, 0x08,             // Report Size: 8-bit field size
                0x95, HID_OUTPUT_REPORT_BYTES,// Report Count
                0x91, 0x02,             // Output (Data, Array, Abs)
                0xC0}                   // End Collection
            };
          
          //Language code string descriptor
          const struct {
            char bLength;
            char bDscType;
            unsigned int string[1];
            } strd1 = {
                4,
                0x03,
                {0x0409}
              };
          
          
          //Manufacturer string descriptor
          const struct{
            char bLength;
            char bDscType;
            unsigned int string[16];
            }strd2={
              34,           //sizeof this descriptor string
              0x03,
              {'M','i','k','r','o','e','l','e','k','t','r','o','n','i','k','a'}
            };
          
          //Product string descriptor
          const struct{
            char bLength;
            char bDscType;
            unsigned int string[18];
          }strd3={
              38,          //sizeof this descriptor string
              0x03,
              {'U','S','B',' ','H','I','D',' ','L','i','b','r','a','r','y','-','e','x'}
           };
          
          //Array of configuration descriptors
          const char* USB_config_dsc_ptr[1];
          
          //Array of string descriptors
          const char* USB_string_dsc_ptr[3];
          
          void USB_Init_Desc(){
            USB_config_dsc_ptr[0] = &configDescriptor1;
            USB_string_dsc_ptr[0] = (const char*)&strd1;
            USB_string_dsc_ptr[1] = (const char*)&strd2;
            USB_string_dsc_ptr[2] = (const char*)&strd3;
          }
          Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

          Comment


          • Nguyên văn bởi queduong Xem bài viết
            [MENTION=45602]edunguyen[/MENTION]
            Cập nhật bản MikroC ARM mới 4.0.0

            ( thêm chip support , thư viện , fix versions ..v..v )

            MikroC PRO ARM mới 4.0.0 EASY and POWER FULL. Thật tuyệt ... anh em cùng thưởng thức .

            1) Download từ trang chủ : http://www.mikroe.com/downloads/get/...v400_setup.zip
            2) Gỡ bỏ sạch các bản cũ đã cài ( nếu có )
            3) Cài mới bản 4.0.0
            4) Patch download here : http://qdec.neq3.com/mikroCARM440.7z

            5) Giải nén Copy đè vào thư mục đã cài đặt mikroC ARM

            6) Khời động chương trình và thưởng thức !
            Em đã làm như trên nhưng nó vẫn báo: NOT REGISTERED. Đã khởi động lại máy rồi a.Có ai gặp chung tình huống này thì chỉ cho em với.
            Cảm ơn mọi người trước.

            Comment


            • Nguyên văn bởi dcn_dt Xem bài viết
              Em đã làm như trên nhưng nó vẫn báo: NOT REGISTERED. Đã khởi động lại máy rồi a.Có ai gặp chung tình huống này thì chỉ cho em với.
              Cảm ơn mọi người trước.
              Click vào About nó có hiện như thế này không ?

              Click image for larger version

Name:	license.jpg
Views:	1
Size:	79.2 KB
ID:	1389339

              tốt nhất Uninstall sạch sẽ ( total uninstaller ) ... rồi cài . Cài xong copy Đè file patch vào là OK !
              Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

              Comment


              • Bác Dương ơi, Em thấy Bác giúp đỡ mọi người rất nhiệt tình và chi tiết, thay mặt AE trên diễn đàn cám ơn Bác rất nhiều, chúc Bác thành công trong sự nghiệp Điện tử.

                Bác cho em hỏi thêm mấy cái của MikroC : Em dùng STM32

                1. Hàm ADC, Code :
                ADC_Set_Input_Channel(_ADC_CHANNEL_10 | _ADC_CHANNEL_11); // Set ADC channel 10 as an analog input
                ADC1_Init(); // Initialize ADC module
                adc_value1 = ADC1_Get_Sample(10);
                adc_value2 = ADC1_Get_Sample(11);

                ==> khi em đọc giá trị adc_value1, adc_value2 về cùng 1 lúc rồi hiển thị lên LCD thì giá trị kênh này ảnh hưởng rất lớn đến kênh kia.

                2. PWM, Code:
                PWM_TIM1_Init(5000);
                PWM_TIM1_Set_Duty(current_duty, _PWM_NON_INVERTED, _PWM_CHANNEL1); // Set current duty for PWM_TIM1
                PWM_TIM1_Start(_PWM_CHANNEL1, &_GPIO_MODULE_TIM1_CH1_PE9);

                ==> Hàm Set_Duty chỉ xuất xung 1 lần mà không duy trì, ở AVR em chỉ set 1 lần là sẽ duy trì mãi.

                3. Em tìm mà chưa thấy thư viện sẵn RTC nội của nó

                4. Giờ có bản 4.2 rồi nhưng em không có thuốc nên chưa dùng được hết tính năng của nó.

                Em rất mong Bác chỉ giúp em các vấn đề trên, vì em mới chuyển sang chip32. Thanks bác.
                Phạm Duy Quý

                PN:0973291335


                Dám nghĩ,dám nói,dám làm

                Comment


                • Nguyên văn bởi dquy05 Xem bài viết
                  Bác Dương ơi, Em thấy Bác giúp đỡ mọi người rất nhiệt tình và chi tiết, thay mặt AE trên diễn đàn cám ơn Bác rất nhiều, chúc Bác thành công trong sự nghiệp Điện tử.

                  Bác cho em hỏi thêm mấy cái của MikroC : Em dùng STM32

                  1. Hàm ADC, Code :
                  ADC_Set_Input_Channel(_ADC_CHANNEL_10 | _ADC_CHANNEL_11); // Set ADC channel 10 as an analog input
                  ADC1_Init(); // Initialize ADC module
                  adc_value1 = ADC1_Get_Sample(10);
                  adc_value2 = ADC1_Get_Sample(11);

                  ==> khi em đọc giá trị adc_value1, adc_value2 về cùng 1 lúc rồi hiển thị lên LCD thì giá trị kênh này ảnh hưởng rất lớn đến kênh kia.

                  2. PWM, Code:
                  PWM_TIM1_Init(5000);
                  PWM_TIM1_Set_Duty(current_duty, _PWM_NON_INVERTED, _PWM_CHANNEL1); // Set current duty for PWM_TIM1
                  PWM_TIM1_Start(_PWM_CHANNEL1, &_GPIO_MODULE_TIM1_CH1_PE9);

                  ==> Hàm Set_Duty chỉ xuất xung 1 lần mà không duy trì, ở AVR em chỉ set 1 lần là sẽ duy trì mãi.

                  3. Em tìm mà chưa thấy thư viện sẵn RTC nội của nó

                  4. Giờ có bản 4.2 rồi nhưng em không có thuốc nên chưa dùng được hết tính năng của nó.

                  Em rất mong Bác chỉ giúp em các vấn đề trên, vì em mới chuyển sang chip32. Thanks bác.
                  Bạn chịu khó ngâm cứu đi , nó không khó quá đâu ... các vấn đề câu hỏi liên quan có thể vào forum của mikroe có hỗ trợ rất tốt .

                  có thể dùng patch Bản 4.2.0 của mình ở dưới đây ( không có pass )
                  1) cài đặt bản 4.2.0
                  2) copy vào thư mục đã cài đặt
                  mikroCPROforARM42.zip
                  Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                  Comment


                  • Anh Duơng cho em hỏi tí. Em mới tập tành với MikroC, nhưng có những lỗi rất là khó hiểu, anh Duơng giải đáp giúp. Em có đoạn code sau lập trình trên pic6f1823

                    #define dkkey1 porta.b0
                    #define dkkey2 porta.b1

                    void quetphim(){
                    trisa.b0=0;trisa.b1=0;

                    porta=1;
                    //dkkey1=0;dkkey2=1;//1
                    //porta.b0=0;porta.b1=1;//2
                    delay_ms(100);


                    porta=2;
                    //dkkey1=1;dkkey2=0;//1
                    // porta.b0=1;porta.b1=0;//2
                    delay_ms(100);

                    }

                    Nếu em dùng đúng như trên thì sóng ngõ ra trên hai chan RA0 và RA1 đảo ngược nhau và dúng sóng vuông lêch nhau mức 1 và 0 là 100ms.
                    Nhưng nếu em dùng cặp lệnh //1 hay //2 thay cho porta=1 và porta=2; thì sóng ngõ ra rất là lộn xộn, thời gian tồn tại mức 1 và mức 0 ở hai chân RA0 và RA1 lệch nhau kinh khủng, cái thì dài ơi là dài cái thì ngắn ơi là ngắn.

                    Em không hiểu việc điều khiển từng chân như vậy có đúng không, vì em có làm như thế này với chip khác thì chưa thấy lỗi. ah với chip này em set chế độ dao động nội.

                    Một trường hợp nữa là em có load một ví dụng sử dụng mikroC trên net, em chạy mô phỏng với file hex của tác giả thì kết quả đúng như tác giả mô tả, nhưng khi em mở cái file MikroC và build lại thì kết quả lại chạy loạn lên, em không sửa bất kì lệnh nào. không bit sao nữa, em cố gắn remove cái mikroC và cài lại nhưng vẫn bị lỗi như vậy. ??? Không lẽ thuốc của em chưa đủ đô??


                    Mong anh tư vấn.

                    Comment


                    • Nguyên văn bởi hocdi Xem bài viết
                      Anh Duơng cho em hỏi tí. Em mới tập tành với MikroC, nhưng có những lỗi rất là khó hiểu, anh Duơng giải đáp giúp. Em có đoạn code sau lập trình trên pic6f1823

                      #define dkkey1 porta.b0
                      #define dkkey2 porta.b1

                      void quetphim(){
                      trisa.b0=0;trisa.b1=0;

                      porta=1;
                      //dkkey1=0;dkkey2=1;//1
                      //porta.b0=0;porta.b1=1;//2
                      delay_ms(100);


                      porta=2;
                      //dkkey1=1;dkkey2=0;//1
                      // porta.b0=1;porta.b1=0;//2
                      delay_ms(100);

                      }

                      Nếu em dùng đúng như trên thì sóng ngõ ra trên hai chan RA0 và RA1 đảo ngược nhau và dúng sóng vuông lêch nhau mức 1 và 0 là 100ms.
                      Nhưng nếu em dùng cặp lệnh //1 hay //2 thay cho porta=1 và porta=2; thì sóng ngõ ra rất là lộn xộn, thời gian tồn tại mức 1 và mức 0 ở hai chân RA0 và RA1 lệch nhau kinh khủng, cái thì dài ơi là dài cái thì ngắn ơi là ngắn.

                      Em không hiểu việc điều khiển từng chân như vậy có đúng không, vì em có làm như thế này với chip khác thì chưa thấy lỗi. ah với chip này em set chế độ dao động nội.

                      Một trường hợp nữa là em có load một ví dụng sử dụng mikroC trên net, em chạy mô phỏng với file hex của tác giả thì kết quả đúng như tác giả mô tả, nhưng khi em mở cái file MikroC và build lại thì kết quả lại chạy loạn lên, em không sửa bất kì lệnh nào. không bit sao nữa, em cố gắn remove cái mikroC và cài lại nhưng vẫn bị lỗi như vậy. ??? Không lẽ thuốc của em chưa đủ đô??


                      Mong anh tư vấn.
                      Tác động đến các bit, các chân cụ thể mà các chân đó có nhiều chức năng ( ở đây 2 chân này có Analog ) thì phải disable nó đi .
                      Thêm lệnh ANSELA =0; ( tắt Analog ) đi là nó chạy được thôi .

                      Bài trên có nhiều kiểu viết ... và các cách là như nhau :

                      1)
                      Code:
                      #define dkkey1 porta.b0
                      #define dkkey2 porta.b1
                      
                      void main(){
                      trisa.b0=0;trisa.b1=0;
                      ANSELA=0;
                      while(1)
                      {
                      dkkey1=0;dkkey2=1;//1
                      delay_ms(100);
                      dkkey1=1;dkkey2=0;//1
                      delay_ms(100);
                        }
                      }
                      2) Cũng có thể
                      Code:
                      #define dkkey1 RA0_bit
                      #define dkkey2 RA1_bit
                      
                      void main(){
                      trisa0_bit=0;trisa1_bit=0;
                      ANSELA=0;
                      while(1)
                      {
                      dkkey1=0;dkkey2=1;//1
                      delay_ms(100);
                      dkkey1=1;dkkey2=0;//1
                      delay_ms(100);
                        }
                      }

                      TrisA0_bit cũng tương đương như trisa0_bit , trisa.b0 , trisa.F0 , v..v ( trong mikroC thường mặc định không phân biệt chữ hoa/ chữ thường với 1 số từ khóa .

                      Porta.b0 <=> PORTA.F0 <=> RA0_bit


                      ---- Còn việc người ta đưa đề tài , project trên mạng mình lấy về , có mã nguồn thì mình cần tìm hiểu xem ... chứ có thể mã nguồn 1 kiểu mà file Hex lại là 1 kiểu ( phiên bản , version 1 ,2 ,3 .... ) ... ví như người ta thêm 1 số câu lệnh vào, dịch ... được file hex ... sau 1 thời gian khác sửa chữa lại có file hex khác ... Các project kiểu này có thể hay xảy ra ... hoặc cũng biết đâu người ta chẳng muốn cho ăn sẵn ( vì ăn sẵn hốt về lại làm hại người ta ) nên chỉ đưa ra cái cơ bản ( tạm chạy được ) còn cái tinh túy người ta dấu đi .
                      Có mã nguồn thì cứ nhìn vào đó mà suy luận !
                      Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                      Comment


                      • Dạ em cảm ơn anh Duơng.
                        Em có ví dụ định thời timer0 0.5ms trên píc6f877a. Nếu em sử dụng ngắt với chương trình như sau thì đúng 0.5ms.
                        void Interrupt() {
                        if (T0IF_bit){
                        RD0_bit=~RD0_bit;
                        }
                        T0IF_bit=0;
                        TMR0=5;
                        }
                        void main() {
                        TRISD.F0=0; //RD0 output
                        TRISD.F1=1;// RD1 input
                        PORTD.F0=0;
                        GIE_bit=1;
                        PEIE_bit=1;
                        T0IE_bit=1; // Cho phep ngat timer0
                        T0CS_bit=0; //Timer
                        PSA_bit=0; //Prescale
                        PS0_bit=0;
                        PS1_bit=0;
                        PS2_bit=0; // 1:2
                        TMR0=5;
                        T0IF_bit=0; // Xoa co ngat timer0
                        while(1){

                        }
                        }

                        Nhưng nếu em không dùng ngắt mà dùng như sau thì chuơng trình lại cho xung ngõ với chu kỳ 7.5us. Em không biết là ý tưởng em sai hay em lập trình sai, anh Dương xem giúp ạ
                        /*void Interrupt() {
                        if (T0IF_bit){
                        RD0_bit=~RD0_bit;
                        }
                        T0IF_bit=0;
                        TMR0=5;
                        } */
                        void main() {
                        TRISD.F0=0; //RD0 output
                        TRISD.F1=1;// RD1 input
                        PORTD.F0=0;
                        GIE_bit=1;
                        PEIE_bit=1;
                        T0IE_bit=1; // Cho phep ngat timer0
                        T0CS_bit=0; //Timer
                        PSA_bit=0; //Prescale
                        PS0_bit=0;
                        PS1_bit=0;
                        PS2_bit=0; // 1:2
                        TMR0=5;
                        T0IF_bit=0; // Xoa co ngat timer0
                        while(1){
                        TMR0=5;//dat gia tri ban dau
                        T0IF_bit=0;//xoa co ngat
                        while(!T0IF);//cho cho co ngat len 1 nghia la timer dem duoc 250xung, voi bo chi 1:2 thì nghĩa là timer0 dem duoc 500xung, với thạch anh 1MHZ<=>1us/tick
                        //500xung=500us=0.5ms
                        RD0_bit=~RD0_bit;


                        }
                        }

                        em sử dụng thạch anh 4MHZ

                        Comment


                        • Nguyên văn bởi hocdi Xem bài viết
                          Dạ em cảm ơn anh Duơng.
                          Em có ví dụ định thời timer0 0.5ms trên píc6f877a. Nếu em sử dụng ngắt với chương trình như sau thì đúng 0.5ms.
                          void Interrupt() {
                          if (T0IF_bit){
                          RD0_bit=~RD0_bit;
                          }
                          T0IF_bit=0;
                          TMR0=5;
                          }
                          void main() {
                          TRISD.F0=0; //RD0 output
                          TRISD.F1=1;// RD1 input
                          PORTD.F0=0;
                          GIE_bit=1;
                          PEIE_bit=1;
                          T0IE_bit=1; // Cho phep ngat timer0
                          T0CS_bit=0; //Timer
                          PSA_bit=0; //Prescale
                          PS0_bit=0;
                          PS1_bit=0;
                          PS2_bit=0; // 1:2
                          TMR0=5;
                          T0IF_bit=0; // Xoa co ngat timer0
                          while(1){

                          }
                          }

                          Nhưng nếu em không dùng ngắt mà dùng như sau thì chuơng trình lại cho xung ngõ với chu kỳ 7.5us. Em không biết là ý tưởng em sai hay em lập trình sai, anh Dương xem giúp ạ
                          /*void Interrupt() {
                          if (T0IF_bit){
                          RD0_bit=~RD0_bit;
                          }
                          T0IF_bit=0;
                          TMR0=5;
                          } */
                          void main() {
                          TRISD.F0=0; //RD0 output
                          TRISD.F1=1;// RD1 input
                          PORTD.F0=0;
                          GIE_bit=1;
                          PEIE_bit=1;
                          T0IE_bit=1; // Cho phep ngat timer0
                          T0CS_bit=0; //Timer
                          PSA_bit=0; //Prescale
                          PS0_bit=0;
                          PS1_bit=0;
                          PS2_bit=0; // 1:2
                          TMR0=5;
                          T0IF_bit=0; // Xoa co ngat timer0
                          while(1){
                          TMR0=5;//dat gia tri ban dau
                          T0IF_bit=0;//xoa co ngat
                          while(!T0IF);//cho cho co ngat len 1 nghia la timer dem duoc 250xung, voi bo chi 1:2 thì nghĩa là timer0 dem duoc 500xung, với thạch anh 1MHZ<=>1us/tick
                          //500xung=500us=0.5ms
                          RD0_bit=~RD0_bit;


                          }
                          }

                          em sử dụng thạch anh 4MHZ
                          Nhìn thoáng qua thì không thấy cái gì khả nghi nhưng đọc kỹ lại thấy mấy lỗi cơ bản :
                          Ở đây bạn dùng cách đếm vòng timer ( rolling ) nhưng lại vẫn enable ngắt timer ... điều này rất nguy hiểm ( có thể là lập trình mới nên ít kinh nghiệm , hoặc có thể thiếu cơ bản ( cái này thuộc về cơ bản nhiều hơn ) ...
                          Nếu để enable ngắt timer ... mà không clear kịp thời cờ tràn ( flag bit ) sẽ gặp trường hợp nhảy vào ngắt liên tục ( khi chưa kịp clear flag bit ) ( rất có thể bị đệ qui ) ... đây có thể là nguyên nhân đầu tiên dẫn đến đầu ra bị ngắt xung .
                          - thứ 2 : T0IF bên trong mikroC trình dịch được ngầm hiểu theo từng câu lệnh cụ thể , có thể là giá trị, biểu thức logic chứ không phải bit flag chung chung như 1 số trình dịch khác . Khi tác động trực tiếp đến 1 bit Cụ thể Trong 1 thanh ghi thì ghi trực tiếp là bit , hoặc Tên_thanh_ghi.B0 , . B1 , .B2 , .F0 , .F1 .v.v
                          Ở đây cụ thể là T0IF_bit
                          do vậy câu lệnh while(!T0IF); chẳng có ý nghĩa gì về mặt logic lệnh while ở đây mà phải viết while(!T0IF_bit); ( tức là trong khi bit T0IF chưa được set lên mức cao... thì đợi ở đó mà chẳng làm gì cả ) .

                          --- KL : Có thể bạn bỏ ngắt timer đi ( T0IE_bit =0; ) hoặc xóa hẳn dòng này ... trong lệnh while(T0IF); thay bằng while(!T0IF_bit); có thể nó sẽ chạy .
                          Tôi chưa test bạn có thể test thử xem có được không !
                          Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                          Comment


                          • Thưa anh Dương, Em đã thay đổi như anh nói, kết quả như dùng ngắt.
                            (em bỏ lệnh cho phép ngắt và sử dụng T0IF_bit thay cho T0IF).

                            Comment


                            • bác queduong oi sao cái patch bản 4.2 của bác lại ko patch được nhỉ .khi dán vào trong chỗ cài chương trình thì trong đó cũng có 1 file giống y hệt như cái patch

                              Comment


                              • Nguyên văn bởi khonggioihan Xem bài viết
                                bác queduong oi sao cái patch bản 4.2 của bác lại ko patch được nhỉ .khi dán vào trong chỗ cài chương trình thì trong đó cũng có 1 file giống y hệt như cái patch
                                Thì chép đè (replace) vào đó !, bản đó là bản gốc lấy từ máy trong hệ thống ra đó vô lý sao không được ?!
                                Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X