Nachtrag zur Folge 3:
Das ursprüngliche Programm sollte durch Messen der internen 1,1-V-Referenz die eigene Betriebsspannung ermitteln, was auch gut funktioniert hat.
'----------------------------------------
'UNO_AD3.BAS Vcc / 1.1 V
'----------------------------------------
$regfile = "m328pdef.dat"
$crystal = 16000000
$baud = 9600
Dim D As Word
Dim U As Single
Config Adc = Single , Prescaler = 64 , Reference = Avcc
Do
D = Getadc(14) 'Ref 1.1 V
U = 1023 / D
U = U * 1.1
Print "Vcc = ";
Print U ; " V"
Waitms 1000
Loop
Fritz Prenninger stellte folgendes Problem mit dem Lesen der internen Referenz (ADC14) fest: Wenn im gleichen Programm ADC0 gelesen wird ändert sich der gelesene Wert aus ADC14.
'----------------------------------------
'UNO_AD3_1a.BAS Vcc / 1.1
V
'----------------------------------------
$regfile =
"m328pdef.dat"
$crystal = 16000000
$baud = 9600
Dim D As
Word
Dim U As Single
Dim E As Word
Dim V As Single
Config
Adc = Single , Prescaler = 64 , Reference = Avcc ' 5,0V
Do
'E = Getadc(0)
V = E * 5.0
V = V / 1023
Print V ; " V"
Waitms 3000
D = Getadc(14) 'Ref 1.1 V
U = 1023 / D
U = U * 1.1
Print "Vcc = ";
Print U ; " V"
Waitms 1000
Loop
Etwas rumprobiert, das Problem konnte ich bestätigen. Zuerst hatte ich einen Rechenfehler in Bascom in Verdacht. Deshalb habe ich die Einstellungen für Hwstack, Swstack usw. eingefügt. Keine Änderung. Dann fiel auf, dass auch bei der funktionierenden Variante der erste Wert noch nicht korrekt ist. Neue Theorie: Das Messen von Kanal 14 schaltet die Referenz erst ein, andere Kanäle schalten sie wieder aus. Und es wird jedesmal etwas Zeit benötigt, bis die Referenz voll da ist. Von so einer Einschwingzeit steht auch etwas im Datenblatt. Also muss man in diesem Fall den Kanal AD14 zweimal messen, einmal zum Einschalten der Referenz und dann nach einer kurzen Pause für die eigentliche Messung. Jetzt funktioniert es korrekt.
'----------------------------------------
'UNO_AD3b.BAS Vcc / 1.1 V
'----------------------------------------
$regfile = "m328pdef.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 64
$framesize = 64
Dim D As Word
Dim E As Word
Dim U As Single
Dim V As Single
Config Adc = Single , Prescaler = 64 , Reference = Avcc ' 5,0V
Do
E = Getadc(0) 'int Ref off
V = E * 5.0
V = V / 1023
Print V ; " V"
Waitms 3000
D = Getadc(14) 'Ref on
Waitms 100
D = Getadc(14) 'Ref 1.1 V
U = 1023 / D
U = U * 1.1
Print "Vcc = ";
Print U ; " V"
Waitms 1000
Loop
