'**************************************************************************
'* 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