[Attiny24, avr-gcc] Problem mit Vcc-Messung

Gast #1595107
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
}
Gast #1595578
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.
Gast #1595926
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!

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