2016-09-24 9 views
-1

Это говорит мне, что «акселерометр» и «lcd» не были объявлены в этой области, когда они используются в PIT0_IRQHandler. Ни одно из решений, которые я нашел в Интернете, пока не работает, поэтому я решил, что просто опубликую его. Я довольно новыми для этого, а поэтому не стесняйтесь указать любые и все ошибки, включенные«акселерометр» и «lcd» не объявлены в этой области

#include <stdio.h> 
    #include "system.h" 
    #include "derivative.h" 
    #include "hardware.h" 
    #include "delay.h" 
    #include "lcd.h" 
    #include "i2c.h" 
    #include "level.h" 
    #include "mma845x.h" 
    #include "tone.h" 
    #include "accel.h" 

    /// LCD dimensions and centerpoint 
    #define LCD_WIDTH (LCD_X_MAX-LCD_X_MIN) 
    #define LCD_HEIGHT (LCD_Y_MAX-LCD_Y_MIN) 
    #define CENTRE_X ((LCD_X_MAX-LCD_X_MIN)/2) 
    #define CENTRE_Y ((LCD_Y_MAX-LCD_Y_MIN)/2) 

    #define BACKGROUND_COLOUR (RED) 
    #define FOREGROUND_COLOUR (WHITE) 
    #define CIRCLE_RADIUS (20) 

    using namespace USBDM; 

    void initialisePIT(int channel, uint32_t interval) { 
     // Enable clock to PIT 
     SIM->SCGC6 |= SIM_SCGC6_PIT_MASK; 
     // Enable PIT module 
     PIT->MCR  = PIT_MCR_FRZ_MASK; 
     // Set reload value 
     PIT->CHANNEL[channel].LDVAL = interval-1; 
     // Enable this channel with interrupts 
     PIT->CHANNEL[channel].TCTRL = PIT_TCTRL_TEN_MASK|PIT_TCTRL_TIE_MASK; 
     // Enable PITn interrupts in NVIC 
     NVIC_EnableIRQ((IRQn_Type)(PIT0_IRQn+channel)); 
     // Set arbitrary priority level 
     NVIC_SetPriority((IRQn_Type)(PIT0_IRQn+channel), 8); 
    } 

    void initialiseLCD(){ 
     // Instantiate SPI interface class 
     Spi *spi = new Spi0(); 
     // Instantiate LCD interface class 
     Lcd *lcd = new Lcd(spi); 
     // Clear Background and set to a preset (Set above) colour 
     lcd->clear(BACKGROUND_COLOUR); 
     // Draw crosshairs and initial circle on the screen 
     lcd->drawLine(LCD_WIDTH/2,LCD_WIDTH/2,0,LCD_HEIGHT,BLACK); 
     lcd->drawLine(0,LCD_WIDTH,LCD_HEIGHT/2,LCD_HEIGHT/2,BLACK); 
     lcd->drawCircle(CENTRE_X, CENTRE_Y, 20, WHITE); 
    } 

    void initialiseAccel() 
    { 
     I2c *i2c = new I2c0(); 
     MMA845x *accelerometer = new MMA845x(i2c, MMA845x::ACCEL_2Gmode); 
    } 

    void PIT0_IRQHandler(void) { 
     int accelStatus; 
     int16_t accelX,accelY,accelZ; 
     accelerometer->readAccelerometerXYZ(&accelStatus, &accelX, &accelY, &accelZ); 

     lcd->clear(BACKGROUND_COLOUR); 
     lcd->drawCircle(accelX,accelY,20,WHITE); 

     // Clear the interrupt request from PIT 
     PIT->CHANNEL[0].TFLG = PIT_TFLG_TIF_MASK; 
    } 

ответ

2

accelerometer объявлен в initialiseAccel. Он выйдет за пределы области действия в конце этой функции и не является известным именем в PIT0_IRQHandler. Вероятно, вы должны создать класс для хранения этих переменных и функций, или вам придется использовать глобальные переменные (возможно, в пространстве имен) для хранения этих значений.

+0

Любое предложение о том, как написать такое пространство имен? Для того, что я пишу, и насколько я могу судить, наличие пространства имен для включения в файл заголовка является лучшим решением, но я пытался и не смог его скомпилировать. – Davies

+0

Объявление пространства имен с вашими переменными (например, «lcd» и «акселерометр»). Лучше было бы иметь класс со всеми этими переменными в нем и, возможно, глобальную (переменную или указатель) к ней, к которой будет доступ к 'PIT0_IRQHandler'. – 1201ProgramAlarm

 Смежные вопросы

  • Нет связанных вопросов^_^