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 | }
|