PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC konfigurieren (Tiny84)



Sauerbruch
02.11.2008, 13:45
Moin zusammen!

Ich versuche gerade, den ADC eines ATTiny84 so zu konfigurieren, dass als Referenz die internen 1,1 Volt gewählt werden. In Bascom ging das (erwartungsgemäß) nicht, sowohl Reference = INT als auch Reference = Internal wurden vom Compiler nicht akzeptiert.

Ist ja nicht schlimm - man kennt solche Eigenwilligkeiten des Compilers ja. Ich habe das ADMUX dann selbst gesetzt, und zwar auf 130 bzw. &B10000010 (Eingang 2 und 1,1V als Referenz).
Per LCD lasse ich mir das Register am Programmanfang anzeigen - der Wert wird zunächst tadellos übernommen. Nach dem ersten mal Getadc(2) wird ADMUX aber auf &B00000010 verändert, d.h. ADC2 als Eingang und Vcc als Referenz.

Hier mal der kurze Code:


$regfile = "attiny84.dat"
$crystal = 1000000

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Porta.7 , E = Porta.0 , Rs = Porta.1
Initlcd
Cursor = Off

Admux = &B10000010
Adcsra = &B11000000
Adcsrb = &B00000000

Locate 1,1
LCD ADMUX
wait 1

Dim Wert As Word

Do
Wert = Getadc(2)
Locate 1 , 1
Lcd "ADMUX: " ; ADMUX
Locate 2 , 1
Lcd Wert
Waitms 250
Cls
Loop

Warum passiert das - und was kann ich dagegen tun? Vcc als Referenz ist nämlich in diesem Fall keine besonders gute Lösung...

zerush
02.11.2008, 13:57
Du kannst anstatt Getadc() ja auch hier weiter mit den Registern arbeiten.
Ich denke mal Getadc() setzt alle Register entsprechend der Konfiguration neu...

Sauerbruch
02.11.2008, 14:23
o.k. - aber wie sag ich´s ihm in Registern, dass er JETZT eine AD-Konversion vornehmen soll?

stefan_Z
02.11.2008, 14:44
Wenn er auf dauer-Messung steht, dann reichts glaubich, das Register auszulesen.
Wenn er One-Shot ist, dann musst du ihn anmachen und dann das Messergebnis aus dem Register holen.

Sauerbruch
02.11.2008, 14:59
Danke für Eure Tipps - jetzt klappt´s: ADSC setzen, auf ADIF warten, Register auslesen, ADSC löschen, fertig. Schade, dass Bascom sich mit den unterschiedlichen Referenzen so schwer tut =P~

Schönen Sonntag noch!!

linux_80
02.11.2008, 16:30
Hallo,

Wenn man kein Config ADC hat, wurde ADMUX immer gelöscht, bei einem Getadc !
Man kann aber bei Getadc das ganze Byte für ADMUX mitgeben.
Bei der 1.11.9.2 werden die Ref-Bits aber ausmaskiert bevor der Kanal gesetzt wird.

Welche Bascom-Version hast Du, ich kann Reference Internal verwenden bei der 1.11.9.2. Und es wird auch richtig im Register gesetzt.

Das hier wird bei mir richtig compiliert:

$regfile = "attiny84.dat"
$crystal = 1000000

Config Adc = Single , Prescaler = Auto , Reference = Internal

Dim W As Word , Channel As Byte

Channel = 2

Do

W = Getadc(channel)

Loop

End

Sauerbruch
02.11.2008, 16:42
Dann scheint das inzwischen verbessert worden zu sein, ich habe 1.11.8.2. als Vollversion, und da geht Reference = Internal definitiv nicht. Vielleicht sollte ich meine Aversion gegen Updates mal langsam ablegen =P~ Aber die direkte Arbeit mit den Registern ist dem Gesamtverständnis ja sehr zuträglich, daher bastele ich eigentlich ganz gerne auf diser Ebene herum.

Vielleicht date ich ja demnächst doch mal up..

Gruß,

Daniel

zerush
02.11.2008, 17:00
Hast du schonmal in C reingeschaut?
Wenn dir diese Ebene eher liegt, wirst du dich da wohl schnell zurecht finden und hast meiner Meinung nach viel mehr Möglichkeiten...

Gruß,
Thomas