variabel ändrar inte värde i picc18

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

variabel ändrar inte värde i picc18

Inlägg av victor_passe »

Hej, jag sitter och försöker skriva en servodrivrutin till min lilla biped.

Jag använder mplab 8.6 och picc18 9.65
kretsen är en PIC18f26k22
Såhär ser koden ut:

Kod: Markera allt

#define _XTAL_FREQ 64000000
#include <htc.h>

__CONFIG(1,FOSC_INTIO67);

//Servopositioner
#define RIGHT_FOOT 1
#define RIGHT_KNEE 2
#define RIGHT_HIP  3
#define LEFT_FOOT  6
#define LEFT_KNEE  5
#define LEFT_HIP   4
#define HEAD       7

//Pinnar
#define SERVO1 LATB0
#define SERVO2 LATB1
#define SERVO3 LATB3
#define SERVO4 LATB4
#define SERVO5 LATC4
#define SERVO6 LATC5
#define SERVO7 LATC6
#define SERVO8 LATC7

#define LED LATA0

volatile short servos[8]={0,0,0,0,0,0,0,0}; //servonas värde [-127,127]
volatile short servos_offset[8]={0,0,0,0,0,0,0,0};[offset så varje servo står exakt rakt vid servos[x]=0]
volatile char servo_cntr=1;//Räknare som håller koll på vilket servo som får sin signal just nu.

void delay_ms(unsigned int ms)//Man får ju inte ha stora konstanter in i __delay_ms().....
{
 while(ms--)
  __delay_ms(1);
}

void interrupt isr(void)
{
 unsigned int tmp;
 if(TMR0IF)
 {
  if(servo_cntr==1)
  {
   SERVO1=1;
   tmp=0xF86F-(servos[0]+servos_offset[0]+127)*32;
   TMR0H=(tmp>>8)&0xFF;
   TMR0L=tmp&0xFF;
   servo_cntr++;
  } 
  else if(servo_cntr==2)
  {
   SERVO1=0;
   SERVO2=1;
   tmp=0xF86F-(servos[1]+servos_offset[1]+127)*32;
   TMR0H=(tmp>>8)&0xFF;
   TMR0L=tmp&0xFF;
   servo_cntr++;
  }  
  else if(servo_cntr==3)
  {
   SERVO2=0;
   SERVO3=1;
   tmp=0xF86F-(servos[2]+servos_offset[2]+127)*32;
   TMR0H=(tmp>>8)&0xFF;
   TMR0L=tmp&0xFF;
   servo_cntr++;
  } 
  else if(servo_cntr==4)
  {
   SERVO3=0;
   SERVO4=1;
   tmp=0xF86F-(servos[3]+servos_offset[3]+127)*32;
   TMR0H=(tmp>>8)&0xFF;
   TMR0L=tmp&0xFF;
   servo_cntr++;
  } 
  else if(servo_cntr==5)
  {
   SERVO4=0;
   SERVO5=1;
   tmp=0xF86F-(servos[4]+servos_offset[4]+127)*32;
   TMR0H=(tmp>>8)&0xFF;
   TMR0L=tmp&0xFF;
   servo_cntr++;
  } 
  else if(servo_cntr==6)
  {
   SERVO5=0;
   SERVO6=1;
   tmp=0xF86F-(servos[5]+servos_offset[5]+127)*32;
   TMR0H=(tmp>>8)&0xFF;
   TMR0L=tmp&0xFF;
   servo_cntr++;
  }    
  else if(servo_cntr==7)
  {
   SERVO6=0;
   SERVO7=1;
   tmp=0xF86F-(servos[6]+servos_offset[6]+127)*32;
   TMR0H=(tmp>>8)&0xFF;
   TMR0L=tmp&0xFF;
   servo_cntr++;
  }    
  else if(servo_cntr==8)
  {
   SERVO7=0;
   SERVO8=1;
   tmp=0xF86F-(servos[7]+servos_offset[7]+127)*32;
   TMR0H=(tmp>>8)&0xFF;
   TMR0L=tmp&0xFF;
   servo_cntr++;
  }        
  else if(servo_cntr>=9)
  {
   SERVO8=0;
   TMR0H=0x63;
   TMR0L=0xBF;
   servo_cntr=1;
  }  
  TMR0IF=0;
 } 
} 

int main()
{
 char i;

 ANSELA=0b0010000;
 ANSELB=0;
 ANSELC=0;
 PORTA=0;
 PORTB=0;
 PORTC=0;
 TRISA=0b00100000;
 TRISB=0b00100000;
 TRISC=0;
 LATA=0;
 LATB=0;
 LATC=0; 
 OSCCON=0b01110000;
 PLLEN=1;
 IPEN=0;
 
 //Servo driver timer
 T0CON=0b10000001;//1:4
 TMR0H=0;
 TMR0L=0;
// 
// T1CON=0b00110001;
// TMR1H=0xB1;
// TMR1L=0xDF;
 
 
 
 INTCON=0b11100000;
 //TMR1IE=1;
 
// //Usart
// RCSTA2=0b10000000;
// TXSTA2=0b00100000;
// SPBRG2=103;

 while(1)
 {
  servos[7]=50;
  delay_ms(1000);
  servos[7]=-50;
  delay_ms(1000);
 }
}
 
Det main gör är att initiera i/o och timer 0.
Sedan ska den med 1sek intervall ändra huvud-servots position.

Interrupten genererar en servo puls i taget till servo1,2,3 osv till servo 8, sedan väntar den ca 12ms till (vilket ger minimum 20ms dödtid mellan pulserna för varje servo)

Om jag ändrar om raden
servos[8]={0,0,0,0,0,0,0,0};
till
servos[8]={0,0,0,0,0,0,0,100};
Så ändras huvudets position
lika så
servos[8]={0,0,0,0,0,0,0,-100};

Men det går bara inte att ändra från main.

Jag har testat att ta bort optimerning och kört servos[] som både volotile och inte vilotile.
Inget verkar funka.

Jag skulle gissa på att det är någon egenhet i kompilatorn som någon här förhoppningsvis känner till.

Och det blir svårt att debuga, klantarna till designers har ju kopplat pickit2-RX till PIC-RX och pickit2-TX till PIC-TX.
Klantigt värre.

Testade att skapa funktionen:

Kod: Markera allt

void set_head(short value)
{
 servos[7]=value;
}
Och anropa den i main istället.
Och då funkar allt som det ska.
Användarvisningsbild
Kubbuth
Inlägg: 161
Blev medlem: 29 mars 2011, 11:10:16
Ort: Hässelby, Stockholm

Re: variabel ändrar inte värde i picc18

Inlägg av Kubbuth »

Kan det vara denna rad som får kompilatorn ur spår?

Kod: Markera allt

volatile short servos_offset[8]={0,0,0,0,0,0,0,0};[offset så varje servo står exakt rakt vid servos[x]=0]
Borde väl vara?

Kod: Markera allt

volatile short servos_offset[8]={0,0,0,0,0,0,0,0}; // [offset så varje servo står exakt rakt vid servos[x]=0]
Eller är det jag som inte fattar varför du har kommentaren i hakparentes?

I övrig kunde jag inte se något fel...
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: variabel ändrar inte värde i picc18

Inlägg av victor_passe »

Oj, jag la till kommentarerna efter jag kopierade in koden
Och hakparantesen ska inte vara där.. så går det när man inte tänker och håller på med vektorer
Användarvisningsbild
Kubbuth
Inlägg: 161
Blev medlem: 29 mars 2011, 11:10:16
Ort: Hässelby, Stockholm

Re: variabel ändrar inte värde i picc18

Inlägg av Kubbuth »

Ok, fel men fel fel alltså :D
Användarvisningsbild
Icecap
Inlägg: 26790
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: variabel ändrar inte värde i picc18

Inlägg av Icecap »

Tillät mig att skriva om interruptkoden en aning.

Kod: Markera allt

#define _XTAL_FREQ 64000000
#include <htc.h>

__CONFIG(1,FOSC_INTIO67);

//Servopositioner
#define RIGHT_FOOT 1
#define RIGHT_KNEE 2
#define RIGHT_HIP  3
#define LEFT_FOOT  6
#define LEFT_KNEE  5
#define LEFT_HIP   4
#define HEAD       7

//Pinnar
#define SERVO1 LATB0
#define SERVO2 LATB1
#define SERVO3 LATB3
#define SERVO4 LATB4
#define SERVO5 LATC4
#define SERVO6 LATC5
#define SERVO7 LATC6
#define SERVO8 LATC7

const unsigned char PORTB_Servo[] = {0x01, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00};
const unsigned char PORTC_Servo[] = {0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x40, 0x80};

#define LED LATA0

volatile short servos[8] = {0,0,0,0,0,0,0,0}; //servonas värde [-127,127]
volatile short servos_offset[8] = {0,0,0,0,0,0,0,0};[offset så varje servo står exakt rakt vid servos[x]=0]
volatile char servo_cntr = 1;//Räknare som håller koll på vilket servo som får sin signal just nu.

void delay_ms(unsigned int ms)//Man får ju inte ha stora konstanter in i __delay_ms().....
{
while(ms--)
  __delay_ms(1);
}

void interrupt isr(void)
  {
  unsigned int tmp;
  if(TMR0IF)
    {
    tmp = 0xF86F - ((servos[servo_cntr] + servos_offset[servo_cntr] + 127) << 5);
    TMR0H = (tmp >> 8) & 0xFF;
    TMR0L =  tmp & 0xFF;
    LATB &= 0xF0; // Set all used servo-outputs on that port to '0'
    LATC &= 0xF0; // Same thing here
    LATB = (LATB & 0x0F) | PORTB_Servo[servo_cntr];
    LATC = (LATC & 0x0F) | PORTC_Servo[servo_cntr];
    if(++servo_cntr >= sizeof(PORTB_Servo)) servo_cntr = 0;
    TMR0IF = 0; // Clear interrupt flag, thus wait for next happening
    }
  }

int main()
  {
  char i;

  ANSELA = 0b0010000;
  ANSELB = 0;
  ANSELC = 0;
  LATA = 0;
  LATB = 0;
  LATC = 0;
  TRISA = 0b00100000;
  TRISB = 0b00100000;
  TRISC = 0;
  OSCCON = 0b01110000;
  PLLEN = 1;
  IPEN = 0;

//Servo driver timer
T0CON = 0b10000001;//1:4
TMR0H = 0;
TMR0L = 0;
//
// T1CON = 0b00110001;
// TMR1H = 0xB1;
// TMR1L = 0xDF;

INTCON = 0b11100000;
//TMR1IE=1;

// //Usart
// RCSTA2 = 0b10000000;
// TXSTA2 = 0b00100000;
// SPBRG2 = 103;

  while(1)
    {
    servos[7] = 50;
    delay_ms(1000);
    servos[7] = -50;
    delay_ms(1000);
    }
  }
Har du kollat ATT main-loop faktisk körs? T.ex. koppla till en LED o se den blinka? Såklart synkroniserat med vilket värde på servon som gäller.
Senast redigerad av Icecap 19 april 2011, 16:03:35, redigerad totalt 1 gång.
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: variabel ändrar inte värde i picc18

Inlägg av victor_passe »

Tack så mycket. jag funderade på att skriva om det mer som den du har under freebies.
Så tack för att du gjorde det åt mig.
Ska testa och se om den funkar också

edit:
Och den funkade fint.
En parentes för lite och 2 servon hade fel värde i port vektorn men sedan funkade det.

Nu ska jag bara göra om fötterna lite på roboten så kan den nog gå sedan.
Mindmapper
Inlägg: 7231
Blev medlem: 31 augusti 2006, 16:42:43
Ort: Jamtland

Re: variabel ändrar inte värde i picc18

Inlägg av Mindmapper »

victor_passe skrev:Hej, jag sitter och försöker skriva en servodrivrutin till min lilla biped.

Jag använder mplab 8.6 och picc18 9.65
kretsen är en PIC18f26k22
Såhär ser koden ut:

Kod: Markera allt

#define _XTAL_FREQ 64000000
#include <htc.h>

__CONFIG(1,FOSC_INTIO67);

//Servopositioner
#define RIGHT_FOOT 1
#define RIGHT_KNEE 2
#define RIGHT_HIP  3
#define LEFT_FOOT  6
#define LEFT_KNEE  5
#define LEFT_HIP   4
#define HEAD       7

//Pinnar
#define SERVO1 LATB0
#define SERVO2 LATB1
#define SERVO3 LATB3
#define SERVO4 LATB4
#define SERVO5 LATC4
#define SERVO6 LATC5
#define SERVO7 LATC6
#define SERVO8 LATC7

#define LED LATA0

volatile short servos[8]={0,0,0,0,0,0,0,0}; //servonas värde [-127,127]
volatile short servos_offset[8]={0,0,0,0,0,0,0,0};[offset så varje servo står exakt rakt vid servos[x]=0]
volatile char servo_cntr=1;//Räknare som håller koll på vilket servo som får sin signal just nu.

void delay_ms(unsigned int ms)//Man får ju inte ha stora konstanter in i __delay_ms().....
{
 while(ms--)
  __delay_ms(1);
}

void interrupt isr(void)
{
 unsigned int tmp;
 if(TMR0IF)
 {
  if(servo_cntr==1)
  {
   SERVO1=1;
   tmp=0xF86F-(servos[0]+servos_offset[0]+127)*32;
   TMR0H=(tmp>>8)&0xFF;
   TMR0L=tmp&0xFF;
   servo_cntr++;
  } 
  else if(servo_cntr==2)
  {
   SERVO1=0;
   SERVO2=1;
   tmp=0xF86F-(servos[1]+servos_offset[1]+127)*32;
   TMR0H=(tmp>>8)&0xFF;
   TMR0L=tmp&0xFF;
   servo_cntr++;
  }  
  else if(servo_cntr==3)
  {
   SERVO2=0;
   SERVO3=1;
   tmp=0xF86F-(servos[2]+servos_offset[2]+127)*32;
   TMR0H=(tmp>>8)&0xFF;
   TMR0L=tmp&0xFF;
   servo_cntr++;
  } 
  else if(servo_cntr==4)
  {
   SERVO3=0;
   SERVO4=1;
   tmp=0xF86F-(servos[3]+servos_offset[3]+127)*32;
   TMR0H=(tmp>>8)&0xFF;
   TMR0L=tmp&0xFF;
   servo_cntr++;
  } 
  else if(servo_cntr==5)
  {
   SERVO4=0;
   SERVO5=1;
   tmp=0xF86F-(servos[4]+servos_offset[4]+127)*32;
   TMR0H=(tmp>>8)&0xFF;
   TMR0L=tmp&0xFF;
   servo_cntr++;
  } 
  else if(servo_cntr==6)
  {
   SERVO5=0;
   SERVO6=1;
   tmp=0xF86F-(servos[5]+servos_offset[5]+127)*32;
   TMR0H=(tmp>>8)&0xFF;
   TMR0L=tmp&0xFF;
   servo_cntr++;
  }    
  else if(servo_cntr==7)
  {
   SERVO6=0;
   SERVO7=1;
   tmp=0xF86F-(servos[6]+servos_offset[6]+127)*32;
   TMR0H=(tmp>>8)&0xFF;
   TMR0L=tmp&0xFF;
   servo_cntr++;
  }    
  else if(servo_cntr==8)
  {
   SERVO7=0;
   SERVO8=1;
   tmp=0xF86F-(servos[7]+servos_offset[7]+127)*32;
   TMR0H=(tmp>>8)&0xFF;
   TMR0L=tmp&0xFF;
   servo_cntr++;
  }        
  else if(servo_cntr>=9)
  {
   SERVO8=0;
   TMR0H=0x63;
   TMR0L=0xBF;
   servo_cntr=1;
  }  
  TMR0IF=0;
 } 
} 

int main()
{
 char i;

 ANSELA=0b0010000;
 ANSELB=0;
 ANSELC=0;
 PORTA=0;
 PORTB=0;
 PORTC=0;
 TRISA=0b00100000;
 TRISB=0b00100000;
 TRISC=0;
 LATA=0;
 LATB=0;
 LATC=0; 
 OSCCON=0b01110000;
 PLLEN=1;
 IPEN=0;
 
 //Servo driver timer
 T0CON=0b10000001;//1:4
 TMR0H=0;
 TMR0L=0;
// 
// T1CON=0b00110001;
// TMR1H=0xB1;
// TMR1L=0xDF;
 
 
 
 INTCON=0b11100000;
 //TMR1IE=1;
 
// //Usart
// RCSTA2=0b10000000;
// TXSTA2=0b00100000;
// SPBRG2=103;

 while(1)
 {
  servos[7]=50;
  delay_ms(1000);
  servos[7]=-50;
  delay_ms(1000);
 }
}
 
Det main gör är att initiera i/o och timer 0.
Sedan ska den med 1sek intervall ändra huvud-servots position.

Interrupten genererar en servo puls i taget till servo1,2,3 osv till servo 8, sedan väntar den ca 12ms till (vilket ger minimum 20ms dödtid mellan pulserna för varje servo)

Om jag ändrar om raden
servos[8]={0,0,0,0,0,0,0,0};
till
servos[8]={0,0,0,0,0,0,0,100};
Så ändras huvudets position
lika så
servos[8]={0,0,0,0,0,0,0,-100};

Men det går bara inte att ändra från main.

Jag har testat att ta bort optimerning och kört servos[] som både volotile och inte vilotile.
Inget verkar funka.

Jag skulle gissa på att det är någon egenhet i kompilatorn som någon här förhoppningsvis känner till.

Och det blir svårt att debuga, klantarna till designers har ju kopplat pickit2-RX till PIC-RX och pickit2-TX till PIC-TX.
Klantigt värre.

Testade att skapa funktionen:

Kod: Markera allt

void set_head(short value)
{
 servos[7]=value;
}
Och anropa den i main istället.
Och då funkar allt som det ska.
Varför passar inte det här i mikroprocessor-avdelningen på forumet.
Jag trodde i min enfald att det var där sånthär skulle postas!
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: variabel ändrar inte värde i picc18

Inlägg av victor_passe »

För att det hör till kompilatorn picc18 och den fysiska kretsen.
sodjan
EF Sponsor
Inlägg: 43288
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: variabel ändrar inte värde i picc18

Inlägg av sodjan »

Ja, det är just det som gör att det hör till mikroprocessorer/mikrokontrollers.
Spelar ingen större roll, men man undrar hur menar igentligen.
Man väntde sig att "oops, felpostat !" eller liknande... :-)
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: variabel ändrar inte värde i picc18

Inlägg av victor_passe »

Jo, som du säger sodjan så beror det ju på hur man ser på det.
Men min µC funkar fint. Det är kompilatorn som jag bråkar med.
Så att lägga det i µC-kategorin känns för mig fel.

Jaja, om någon med befogenheter känner för att flytta tråden så är de välkomna.
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: variabel ändrar inte värde i picc18

Inlägg av victor_passe »

Har nu stött på exakt samma problem igen.
Jag han inte sätta värdet på en variabel i main,
men om jag skapar funtionen:
void set_a(char data)
a=data;

Så funkar det perfekt.
Testat massa olika optimerningar, senaste verisionen och allt möjligt. går bara inte att ändra värdet på en variabel i main.
Användarvisningsbild
Icecap
Inlägg: 26790
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: variabel ändrar inte värde i picc18

Inlägg av Icecap »

Självklart det gör men tydligen inte på det sätt som DU gör...
sodjan
EF Sponsor
Inlägg: 43288
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: variabel ändrar inte värde i picc18

Inlägg av sodjan »

Var är test caset som visar fenomenet ?
Du glömde visst att posta det. Försök igen.
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: variabel ändrar inte värde i picc18

Inlägg av victor_passe »

Kod: Markera allt

/*
Skapa 5Hz updaterings interrupt
{
 update_buttons
 read_button
 read_trigger
 kalla process_trigger
}
*/

#define _XTAL_FREQ 64000000
#include <htc.h>

__CONFIG(1,FOSC_INTIO67);

#define BL_EN LATB4
#define LASER_EN LATC3
#define VIBB_EN LATC4
#define LED_R LATA0
#define LED_G LATA1
#define LED_B LATA2
#define TRIGGER (!RC5)

#include "lcd.h"
void delay_ms(unsigned int);
void update_buttons(void);
void process_buttons(void);
#include "lcd.c"

volatile unsigned char tx_buffert[32],tx_next_empty=0,tx_next_read=0;
volatile unsigned char buttons_led[4][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0}},buttons_state[4];


void delay_ms(unsigned int ms)
{
 while(ms--)
  __delay_ms(1);
}

void interrupt isr(void)
{
 if(TX2IF && TX2IE)
 {
  if(tx_next_empty!=tx_next_read)
  {
   TXREG2=tx_buffert[tx_next_read++];
   tx_next_read&=0x1F;
  }
  else
   TX2IE=0;
  TX2IF=0; 
 } 
 if(TMR0IF && TMR0IE)
 {
  process_buttons();
  update_buttons();

  TMR0H=0xCF;
  TMR0L=0x2B;
  TMR0IF=0;
 }
} 

void uart_send(unsigned char byte)
{
 char initiate=0;
 if(tx_next_empty==tx_next_read)
  initiate=1; 
 tx_buffert[tx_next_empty++]=byte; 
 tx_next_empty&=0x1F;
 if(initiate)
  TX2IE=1;
} 

void update_buttons()//Kalla max 5gånger/sek
{
 unsigned char i,j;
 for(j=0;j<3;j++)
 {
  for(i=0;i<4;i++)
  {
   uart_send(i+4*(2-j));
   buttons_led[0][0]=255;
   buttons_led[1][0]=255;
   buttons_led[2][0]=255;
   buttons_led[3][0]=255;
   buttons_led[0][1]=255;
   buttons_led[1][1]=255;
   buttons_led[2][1]=255;
   buttons_led[3][1]=255;
   buttons_led[0][2]=255;
   buttons_led[1][2]=255;
   buttons_led[2][2]=255;
   buttons_led[3][2]=255;
   buttons_led[3][2]=255;
   //buttons_led[i][j]=255;
   uart_send(buttons_led[i][j]);
  }
 }
 uart_send(12);
 i=RCREG2;
 buttons_state[0]=(i&1);
 buttons_state[1]=(i&2)>>1;
 buttons_state[2]=(i&4)>>2;
 buttons_state[3]=(i&8)>>3;
}

void process_buttons()
{
 if(buttons_state[0])
  BL_EN=1;
 buttons_led[0][0]=255;
 buttons_led[1][0]=255;
 buttons_led[2][0]=255;
 buttons_led[3][0]=255;

 //if(buttons_state[1])

}

void buttons_init()
{
 char i;
 for(i=0;i<4;i++)
 {
  buttons_led[i][0]=0;
  buttons_led[i][1]=0;
  buttons_led[i][2]=0;
  buttons_state[i]=0;
 }  
}
void main()
{
 ANSELA=0;
 ANSELB=0;
 ANSELC=0;
 PORTA=0;
 PORTB=0;
 PORTC=0;
 TRISA=0;
 TRISB=0b10001000;
 TRISC=0b00100000;
 LATA=0;
 LATB=0;
 LATC=0; 
 OSCCON=0b01110000;
 PLLEN=1;
 IPEN=0;
 INTCON=0b11000000;


 //5Hz timer0
 T0CON=0b10000111;//1:256
 TMR0H=0xCF;
 TMR0L=0x2B;
 TMR0IE=1;

 //Usart
 RCSTA2=0b10010000;
 TXSTA2=0b00100000;
 BAUDCON2=0b00001000;
 SPBRGH2=0x06;
 SPBRG2=0x82;//2400baud
 
 delay_ms(100);
 lcd_init();
 //buttons_init();
 
 while(1);
 return;
}
 
 
Dem mesta koden är ointressant men i update_buttons så ska den skicka 24 bytes till en knappsats.
vektorn button_leds[x][y] är intensiteten på lysdiod x, färg y, där y är röd, grön, blå för 0,1,2.
Jag sätter alla element i den vektorn till 255 vilket ska tända alla lysdioder på max vill ljus.

Men inget händer.
Om jag tar bort // från raden:
//buttons_led[j]=255;
så tänds alla led till vitt.
Och om jag initierar button_led vektorn till 255 istället för 0 så tänds också alla.
Det är som att
buttons_led[1][2]=255;
inte har någon som helst effekt

Så det känns som att jag antingen missar något med variablerna eller att kompilatorn är kass.
Användarvisningsbild
Icecap
Inlägg: 26790
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: variabel ändrar inte värde i picc18

Inlägg av Icecap »

En nyfiken fråga: varför tusan definierar du en variabel med ett konstant värde?
volatile unsigned char buttons_led[4][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
Denna initiering måste ske med en programsnudd INNAN main drar igång, något jag personligen hatar just för att man inte har koll på exakt vad som händer.

Mitt sätt att göra detta på är:
volatile unsigned char buttons_led[4][3];
Sedan i initieringen gör jag en loop som nollar alla värden om det är önskvärd. Då aktiveras ingen funktioner som inte JAG aktiverar!
Skriv svar