Hallo,
Ich möchte den Pin PB5 eines Attiny13 als Analogeingang zur Messung der
Versorgungsspannung des Attiny nutzen.
Dazu habe ich volgendes Programm geschrieben:
1
intmain(void)
2
{
3
PORTB=0x1e;//Pin für Taster und ADC(Reset) als Eingang
4
DDRB=0x1e;
5
//int langsam=0;
6
//-------TIMER----------------------------------
7
TCCR0A=(1<<WGM01);// CTC Modus
8
TCCR0B|=(1<<CS02);// Prescaler 8
9
OCR0A=97;
10
//------> Timer läuft nun
11
//-------------AD-WANDLER-----------------------
12
ADMUX&=~(1<<REFS0);//VCC als Fefferenz
13
ADMUX&=~(1<<MUX1);//PB5 als Eingang
14
ADMUX&=~(1<<MUX0);
15
ADCSRA|=(1<<ADEN);//ADC Enable
16
ADCSRA|=(1<<ADATE);//Für Dauerhafte Wandlung
17
ADCSRB&=~(1<<ADTS0);
18
ADCSRB&=~(1<<ADTS1);
19
ADCSRB&=~(1<<ADTS2);
20
ADCSRA|=(1<<ADSC);//Wandlung Starten
21
while(1)
22
{
23
if(ADIF==1)//Abfrage Wandlung Beendet
24
{
25
PORTB=0x3B;
26
while(1)//Wenn irgendwann mal eine Wandlung Stattfindet
27
{;
28
}
29
}
30
else
31
{
32
PORTB=0x2F;
33
}
34
}
35
}
Wenn nun irgengwann mal eine Wandlung stattfindet müsste das ADIF-Bit
gesetzt werden und mein Programm 0x3B auf die Ausgänge geben.
Leider kommt immer nur 0x2F raus.
Warum findet die Wandlung nicht statt?
Danke für die Korrektur,
if(ADCSRA&(1<<ADIF)) //Abfrage Wandlung Beendet
{
PORTB=0x3B;
while(1) //Wenn irgendwann mal eine Wandlung Stattfindet
{;}
}
Ist wohl die richtige Abfrage.
Die ADTS-Bits sind auf Free-Running gesetzt, bedeutet das wirklich
dauerhafte Wandlung?
Muss ich einen Vorteiler in ADCSRB verwenden?
Muss eventuell noch am DIDR0 (Digital-Input-Disable-Register)
etwas eingestellt werden?
(--> kann bei der Wandlung wenn der Reset auf VCC hängt überhaupt was
anderes als 1024 rauskommen?)
Dennoch läuft der Wandler wohl nicht los.
Muss nicht Start Conversion gesetzt werden und die Wandlung löscht Start
Conversion und bei Beendigung kann man dort ein H lesen? irgentwie so
war das doch. Oder fragt man beim ADC tatsächlich ADIF ab?
Hi
>Die ADTS-Bits sind auf Free-Running gesetzt, bedeutet das wirklich>dauerhafte Wandlung?
Ja.
>Muss ich einen Vorteiler in ADCSRB verwenden?
Kommt auf deinen Controllertakt an. Wenn er >400kHz ist, dann ja.
>Muss eventuell noch am DIDR0 (Digital-Input-Disable-Register)>etwas eingestellt werden?
Kannst du. Ist aber nicht zwingend.
>(--> kann bei der Wandlung wenn der Reset auf VCC hängt überhaupt was>anderes als 1024 rauskommen?)
Nein.
Ein kardinaler Fehler deines recht unsinnigen 'Programms' ist, das du
ADIF nicht wieder zurücksetzt. Nach der ersten Wandlung wird es 1 und
dabei bleibt es.
Dir ist auch bewußt, das um PB5 zu nutzen, du die RESET-Disable-.Fuse
setzen mußt. Damit kommst du dann nur noch mit HV-Programmierung an den
Controller.
MfG Spess
Using the ADC Interrupt Flag as a trigger source makes the ADC start a
new conversion as soon
as the ongoing conversion has finished. The ADC then operates in Free
Running mode, constantly
sampling and updating the ADC Data Register. The first conversion must
be started by
writing a logical one to the ADSC bit in ADCSRA. In this mode the ADC
will perform successive
conversions independently of whether the ADC Interrupt Flag, ADIF is
cleared or not.
If Auto Triggering is enabled, single conversions can be started by
writing ADSC in ADCSRA to
one. ADSC can also be used to determine if a conversion is in progress.
The ADSC bit will be
read as one during a conversion, independently of how the conversion was
started.
ausm Datenblatt seite dreienachzich
Spess53 schrieb:> Dir ist auch bewußt, das um PB5 zu nutzen, du die RESET-Disable-.Fuse> setzen mußt.
Ich habe es zwar (mangels Notwendigkeit) nicht überprüft, aber mir wurde
zugetragen, dass der ADC des Reset-Pins auch dann (mit eingeschränktem
Messbereich) funktionieren soll, wenn Reset nicht weggefust ist. Dann
steht aber nur der obere Bereich zur Verfügung, bei dem Reset noch nicht
auslöst. Die Info bezog sich zwar auf die TinyX5-Reihe, es könnte aber
auch auf den Tiny13 zutreffen.
...
Hannes Lux schrieb:> Spess53 schrieb:>> Dir ist auch bewußt, das um PB5 zu nutzen, du die RESET-Disable-.Fuse>> setzen mußt.>> Ich habe es zwar (mangels Notwendigkeit) nicht überprüft, aber mir wurde> zugetragen, dass der ADC des Reset-Pins auch dann (mit eingeschränktem> Messbereich) funktionieren soll, wenn Reset nicht weggefust ist. Dann> steht aber nur der obere Bereich zur Verfügung, bei dem Reset noch nicht> auslöst. Die Info bezog sich zwar auf die TinyX5-Reihe, es könnte aber> auch auf den Tiny13 zutreffen.>> ...
Kann ich bestätigen. Habe ich mit irgendeinem Controller auch
ausprobiert, weil ich es nicht glauben wollte.
mfg.
Matze schrieb:> Die ADTS-Bits sind auf Free-Running gesetzt, bedeutet das wirklich> dauerhafte Wandlung?
Den FreeRun-Mode habe ich gern benutzt, wenn sowiso ein Timer lief, der
nebenher noch (ohne Busy-Prüfung) den ADC ausliest. Dazu muss aber durch
vernünftige Wahl von ADC-Vorteiler und Timer-Intervall dafür gesorgt
werden, dass der ADC zwischen den Abfragen mindestens eine neue Wandlung
"im Kasten" hat.
Sind es mindestens zwei Wandlungen, dann kann man in der Timer-ISR auch
die Messquelle (ADMUX) verändern. So kann man mit einem Index auf Arrays
mit ADMUX-Bitmuster und ADC-Ergebnis (wenn nötig auch mit
Mittelwertbildung zur Messwertberuhigung) im Hintergrund (Timer-ISR)
ohne jegliches Busywait und ohne zusätzlichen ADC-Interrupt alle
ADC-Eingänge wandeln und dem Hauptprogramm per Array bereitstellen.
...
Hi
>Ich habe es zwar (mangels Notwendigkeit) nicht überprüft, aber mir wurde>zugetragen, dass der ADC des Reset-Pins auch dann (mit eingeschränktem>Messbereich) funktionieren soll, wenn Reset nicht weggefust ist. Dann>steht aber nur der obere Bereich zur Verfügung, bei dem Reset noch nicht>auslöst. Die Info bezog sich zwar auf die TinyX5-Reihe, es könnte aber>auch auf den Tiny13 zutreffen.
Wußte ich nicht. Aber selbst wenn es funktioniert, einen rechten Nutzen
sehe ich darin nicht.
MfG Spess
Spess53 schrieb:> Aber selbst wenn es funktioniert, einen rechten Nutzen> sehe ich darin nicht.
Ich schon, es ermöglicht z.B. den Anschluss einer Widerstandskette mit
Jumpern, mit denen dann ein Modus der Firmware ausgewählt werden kann.
Ich hab's aber noch nicht gebraucht und daher auch noch nicht getestet.
...
Spess53 schrieb:> Hi>>>Ich habe es zwar (mangels Notwendigkeit) nicht überprüft, aber mir wurde>>zugetragen, dass der ADC des Reset-Pins auch dann (mit eingeschränktem>>Messbereich) funktionieren soll, wenn Reset nicht weggefust ist. Dann>>steht aber nur der obere Bereich zur Verfügung, bei dem Reset noch nicht>>auslöst. Die Info bezog sich zwar auf die TinyX5-Reihe, es könnte aber>>auch auf den Tiny13 zutreffen.>> Wußte ich nicht. Aber selbst wenn es funktioniert, einen rechten Nutzen> sehe ich darin nicht.>> MfG Spess
Ich hab mich da mal mit einem Bastler gestritten, der das ganz toll
fand, damit einen Taster abzufragen. Es ist Scheiss, aber es geht.
Aber wenn ich die Vcc messen will, nehme ich statt einem 13er einen 25er
und mess das mit Bandgap gegen Vcc.
mfg.