Thông báo

Collapse
No announcement yet.

Codevision báo lỗi khi khai báo biến ?

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

  • Codevision báo lỗi khi khai báo biến ?

    Mình muốn dùng tên gợi nhớ thay cho phải dùng tên các pin hay các port trong atmega8

    Sẽ không thấy báo lỗi nếu
    - mình không khai báo thêm phần ngắt truyền nhân nối tiếp
    - hoặc là nếu mình khai báo truyền nhận nối tiếp thì phần khai báo biến hay định nghĩa pin cho các chương trình khác phải đặt phía dưới chương trình ngắt truyền nhận nối tiếp ?


    mà lỗi toàn báo kiểu " missing " ; "

    trong khi mình kiểm tra kô thấy thiếu mấy cái dấu đó ?


    ví dụ về trường hợp mình khai báo một số định nghĩa và biến ở phía trên của ngắt truyền nhận nối tiếp và xảy ra thông báo lỗi như hình trên :
    Code:
    #include <mega8.h> 
    #define xtal 16000000 // dung thach anh 16 Mhz
    #include <delay.h>
    #include <math.h> 
    #include <spi.h>
    #include<stdio.h>
    
    //================================
    #define l_u PORTC.5    // LED DON HIEN THI
    #define l_i  PORTC.4 
    #define on 0
    #define off 1    
    #define l1 PORTD.5      // KICH TRANSISTOR
    #define l2 PORTD.6
    #define l3 PORTD.7
    #define l4 PORTB.0
    #define l5 PORTB.1
    #define clock PORTB.5
    #define data PORTB.3
    #define latch PORTB.2
    #define s_a PORTC.2 // CHON KENH CHO IC PHAN KENH 4052
    #define s_b PORTC.3 //
    
    //================================  
    
    //=========== ngat ngoai =====================
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    // Place your code here
    }
    
    // External Interrupt 1 service routine
    interrupt [EXT_INT1] void ext_int1_isr(void)
    {
    // Place your code here
    
    }  
    
    
    
    
    //===========================
    
    
    // ==========ngat timer========================= 
    //=========================================
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    // Place your code here
    
    }
    
    // Timer 1 overflow interrupt service routine
    interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
    // Place your code here
    
    }
    
    // Timer 2 overflow interrupt service routine
    interrupt [TIM2_OVF] void timer2_ovf_isr(void)
    {
    // Place your code here
    
    }
    
    //=====================================
    
    
    //================ ngat noi tiep ======================
    
    #define RXB8 1
    #define TXB8 0
    #define UPE 2
    #define OVR 3
    #define FE 4
    #define UDRE 5
    #define RXC 7
    
    #define FRAMING_ERROR (1<<FE)
    #define PARITY_ERROR (1<<UPE)
    #define DATA_OVERRUN (1<<OVR)
    #define DATA_REGISTER_EMPTY (1<<UDRE)
    #define RX_COMPLETE (1<<RXC)
    //==================================
     
    
    //===================================
    // USART Receiver buffer
    #define RX_BUFFER_SIZE 8
    char rx_buffer[RX_BUFFER_SIZE];
    
    #if RX_BUFFER_SIZE<256
    unsigned char rx_wr_index,rx_rd_index,rx_counter;
    #else
    unsigned int rx_wr_index,rx_rd_index,rx_counter;
    #endif         
    //======================================
    
    bit rx_buffer_overflow;
    
    // USART Receiver interrupt service routine
    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    char status,data;
    status=UCSRA;
    data=UDR;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
       {
       rx_buffer[rx_wr_index]=data;
       if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
       if (++rx_counter == RX_BUFFER_SIZE)
          {
          rx_counter=0;
          rx_buffer_overflow=1;
          };
       };
    }
    
    #ifndef _DEBUG_TERMINAL_IO_
    // Get a character from the USART Receiver buffer
    #define _ALTERNATE_GETCHAR_
    #pragma used+
    char getchar(void)
    {
    char data;
    while (rx_counter==0);
    data=rx_buffer[rx_rd_index];
    if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
    #asm("cli")
    --rx_counter;
    #asm("sei")
    return data;
    }
    #pragma used-
    #endif
    
    // USART Transmitter buffer
    #define TX_BUFFER_SIZE 8
    char tx_buffer[TX_BUFFER_SIZE];
    
    #if TX_BUFFER_SIZE<256
    unsigned char tx_wr_index,tx_rd_index,tx_counter;
    #else
    unsigned int tx_wr_index,tx_rd_index,tx_counter;
    #endif
    
    // USART Transmitter interrupt service routine
    interrupt [USART_TXC] void usart_tx_isr(void)
    {
    if (tx_counter)
       {
       --tx_counter;
       UDR=tx_buffer[tx_rd_index];
       if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
       };
    }
    
    #ifndef _DEBUG_TERMINAL_IO_
    // Write a character to the USART Transmitter buffer
    #define _ALTERNATE_PUTCHAR_
    #pragma used+
    void putchar(char c)
    {
    while (tx_counter == TX_BUFFER_SIZE);
    #asm("cli")
    if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
       {
       tx_buffer[tx_wr_index]=c;
       if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
       ++tx_counter;
       }
    else
       UDR=c;
    #asm("sei")
    }
    #pragma used-
    #endif

    còn nếu mình bỏ phần khai báo biến hoặc định nghĩa pin để ở đằng sau thì không thấy lỗi ??

    Code:
    #include <mega8.h> 
    #define xtal 16000000 // dung thach anh 16 Mhz
    #include <delay.h>
    #include <math.h> 
    #include <spi.h>
    #include<stdio.h>
    //================ ======================
    
    #define RXB8 1
    #define TXB8 0
    #define UPE 2
    #define OVR 3
    #define FE 4
    #define UDRE 5
    #define RXC 7
    
    #define FRAMING_ERROR (1<<FE)
    #define PARITY_ERROR (1<<UPE)
    #define DATA_OVERRUN (1<<OVR)
    #define DATA_REGISTER_EMPTY (1<<UDRE)
    #define RX_COMPLETE (1<<RXC)
    //==================================
     
    
    //===================================
    // USART Receiver buffer
    #define RX_BUFFER_SIZE 8
    char rx_buffer[RX_BUFFER_SIZE];
    
    #if RX_BUFFER_SIZE<256
    unsigned char rx_wr_index,rx_rd_index,rx_counter;
    #else
    unsigned int rx_wr_index,rx_rd_index,rx_counter;
    #endif         
    //======================================
    
    bit rx_buffer_overflow;
    
    // USART Receiver interrupt service routine
    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    char status,data;
    status=UCSRA;
    data=UDR;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
       {
       rx_buffer[rx_wr_index]=data;
       if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
       if (++rx_counter == RX_BUFFER_SIZE)
          {
          rx_counter=0;
          rx_buffer_overflow=1;
          };
       };
    }
    
    #ifndef _DEBUG_TERMINAL_IO_
    // Get a character from the USART Receiver buffer
    #define _ALTERNATE_GETCHAR_
    #pragma used+
    char getchar(void)
    {
    char data;
    while (rx_counter==0);
    data=rx_buffer[rx_rd_index];
    if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
    #asm("cli")
    --rx_counter;
    #asm("sei")
    return data;
    }
    #pragma used-
    #endif
    
    // USART Transmitter buffer
    #define TX_BUFFER_SIZE 8
    char tx_buffer[TX_BUFFER_SIZE];
    
    #if TX_BUFFER_SIZE<256
    unsigned char tx_wr_index,tx_rd_index,tx_counter;
    #else
    unsigned int tx_wr_index,tx_rd_index,tx_counter;
    #endif
    
    // USART Transmitter interrupt service routine
    interrupt [USART_TXC] void usart_tx_isr(void)
    {
    if (tx_counter)
       {
       --tx_counter;
       UDR=tx_buffer[tx_rd_index];
       if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
       };
    }
    
    #ifndef _DEBUG_TERMINAL_IO_
    // Write a character to the USART Transmitter buffer
    #define _ALTERNATE_PUTCHAR_
    #pragma used+
    void putchar(char c)
    {
    while (tx_counter == TX_BUFFER_SIZE);
    #asm("cli")
    if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
       {
       tx_buffer[tx_wr_index]=c;
       if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
       ++tx_counter;
       }
    else
       UDR=c;
    #asm("sei")
    }
    #pragma used-
    #endif
    //================================================
    
    //sau đó mới  khai báo mấy thứ trên ở dưới thì không lỗi ??
    //================================
    #define l_u PORTC.5    // LED DON HIEN THI
    #define l_i  PORTC.4 
    #define on 0
    #define off 1    
    #define l1 PORTD.5      // KICH TRANSISTOR
    #define l2 PORTD.6
    #define l3 PORTD.7
    #define l4 PORTB.0
    #define l5 PORTB.1
    #define clock PORTB.5
    #define data PORTB.3
    #define latch PORTB.2
    #define s_a PORTC.2 // CHON KENH CHO IC PHAN KENH 4052
    #define s_b PORTC.3 // 
    //================================  
    
    //=========== ngat ngoai =====================
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    // Place your code here
    }
    
    // External Interrupt 1 service routine
    interrupt [EXT_INT1] void ext_int1_isr(void)
    {
    // Place your code here
    
    }  
    
    
    
    
    //===========================
    
    
    // ==========ngat timer========================= 
    //=========================================
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    // Place your code here
    
    }
    
    // Timer 1 overflow interrupt service routine
    interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
    // Place your code here
    
    }
    
    // Timer 2 overflow interrupt service routine
    interrupt [TIM2_OVF] void timer2_ovf_isr(void)
    {
    // Place your code here
    
    }
    
    //=====================================

  • #2
    dòng khai báo này của bạn #define data PORTB.3, trùng với biến data khai báo trong hàm ngắt truyền nhận "char status,data;" nên mới báo lỗi, sửa lại bằng " #define data_1 PORTB.3 " chẳng hạn thì ok.

    Comment


    • #3
      ù mình không để ý wen mất cám ơn bạn. ah mình muốn hỏi thêm mình muốn truyền một số thưc từ vdk lên mà vẫn chưa được.

      vd :
      int Vin, vreff = 5000;

      Vin = (val_h*256 + val_l)*vreff/1024;
      prinf("%d\r\n",Vin);
      ==> trên cái run teminal của codevision mình thu được nhu ; 3759,3754.........(mV)
      nhưng nếu mình muốn nó hiển thị là : 3.75 (Volt) chảnh hạn thì làm sao nhỉ ?
      nếu mình khai báo : float Vin;
      Vin = ((float)val_h*256 + 256 + (float)val_l)*(float)4.9/1024;
      prinf("%d\r\n",Vin);
      ==> chi thu được như sau : 0,1,2,3,4 (volt) ?

      làm mãi không ra để hiển thị số thực chán wa bạn ah.
      Last edited by newbie_avr; 18-12-2009, 10:38.

      Comment


      • #4
        Nguyên văn bởi ah mình muốn hỏi thêm [COLOR="Red"
        mình muốn truyền một số thưc từ vdk lên mà vẫn chưa được.[/COLOR]

        vd :
        int Vin, vreff = 5000;

        Vin = (val_h*256 + val_l)*vreff/1024;
        prinf("%d\r\n",Vin);
        ==> trên cái run teminal của codevision mình thu được nhu ; 3759,3754.........(mV)
        nhưng nếu mình muốn nó hiển thị là : 3.75 (Volt) chảnh hạn thì làm sao nhỉ ?
        nếu mình khai báo : float Vin;
        Vin = ((float)val_h*256 + 256 + (float)val_l)*(float)4.9/1024;
        prinf("%d\r\n",Vin);
        ==> chi thu được như sau : 0,1,2,3,4 (volt) ?

        làm mãi không ra để hiển thị số thực chán wa bạn ah.
        bạn có thể dùng lun thư viên stdlib,dùng lệnh chuyển đổi số thục sang chuỗi rối truyền lên,đó ftoa().nếu cần chính xác thì có thể tham khảo bộ help cua CV
        hãy quý những j hiện tại mình đang có

        Comment


        • #5
          Trong thư viện đó có lệnh
          void ftoa(float n, unsigned char decimals, char *str)
          mấy bữa trước mình thử mà không được .

          vd : unsigned char strs[3];
          unsigned char dem;
          float varl = 4.456;
          float (varl,2,strs);
          for(dem = 0; dem<3; dem++)
          { putchar(strs[dem]);
          delay_ms(300);
          printf("%d\r\n",str[dem]);
          delay_ms(300);
          }

          ==> chả ra cái gì cả




          dụng ý sài putchar và printf là để so sánh. mà thực ra nó cũng là từ 1 thằng có cải tiến .

          Comment

          Về tác giả

          Collapse

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

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

          Collapse

          • bqviet
            Trả lời cho Đấu tắt điện cho máy tính bảng
            bởi bqviet
            Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
            06-12-2025, 17:17
          • nguyendinhvan
            Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
            bởi nguyendinhvan
            Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
            05-12-2025, 19:59
          • afrendly
            Trả lời cho Đấu tắt điện cho máy tính bảng
            bởi afrendly
            Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
            04-12-2025, 01:27
          • nick22
            Trả lời cho Máy điện châm ?
            bởi nick22
            Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
            01-12-2025, 13:23
          Đang tải...
          X