ADC Konfigurationsbeispiel für ARM LPC1768

Gast #2576726
Lesenswert?

Hallo,

ich würde gerne wissen was im Folgenden Beispiel die Bezeichnungen 1UL 
und 3UL bewirken ? UL = unsigned Long??? Kann mir einer den Zusammenhang 
erklären? Ich kenne es eigentlich bisher nur so, dass wenn man diese 
Zeile als Beispiel verwendet
1
LPC_SC->PCONP       |=  (1UL<<12);
, an die 12te Stelle eine 1 geschoben wird und dann mit dem bisherigen 
Inhalt des Registers Oder-Verknüpft wird. Wie ist das jetzt 
beispielsweise bei
1
  LPC_PINCON->PINSEL3 |=  (3UL<<30);
 ???
Würden uns über Antworten freuen, fangen grad an in die Thematik 
einzusteigen.


Besten dank im voraus,
Gruß Sven & Alex
1
int main (void)
2
{
3
  unsigned int val;
4

5
  SystemInit();
6
  
7
  //ET-NXP ARM KIT(LPC1768) Hardware
8
  //LED = P2[7..0]
9
  //ADC = P1.31(AD0.5)
10
  LPC_GPIO2->FIODIR =0xFF;                      // P2[0..7] defined as Outputs 
11
  LPC_GPIO2->FIOPIN = 0x00;                      // OFF all LED
12

13
  LPC_PINCON->PINSEL3 &= ~(3UL<<30);                // Reset P1.31 = GPIO
14
  LPC_PINCON->PINSEL3 |=  (3UL<<30);                           // Config P1.31 is AD0.5 
15
  LPC_SC->PCONP       |=  (1UL<<12);                           // Enable power to ADC block 
16
  LPC_ADC->ADCR        =  (1UL<< 5) |                          // select AD0.5 pin 
17
                          (1UL<< 8) |                          // ADC clock is 18MHz/2 
18
                          (1UL<<21);                           // enable ADC 
19

20
  while(1)
21
  {
22
    LPC_ADC->ADCR |=  (1<<24);                               // start conversion 
23
    while (!(LPC_ADC->ADGDR & (1UL<<31)));                   // Wait for Conversion end 
24
    val = ((LPC_ADC->ADGDR >> 4) & 0xFFF);                   // read converted value 
25
    LPC_ADC->ADCR &= ~(7<<24);                               // stop conversion 
26

27
    LPC_GPIO2->FIOPIN = led_graph[val/512];                  // result of A/D process 
28
  }
29
}
Gast #2576858
Lesenswert?

Vielen Danke!
Wir haben jetzt auch den größten Teil des Programmes verstanden, wir 
hängen nun aber an diesen Zeilen:

1
  while (!(LPC_ADC->ADGDR & (1UL<<31)));                   // Wait for Conversion end 
2
    val = ((LPC_ADC->ADGDR >> 4) & 0xFFF);                   // read converted value


Kann und das bitte jemand erklären?
Danke im voraus

alex
Gast #2576881
Lesenswert?

Inhaltlich beschrieben auf Seite 578 des LPC17xx User Manual.

LPC_ADC->ADGDR liest den Inhalt des Registers ADGDR. Diese Ergebnis wird 
logisch UND-verknüpft mit einer eins, die um 31 Stellen nach links 
geschoben wurde. Denn an dieser Stelle im ADGDR-Register (Bit 31) ist 
das DONE-Flag welches anzeigt, ob die AD-Wandlung abgeschlossen ist oder 
nicht. So lange es nicht gesetzt ist, läuft die Wandlung noch. Die 
UND-Verknüpfung ergibt also Null. Das Ergebnis wird aber mit ! negiert, 
so daß die while-Bedingung erfüllt ist und als Warteschleife fungiert, 
bis das Flag gesetzt ist und die UND-Verknüpfung Null ergibt.

LPC_ADC->ADGDR >> 4 schiebt den Registerinhalt einfach um 4 Stellen nach 
rechts, da das Ergebnis der Wandlung aus mir absolut unerklärlichen 
Gründen  leider nicht rechtsbündig im Register liegt (bit 3:0 sind 
reserved). Nun enthalten die bits 11:0 nach dem Schieben rechtsbündig 
die 12 bits der Wandlung.
Die logische UND-Verknüpfung mit 0xFFF sorgt dafür, daß nur die bits 
11:0 ausgewertet und an val übergeben werden. Welchen Wert die bits 
31:12 haben, ist dann nämlich egal. Sie werden ausmaskiert/ zu Null.
Am besten einfach mal binär aufschreiben und die Schritte durchgehen. So 
wird es einem bei Bitoperationen schnell klar, was dort passiert.
Gast #2576931
Lesenswert?

Das hat uns sehr geholfen - Danke!

Kannst du uns aber bitte noch genauer erklären was dieser Befehl genau 
macht?
1
LPC_ADC->ADGDR

Also was genau steht da genau drin? Eine Null, eine Eins - bzw. was 
genau wird hier verknüpft?
Nochmals vielen Danke voraus =)
Gast #2588359
Lesenswert?

Lutz schrieb:
> LPC_ADC->ADGDR liest den Inhalt des Registers ADGDR.
mit dem "->" - Operator. Ihr müßt euch unbedingt ein C-Buch zulegen und 
diese Grundlagen lernen; ohne dem geht es nicht (aushilfsweise z.B. auch 
mal hier schauen 
http://openbook.galileocomputing.de/c_von_a_bis_z/015_c_strukturen_003.htm#mj5db2bd787482bd929c5e321891a6d042). 
Hier bedeutet es Zugriff auf eine struct.

Lutz schrieb:
> Diese Ergebnis wird logisch UND-verknüpft
mit "&" - Operator

Lutz schrieb:
> mit einer eins, die um 31 Stellen nach links geschoben wurde.
mit (1UL<<31), binär ist das 10000000 00000000 00000000 00000000

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren