Home/Startseite
Shop
 Kauf auf Rechnung
 faire Versandkosten
 schnelle Lieferung
Kontakt / Service
 
login.php profile.php?mode=register index.php search.php faq.php
myAVR.de Foren-Übersicht » mySmartControl MK2 » Seltsames Verhalten des ADC auf dem myAvrControl
Neues Thema eröffnen  Neue Antwort erstellen Vorheriges Thema anzeigen :: Nächstes Thema anzeigen 
Seltsames Verhalten des ADC auf dem myAvrControl
BeitragVerfasst am: 29.12.2009, 12:11 Antworten mit Zitat
allgaeukaes
Anmeldungsdatum: 29.12.2009
Beiträge: 6
Wohnort: Oberallgäu




Hallo myAvr-Support!

Wir versuchen auf einem myAvrControl V1.09 den ADC auf dem Atmega168 im Single Conversion Mode mit folgender Parametrisierung zu betreiben:

ADMUX:
REFS1:0 = 00 > da laut Schaltplan AREF an VCC liegt!
ADLAR = 0 > Ergebnis rechts ausgerichtet
MUX3:0 = E > 1,1 V Band-Gap als Messeingang

ADCSRA:
ADEN = 1
ADATE = 0 > Auto-Trigger aus
ADIE = 1 > Interrupt für ISR-Routine zum Auslesen der Datenregister zulassen
ADPS1:0 = 11 > für Teiler 128 damit bei 20MHZ Systemtakt der ADC-Takt < 150 kHz

ADCSRB:
komplett auf 0x00

--------------------------------------------------------

Vorgesehener Programmablauf:
Der ADC soll im Single Conversion Modus nach Empfang eines bestimmten Zeichens über den UART starten, die Messung ausführen, per Interrupt den Abschluß der Wandlung und das Messdatum im Datenregister signaliseren und wieder auf den Start warten.
Die Initialsierung mit den obengennaten Parametern erfolgt zum Programmstart.I
m Anschluß an die ADC-Parametrisierung wird der globale Interrupt zugelassen Das Programm wartet jetzt in einer Endlos-Schleife auf ein bestimmtes Zeichen vom UART und startet sodann die Wandlung per ADSC = 1. Am Ende der Wandlung wird ein Interrupt ADIF erwartet, der über den zugehörigen ISR-Vector das Auslesen des/der ADC-Datenregister ausführt. Nach Beenden der ISR-Routine befindet sich das Programm wieder in der Warteschleife (reti) auf das "Start"-Zeichen vom UART.


So die Theorie.
In der Praxis tritt aber folgendes Problem auf, sobald die Interruptfreigabe = ADIE = 1 in der ADC-Parametrisierung erfolgt wird sofort der zugehörige ISR-Vector angesprungen obwohl die Wandlung NOCH NICHT per ADSC gestartet wurde!
Die Datenregister des ADC enthalten jedoch bereits den erwarteten Messwert.
Es ist so als der ADC entgegen der Parametrisierung im "free running modus"
läuft.

Diagnose:
Die zugehörige Anwendung ist auf Eclipse mit Win-Avr, letztes Release, in C erstellt.
Eine Portierung und Überarbeitung im AVRStudio hat keine Änderung erbracht.
(vermutlich weil das AVRStudio auch auf Win-Avr zurückgreift)
Eine Überprüfung des HEX-Listings und der Linker-Listen geben keinen Hinweis auf Fehler z.B. bei den ISR-Vectoren. Lässt man den Wandlungsprozess ohne Interruptfreigabe ablaufen ( Test ob ADSC noch 1) und holt die ADC Daten dann funktioniert es.
Devicetyp, Takt usw sind alles korrekt eingestellt. Eine externe Beschaltung der Ports auf dem myAvrController gibt es nicht. Die Betriebspannung wird aus dem USB-Anschluß genommen. Weil das myAVRControl zur Zeit den einzig für uns verfügbaren Atmega168 enthält und der auch noch eingelötet ist kann keine Referenzierung auf einem profesionellen Entwicklerboard erfolgen.

Was nun:
Bevor wir die Lösung in Assembler nachbauen,
die Frage ob etwas konstruktiv problematisch ist,
der Ansatz so nicht funktioniert,
ob es ähnliche Beobachtungen gibt
solche Probleme mit dem ADC bei 20MHz bekannt sind.

Erfahrungen sind wilkommen!
Benutzer-Profile anzeigen Private Nachricht senden
BeitragVerfasst am: 29.12.2009, 18:56 Antworten mit Zitat
Berecke
Anmeldungsdatum: 13.11.2008
Beiträge: 170
Wohnort: Berlin




Auch wenn ich nicht die Hotline bin, hatte ich mal beim Lesen der Datenblätter das Folgende entdeckt:

Code:
When changing the ACIS1/ACIS0 bits, the Analog Comparator Interrupt must be disabled by clearing its Interrupt Enable bit in the ACSR Register. Otherwise an interrupt can occur when the bits are changed.


Findet man auf Seite 242

http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf

_________________
Gruß Berecke
Benutzer-Profile anzeigen Private Nachricht senden ICQ-Nummer
Analog Digital Converter oder Analog Comparator
BeitragVerfasst am: 29.12.2009, 21:14 Antworten mit Zitat
allgaeukaes
Anmeldungsdatum: 29.12.2009
Beiträge: 6
Wohnort: Oberallgäu




Danke für den Hinweis!

Es geht hier auf der Seite 242 um den Analog-Comparator, ein logisch getrenntes Element vom Analog Digital Converter der mich zur Zeit "juckt"!

Trotzdem ist der Hinweis gut, weil dieses Ding mit dem Register ADCSRB einen gemeinsamen Punkt hat, wenn man die NEGATIVEN Signalquellen für den COMPARATOR auswählen will. Ich nutze den Analog-Comparator nicht. Dieses Teil muss aber im Gegensatz zu dem Analog Digital Converter bewusst ausgeschaltet werden, damit es NICHT stört! Das werd ich jetzt noch tun.
Benutzer-Profile anzeigen Private Nachricht senden
BeitragVerfasst am: 29.12.2009, 22:13 Antworten mit Zitat
Berecke
Anmeldungsdatum: 13.11.2008
Beiträge: 170
Wohnort: Berlin




Sowie ich das verstehe, läuft der ADC im Free-Running-Modus. Dann sollte nach Figure 23-7 auf Seite 248 ein automatischer Interrupt nach Digitalisierung der analogen Spannung ausgelöst werden.
Allerdings ist ADSC nach einem Reset auf log.0, was dem oben vermuteten widerspricht. Ist denn ADCSRA:ADSC vor der Interruptfreigabe richtig gesetzt? Stimmt der Ablauf beim Setzen der Register?

Oder...
Code:
A single conversion is started by disabling the Power Reduction ADC bit, PRADC, in Minimizing Power Consumption on page 40 by writing a logical zero to it and writing a logical one to the ADC Start Conversion bit, ADSC.


Es wäre schön zu erfahren, woran es denn nun lag.

_________________
Gruß Berecke
Benutzer-Profile anzeigen Private Nachricht senden ICQ-Nummer
Problem ist diagnostiziert
BeitragVerfasst am: 30.12.2009, 11:18 Antworten mit Zitat
allgaeukaes
Anmeldungsdatum: 29.12.2009
Beiträge: 6
Wohnort: Oberallgäu




Hallo!

Das Problem ist diagnostiziert. Das Programm nutzt den Sleep-Modus Idle wenn keine UART oder ADC Tätigkeit ansteht. Allerdings in dem Moment wo die MCU in Idle geht wird der Analog-Digital-Wandler automatisch gestartet. Das führt natürlich am Ende der Wandlung zu einem (gewollten, weil im ADC-Init enabled!) ADC Interrupt. Die CPU wird geweckt, die ISR Routine startet, die Messdaten werden gesichert usw. Danach schaut das Programm ob ein weiterer Auftrag vorliegt und geht irgendwann wieder in den Idle Zustand und startet dabei wieder automatisch den ADC! Das läuft so ab unabhängig davon ob man jemals den ADC per ADSC-Bit gestartet hat. Also ein impliziter Free Running Modus!
Das Verhalten entspricht zwar so nicht der Idle-Logik, die da heisst warte auf ein explizit angestossenes Ereignis. Es ist schon kurios wenn der Idle selbst ein Ereignis auslöst, aber es ist mal so implementiert!
Bei der ADC- Noise Reduction ist es sinnvoll das dort der ADC automatisch gestartet wird, da man ab dem Punkt eine definierte störungsarme Umgebung erwartet. Hier ist der Auftrag Störungen zu minimieren Auslöser für ein Ereignis.

Aber es ist mal so!


Gruß
Benutzer-Profile anzeigen Private Nachricht senden


Seltsames Verhalten des ADC auf dem myAvrControl
myAVR.de Foren-Übersicht » mySmartControl MK2
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Alle Zeiten sind GMT + 1 Stunde  
Seite 1 von 1  

  
  
 Neues Thema eröffnen  Neue Antwort erstellen  


Powered by phpBB © 2001-2004 phpBB Group
Designed for Trushkin.net | Themes Database
Deutsche Übersetzung von phpBB.de