Forum: Mikrocontroller und Digitale Elektronik [Attiny24, avr-gcc] Problem mit Vcc-Messung


von Drachenbändiger (Gast)


Lesenswert?

Hallo,

im Folgenden ein Rumpfprogramm, mit dem sich das Problem nachweisen 
lässt, auf dessen Ursache ich einfach nicht komme:

*Idee*: Attiny24 misst eigene Vcc; also: Aref=Vcc (REFS0 und REFS1=0), 
ADMUX steht auf Bandgap reference (ADMUX=0b100001) (etwa 1.1V beim 
Attiny24).

*Randbedingungen*:
 - Compiliert mit WinAvr-20090313, -Os
 - Attiny läuft mit ext. 4MHz Quarz
 - Fuses (wie für das Projekt nötig, wo ich diese Messung einsetzen
     möchte): RSTDISBL programmiert, SPIEN nicht programmiert, EESAVE
     programmiert, externer XTAL 3-8MHz, Startup: 64ms+14ck, BOD aus
     (habe es auch mit BODLEVEL=2,7 und BODLEVEL=4,3 versucht)
 - LED mit R an PA0 gegen Masse

Ich erwarte, dass die LED bei einer Betriebsspannung unter 4V an und 
sonst aus ist. Sie leuchtet aber im gesamten Bereich (3-5V getestet)! 
Was habe ich übersehen?

PA0 sollte bei REFS0=REFS1=0 (Aref=Vcc) doch vom ADC abgekoppelt sein, 
so dass ich den Pin als Ausgabe benutzen kann, oder verstehe ich das 
nicht richtig?
1
#include <inttypes.h>
2
#include <io.h>
3
4
#define LED_        PA0 // 
5
6
// returns 0 if Vcc > 4V else !=0
7
uint8_t supply_voltage_check(void) {
8
        ADMUX=0b100001; // Aref=AVcc, input: 1.1V reference
9
        ADCSRB=1<<ADLAR; // 10 bits would be overkill...
10
        ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADPS2); // F_CPU/16=250kHz
11
        while (ADCSRA&(1<<ADSC)) {}; // wait to complete
12
        uint8_t adh=ADCH;
13
        ADCSRA=0;
14
        return (adh > (uint8_t)(256.*(1.1/4.))); // 256*Vint/Vthresh
15
}
16
17
18
int main(void) {
19
    
20
    DDRA=(1<<LED_);
21
22
    do{
23
        if (supply_voltage_check()) PORTA|=1<<LED_; else PORTA&=~(1<<LED_);
24
    } while(1);
25
26
}

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Passiert das auch, wenn du dich an die Empfehlungen aus dem Datenblatt 
und aus dem AVR-GCC-Tutorial hälst? Also nach dem 
Einschalten/Umschalten des ADC einen Dummyread und dann erst die 
tatsächliche ADC.

von Drachenbändiger (Gast)


Lesenswert?

Hallo Stefan,

ja, leider auch dann!

von Drachenbändiger (Gast)


Lesenswert?

Auah ... es lag die falsche Spannung an -- mea culpa -- in eine Ecke 
verkriech! Hatte schon heute früh mehrere Stunden danach gesucht, aber 
übersehen, dass ich die Spannung am Netzteil und nicht an den Pins des 
Controllers gemessen habe (mehrere Spannungen, die die Schaltung 
versorgen). Tut mir leid, Euch hier mit diesem Schein-Problem belästigt 
zu haben.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

No Panic! Das war keine Belästigung, sondern ein willkommener Anlaß für 
mich, das Ganze auf einem Atmega8 und dem [[Pollin 
Funk-AVR-Evaluationsboard‎]] nachzuprogrammieren.

von Drachenbändiger (Gast)


Lesenswert?

Freut mich, dass Du das so positiv siehst, Stefan. Ich war gestern 
ziemlich angenervt, als die Sache nicht laufen wollte, und dachte, ich 
finde den Fehler, wenn ich den relevanten Programmteil extrahiere (so 
ist es auch dazu gekommen, dass kein Dummy-Read zu sehen ist...) und 
hier erkläre. Ich habe mich schwergetan, den Beitrag tatsächlich 
abzusenden. Und dann der Reinfall, bei der Hardware etwas übershen zu 
haben! Grrr!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ein Uralttrick von Programmierern:

Setze einen Teddy neben den Monitor. Wenn das Programm hakt, erläre dem 
Teddy das Programm. Oft ist die Lösung dann offensichtlich.

Dein Teddy waren wir :)

PS: Stelle unbedingt sicher, dass kein Kollege, Schwiegermutter in der 
Erklärphase reinkommt!

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.