Difference between revisions of "AVR Embedded Tutorial - Analog Read/de"

From Lazarus wiki
Jump to navigationJump to search
(Created page with "{{Translate}} {{Warning| In Arbeit}} =Analog Read= ==Vorwort== Wie man die UART ansteuert, steht hier: * UART ''UARTInit'' und ''UARTSend...")
 
Line 9: Line 9:
  
 
==code==
 
==code==
 +
Dieser Code ist für einen Atmega328/Arduino mit 16MHz.
  
<syntaxhighlight lang="pascal">
+
===ADC Initialisieren===
const
+
Analoges Einlesen konfigurieren.
  REFS0 = 6;
+
Als Referenzspannung wird AVcc genommen, dies ist der einfachste Weg. Dies mus an '''ADMUX''' übergeben werden.
  ADPS0 = 0;
 
  ADPS1 = 1;
 
  ADPS2 = 2;
 
  
 +
Folgende Referenzspannungen kann man mit ADMUX konfigurieren:
 +
{| class="wikitable"
 +
|-
 +
! Bit 7 !! Bit 6 !! Beschreibung
 +
|-
 +
| 0 || 0 || Pin AREF
 +
|-
 +
| 0 || 1 || von AVcc
 +
|-
 +
| 1 || 0 || -
 +
|-
 +
| 1 || 1 || 2.56V
 +
|}
 +
Mit '''ADCSRA''' wird der Wandler gestartet.
  
 +
<syntaxhighlight lang="pascal">
 
   procedure ADC_Init;
 
   procedure ADC_Init;
 
   begin
 
   begin
     ADMUX := (1 shl REFS0);
+
     ADMUX := (1 shl REFS);   // AVcc als Referenz.
     ADCSRA := %111 or (1 shl ADEN);
+
     ADCSRA :=(1 shl ADEN) or // Wandler einschalten.
 +
    %111;                   // Teiler 128.
 
   end;
 
   end;
 +
</syntaxhighlight>
 +
 +
===Auslesen===
 +
Der Ablauf bei Messen ist folgendermassen.
 +
* Port angeben.
 +
* Warten bis Messung ferig.
 +
* Messwert auslesen.
 +
Bei '''ADMUX''' muss man die Referenzspannung nochmals angeben, weil es das Register mit Referenz teilt, man könnte auch eine or-Verknüpfung mit '''ADMUX''' machen.
  
 +
<syntaxhighlight lang="pascal">
 
   function ADC_Read(Port: byte): integer;
 
   function ADC_Read(Port: byte): integer;
 
   begin
 
   begin
     ADMUX := (1 shl REFS0) or (Port and $0F);
+
     ADMUX := (1 shl REFS) or (Port and $0F);     // Port angeben.
     ADCSRA := ADCSRA or (1 shl ADSC);
+
     ADCSRA := ADCSRA or (1 shl ADSC);             // Messen einleiten.
     while (ADCSRA and (1 shl ADSC)) <> 0 do begin
+
     while (ADCSRA and (1 shl ADSC)) <> 0 do begin // Warten bis gemessen.
 
     end;
 
     end;
  
     Result := ADC;
+
     Result := ADC;                               // Messwert auslesen.
 
   end;
 
   end;
 +
</syntaxhighlight>
 +
Wen man immer vom gleiche Port einliest, muss man die '''ADMUX'''-Zeile nur einmal aufrufen.
 +
Auch kann man dann das Messen einleiten direkt nach der '''while''-Schleife machen. Die spart ein paar Takte.
  
 +
===Über UART ausgeben===
 +
Variablen für Zwischenspeicher für die Messdaten.
 +
<syntaxhighlight lang="pascal">
 
var
 
var
 
   Data: integer;
 
   Data: integer;
 
   s: string[10];
 
   s: string[10];
 
+
</syntaxhighlight>
 +
In einer Endlosschelife werden dann die Messdaten ausgegeben.
 +
<syntaxhighlight lang="pascal">
 
begin
 
begin
  

Revision as of 18:59, 15 November 2017

Template:Translate

Warning-icon.png

Warnung: In Arbeit

Analog Read

Vorwort

Wie man die UART ansteuert, steht hier:

  • UART UARTInit und UARTSendString(...

code

Dieser Code ist für einen Atmega328/Arduino mit 16MHz.

ADC Initialisieren

Analoges Einlesen konfigurieren. Als Referenzspannung wird AVcc genommen, dies ist der einfachste Weg. Dies mus an ADMUX übergeben werden.

Folgende Referenzspannungen kann man mit ADMUX konfigurieren:

Bit 7 Bit 6 Beschreibung
0 0 Pin AREF
0 1 von AVcc
1 0 -
1 1 2.56V

Mit ADCSRA wird der Wandler gestartet.

  procedure ADC_Init;
  begin
    ADMUX := (1 shl REFS);   // AVcc als Referenz.
    ADCSRA :=(1 shl ADEN) or // Wandler einschalten.
    %111;                    // Teiler 128.
  end;

Auslesen

Der Ablauf bei Messen ist folgendermassen.

  • Port angeben.
  • Warten bis Messung ferig.
  • Messwert auslesen.

Bei ADMUX muss man die Referenzspannung nochmals angeben, weil es das Register mit Referenz teilt, man könnte auch eine or-Verknüpfung mit ADMUX machen.

  function ADC_Read(Port: byte): integer;
  begin
    ADMUX := (1 shl REFS) or (Port and $0F);      // Port angeben.
    ADCSRA := ADCSRA or (1 shl ADSC);             // Messen einleiten.
    while (ADCSRA and (1 shl ADSC)) <> 0 do begin // Warten bis gemessen.
    end;

    Result := ADC;                                // Messwert auslesen. 
  end;

Wen man immer vom gleiche Port einliest, muss man die ADMUX-Zeile nur einmal aufrufen. Auch kann man dann das Messen einleiten direkt nach der 'while-Schleife machen. Die spart ein paar Takte.

Über UART ausgeben

Variablen für Zwischenspeicher für die Messdaten.

var
  Data: integer;
  s: string[10];

In einer Endlosschelife werden dann die Messdaten ausgegeben.

begin

  // UART inizialisieren
  UARTInit;

  // ADC
  ADC_Init;

  asm
           Sei end;
  repeat
    Data := ADC_Read(0);
    str(Data: 6, s);
    UARTSendString(s);
  until 1 = 2;
end.