Forum: Mikrocontroller und Digitale Elektronik ADC Konfigurationsbeispiel für ARM LPC1768


von sven & alex (Gast)


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
}

von Lutz (Gast)


Lesenswert?

UL steht für unsigned long, genau.
3UL bedeutet, daß bit 0 und bit 1 gesetzt sind und diese dann nach links 
geschiftet werden. Bei 1UL wird nur das bit 0 gesetzt und dann 
geschoben.

von alex (Gast)


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

von Lutz (Gast)


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.

von alex (Gast)


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 =)

von alex (Gast)


Lesenswert?

Kann uns den niemand helfen?

von Lutz (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.