ADC-Summer

adc-summer.luna
'**************************************************************************
'* Name        : ADC-Summer
'* Function    : First Steps Example
'* Hardware    : aTeVaL Evaluation Board - http://www.ehajo.de
'**************************************************************************
'* Compiler    : lunaAVR 2015.r1 (or newer)
'**************************************************************************
'* Author      : rgf, avr@myluna.de
'* Date/Version: 04.04.2015
'* www         : http://avr.myluna.de
'**************************************************************************
' µC-Belegung am Beispiel Atmega328p
' Poti:  	PortC.0	!Der untere ADC-Jumper auf dem aTeVaL muss gesteckt sein!
' Summer:	PortD.7 !Die Lötbrücke "SPKR" auf der Lötseite muss geschlossen sein!
'**************************************************************************
 
avr.device = atmega328p   'Controller-Typ festlegen
avr.clock = 8000000       'Dem Compiler mitteilen mit welcher Taktrate der Controller läuft
avr.stack = 64            'Den Programmstack einstellen
' -> Siehe "avr": http://avr.myluna.de/doku.php?id=de:avr
 
#library "Library/Adc.interface"
' -> Siehe "Libraries": http://avr.myluna.de/doku.php?id=de:libraries
 
'Die Port-Pins von Poti und Summer mit einem Bezeichner
'versehen. Dies zur besseren Lesbarkeit im Quelltext
#define POTI as PortC.0
#define SUMMER as PortD.7
' -> Siehe "#defines": http://avr.myluna.de/doku.php?id=de:define
 
'Eine Variable ohne Vorzeichen mit 16 Bit anlegen zur Aufnahme des ADC-Messwerts
dim adc_wert as word
 
POTI.mode	= input         'Poti als Eingang
SUMMER.mode	= output,low  'Summer als Ausgang
' -> Siehe "Port": http://avr.myluna.de/doku.php?id=de:port
 
'Wir wollen den Spannungswert des Potis über den ADC0 einlesen (Pin 23 vom Controller) 
'Den Analog-Digitalwandler des Controllers konfigurieren.
 
'Teilungsfaktor des ADC, ADC-Frequenz soll zw. 50 und 200kHz liegen.
'In diesem Fall Teiler 64, also dann 8MHz / 64 = 125kHz
Adc.Clock	= 64
 
'AVCC (also +5V als Spannungsreferenz verwenden)
Adc.Reference = avccCap
 
'Channel 0 (ADC0) auswählen
Adc.Channel = 0
 
'ADC einschalten
Adc.Enable
 
'Nach dem Einschalten wird eine Dummy-Wandlung empfohlen
'Wandlung starten
void Adc.Value
 
'Hauptschleife
do
  'Messwert lesen
  adc_wert = Adc.Value
  'Warten so viele µs, wie der ADC-Wert ist
  long_delay( adc_wert )
  'Pin des Summers invertieren
  SUMMER.toggle
loop
 
'Unterprogramm
procedure long_delay(us as word)
  'so viele us warten wie der Funktion uebergeben wurden
  while us    'Schleife solange ausführen wie us <> 0 ist
    waitus 1  '1µs warten
    us--      'Variable "us" dekrementieren
  wend
endproc