Attiny13, PB5 (Reset-Pin) als ADC zur messung von VCC nutzen

Gast #3264412
Lesenswert?

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
int main(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?
Gast #3264440
Lesenswert?

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.
Gast #3264540
Lesenswert?

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?
Gast #3264561
Lesenswert?

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
Gast #3264566
Lesenswert?

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
#3264578
Lesenswert?

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.

...
#3264584
Lesenswert?

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.
#3264594
Lesenswert?

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.

...
Gast #3264597
Lesenswert?

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
#3264606
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren