Guten Tag an alle:
Mein Problem sieht folgendermaßen aus:
Ich lese bei einem Mega8 Smd einen Spannungswert mit ADC ein. So weit so
gut, das funktioniert alles und zeigt die Werte am LCD an.
Jetzt wollte ich noch Leds blinken lassen und habe mir den Timer1 so
programmiert, dass die Led ein paar mal in der Sekunde blinkt.
Ohne den Timer1 funktioniert es wie gesagt einwandfrei. Schalte ich den
Timer1 ein, so stimmen die Werte ungefähr jede 5te Sekunde nicht und das
Lcd blendet falsche Werte ein. Meist so ca 300mV daneben. Danach passen
dir Werte wieder und nach ca 5 Sekunden schmeißt er wieder falsche Werte
rein.
Der Mega8 läuft mit internem Quarz, also 1MHz. Ich habe ihn aus der
Verpackung genommen und reingelötet, programmiert und ausprobiert.
Kann mir da einer helfen?
Vielen Dank
Gregor
>Der Mega8 läuft mit internem Quarz, also 1MHz.
Es gibt keinen internen Quarz !
>Ohne den Timer1 funktioniert es wie gesagt einwandfrei. Schalte ich den>Timer1 ein, so stimmen die Werte ungefähr jede 5te Sekunde nicht und das>Lcd blendet falsche Werte ein. Meist so ca 300mV daneben. Danach passen>dir Werte wieder und nach ca 5 Sekunden schmeißt er wieder falsche Werte>rein.
Haengen die LEDS an dem selben Port wie die Analog eingaenge ?
Dann koennte es sich um uebersprechen handeln.
Gruss Helmi
Danke für die Antwort!
Ja, das stimmt, die Leds hängen auf PC5 und PC4, sind zwar ADC Eingänge,
aber kann man ja als normalen Pin auch nehmen ?!?
Eingelesen werden drei Spannungsquellen auf PC0, PC1 und PC3.
hmmm, aber andere Pins sind "eigentlich" nicht mehr frei, da müsste ich
was ändern.
Glaubst du, dass es davon wirklich kommt? Dann versuch ich das mal zu
ändern.
LG
Gregor
Innerhalb des uC sind die Treibertransistoren fuer die Ausgaenge in der
gleichen Ecke wie die Analogeingaenge. Wenn du da jetzt eine LED dran
haengst fliesst das erstmal ein dicker Strom in dieser Ecke des uC. Das
kann schon eine verfaelschung der Messwerte zur folge haben.Es kann auch
sein das dieser Strom an den GND -Anschluessen des uC schon eine
Spannung abfallen laesst und die ueberlagert sich zur deiner
Messspannung.
Am besten ist es die LEDs ueber externe Treiber anzusteuern das waere
fuer den ADC die beste Wahl. In machen Datenblaettern steht auch das man
wenn man an den ADC-Port digitale Signale anlegt mit Rauschen auf den
ADC-Kanaelen zu rechnen hat. Einige Prozessorhersteller sehen aus diesen
Gruenden auch keine Outputs an diesen Ports vor.
Gruss Helmi
Angeschlossen sind alle Versogungspins.
Sprich alle 3xGND auf Masse und 2xVcc,AVCC und AREF mit 3,3V
Versorgung.Ist ein SMD Mega8.
Dazu habe ich noch zwischen AREF und GND 100nF und zwischen VCC und GND
auch noch einmal 100nF. Ich denke das sollte passen.
Was bedeutet Block-C für AREF? Ist das eh der 100nF Kondensator?
Kannst du mir bitte ein Beispiel nennen für so einen externen LED
Treiber, der bei mir passt (3,3V)?
Danke
Gregor
>Kannst du mir bitte ein Beispiel nennen für so einen externen LED>Treiber, der bei mir passt (3,3V)?
Im einfachsten Fall einen Transistor.
-------------------+---- +3.3V
|
A
LED
K
|
R1
|
C
AVR---- R2 ------B BC547B
E
|
GND
Ein 74HC04 kannst du auch dafür verwenden
Gruss Helmi
Gregor wrote:
> Ohne den Timer1 funktioniert es wie gesagt einwandfrei. Schalte ich den> Timer1 ein, so stimmen die Werte ungefähr jede 5te Sekunde nicht und das> Lcd blendet falsche Werte ein. Meist so ca 300mV daneben.
Das ist ja extrem viel. Was für einen Vorwiderstand nimmst Du denn für
die LED?
Du solltest die LED gegen GND schalten (high = an), dann fließt der
LED-Strom nicht über GND des MC und hebt nicht desssen internes
GND-Potential an.
Eine Möglichkeit ist auch, die LED immer während der Messung dunkel zu
tasten. Das dauert nur wenige µs, merkt man also nicht.
Oder nimm den Differenz-Modus des ADC.
Peter
hallo an alle,
ich habe wieder ein bisschen experimentiert:
Ich habe eine Spule mit 10uH zwischen Aref und Avcc angeschlossen. Das
hat nichts gebracht.
Weiters verwende ich als Vorwiderstand 100 Milliohm für die Leds.
Des weiteren habe ich herausgefunden, dass wenn ich den Timer einschalte
in Bascom, aber ihm nichts zuweise, also keine Leds die leuchten sollen,
dann funktioniert es problemlos! Sage ich ihm nun:
Timerroutine:
Isr_von_timer1:
Timer1 = 55000
If Sp0 < 4 Then Toggle Led1 Else Led1 = 0 ....Diesen Satz!
Return
Dann gehts nicht mehr!
Egal, auf welchen Pins die Leds liegen, habe auch schon einen Port
genommen, wo nicht die ADCs drauf liegen.
Hat bis jetzt alles nichts gebracht!
Meint ihr, ich soll mal einen 8MHZ Quarz anschließen? ODer hat das damit
nichts zu tun?
LG Gregor
Außerdem habe ich gerade herausgefunden, dass:
wenn ich diese Routine nehme:
Isr_von_timer1:
Timer1 = 55000
Toggle Led1
Toggle Led2
Return
Also die If Befehle weglasse, dann funktioniert es auch!
Ich wollte haben, dass wenn die Spannung unter 4V fällt, dass die Leds
blinken!
Wieso mag er keinen If Befehl im Timer?
LG
Gregor
Peter wrote:
> Weiters verwende ich als Vorwiderstand 100 Milliohm für die Leds.
Also Kurzschluß, na dann ist ja alles klar.
Es kann nicht gehen.
Ich nehme immer 1k (für low current LEDs).
Peter
ups, sorry! Ich bin BLÖD!
Nicht 100 milliohm, sondern 100 OHM!
Sollte man die nicht folgendermaßen ausrechnen?
R=(3,3V - 2V)/0,02 ???
Wieso nimmst du 1k?
Vielen Dank
Gregor
Wenn Du nicht uralte LED benutzt, mußt Du auch keine 20mA fließen
lassen,
um etwas zu sehen. Hast Du die LED, wie Peter riet, gegen +Ub
geschaltet?
Was auch besser wäre: In der ISR nur einen Merker zu setzen, den dann
in der Hauptschleife mit der Spannungsbedingung (Sp0<4) zu verknüpfen
und
anschließend wieder rückzusetzen. Aus der ISR sollte man so schnell wie
möglich wieder verschwinden.
MfG Paul
Zuerst, danke dass ihr die Zeit habt, mir zu helfen. Das hilft ungemein
weiter!
Also die Leds sind mit Minus an Masse und mit Plus über Vorwiderstand an
die Ports des Mega8 angeschlossen. Die Platine ist aber schon geätzt, da
kann ich nicht wirklich was ändern....
Ich ( Bin aber leider eher unwissend in diesem Bereich ) bin der
Meinung, dass es mit der ISR zu tun hat, weil wenn ich den If Befehl
raus nehme und einfach Toggle LED1 schreibe, dann blinkt die schön und
die Werte passen exakt und springen nicht.
@Paul: Kannst du mir vielleicht kurz erklären, wie das geht im Bascom,
von der ISR raus, kurz ins Hauptprogramm, und dann wieder zurück?
Oder einen Befehl? Auch in Bascom bin ich leider nicht der Bringer ;o(
Danke
Gregor
Würd' halt mal ein wenig Code posten, dann muss hier keiner raten. Und
kurz rein und raus heist, es ist schlecht wenn man alle 50mS einen
Interrupt aufruft, der dann 100mS Verarbeitungszeit hat.
Peter wrote:
> Also die Leds sind mit Minus an Masse und mit Plus über Vorwiderstand an> die Ports des Mega8 angeschlossen.
Dann ist es richtig rum.
Aber wenn VCC als Referenz dient, muß auf externe Referenz gesetzt
werden und VREF extern mit VCC verbunden werden. Sonst verringert der
Abfall über den VCC-Pin Deine Referenz.
Ob nun der Strombedarf der LED Schuld ist oder Deine Software, kannst Du
ganz leicht prüfen:
Laß die LED in der Software drin, aber klemme sie ab.
Peter
Danke Paul für deinen Einsatz,
doch leider auch keine Verbesserung.
Was mir auffällt ist, dass es ca. 6Sekunden dauert, bis ZWEI Fehler
kommen.
Also sechs Sekunden lang zeigt er das richtige an, danach kommt ein
Fehler, sagen wir zwischen 300 bis 1000mV daneben, danach kommt ganz
eine anderen Zahl, sagen wir 13673743 oder so....
Leds habe ich abmontiert, brachte keine Verbesserung. Also liegt es
nicht an denen.
puhhh....Mir fällt nichts mehr ein.
Noch kurz zu dem Statement:
Aber wenn VCC als Referenz dient, muß auf externe Referenz gesetzt
werden und VREF extern mit VCC verbunden werden. Sonst verringert der
Abfall über den VCC-Pin Deine Referenz.
Bei mir dient die Versorgungsspannung (3,3V) für die Referenz.
Was heißt: Muss auf externe Referenz gesetzt werden? Ist das Hardware
oder Software?
2xVCC und AREF und AVCC sind miteinander verbunden.
Liegt es vielleicht an den Spannungsteilern? Die sind 1K und 2,2K....
Also,
hab's kurz compiliert und hab' mir auch gedacht, daß das Umstellen der
If/Then Funktion in der ISR nichts bringt, hatte keinen Fehler beim
Compilieren bekommen.
Die ISR ist m.E. langsam genug, so daß da drin nix zeitkritisches
passiert, aber hier ein paar Vorschläge:
1) M.E. musst Du nicht den Timer in der ISR immer neu setzen, das kann
raus
2) Keine Fließkommarechnungen in einer ISR, Du vergleichst einen Single
Wert < 4
Fließkomma ist langsam. Vorschlag: Mach den Vergleich in der
Hauptschleife und setze ein "Blinkflag", daß Du dann in der ISR
auswertest.
3) Du hast ein langes Delay in der Hauptschleife, synchronisiere doch
gleich alles mit dem Interrupt. Damit kann man vermeiden, daß sich
Wandlung und Ausgabe in die Quere kommen:
Dim ISR_Sync as Bit
...
>>In die ISR:
...
ISR_Sync = 1
...
>>In die Hauptschleife zum Beginn:
...
ISR_Sync = 0
While (ISR_Sync = 0)
Wend
>> Hier könnte noch ein KLEINES Delay rein, damit würde man dem Port Zeit geben
zur Ruhe zu kommen, einfach ausprobieren.
...
Ggf. Timer1-Wert anpassen, sollte meiner Rechnung nach aber mit 2.3 Hz
aufgerufen werden und so passen.
Noooch was:
Config Adc = Single , Prescaler = Auto
ohne weitere Parameter nimmt bei VRef mit VCC verbunden die
Versorgungsspannung als Referenz. Musst aber aufpassen, ob Deine
Versorgungsspanmnung stabil ist, jede Schwankungen durch Belastung
verfälscht den gewandelten Wert. Ich nehme gerne die interne Referenz,
dann ist zwar der Maximalwert am ADC Pin bei 2.56V erreicht, aber da Du
scheinbar Spannungsteiler verwendest, kann man das anpassen. Bei
Verwendung interner Ref den ARef Pin von VCC lösen ! Und mit einem
passenden Kondensator zur Rauschminderung nach Masse versehen, siehe
Mega8 Datenblatt.
Dann:
Config Adc = Single , Prescaler = Auto, Reference = Internal
Hallo,
ich möchte noch alle ganz herzlich danken, die mir geholfen habe, bzw.
versucht haben zu helfen :o)
Ich habe es endlich geschafft.
Ich habe einen 8mhz quarz eingebaut mit zwei 22pf Kondensatoren. Fuse
bits umgestellt und nun klappt alles, so wie es soll.
ich weis zwar nicht, ob das die elleganteste Lösung ist, aber
funktionieren tut es!
Vielen Dank
Gregor
Aber bitte doch ;-)
Du hattest dann ein Timingproblem, da hat etwas zu lange gedauert.
Das wäre aber auch mit Umstellen der Fuse auf internen 8MHz Clock
gegangen :-)
@MWS: Danke, das wusste ich nicht. Muss ich mal schauen, wie man das
ganze einschaltet und so....
@Paul: Ich habe am Code nichts geändert. Der Code ist der selbe, wie ein
paar Posts vorher. nur natürlich 8 Mhz eingestellt.
Lg
Gregor
Gerne,
Umstellung der Fuses für interne 8 MHz im Programmer Dialog von Bascom.
Du hast ja bereits auf ext. Oszillator umgestellt, genau da müssten auch
die Option: internal RC 8 MHz Osc (oder so ist ähnlich) zu finden sein.