mikrocontroller.net

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


Autor: Drachenbändiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
#include <inttypes.h>
#include <io.h>

#define LED_        PA0 // 

// returns 0 if Vcc > 4V else !=0
uint8_t supply_voltage_check(void) {
        ADMUX=0b100001; // Aref=AVcc, input: 1.1V reference
        ADCSRB=1<<ADLAR; // 10 bits would be overkill...
        ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADPS2); // F_CPU/16=250kHz
        while (ADCSRA&(1<<ADSC)) {}; // wait to complete
        uint8_t adh=ADCH;
        ADCSRA=0;
        return (adh > (uint8_t)(256.*(1.1/4.))); // 256*Vint/Vthresh
}


int main(void) {
    
    DDRA=(1<<LED_);

    do{
        if (supply_voltage_check()) PORTA|=1<<LED_; else PORTA&=~(1<<LED_);
    } while(1);

}

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Drachenbändiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefan,

ja, leider auch dann!

Autor: Drachenbändiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Drachenbändiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.