Hallo AVR-Spezialisten. Habe einen Atmel 168PA in einer kleinen Aufsteckplatine (Pollin 810 366 ) und habe bei der Messung von der BandGap -Spannung Hausnummern. u0=ADC0-Kanal ...u7=ADC7-Kanal BG= BandGap __=Masse iT= interne Tempratur meine Messwert-Ausgabe sieht so aus. (Zahlen sind alle Hexwerte) u0=000;u1=000;u2=000;u3=000;u4=000;u5=000;u6=000;u7=000;BG=2DE;__=000;iT =143; hierbei sind alle ADC-Eingänge mittels Draht auf GND gelegt und die interne Tempratur-Messung reagiert auch auf Erwärmung. nur die BandGap liefert Hausnummern ausschnitt aus asm ldi bb,((1<<REFS1) |(1<<REFS0)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(0<<MUX0) ) ;; kanal VBG sts ADMUX,bb ;start der wandlung ldi bb,(1<<ADEN) |(1<<ADSC) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) sts ADCSRA,bb go_adcloop: ;warte bis aktuelle wandlung fertig lds bb,ADCSRA sbrc bb ,ADSC rjmp go_adcloop ;und abholen lds bb,ADCL ;zuerst low lds akku,ADCH ;dann hi .........anzeigen der messwerte Frage: für was ist die Messung von BandGap und Masse gut ?? im Datenblatt "Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA -328-328P_datasheet_Complete.pdf" auf Seite 238 steht am AD-Mux "BANDGAP REFERENCE" und am Referenz-Mux "INTERNAL 1.1V REFERENCE" Handelt es sich um das gleiche ???? eigentlich müsste doch 0x3ff gemessen werden wie dann bei GND 0x000 herauskommt? Nebenbei muss ich noch was loswerden. Was haben sich die Chip-Designer bei der Adressvergabe gedacht? Da gibt es im IN/Out-Bereich jede Menge freie (reserviert für was ??) Adressen und sowas wichtiges wie z.Bsp. das ADCSRA -Register muss mit Krücken abgefragt werden. wenn die schon so viel vom M8 verwerfen, so könnte doch eine Umstellung etwas besseres liefern. (oder hatte schon damals Microchip den Daumen drauf ??) noch was: gibt es eine sinnvolle Verwendung für GPIOR0 GPIOR1 GPIOR2 sind die wirklich frei und benutzbar ?? und was passiert, wenn man reservierte Adressen benützt (beschreibt) mit freundlichem Gruß Fritz
Fritz S. schrieb: > Frage: für was ist die Messung von BandGap und Masse gut ?? Man kann bei Batteriebetrieb die Bandgap-Spannung z.B. gegen Vcc messen und damit Rückschlüsse auf die Batteriespannung ziehen. > auf Seite 238 steht am AD-Mux "BANDGAP REFERENCE" und am Referenz-Mux > "INTERNAL 1.1V REFERENCE" > Handelt es sich um das gleiche ???? Eigentlich ja. > Was haben sich die Chip-Designer bei der Adressvergabe gedacht? Das habe ich mich bei Einführung des Mega48 auch gefragt. Da ich die Situation aber nicht ändern kann, muss ich es so hinnehmen. Inzwischen habe ich mich daran gewöhnt und nutze ganz gerne die kleinen preiswerten Mini-Pro-Module mit Mega168 und Mega328. ...
Bandgap: eigene Antwort. Hannes schrieb wegen BG: Eigentlich ja. Und das gab den Anstoß. Lösung der Bandgap-Messung ist: Man muss als Referenz AVcc oder externe Referenz in "REFS1 REFS0" einstellen. Dann misst man mit dem Voltmeter die AVref am Pin 20 (32p TQFP Gehäuse) Nun startet man die ADC-Messung der BG Berechnungs-Beispiel: Aref=3.28 Volt BG gemessener ADC-Wert=0x14d die interne BG-Spannung ist dann BG = Aref / 1024 * ADC-Wert hier ist also die BG-Referenz 1.07 V dieser Wert kann auch bei der interen Tempraturmessung herangezogen werden. als Hinweis noch: verändert man die Referenz von BG zu AVcc, so geht der Aref-Pin innerhalb mikroSekunden hoch, verändert man die Referenz von AVcc auf BG so dauert es über 3 milliSekunden, bis Aref auf 1.1 Volt runterkommt wenn man dies nicht beachtet, misst man zu kleine Werte!!! rätselhaft bleibt aber doch die Messung,wenn Referenz und Mux-Kanal auf BG stehen. Eigentlich müsste doch Vollausschlag 0x3ff herauskommen!! mit freundlichem Gruß Fritz
> rätselhaft ... 0x3ff ...
Wie sieht Ihr Programm aus? Springen Sie vielleicht nach Anzeigen der
Messwerte auf §go_adcloop zurück?
Fritz S. schrieb: > Eigentlich müsste doch Vollausschlag 0x3ff herauskommen!! Wenn ich Dich richtig verstehe, misst Du $2DE und erwartest $3FF. Kann es sein, dass Du zu schnell nach dem Umschalten der Referenz misst, die Referenz also noch gar nicht bei 1,1 V angekommen ist? Versuche es doch mal mit einer größeren Verzögerung zwischen Umstellen von ADMUX und Starten der Messung. Zyklische Messungen an mehreren Eingängen mache ich gern nach folgendem Schema: Im RAM ein Array für ADMUX-Werte und Ergebnisse einrichten, dabei (bei 10-Bit-Messung) 3 mal so viele Bytes benutzen, wie Mess-Stellen vorhanden sind. Bei 8-Bit-Messung (ADLAR-Bit gesetzt) die zweifache Anzahl, da hier ADCL nicht gebraucht wird. Die Anzahl der Mess-Stellen bezeichne ich jetzt mal als "Offset". Das Array hat also 3 Bereiche, im ersten Bereich stehen die ADMUX-Werte, im zweiten Bereich die Werte aus ADCL und im dritten Bereich die Werte aus ADCH. Den (ersten) Bereich mit ADMUX-Werten mit Daten füllen (Referenz und Messquelle), Index für Array einrichten (Zähler für Mess-Stelle). Ersten Wert in ADMUX schreiben, ADC im Free-Run-Mode starten. Per Timer-Interrupt, dessen Intervall größer als der Zeitbedarf mehrerer Messungen sein muss, also z.B. den für Tastenentprellung benötigten Takt, neben der eigentlichen Arbeit noch Folgendes tun: - Y-Pointer per PUSH sichern, dann auf Array-Basisadresse plus Index setzen - ADCL lesen - Daten mit STD und Offset ins Array schreiben (Array-Bereich 2) - ADCH lesen - Daten mit STD und doppeltem Offset ins Array schreiben (Bereich 3) - Index erhöhen und zum Ring begrenzen, bei Bedarf ein Flag setzen, dass die Mainloop informiert, dass eine komplette Runde gelesen wurde und alle Daten neu sind. - Array ohne Offset lesen (ADMUX-Wert aus Bereich 1 holen) - Wert in ADMUX schreiben - Y-Pointer per POP wiederherstellen... Die Mainloop kann dann das Flag prüfen und wenn es aktiv ist alle benötigten Daten aus dem Array lesen und verarbeiten, dabei natürlich das Flag wieder löschen, die Daten sind ja gelesen. Braucht man unterschiedliche "Einschwingzeiten" für ADMUX, so kann man die Anzahl der Mess-Stellen erhöhen und die Messung mit der längsten Vorbereitungszeit durch identische ADMUX-Einträge mehrfach durchführen und nur die letzte Messung auswerten. Das kostet zwar ein paar zusätzliche Bytes im Array, spart aber einen weiteren Zähler und Rechenzeit im Interrupt. ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.