Avbrottsrutin fråga Arduino Uno32 i MPIDE "LÖST"

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
SeniorLemuren
Inlägg: 7812
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Avbrottsrutin fråga Arduino Uno32 i MPIDE "LÖST"

Inlägg av SeniorLemuren »

Nu får vi se vad ni går för då, alla Arduinofreaks, här kommer en alldeles färsk inrusande i Arduinovärlden som behöver hjälp.

Jag har med mycket möda och stort besvär funnit att nedan visade avbrottsrutin fungerar. Den skriver snällt ut värden från analogport A0 på en GLCD. Nu till själva problemet. Jag vill ha tag i värdet "viper" för att använda utanför denna rutin, den skall nämligen ändra en visares läge på displayen. Hur gör jag för att kkomma åt värdet på viper i main-loopen utanför "extern C".

Jag hade kunnat göra programmet i MPLAB X om jag bara finge min PICkit3 någon gång. Men jag tänkte jag kunde passa på att kolla in i Arduino.världen lite under tiden, så därför sitter jag nu här med skägget i brevlådan.

Lägg märke till att det är UNO32 med PIC32 µC jag håller på med. Det är helt annorlunda avbrottshantering på denna än vad den vanliga UNO använder.

Jag antar att man måste delarera viper globalt, men hittar ingen syntax som fungerar.

Kod: Markera allt

#include <plib.h>
#define SYS_FREQ	(80000000) 
#include <GLCD.h>
void setup()
{

   GLCD.begin(34, 36, 37, 26, 27, 28, 29, 30, 31, 32, 33, 2, 7, 8);

  // Clear the screen
  GLCD.cls(); 
  GLCD.update();    
  
SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE); 
T1CON =0;
T1CON =7984; //T1_PS_1_8;//0x0; // Stop the Timer and Reset Control register
// Set prescaler at 1:256, internal clock source
TMR1 = 0x0; // Clear timer register
PR1 = 65535; // 16 bitars tal max
 // Load period register
IPC1SET = 0x000C; // Set priority level=3
IPC1SET = 0x0001; // Set subpriority level=1
IFS0CLR = 0x0010; // Clear Timer interrupt status flag
IEC0SET = 0x0010; // Enable Timer interrupts
T1CONSET = T1_ON; //0x8000; // Start Time
}

void loop(){
// ************ Här vill jag komma åt viper. ************
....
....
....
}




extern "C"
{
void __ISR(_TIMER_1_VECTOR,ipl3) pwmOn(void)
  {
    String viper =  String(analogRead(A0), DEC);
    GLCD.setCursor(0,0);
    GLCD.print(viper +"   "); 
    GLCD.update();  

    mT1ClearIntFlag(); // Clear interrupt flag
  }
}
  
Senast redigerad av SeniorLemuren 17 mars 2015, 07:19:03, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26153
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Avbrottsrutin fråga Arduino Uno32 i MPIDE

Inlägg av Icecap »

Och jag - som håller mig till "riktiga" µC kan nog ge dig svaret:
Definiera en variabel du kallar "Viper"

Sedan - i ISR'n - skriver du:
Viper = analogRead(A0);

Klart.
SeniorLemuren
Inlägg: 7812
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Avbrottsrutin fråga Arduino Uno32 i MPIDE

Inlägg av SeniorLemuren »

Det löste sig. Jag hade definierat variabeln som string även i den externa avbrottsrutinen i C blocket:
"String viper = String(analogRead(A0), DEC);"

när jag tog bort String och bara skrev:
"viper = String(analogRead(A0), DEC);"

och bara definierade "String viper;" utanför C-blocket så funkade det. :)
hummel
Inlägg: 2269
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Avbrottsrutin fråga Arduino Uno32 i MPIDE

Inlägg av hummel »

Kallar på subrutiner som verkar likna printf i en isr. Har du inte lite mycket kod i din avbrottsrutin?
SeniorLemuren
Inlägg: 7812
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Avbrottsrutin fråga Arduino Uno32 i MPIDE

Inlägg av SeniorLemuren »

Jo, visst har jag det. Just för att få en kontroll på att den funkar. Värdet viper är ju det som skall användas för avbrottsrutinen men eftersom jag inte fick tag i värdet först så var jag tvungen att kolla att det verkligen fanns.

Nu är koden klar. Cirklarna ritade jag med pytagoras och satte X,Y-pixlar. Vill man så kan man ju rita bakgrunden i ett grafikprogram och ladda in det som färdig pixelgrafik. Då kan man lätt göra snygga bakgrunder som man kan växla emellan om man t.ex vill använda displayen till en voltmätare eller liknande. (Det måste ju inte vara en rodervinkelvisare). :)

Jag använder MajenkoLibraries/GLCD. Som kan laddas hem här.

Koden är enkel och ser ut som följer:

Kod: Markera allt

/*Detta program ritar ett visarinstrument på en GLCD 64 x 128 pixel *
* Library:   GLCD master av Majenko Technologies                     *
* Programmet skrivet för CHIPkit Uno32  (PIC32 µC) i MPIDE          *
* Av: urban Hahne                                                    *
* Får användas fritt för privat bruk                                *
*********************************************************************/
// analogport A0 används son input

#include <plib.h>
#define SYS_FREQ	(80000000) 
#include <GLCD.h>

int y;        // position i y_led
int x;        // position i x_led
int r;        // cirkelradie

int y2;        // position i y_led
int x2;        // position i x_led
String viper;
int iViper ;

void setup()
{   
  GLCD.begin(34, 36, 37, 26, 27, 28, 29, 30, 31, 32, 33, 2, 7, 8);  
  GLCD.cls();
  GLCD.update();
  
  SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE); 
  T1CON =0;
  T1CON =7984;      // prescaler 1:256,
  TMR1 = 0x0;       // Clear timer register
  PR1 = 65535;      // period register16 bitars tal max  
  IPC1SET = 0x000C; // Set priority level=3
  IPC1SET = 0x0001; // Set subpriority level=1
  IFS0CLR = 0x0010; // Clear Timer interrupt status flag
  IEC0SET = 0x0010; // Enable Timer interrupts
  T1CONSET = T1_ON; // 0x8000; // Start Time  
   
  //**************Stora cirkeln höger halva **************
  r = 64; 
  x = 0;   
  for(int i=0; i<52; i++)
  {    
    y = sqrt(sq(r) - sq(x));  
    GLCD.setPixel(x+64,64-y);
    x++;
  }
  //********** mindre övre cirkel höger halva ***********
  r = 55; 
  x2 = 0;  
  for(int i=0; i<45; i++)
  {    
    y2 = sqrt(sq(r) - sq(x2));    
    GLCD.setPixel(x2+64,64-y2);
  x2++;
  }
  GLCD.draw(x2+63,64-y2,x+63,64-y,1);  //rita höger ändstreck  
  
  //************** Stora cirkeln vänster halva  **************
  r = 64; 
  x = 0; 
  for(int i=0; i<52; i++)
  {  
    y = sqrt(sq(r) - sq(x));    
    GLCD.setPixel(x+63,64-y);
    x--;   
  }     
  //********** mindre övre cirkel vänster halva  ***********
  r = 55; 
  x2 = 0; 
  for(int i=0; i<45; i++)
  {  
    y2 = sqrt(sq(r) - sq(x2));    
    GLCD.setPixel(x2+63,64-y2);
    x2--;   
  }    
  GLCD.draw(x2+63,64-y2,x+63,64-y,1);  //rita vänster ändstreck
  GLCD.draw(64,64-55,64,64-64,1);      //rita centrumstreck
  GLCD.update();
} 

void loop()  
{    
    /**************************************************
    * Pilen  åt höger resp vänster i höger kvadrant   *                                              *
    * när värdet viper är större än 512               * 
    ***************************************************/
    iViper = viper.toInt();
    if (iViper > 512)
    {
      r = 53;
      x = (iViper- 512) / 12;              
      y = sqrt(sq(r) - sq(x));         
      GLCD.draw(x+64,64-y,+64,64,1); //Rita pil   
      GLCD.update();  
      GLCD.draw(x+64,64-y,+64,64,0); //Rita bort pil.   
    }    
    /****************************************************
    * Pilen  åt höger resp vänster i vänster kvadrant   *                                              *
    * när värdet viper är midre eller lika med 512    * 
    *****************************************************/
    if (iViper <= 512)
    {
      x = (iViper- 512) / 12;   
      r = 53;     
      y = sqrt(sq(r) - sq(x));    
      GLCD.draw(x+64,64-y,+64,64,1); //Rita pil   
      GLCD.update();  
      GLCD.draw(x+64,64-y,+64,64,0); //Rita bort pil.   
    }  
}
// **************Avbrotsrutinen **********************
extern "C"
{
void __ISR(_TIMER_1_VECTOR,ipl3) pwmOn(void)
  {
    viper =  String(analogRead(A0), DEC); // * Ge viper analoga värdet från port A0 *   
    mT1ClearIntFlag(); // Clear interrupt flag
  }
}

 
Skriv svar