PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC Problem am Mega8



Blue72
28.05.2009, 12:29
Hi Leute,

ich habe da ein Problem mit dem ADC.
Es liegt am ADC7 eine Spannung an von 3V (z.B.), zeitgleich mit dem einschalten des µC. Diese Spannung lasse ich mir über LEDs anzeigen.

Das Problem ist, das die anliegende Spannung erst dann erkannt wird wenn eine Änderung dieser Eintritt, vorher nicht.

Ich habe schon viel probiert, z.B. Stop ADC und direkt Start ADC eingefügt, um kurz die Spannung vom ADC zu entfernen.
Auch der Betriebsmodus Single oder Free brachte keine Änderung.
Hier mal das Programm:




$regfile = "m8def.dat"
$framesize = 32
$swstack = 64
$hwstack = 64
$crystal = 1000000

Dim I As Byte , W As Word , B(7) As Word , C(7) As Word , A As Byte

Config Portd = Output
Config Pind.7 = Input
Config Portb.1 = Output
Config Adc = Single , Prescaler = Auto , Reference = Avcc

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 8

Compare1a = 1

Config Timer0 = Timer , Prescale = 64
Enable Timer0
Enable Interrupts
On Timer0 Zaehlen

Do

W = Getadc(7)

If W > 0 And W < 50 Then : Led_port = &B10100111 : End If
If W > B(1) And W < C(1) Then : Led_port = &B11111001 : End If
If W > B(2) And W < C(2) Then : Led_port = &B11000000 : End If
If W > B(3) And W < C(3) Then : Led_port = &B10100100 : End If
If W > B(4) And W < C(4) Then : Led_port = &B10110000 : End If
If W > B(5) And W < C(5) Then : Led_port = &B10011001 : End If
If W > B(6) And W < C(6) Then : Led_port = &B10010010 : End If
If W > B(7) And W < C(7) Then : Led_port = &B10000010 : End If

Loop



Irgend jemand ne Idee woran es liegt ? Ich habe im Datenblatt des Mega8 nichts gefunden wo z.B. steht das der ADC erst bei Änderung der anliegenden Spannung was macht.
Wenn ich allerdings anstelle von W=GETADC(7) W=200 angebe funktioniert es sofort. Sobald sich der Wert einmal geändert hat funktioniert alles bestens, bis man den µC wieder abschaltet oder resettet.

kalletronic
28.05.2009, 12:42
Hi, wo steht denn in deinem Programm des "Start ADC" ?

Blue72
28.05.2009, 12:43
Hi,

hier:

Config Adc = Single , Prescaler = Auto , Reference = Avcc

danach startet der ADC automatisch. Allerdings habe ich auch trotzdem schon versucht es auch noch einmal hin zu schreiben.
Klappt aber auch nicht mit Start ADC.

ikarus_177
28.05.2009, 12:57
Hallo,

vielleicht hilft es, die verwendeten Pins am PortA (oder gleich den gesamten Port) zunächst auf Input zu schalten?
Jetzt ohne es probiert zu haben...

Viele Grüße

Blue72
28.05.2009, 13:00
Hi,

der ADC7 und ADC6 hängen nicht am Port A, diese sind zusätzlich vorhanden in der TQFP32 Version.

Gruß
Jens

ikarus_177
28.05.2009, 13:13
Kann es eventuell sein, dass du den ADC zu oft in der Hauptschleife abfragst? Versuche mal, eine kleine Pause (~50-150 ms) in der Hauptschleife einzubauen. Auch sollte man vor der eigentlichen Messung immer eine Dummy-Messung durchführen, deren Resultat wird dann einfach ignoriert.

Viele Grüße

Blue72
28.05.2009, 13:20
Hmm also es funktioniert ja alles super sobald man EINMAL die Spannung am ADC verändert. Danach läuft er wie er soll. Ich hab auch schon eine Pause von 200ms eingebaut, resultat wie vorher.

Sauerbruch
28.05.2009, 13:51
Vielleicht liegt das Problem ja ganz wo anders? Poste doch mal den ganzen Code...

Blue72
28.05.2009, 14:08
Im Prinzip ist das schon der ganze Code, vor dem DO kommt nur noch eine READEEPROM Routine um die Werte von B(x) und C(x) einzulesen.
Selbst danach hatte ich schon eine Pause von 2s eingelegt, brachte aber auch nichts.

MeckPommER
28.05.2009, 14:16
welche werte werden denn für b(x) und c(x) eingelesen? vielleicht erreicht der adc nie diese werte und zeigt deshalb nichts an?

Blue72
28.05.2009, 14:22
Doch doch, es sind Werte zwischen 0-1023.
Ich sag ja es funktioniert ja alles sobald man einmal die Spannung am ADC Eingang ändert. Ab diesem Zeitpunkt wird alles korrekt angezeigt und auch korrekt verarbeitet. An den Daten selbst kann es nicht liegen. Die externe Beschaltung ist auch einwandfrei.

MeckPommER
28.05.2009, 14:45
Nun ja, irgendwo muss der Fehler ja stecken, und das tut er meistens im Detail. Das originale Listing wäre hier von Vorteil, da man dann sehen kann, ob du z.B. led_port wirklich nicht definiert hast, etc.

An eine Fehlfunktion des ADC glaube ich nämlich auch nicht da ich diese schon oft verwendet habe, aber noch keine derartigen Probleme feststellen konnte.

Wenn alles ausser dem ADC funktioniert, könntest du also deine do-loop schleife durch eine for-next mit W als zählender Variable ersetzen und deine LED-anzeige geht fröhlich alle Anzeigewerte durch?

Am besten wäre also das originale Listing evtl sogar mit den Auszügen aus dem EEPROM. Und wenns dann auch nicht durchsichtiger wird, eine assembler-routine für den ADC stricken.

kannst du hinter dem getadc irgendwo kurz eine led aufleuchten lassen um zu sehen, ob der µC beim programmstart schon bei der messung hängt?

Gruß MeckPommER

Blue72
28.05.2009, 15:17
Ahhhhhh ausversehen gelöscht ](*,)

MeckPommER
28.05.2009, 16:08
So einen hängenden adc habe ich noch nicht gesehen *kopfkratz*

versuche es einfach mal mit einem LED-Aufleuchten hinter dem getadc. dann weißt du es genau.
Und das "start adc" würde ich trotzdem hinzufügen.

Blue72
28.05.2009, 21:28
Soooo ... hab den Fehler gefunden :)




Do

W = Getadc(7)

If W > 0 And W < 50 Then : Led_port = &B10100111 : End If
If W > B(1) And W < C(1) Then : Led_port = &B11111001 : End If
...
...
...


Loop


Die Zeile "If W>0 ..." hat den ADC zum aufhängen bewegt, egal wie hoch der Spannungswert am ADC Eingang auch war beim einschalten.
Ich habe die Zeile jetzt in "If W>=0 ..." geändert und nun funktioniert es so wie es soll =D>

Danke für eure Hilfe.

Gruß
Jens

ikarus_177
28.05.2009, 21:31
Und was war nun die Ursache der "Fehlfunkion"?

Viele Grüße

Blue72
28.05.2009, 21:33
Sorry, kam mit dem schreiben nicht schnell genug hinterher ;)