Hallo,
ich will mit meinem AtMega8 (fertig verschalten auf dem
Experimentierboard von myAVR) eine Spannung von 0-5V messen.
Das ganze lief auch Anfangs über den ADC0 des µC ganz gut, nur habe ich
den Fehler gemacht die Schaltspitzen meiner Spannung außer acht zu
lassen, diese haben meinen ADC-Pin zerstören.
Mittlerweile habe ich die Schaltung umgestellt, sodass diese
Spannungsspitzen nicht mehr vorkommen ;-)
Der AtMega8 hat ja laut Datenblatt mehrere ADC Pins, kann ich einfach
den Wert über einen anderen Pin einlesen? Wenn ja, wie? Oder bleibt mir
nichts anderes übrig einen neuen zu kaufen?
Mein bisheriger Quelltext:
1
classApplication:publicController
2
{
3
// Bausteine und Attribute .........................................
4
protected:uint8_twert;
5
protected:uint8spannung,analogwert;//Variablen für Berechnung und Ausgabe festlegen
spannung=analogwert*50/255;//Errechnen des realen Spannungswertes
35
konsole.sendByte(analogwert);//Analogwert an Konsole für Oszi
36
37
text.format("Spannung= %u,%u V \n",spannung/10,spannung%10);//Formatierung Ausgabetext
38
39
konsole.sendString(text);// Textausgabe an Konsole
40
}
41
}app;// Anwendungsinstanz
Das bringt mich zu meinem 2. Problem:
Ich kann die Uart Ausgabe nicht takten, sozusagen gibt mir die Uart die
Werte in einem mir unbekannten (jedoch zu hohem) Takt aus.
Versuche ich über "waitUs" eine kurze Pause zu bewirken sendet mit die
Uart gar nichts mehr. Verhindert die Funktion onStart das ganze? Wie
umgehe ich das?
Vielen Dank. :-)
Ich würde den Controller entsorgen, selbst wenn er sonst noch
funktioniert, kostet ja nicht die Welt.
Ansonsten kannst du natürlich auf einen anderen Eingang wechseln. Evtl.
gehts.
Tobias K. schrieb:> Der AtMega8 hat ja laut Datenblatt mehrere ADC Pins, kann ich einfach> den Wert über einen anderen Pin einlesen?
Das kommt drauf an, was du wirklich zerstört hast.
Der Mega hat ja nicht 8 ADC-SChaltungen sondern nur einen einzigen.
Über einen auf dem IC eingebauten 'Schalter' kannst du einen der 8 ADC
Pins an diesen einen real existierenden ADC anschalten und mit dem ADC
die Spannung an diesem Pin messen.
> Wenn ja, wie?
In dem du den Multiplexer (so heißt der Schalter) auf den gewünschten
Pin einstellst.
> Oder bleibt mir> nichts anderes übrig einen neuen zu kaufen?
Wie gesagt: Kommt drauf an, was du genau zerschossen hast. Wenn es nur
die Clamping Dioden erwischt hat, dann mag es auch so noch gehen.
Karl Heinz schrieb:>> Wenn ja, wie?>> In dem du den Multiplexer (so heißt der Schalter) auf den gewünschten> Pin einstellst.
Was mag wohl die 0 hier
1
spannungmesser.config(0);
für eine Bedeutung haben.
Weißt du. Ich finde das immer ein wenig seltsam, wenn Leute hier
aufschlagen, die sagen, 'sie' hätten ein Programm geschrieben und dann
recht offensichtlich von dem Quelltext, den sie präsentieren nicht die
geringste Ahnung haben, während alle die, die das zugrunde liegende
Framework überhaupt nicht kennen, sofort mal 2 oder 3 heiße, viel
versprechende Spuren sehen, denen es sich lohnen könnte nachzugehen.
Tobias K. schrieb:> Ich kann die Uart Ausgabe nicht takten, sozusagen gibt mir die Uart die> Werte in einem mir unbekannten (jedoch zu hohem) Takt aus.
Die Uart gibt ganz offensichtlich
1
konsole.config(9600);
die Ausgaben mit 9600 Baud aus. Stell das Terminal auf 9600 und wenn die
Taktfrequenz des µC korrekt eingestellt ist und auch das Framework diese
Taktfrequenz kennt, dann muss das funktionieren.
Der häufigste Fehler an dieser Stelle ist der, dass der µC eben nicht
mit der Taktfrequenz läuft, von der der Programmierer annimmt das er es
tut. Wenn die Taktfrequenz aber nicht stimmt, dann stimmen zwangsläufig
alle davon abhängigen Timings nicht mehr.
Ein nagelneuer Mega8 läuft ab Werk mit ca. 1Mhz aus dem internen
Taktgenerator. Egal ob da phsyikalisch ein QUarz oder ein
Quarzoszillator angeschlossen ist. Damit derartige Bausteine (die die
Frequenz wesentlich exakter einhalten als der interne RC_generator) aber
wirksam werden, muss man sie mittels der µC-internen Fusebits auch
aktivieren. Tut man das nicht, dann kann der Quarz an den Anschlüssen
hängen bis er vergammelt, der Mega benutzt ihn deswegen trotzdem nicht.
@Karl Heinz
vielen Dank für deine Hilfe. Konnte es umstellen, die anderen Pins
funktionieren zum Glück. Habe aber dennoch zur Sicherheit einen neuen
bestellt, denn der µC wird warm bis heiß und das sollte er im normalen
Betrieb ja wohl nicht.
Und zu deiner Vermutung muss ich zugeben, ja ich habe den Quelltext aus
einem Tutorial für ADC übernommen und nach meinem Denken angepasst und
erweitert, da entgehen einem wohl solche Details, wie man z.B. den ADC
Pin umstellt, habe das aber auch bisher noch nie benötigt.
Karl Heinz schrieb:> Stell das Terminal auf 9600 und wenn die> Taktfrequenz des µC korrekt eingestellt ist und auch das Framework diese> Taktfrequenz kennt, dann muss das funktionieren.
Ich habe die Baudrate auf 600 gesenkt, auch in der UartBrdige
Einstellung, nun sendet es in einer besseren Rate.
Problematisch ist jetzt nur, dass die LED nicht mehr ausgeht, also die
Eingänge sich nicht mehr abschalten.
Hallo,
waitUs nimmt nur 8bit werte als Parameter
waitUs(5000000); das macht irgendwas nur nicht was du erwartest für
längere Wartezeiten solltest du waitMs nehmen.
des weiteren vermeide im Timer-Interrupt die Multiplikation und Division
und ganz besonders das Formatieren und senden von Strings, setze nur ein
Flag und erledige das in onWork. In Interrupts immer nur schnelle Sachen
machen alles was Zeit braucht muss in die Mainloop also hier onWork.
Gruß J.
@JochenZ:
Vielen Dank für deine Antworten!
Habe auch schon versucht das ganze über if-Schleifen zu lösen, aber da
hing es an der Umsetzung. Auf deinen Weg wäre ich wohl so schnell nicht
gekommen. ;)
Hab nur ein paar Kleinigkeiten wie Ports anpassen müssen.
Habs getestet und es klappt wunderbar.
Tobias K. schrieb:> nur habe ich> den Fehler gemacht die Schaltspitzen meiner Spannung außer acht zu> lassen, diese haben meinen ADC-Pin zerstören.
Eingänge schaltet man generell nicht direkt an Spannungsquellen. Da
gehört ein Schutzwiderstand mindestens 1k, besser 10k in Reihe.
Und wenn diese Quellen der VCC vor- oder nacheilen können, ist er sogar
Pflicht.
Die einzigen Anschlüsse, die direkt an Spannung liegen dürfen sind
(A)VCC.
@Peter Dannegger:
Ich musste sowieso einen Spannungsteiler einsetzen, jetzt ist der
Eingang mit einem 100k Widerstand abgesichert.
Will zur Sicherheit noch eine Z-Diode (5,1V) dazuschalten damit da
nichts mehr anbrennen kann.