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

          Đang tải...
          X