Sida 1 av 3

Vad betyder [] tecknet i programmet, arduino.

Postat: 29 oktober 2015, 02:00:32
av orvar-e
Försöker förstå mig på en arduino-kod som följde med en radiomottagare. Jag kan inte få den där sändaren/mottagaren att fungera som jag önskar. Den fungerar säkert som den ska, men inte som jag vill. Koden först, vad betyder abc[3]

Kod: Markera allt

unsigned long Temporary[3]
Det finns senare i koden Temporary [0] - [3] och [k], vilket blir 5 olika Temporary[*].

Hela koden .....

Kod: Markera allt

//Author: cantone-electonics
//More information welcome to : http://www.canton-electronics.com 
//Arduino 1.0
//Arduino uno R3
//Making a wireless remote control with arduino

//const int data_out = 2;//encoder DOUT

 //LED pin,When receiving the key from the serial port, LED flash
const int ledPin =  13;    //LED pin


const int data_out =  7;    //encoder DOUT



// OSC Resistance is 3.3M
const int Osc_4xCycle = 359; //4 oscillating time periods 
const int Osc_12xCycle = 1078;//12 oscillating time periods

unsigned long Temporary[3];//Temporary storage unit


//output bit "0"
void bit_0() {
  
  digitalWrite(data_out, HIGH);
  delayMicroseconds(Osc_4xCycle);//4 oscillating time periods High level
  digitalWrite(data_out, LOW);
  delayMicroseconds(Osc_12xCycle);//12 oscillating time periods Low level
  digitalWrite(data_out, HIGH);
  delayMicroseconds(Osc_4xCycle);//4 oscillating time periods High level
  digitalWrite(data_out, LOW);
  delayMicroseconds(Osc_12xCycle);//12 oscillating time periods Low level
  
}

//output bit "1"
void bit_1() {
  
  digitalWrite(data_out, HIGH);
  delayMicroseconds(Osc_12xCycle);//12 oscillating time periods High level
  digitalWrite(data_out, LOW);
  delayMicroseconds(Osc_4xCycle);//4 oscillating time periods Low level
  digitalWrite(data_out, HIGH);
  delayMicroseconds(Osc_12xCycle);//12 oscillating time periods High level
  digitalWrite(data_out, LOW);
  delayMicroseconds(Osc_4xCycle);//4 oscillating time periods Low level
  
}

//output bit "f"
void bit_f() {
  
  digitalWrite(data_out, HIGH);
  delayMicroseconds(Osc_4xCycle);//4 oscillating time periods High level
  digitalWrite(data_out, LOW);
  delayMicroseconds(Osc_12xCycle);//12 oscillating time periods Low level
  digitalWrite(data_out, HIGH);
  delayMicroseconds(Osc_12xCycle);//12 oscillating time periods High level
  digitalWrite(data_out, LOW);
  delayMicroseconds(Osc_4xCycle);//4 oscillating time periods Low level
  
}

//output synchronous bit
void bit_syn() {
  
  digitalWrite(data_out, HIGH);
  delayMicroseconds(Osc_4xCycle);//4 oscillating time periods High level
  digitalWrite(data_out, LOW);
  delayMicroseconds(Osc_4xCycle*31);//124 oscillating time periods Low level

}

//send:8 Address Bits, 4 Data Bits, Sync bit
void send_data(){
  unsigned char temp,tab,i;
  unsigned char j,k;
  for(j=0;j<4;j++)
  {
    for(k=0;k<3;k++)//send 8 Address Bits, 4 Data Bits
    {
      tab = Temporary[k];
    
      for(i=0;i<4;i++)
      {
        temp = tab;
        temp &= 0xC0;
      
        if(temp == 0xC0)//11 is bit "1"
        {
          bit_1();
        }
        else if(temp == 0x00)//00 is bit "0"
        {
          bit_0();
        }
        else //01 is bit "f"
        {
          bit_f();
         }
      
        tab =  tab << 2;
    }
  }
  
   bit_syn();//send Sync bit
  
  }
}
  

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);  
   // initialize the encoder DOUT pin as an output
  pinMode(data_out, OUTPUT); 
  

  

  
  
  Serial.begin(9600);

}

void loop()
{
  int keydata = 0;
  int receive_flag = 0;
  
  Temporary[0] = 0xC5;//address A7-A4
  Temporary[1] = 0x55;//address A3-A0
  digitalWrite(ledPin, LOW);//Turn off led

  
  while(1)
  {
    //get key from pc serial port
    while (Serial.available() > 0)  
    {
        keydata = Serial.read();
        receive_flag = 1;
        delay(2);
    }
    
    if(receive_flag == 1)//if get key,send key
    {
      
    receive_flag = 0;
    
    if((keydata == 'a') || (keydata == 'A'))//trigger A channel relay.
    {
      Temporary[2] = 0xC0;// 0xC0 is A button key
      digitalWrite(ledPin, HIGH);//Turn on led
      send_data();//send code word
       Serial.println(".....trigger A channel relay.....");
    }
    else if((keydata == 'b') || (keydata == 'B'))//trigger B channel relay.
    {
      Temporary[2] = 0x30;// 0x30 is B button key
      digitalWrite(ledPin, HIGH);//Turn on led
      send_data();//send code word
      Serial.println(".....trigger B channel relay.....");
    }
     else if((keydata == 'c') || (keydata == 'C'))//trigger C channel relay.
     {
      Temporary[2] = 0x0C;// 0x0C is C button key
      digitalWrite(ledPin, HIGH);//Turn on led
      send_data();//send code word
      Serial.println(".....trigger C channel relay.....");
      
     }
     else if((keydata == 'd') || (keydata == 'D'))//trigger D channel relay.
     {
      Temporary[2] = 0x03;// 0x03 is D button key
      digitalWrite(ledPin, HIGH);//Turn on led
      send_data();//send code word
      Serial.println(".....trigger D channel relay.....");
     }
     
    keydata = 0;
    
    //When receiving the key from the serial port, LED flash
    digitalWrite(ledPin, LOW);//Turn off led
    delay(50);//delay 100ms
    digitalWrite(ledPin, HIGH);//Turn on led
    delay(50);//delay 100ms
    digitalWrite(ledPin, LOW);//Turn off led
    delay(50);//delay 100ms
    digitalWrite(ledPin, HIGH);//Turn on led
    delay(50);//delay 100ms
    digitalWrite(ledPin, LOW);//Turn off led
    
    }
   
  }
}

Re: Vad betyder [] tecknet i programmet, arduino.

Postat: 29 oktober 2015, 02:26:33
av AndLi
>Det finns senare i koden Temporary [0] - [3] och [k], vilket blir 5 olika Temporary[*].

Det blir en array, värdet inom[] anger indexet.

Så du kan se det som tre variabler som heter Temporary_0,Temporary_1,Temporary_2.

I fallet med Temporary[k] anger k vilken av de tre variablerna man ska använda just nu.
k ska aldrig i detta exempel ha ett annat värde än 0,1 eller 2 när det används tillsammans med Temporary.

Så om k = 2, ändrar man med "Temporary[k] = 42" sätter man Temporary_2 till 42.
sätter man sen k= 1 och kör samma kodrad kommer Temporary_1 att sättas till 42.....

Något förvirrat kan det ju vara att man skriver unsigned long Temporary[3] men får index 0,1 och 2...
3 anger i det fallet antalet man vill ha!

Hoppas det blev lite klarare

Re: Vad betyder [] tecknet i programmet, arduino.

Postat: 29 oktober 2015, 08:19:58
av Icecap
Om Temporary[3] används i koden är den underdimensionerat! Detta ger mycket ofta problem vid att det i grunden bara är en pekare på Temporary och där är det reserverat 3 platser, #0, #1 och #2.

Se det som att du beställer 3 säten i biografen. Då får du t.ex. start på säte 3 och därmed 4 och 5 också. Men du har bara dessa säten, tar du ytterligare ett säte är det någon annans och det blir konflikt.

I C kollas indexen inte om man inte specifikt för en funktion för detta, alltså kan man reservera plats för 1 byte men läsa och skriva till "alla" ändå.

Jag använder det rimligt ofta, om jag t.ex. till spara inställningar i EEPROM. Jag definierar en typedef T_CONFIG med alla de inställningar som behövs. Sedan kan jag deklarera en union med T_CONFIG i samt en unsigned char[1] "bredvid".

Då kan jag komma åt T_CONFIG värde för värde men jag kan även komma åt varje byte utan att fibbla med att cast'a.

Därmed kan min "skriva/läsa ett block bytes till/från EEPROM" fungera enkelt och smidigt.

Re: Vad betyder [] tecknet i programmet, arduino.

Postat: 30 oktober 2015, 00:59:32
av orvar-e
Liknelsen med biostolar var bra, det fattar jag. Men det är fortfarande inte helt klart för mig än så jag kommer med några fler funderingar.
Om men skriver som i koden unsigned long Temporary[3];, innebär det automatiskt att man menar från 0-2?

Det är den här kodbiten som styr i vilken ordning det ska sändas (om jag förstår det rätt).
Men hur fungerar den?

for(j=0;j<4;j++) .... hur långt sträcker sig den? Allt inom "curly brackets" nedanför? Den gör det 4 gånger?
Nä, kan nån som begriper förklara för nån som inte begriper.

Kod: Markera allt

void send_data(){
  unsigned char temp,tab,i;
  unsigned char j,k;
  for(j=0;j<4;j++)
  {
    for(k=0;k<3;k++)//send 8 Address Bits, 4 Data Bits
    {
      tab = Temporary[k];
    
      for(i=0;i<4;i++)
      {
        temp = tab;
        temp &= 0xC0;
      
        if(temp == 0xC0)//11 is bit "1"
        {
          bit_1();
        }
        else if(temp == 0x00)//00 is bit "0"
        {
          bit_0();
        }
        else //01 is bit "f"
        {
          bit_f();
         }
      
        tab =  tab << 2;
    }
  }
  
   bit_syn();//send Sync bit
  
  }
}

Re: Vad betyder [] tecknet i programmet, arduino.

Postat: 30 oktober 2015, 01:38:06
av Marta
Det verkar som Du inte alls är van vid C. Här är en länk som skingrar dimmorna: https://en.wikibooks.org/wiki/A_Little_C_Primer

Re: Vad betyder [] tecknet i programmet, arduino.

Postat: 30 oktober 2015, 02:16:28
av orvar-e
Ja, det är väl det enda rätta.......

Re: Vad betyder [] tecknet i programmet, arduino.

Postat: 30 oktober 2015, 07:55:36
av Icecap
if(), for(;;) osv kör 1 kommando!

Men det är så smart att tar du ett antal kommandon och klämmer in dom mellan { och } räknas de som 1 kommando.

if(<nånting som blir sant> utförs_denna_instruktion;
else Utförs_denna_instruktion; // Man kan ha med 'else' men man måste inte.

if(<nånting som blir sant> {
Utförs_denna_instruktion;
Och_denna_instruktion;
Och_Många_Fler_instruktioner;
} // Fram till hit

Re: Vad betyder [] tecknet i programmet, arduino.

Postat: 30 oktober 2015, 08:27:19
av Nerre
orvar-e skrev:Liknelsen med biostolar var bra, det fattar jag. Men det är fortfarande inte helt klart för mig än så jag kommer med några fler funderingar.
Om men skriver som i koden unsigned long Temporary[3];, innebär det automatiskt att man menar från 0-2?
Ja. I C börjar index alltid på noll. Det har att göra med att det används som addering.

Om variabeln börjar på adress 0x123 så ligger element 0 på adress 0x123 + 0 gånger <elementstorleken>, element 1 ligger på adress 0x123 + 1 gånger <elementstorleken> och element 2 ligger då alltså på adress 0x123 + 2 gånger <elementstorleken>
Allt inom "curly brackets" nedanför?
De används för att gruppera flera instruktioner så de ser som ett "underblock". Det vanligaste är för loopar, if-satser och liknande, men det kan även användas för att ge ett "tillfälligt scope" för en variabel (en variabel som deklareras innanför måsvingarna existerar inte utanför dem, ett smidigt sätt att göra temporära variabler).
Den gör det 4 gånger?
Ja, det ser så ut. Men formellt sett är det så här:
Den gör det så länge k är mindre än 3. För varje varv räknar den upp k med 1. Och k nollställs före första varvet.

Det blir 4 gånger så länge k inte manipuleras inuti loopen. Men det är fullt möjligt att kod inuti loopen kan ändra på k så det blir fler eller färre än 4 gånger. (I det här fallet verkar det inte ske, men det är fullt möjligt.)

I pseudokod blir det nåt i stil med:

Nollställ k
:start
Om k är mindre än tre, utför instruktionen (inom måsvingarna), räkna upp k och börja om från :start

Re: Vad betyder [] tecknet i programmet, arduino.

Postat: 30 oktober 2015, 08:29:28
av Glenn
Det kan tilläggas att arrays funkar ungefär likadant i BASIC också, typ PBP, så jag vet inte om det är direkt C-specifikt.

Re: Vad betyder [] tecknet i programmet, arduino.

Postat: 30 oktober 2015, 09:58:58
av TomasL
Det är väl så inom i stort sett alla språk där man kan använda Arrays.
En kanske bättre analogi är:

Kod: Markera allt

int LådaA[10];
Det betyder att i din skrivbordslåda, vilken du satt etiketten LådaA på, så har du 10 st fack i lådan, numrerade från 0-9.
Så vad du helt enkelt gör med kodstycket

Kod: Markera allt

 LådaA[5]
att är att tala om för programmet att de data som skall användas ligger i LådaA fack 5

Re: Vad betyder [] tecknet i programmet, arduino.

Postat: 30 oktober 2015, 10:01:50
av Nerre
Om jag inte minns helt fel så börjar Pascal med index 1, sen finns det väl vissa språk där man t.o.m. kan välja vilket intervall index ska ligga inom (typ array[7..16]).

Re: Vad betyder [] tecknet i programmet, arduino.

Postat: 30 oktober 2015, 10:04:53
av sodjan
I de flesta andra språk som inte har C's låga nivå så har första platsen i en array index 1.
Det är väl bara det som är lite förvirrande i början... :-)

> Om men skriver som i koden unsigned long Temporary[3];, innebär det automatiskt att man menar från 0-2?

När man skriver "unsigned long Temporary[3]" så anger man bara hur *stor* arrayen
ska vara (3 positioner i detta fall), inte vilket som är max index. En array med 3 "platser"
anges sedan med index ("adress") 0, 1 och 2.

Och som sagt, andra språk använder index 1, 2, och 3 (eller valfritt index), vilket ju kanske
kan uppfattas som lite mer logiskt. :-)

Re: Vad betyder [] tecknet i programmet, arduino.

Postat: 30 oktober 2015, 12:02:14
av nifelheim
När det gäller "fiskmåsparenteserna" och vad som hör till samma "block",
så kolla på indendteringen.

I verktygs menyn finns "Autoformat" som fixar det automagiskt.
(men det är snyggare att göra själv :-) )



edit : stavning

Re: Vad betyder [] tecknet i programmet, arduino.

Postat: 30 oktober 2015, 12:20:40
av Nerre
Indenteringen är ju bara för att det ska bli enklare att läsa, kompilatorn skiter ju högaktningsfullt i indentering.

Det finns ju dessutom flera olika skolor när det gäller hur man hanterar måsvingar och indentering.
https://en.wikipedia.org/wiki/Indent_style

Re: Vad betyder [] tecknet i programmet, arduino.

Postat: 30 oktober 2015, 12:51:26
av nifelheim
exakt ,
TS frågade hur långt loopen går,
ett enkelt och tydligt sätt för en människa att se det
är att göra "autoformat" och titta på indendteringen.

Alltså bara en sak för att TS inte ska behöva fundera på vad som ligger i vilket block,
kompilatorn tvekar inte, det gjorde TS :-)


Om det jag skrev kunde uppfattas som om det påverkade kompileringen,
var jag otydlig . :-)