Forum: Mikrocontroller und Digitale Elektronik Attiny13, PB5 (Reset-Pin) als ADC zur messung von VCC nutzen


von Matze (Gast)


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?

von Justus S. (jussa)


Lesenswert?

1
if(ADIF==1)

is klar...wann ist denn bitte 4==1?

von Matze (Gast)


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.

von Axel R. (Gast)


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?

von Spess53 (Gast)


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

von Axel R. (Gast)


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

von Hannes L. (hannes)


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.

...

von Thomas E. (thomase)


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.

von Hannes L. (hannes)


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.

...

von Spess53 (Gast)


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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Thomas E. (thomase)


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.

von Hannes L. (hannes)


Lesenswert?

Thomas Eckmann schrieb:
> das mit Bandgap gegen Vcc.

Das mache ich auch gerne.

...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.