Hi, kann mir Jemand erläutern, wieso meine Status-Funktion "allways TRUE" zurück liefert?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
Also an dem PIN hängt ein OptoCoupler, der richtig angesprochen wird. Grüße Oekel
|
Anzeige
|
PIN vs PORT beim OUTPUTHi, kann mir Jemand erläutern, wieso meine Status-Funktion "allways TRUE" zurück liefert?
Also an dem PIN hängt ein OptoCoupler, der richtig angesprochen wird. Grüße Oekel Ok, der Code ist 100% korrekt. Ich hatte lediglich vergessen den Header des obigen Schnipsels einzubinden. Daher die neue Frage: Wieso ist bool test = heater_STATUS(); immer TRUE, wenn heater_STATUS() extern definiert wurde und er es nicht finden kann? Grüße Oekel
Gast
#5100218
D a v i d K. schrieb: > Also an dem PIN hängt ein OptoCoupler, der richtig angesprochen wird. Damit ist wirklich alles erschöpfend erklärt. Ich liebe sie, diese Prosa-Schaltpläne.
Gast
#5100242
Lieba Gedichte schrieb: > Ich liebe sie, diese Prosa-Schaltpläne. nicht nur prosa Schaltpläne. Auch Prosa Fehlermeldungen D a v i d K. schrieb: > wenn heater_STATUS() extern definiert wurde und er es nicht > finden kann Und zu PINC gibt es nicht mal Prosa.
Gast
#5100379
Möglicherweise hast du den Optokoppler ohen Vorwiderstand zwischen den PIN und VCC angeschlossen. Dadurch liegt der PIN immer auf High. Das PIN Register liest den aktuellen Zustand des PIN ein. Das PORT Regsietr kannst du benutzen, um abzufragen, welchen Pegel der Ausgang eigentlich haben sollte. Zwischen beiden besteht ein Unterschied, wenn der Ausgang kurzgeschlkossen wird.
Gast
#5100387
D a v i d K. schrieb: > Wieso ist bool test = heater_STATUS(); > immer TRUE, wenn heater_STATUS() extern definiert wurde und er es nicht > finden kann? Weil er sich für etwas entscheiden muß und ahnt, daß es extern mit TRUE intitialisiert wurde. Ich würde zuallererst mal nachmessen, welcher Pegel bzw. welche Spannung denn tatsächlich am Pin 7 vom Port C liegt. Dieses Messergebnis könnte bedeutend für den Programmverlauf sein... isimmerso schrieb: > D a v i d K. schrieb: >> Wieso ist bool test = heater_STATUS(); >> immer TRUE, wenn heater_STATUS() extern definiert wurde und er es nicht >> finden kann? > > Weil er sich für etwas entscheiden muß und ahnt, daß es extern mit TRUE > intitialisiert wurde. Naja, er dürfte es nicht einmal compilieren. Deswegen wundert es mich gerade das er überhaupt einen Status annehmen kann ;-) Lothar M. schrieb: > Ich würde zuallererst mal nachmessen, welcher Pegel bzw. welche > Spannung denn tatsächlich am Pin 7 vom Port C liegt. Dieses > Messergebnis könnte bedeutend für den Programmverlauf sein... Wie ich oben bereits geschrieben habe ist der Code richtig. Und selbstverständlich habe ich einige Iterationen durch, in denen ich validiert habe, dass die Ausgänge richtig schalten. Hinzu kam lediglich die Statusabfrage, die ich an anderer Stelle im Programcode benötigte. Rene K. schrieb: > isimmerso schrieb: >> D a v i d K. schrieb: >>> Wieso ist bool test = heater_STATUS(); >>> immer TRUE, wenn heater_STATUS() extern definiert wurde und er es nicht >>> finden kann? >> >> Weil er sich für etwas entscheiden muß und ahnt, daß es extern mit TRUE >> intitialisiert wurde. > > Naja, er dürfte es nicht einmal compilieren. Deswegen wundert es mich > gerade das er überhaupt einen Status annehmen kann ;-) Danke euch beiden. Diese Info hatte ich vermutet und gebraucht. Wieso er überhaupt compiliert und wieso ein DEFAULT dann zu TRUE falsifiziert ist mir immer noch ein Rätsel. Hätte wie ihr auch erwartet, dass der Compiler zumindest eine Warnung ausgibt. Nichts dergleichen! D a v i d K. schrieb: > Wieso er überhaupt compiliert und wieso ein DEFAULT dann zu TRUE > falsifiziert ist mir immer noch ein Rätsel. Hätte wie ihr auch erwartet, > dass der Compiler zumindest eine Warnung ausgibt. Nichts dergleichen! Wenn es keine Meldung vom Compiler gibt, woher weißt du dann überhaupt, dass "er es nicht finden kann"? Alles irgendwie sehr nebulös. D a v i d K. schrieb: > der Compiler Welcher denn? Und was änderst du jetzt in deinem Programm zwischen "geht" und "geht nicht"? > Diese Info hatte ich vermutet und gebraucht. Dass ein Compiler etwas "ahnt"? > Wieso er überhaupt compiliert und wieso ein DEFAULT dann zu TRUE > falsifiziert ist mir immer noch ein Rätsel. Du solltest das mal auf einen "Dreizeiler" reduzieren, so dass du ein einfaches Programm hast, das mal den Fehler aufweist und mal nicht. Dann kann man das evtl. nachvollziehen. Aber bisher waren die allermeisten "Compilerfehler", die Anfänger hatten, letztlich Bedienfehler. Ich hatte bisher erst 2 richtige Fehler im Compiler, einer trat sofort nach einem Update auf. Der andere hat fast eine Woche Zeit gekostet, um nachzuweisen, dass es tatsächlich der Compiler war, der einen unaligned Zugriff falsch abhandelte.
Gast
#5101010
Lothar M. schrieb: > Und was änderst du jetzt in deinem Programm zwischen "geht" und "geht > nicht"? Das hatte er ja zu Eingangs beschrieben: D a v i d K. schrieb: > Ich hatte lediglich vergessen den Header > des obigen Schnipsels einzubinden. Und da er keine Lust hat, das nochmal auszuprobieren oder gar zu verstehen, ist die angebotene Lösung der vorausahnenden Kompilierung ausreichend ;-)
Gast
#5101020
Achim S. schrieb: > vorausahnenden Kompilierung Ein schöner Ausdruck! Muß ich mir unbedingt merken, wenn es mal wieder um die "Ahnungen" eines Compilers geht. Das hat schon fast was von "künstlicher Intelligenz" :-) Stefan E. schrieb: > Wenn es keine Meldung vom Compiler gibt, woher weißt du dann überhaupt, > dass "er es nicht finden kann"? > > Alles irgendwie sehr nebulös. Na weil mein Programm die Ausgänge regelmäßig ändert , sonst bräuchte ich ja keinen MC. Also Header eingebunden und Ablauf/Display beobachtet.
Gast
#5101396
Nee... So nicht! Wenn der Kompiler was nicht findet, dann hagelt es Errors. Spätestens der Linker bricht dir dann ins Essen. Denn der hat die Pflicht, die extern Deklaration aufzulösen, mit einer Adresse zu versehen. D a v i d K. schrieb: > Na weil mein Programm die Ausgänge regelmäßig ändert , sonst bräuchte > ich ja keinen MC. > Also Header eingebunden und Ablauf/Display beobachtet. Gutes Vorgehen, um "mal eben kurz zu schauen", schlechtes Vorgehen um damit die Frage in einem Forum wie diesem zu starten. Als nächstes könntest du mal direkt am PIN des uC messen, welche Spannungen da anliegen (am besten mit einem Oszi). Sollte da wider Erwarten eine Spannung kleiner 0.3*Vcc anliegen kannst du beginnen, Stück für Stück deinen Code abzuspecken bis der Fehler verschwindet. Sollte der Fehler bis zum Schluss, wenn der Code also so einfach ist wie möglich, immer noch da sein kannst du den Quellcode mal packen und hier hoch laden. Vielleicht erkennen dann die Spezialisten wo genau das Problem ist.
Gast
#5101469
D a v i d K. schrieb: > DDRC |= ((1 << PC3) | (1 << PC4) | (1 << PC5) | (1 << PC6) | (1 << > PC7)); /* Ausgaenge */ Könnte es nicht so sein, dass der Pin PC7, auf Eingang geschaltet werden sollte bevor man ihn abfragt? > bool heater_STATUS(){ > return (PINC & (1 << PC7)); > //return (PORTC & (1 << PC7)); Was ich mich frage, wifür überhaupt zurück lesen? Der aufrufende Teil könnte sich ja auch einfach merken was passiert, zumal hier ja auch sowieso noch eine globale Variable gesetzt wird. Die Variable könnte dann auch noch so zurück gesetzt werden
Na, vielleicht, eher mit weniger Zeilen. :-) Einzeiler zu kapseln finde ich generell etwas überflüssig. Vor allem welche die nicht danach aussehen als bräuchte man die drölfzig Mal im Code. Und statt das sich das Programm den Zustand merkt kann man das auch so einrichten das in jedem Umlauf erneut entschieden wird ob was an oder aus sein soll. Die Bedingung die zu einem heater_ON() führt ist ja sowieso schon vorhanden und wird geprüft. D a v i d K. schrieb: > Wie ich oben bereits geschrieben habe ist der Code richtig. Und > selbstverständlich habe ich einige Iterationen durch, in denen ich > validiert habe, dass die Ausgänge richtig schalten. Na wenn sowohl der Code korrekt ist, als auch elektrisch alles passt, dann ist die einzige übrig bleibende Erklärung, dass dein µC kaputt ist. Hi Wenn z.B. ein OC-Ausgang benutzt wird, können auch 'Andere' die Leitung auf LOW ziehen. Obwohl man gerade selber HIGH sendet (in diesem Fall den PullUp an hat und der Port auf IN geschaltet ist), muß Das nicht mit dem tatsächlichen Stand zu tun haben - deshalb liest man den Zustand des Pin, weil man nicht wissen will, was geplant ist, sondern, was wirklich anliegt. MfG Patrick J. schrieb: > Wenn z.B. ein OC-Ausgang benutzt wird, können auch 'Andere' die Leitung > auf LOW ziehen. Das sieht nur schwer nach AVR aus und die haben keine Open-Collector Ausgänge, zumindest nicht als IOs. Zur Überwachung würde ich dann auch einen anderen Pin als Eingang benutzen. Auch bei einem AVR kann man, wenn der Pin sich im Output befindet, den IST-Zustand über PINx abfragen. Gerade wenn mit Pull-Up / -Down gearbeitet wird ist dies sehr hilfreich. Ob dies nun bei allen AVR so ist, kann ich nicht beurteilen - zumindest geht es beim ollen Attiny2313, Mega16 und Mega32u4. Rene K. schrieb: > Auch bei einem AVR kann man, wenn der Pin sich im Output befindet, den > IST-Zustand über PINx abfragen. Ja, klar. Nur wenn der Pin als Ausgang geschaltet ist und auf High, aber extern gegen Low gezogen wird, dann ist der Pin kurz vor dem Abfackeln. Ebenso anders herum mit dem Pin auf Low geschaltet und extern gegen Plus gezogen. Das kann man zwar abfragen, sowas sollte aber schon in der Schaltung gar nicht möglich sein. Rudolph R. schrieb: > Patrick J. schrieb: >> Wenn z.B. ein OC-Ausgang benutzt wird, können auch 'Andere' die Leitung >> auf LOW ziehen. > > Das sieht nur schwer nach AVR aus und die haben keine Open-Collector > Ausgänge, zumindest nicht als IOs. Korrekt. Ungeachtet dessen könnte ein auf H gesetzter Ausgangspin trotzdem extern auf L gezogen werden. Das ist dann zwar nicht ganz regelkonform, insbesondere weil dann ein heftiger, möglicherweise sogar außerhalb der absolute maximum ratings liegender Kurschlußstrom aus dem Pin fließen würde. Aber gehen würde es. Und: man könnte genau diesen Fall durch das Lesen des PIN-Registers feststellen. > Zur Überwachung würde ich dann auch einen anderen Pin als Eingang > benutzen. Das wäre im eben geschilderten Szenario kein Vorteil. Rolf M. schrieb: > D a v i d K. schrieb: >> Wie ich oben bereits geschrieben habe ist der Code richtig. Und >> selbstverständlich habe ich einige Iterationen durch, in denen ich >> validiert habe, dass die Ausgänge richtig schalten. > > Na wenn sowohl der Code korrekt ist, als auch elektrisch alles passt, > dann ist die einzige übrig bleibende Erklärung, dass dein µC kaputt ist. Wobei ein Blick auf bisherige Beiträge des TE (beileibe nicht nur in diesem Thread) die Wahrscheinlichkeiten ganz massiv dahin verschiebt, die Annahme "der Code [ist] richtig" in Frage stellen zu wollen. Rudolph R. schrieb: > Ja, klar. > Nur wenn der Pin als Ausgang geschaltet ist und auf High, aber extern > gegen Low gezogen wird, dann ist der Pin kurz vor dem Abfackeln. > Ebenso anders herum mit dem Pin auf Low geschaltet und extern gegen Plus > gezogen. > Das kann man zwar abfragen, sowas sollte aber schon in der Schaltung gar > nicht möglich sein. Das ist richtig. :-) Es heißt ja nicht ob es gut ist, sondern ob es geht. Die Frage die ich in den Raum geworfen habe war ja auch nicht, ob das funktioniert, sondern wofür überhaupt. :-) OpenCollector jetzt mal ausser acht gelassen. Wenn sowas möglich ist buche ich das als Schaltungsfehler und wenn mir der Pin abfackelt nützt es herzlich wenig wenn die Software davon was merkt.
Gast
#5101535
Axel S. schrieb: > ein heftiger, möglicherweise sogar > außerhalb der absolute maximum ratings liegender Kurschlußstrom aus dem > Pin fließen würde. Aber gehen würde es. Und: man könnte genau diesen > Fall durch das Lesen des PIN-Registers feststellen. Nicht wirklich. Ein Strom außerhalb der Maximum Ratings zerstört den µc in beliebig kurzer Zeit. Ob du das vor der Zerstörung noch durch Rücklesen des Pins erkennen kannst und auch noch dagegen reagieren kannst, ist Zufall und mit Sicherheit auch abhängig vom Controllerchip und dessen Herstellungscharge. xXx schrieb: > Könnte es nicht so sein, dass der Pin PC7, auf Eingang geschaltet werden > sollte bevor man ihn abfragt? Nein, das ist nicht erforderlich. Rudolph R. schrieb: > Was ich mich frage, wifür überhaupt zurück lesen? Um z.B. an anderen Stellen im Programm zu prüfen, ob grade geheizt wird oder nicht. Kann man auch mittels Flag in Software machen, man kann aber auch den Hardware-Pin einfach abfragen. Mach ich fast immer so. Axel S. schrieb: >> Na wenn sowohl der Code korrekt ist, als auch elektrisch alles passt, >> dann ist die einzige übrig bleibende Erklärung, dass dein µC kaputt ist. > > Wobei ein Blick auf bisherige Beiträge des TE (beileibe nicht nur in > diesem Thread) die Wahrscheinlichkeiten ganz massiv dahin verschiebt, > die Annahme "der Code [ist] richtig" in Frage stellen zu wollen. Darauf wollte ich eigentlich auch hinaus. Es ist eben ungeschickt, wenn das System nicht funktioniert und man um Hilfe bittet, zuerst mal voller Inbrunst zu postulieren, dass man alles richtig gemacht hat. Das lässt nicht viele Möglichkeiten für Hilfe zur Lösung des Problems offen. MaWin schrieb: > Ein Strom außerhalb der Maximum Ratings zerstört den µc in beliebig > kurzer Zeit. Wie kurz sind die denn deiner Erfahrung nach? > Ob du das vor der Zerstörung noch durch Rücklesen des Pins erkennen > kannst und auch noch dagegen reagieren kannst, ist Zufall und mit > Sicherheit auch abhängig vom Controllerchip und dessen > Herstellungscharge. Ich hab's zwar noch nicht ausporbiert, aber kann mir irgendwie nicht vorstellen, dass bei einem Kurzschluss am I/O-Pin der µC innerhalb einer einstelligen Zahl von Mikrosekunden abraucht. Rolf M. schrieb: > Ich hab's zwar noch nicht ausporbiert, aber kann mir irgendwie nicht > vorstellen, dass bei einem Kurzschluss am I/O-Pin der µC innerhalb einer > einstelligen Zahl von Mikrosekunden abraucht. Ein Atmega328 verkraftet mehrere Millisekunden das Eineinhalbfache des im Datenblatt angegebenen Wertes für einen Pin, das ist zumindest meine Erfahrung
Gast
#5101557
Rolf M. schrieb: > Wie kurz sind die denn deiner Erfahrung nach? Das spielt keine Rolle, weil es bei deinem Chip anders ist. Wenn Elektronik für eine beliebig kleine Zeit außerhalb der Maximum Ratings betrieben wird, dann ist sie als defekt anzunehmen. D a v i d K. schrieb: > Wieso ist bool test = heater_STATUS(); > immer TRUE, wenn heater_STATUS() extern definiert wurde und er es nicht > finden kann? Also ich verstehe das jetzt so, dass das Programm wie gewünscht funktioniert, wenn die Header-Datei eingebunden wurde. Fehlt diese, tut es das nicht. Der Grund liegt im C-Standard. Erst einmal sind (aus historischen Gründen) Funktionsprototypen im Gegensatz zu C++ nicht obligatorisch. Der Compiler sieht einen fehlenden Prototypen daher nicht als Fehler an, sondern geht bei der Kompilierung der aufrufenden Funktion defaultmäßig davon aus, dass der Rückgabe-Wert der aufgerufenen Funktion ein int ist, auf dem AVR also 2 Bytes. Die aufgerufene Funktion hat den Rückgabewert bool, beschreibt also nur ein 8-Bit-Rückgabe-Register. Die aufrufende Funktion interpretiert jedoch zwei Register als Rückgabewert (int). Der (implizite) cast von int nach bool ist laut Standard immer true, wenn der int-Wert ungleich Null ist. Steht also in dem als High-Byte des Rückgabewertes interpretierten Register keine Null (was meistens der Fall ist), ergibt sich also am Ende ein 'true', selbst wenn die Funktion selbst ein 'false' zurück gegeben hat. Daher: Immer alle Warnungen des Compilers einschalten und auch ernst nehmen! Detlev T. schrieb: > Daher: Immer alle Warnungen des Compilers einschalten und auch ernst > nehmen! Sollte er eine Header nicht finden, wirft er keine Warnung raus sondern bringt einen Fehler und compiliert garnicht erst. Rene K. schrieb: > Sollte er eine Header nicht finden, wirft er keine Warnung raus sondern > bringt einen Fehler und compiliert garnicht erst. D a v i d K. schrieb: > Ok, der Code ist 100% korrekt. Ich hatte lediglich vergessen den Header > des obigen Schnipsels einzubinden. MaWin schrieb: > Wenn Elektronik für eine beliebig kleine Zeit außerhalb der Maximum > Ratings betrieben wird, dann ist sie als defekt anzunehmen. Ich würde es etwas anders formulieren: man muss mit einem Defekt rechnen. Denn: - der Hersteller garantiert unterhalb der Maximum Ratings, dass das Bauteil nicht kaputt geht - der Hersteller garantiert aber nicht, dass das Bauteil oberhalb der Maximum Ratings kaputt geht.
Gast
#5101636
> Ein Strom außerhalb der Maximum Ratings zerstört den µc > in beliebig kurzer Zeit. Mein Motorrad schafft auf ebener Strecke maximal 140km/H. Laut Betriebsanleitung soll ich vermeiden, über einen längeren Zeitraum mit maximaler or annähernd maximaler Geschwindigkeit zu fahren, besonders bei erhöhter Temperatur. Das ist genau so ein Wischiwaschi, wie der maximale Strom von I/O Pins bei Mikrochips. In den 90er Jahren machte ich anhand eines PC Mainboardes die Erfahrung, daß die 74LS245 Bustreiber sehr empfindlich auf Schrauben im Slot reagieren. Ich kann mich allerdings nicht erinnern, daß mir danach jemals auch nur irgendein IC wegen Kurzschluss an einem einzelnen Ausgang kaputt gegangen wäre (womit ich nicht behaupten will, daß alle IC's kurzschlussfest seien). Insofern würde ich "in beliebig kurzer Zeit" auf "in beliebig langer Zeit" ändern. Es ist in der Praxis lange nicht so dramatisch, wie deine Bemerkung anmutet. Zur Erkennung von Kurzschlüssen kann ich mir durchaus vorstellen, das PIN Register eines AVR Ausganges zu lesen. Man könnte dann die Leitung deaktivieren und eine entsprechende Fehlermeldung anzeigen. Detlev T. schrieb: > Rene K. schrieb: >> Sollte er eine Header nicht finden, wirft er keine Warnung raus sondern >> bringt einen Fehler und compiliert garnicht erst. > > D a v i d K. schrieb: >> Ok, der Code ist 100% korrekt. Ich hatte lediglich vergessen den Header >> des obigen Schnipsels einzubinden. Ja dazu darfst du folgendes aber auch nicht vergessen: D a v i d K. schrieb: > wenn heater_STATUS() extern definiert wurde und er es nicht > finden kann? M. K. schrieb: > Ein Atmega328 verkraftet mehrere Millisekunden das Eineinhalbfache des > im Datenblatt angegebenen Wertes für einen Pin, das ist zumindest meine > Erfahrung Ein Atmega verkraftet monatelang einen Kurzschluss gegen Vcc oder GND ohne merkbaren Schaden. Ich habe das mal an 10 getestet und die dann gegen neue Atmega vermessen: auch nach 2 Monaten Kurzschluss keine messbaren Unterschiede zu unbelasteten Pins ode Pins neuer AVR. Stefan U. schrieb: > Insofern würde ich "in beliebig kurzer Zeit" auf "in beliebig langer > Zeit" ändern. Es ist in der Praxis lange nicht so dramatisch, wie deine > Bemerkung anmutet. So ist es. Man kann sogar einen kompletten Port kurzschließen. Der AVR wird heiß, funktioniert aber hinterher trotzdem noch. xXx schrieb: > Könnte es nicht so sein, dass der Pin PC7, auf Eingang geschaltet werden > sollte bevor man ihn abfragt? Sieh dir einfach mal die innere Beschaltung eines AVR IO-Pins an: den Pegel am Pin kannst du immer lesen. Egal, ob der Treiber auf Ein- oder Ausgang geschaltet ist. Lothar M. schrieb: > Ein Atmega verkraftet monatelang einen Kurzschluss gegen Vcc oder GND > ohne merkbaren Schaden. Das ist eine gewagte These an deren Korrektheit ich Zweifel hege. Vielleicht klappt das unter so Randbedngungen wie das der Spannungsregler gar nicht genug Strom liefern kann.
Gast
#5101758
Stefan U. schrieb: > Das ist genau so ein Wischiwaschi, wie der maximale Strom von I/O Pins > bei Mikrochips. Wenn das Programm den Pin abfragt, ob der Kurzschluss-Fall eingetreten ist, dann hab ihr einen Fehler in eurem Schaltungsdesign. Denn ihr habt euer System außerhalb der Spezifikation designed. Das wird euch auf jeden Fall auf die Füße fallen. Der Kurzschluss muss schaltungstechnisch/programmtechnisch verhindert werden. Er darf in keinem Fall auftreten können. Und dann braucht man ihn auch nicht abzufragen, da er ja nicht auftreten kann.
Gast
#5101762
Lothar M. schrieb: > Ich habe das mal an 10 getestet und die dann > gegen neue Atmega vermessen Und aufgrund dieser Stichprobe gehst du jetzt mit deinem Kurzschlusskonzept in deinem Design in Serie? Sehr gewagt. Der AtMega ist nicht für Kurzschlüsse am Pin ausgelegt. Wenn das durch äußere Gegebenheiten auftreten kann, muss es in einer Vorschaltung abgefangen werden. Und dann braucht man den Pin auch nicht abzufragen.
Gast
#5101778
> Das wird euch auf jeden Fall auf die Füße fallen.
Na wenn du meinst... Das Gute ist, wir müssen uns nicht einige werden.
Wenn die Schaltung zuverlässig funktionieren soll, sollte man zweifellos
nur das tun, was das Datenblatt zusichert.
Wenn es billig sein soll, dann einfach mal ausprobieren, was geht. Aber
hinterher nicht rumheulen, wenn ein Bauteil dabei dann doch kaputt geht.
Gast
#5101779
Stefan U. schrieb: > Na wenn du meinst... Das Gute ist, wir müssen uns nicht einige werden. > > Wenn die Schaltung zuverlässig funktionieren soll, sollte man zweifellos > nur das tun, was das Datenblatt zusichert. > > Wenn es billig sein soll, dann einfach mal ausprobieren, was geht. Aber > hinterher nicht rumheulen, wenn ein Bauteil dabei dann doch kaputt geht. Na also. Da sind wir uns dann doch noch einig geworden.
Gast
#5101789
Lothar M. schrieb: > Ein Atmega verkraftet monatelang einen Kurzschluss gegen Vcc oder GND > ohne merkbaren Schaden. Vorsicht! > Ich habe das mal an 10 getestet und die dann > gegen neue Atmega vermessen: auch nach 2 Monaten Kurzschluss keine > messbaren Unterschiede zu unbelasteten Pins ode Pins neuer AVR. Das ist durchaus glaubhaft, aber nur unter bestimmten Randbedingungen, deren wichtigste ist: Es muss ein grosses Gehäuse sein (oder auch ein kleines Gehäuse, dann aber auf relativ viel Kupfer darunter). Der erste Knackpunkt ist nämlich die Verlustleistung. Solange das Gebilde die loswerden kann, ohne die Temperatur im Hotspot allzusehr ansteigen zu lassen, geht die Sache halbwegs in Ordnung. Eins meiner privaten Beispiele dazu: Nutzung zweier (komplementär betriebener) Timer-OCR-Ausgänge zum direkten Betrieb eines (magnetdynamischen) Lautsprechers im Brückenbetrieb. DDS-PWM, entsprechende Filterschaltung natürlich vorher durchgerechnet und hardwaremässig auch tatsächlich vorhanden. Diese Anwendung (näherungsweise Leistungsanpassung, also nichtmal wirklich Kurzschluss) schafft es im Dauerbetrieb, einen Mega1284P in DIP40 auf ca. 20K über Umgebungstemperatur zu bringen. Das ist tatsächlich relativ unkritisch und läuft monatelang im Dauerbetrieb ohne jegliche Probleme und es sind auch, genau wie du es beschreibst, danach keinerlei Degradationserscheinungen messbar. AAABERR: mit einem 1284P im 7x7mm VQFN-Gehäuse geht die Sache schon ganz anders aus (du ahnst, wie genau...) Und wenn du es nicht wahrhaben willst: Probier es einfach selber aus, die Rauchwolke, als Entertainment aufgefasst, ist die 7 Euro durchaus wert ;o) Zu der Abwärmeproblematik kommt allerdings noch ein weiteres Problem hinzu, welches allerdings im privaten Umfeld oder Büroumgebungen wohl kein Problem darstellt, spätestens in der EMV-Prüfung aber gnadenlos aufgedeckt wird. Energieeintrag mit hinreichenden Transienten (Teil der EMV-Prüfung) grillt auch die solcherart überlasteten Ausgänge eines 1284P im DIP40-Gehäuse zuverlässig und hochgradig (nämlich zu 100%) reproduzierbar. Allerdings ist gut möglich, dass dieser Effekt bei einem wirklichen Kurzschluss am Ausgang nicht aufgetreten wäre, weil der Energieeintrag im konkreten Fall offensichtlich über die Zuleitung zum Lautsprecher erfolgt ist und kein gnädiger Kurzschluss sie vom Ausgangstreiber ferngehalten hat. Ein wenig Ferrit-Magie an der richtigen Stelle löste dieses Problem... MaWin schrieb: > Stefan U. schrieb: >> Das ist genau so ein Wischiwaschi, wie der maximale Strom von I/O Pins >> bei Mikrochips. > > Wenn das Programm den Pin abfragt, ob der Kurzschluss-Fall eingetreten > ist, dann hab ihr einen Fehler in eurem Schaltungsdesign. Richtig. Ich wollte das auch keinesfalls als empfehlenswertes Design darstellen, sondern nur darauf hinweisen, daß es u.U. tatsächlich sinnvoll sein kann, den Pegel an einem auf Ausgang geschalteten Pin per Zugriff auf das PIN Register zurückzulesen. Als Designpattern taugt das so richtig erst bei open-drain Ausgangsstufen. Was den Defekt des µC angeht - das hängt wesentlich an bishher nicht diskutierten Randbedingungen. Die Ausgänge der AVR können IIRC bei 3.3V Versorgung ohnehin schon nicht so viel Strom treiben, wie die maximum ratings erlauben. In diesem Fall wäre man also schon mal auf der sicheren Seite. Ansonsten ist das Limit ein thermisches. Die MOSFET in den Ausgangsstufen schnüren früher oder später ab und begrenzen den Ausgangsstrom. Die Frage ist, ob die Verlustleistung und die damit einher gehende Temperaturerhöhung ausreicht, den Chip permanent zu schädigen.
Gast
#5101827
Axel S. schrieb: > Als Designpattern taugt das > so richtig erst bei open-drain Ausgangsstufen. Ich lese auch öfter einen Output Pin ein. Das erspart ein Flag im Ram. Kann mich nicht erinnern, da jemals einen falschen Wert bekommen zu haben. Never.
Beitrag #5101856 wurde von einem Moderator gelöscht.
Arduino F. schrieb: > Ich lese auch öfter einen Output Pin ein. > Das erspart ein Flag im Ram. Da könntest du aber genauso gut das PORT-Register nehmen. Rolf M. schrieb: > Arduino F. schrieb: >> Ich lese auch öfter einen Output Pin ein. >> Das erspart ein Flag im Ram. > > Da könntest du aber genauso gut das PORT-Register nehmen. Kleiner Tipp: Für solche Zwecke haben ATMEGAs General Purpose IO-Register (GPIO). Das sind einzelne Bytes von Speicher, die im IO-Bereich (0x00-0x3F) liegen und daher sehr effizient angesprochen werden können. Hi Arduino F. schrieb: > Kann mich nicht erinnern, da jemals einen falschen Wert bekommen zu > haben. > Never. Hier bei mir geht es nicht um einen 'falschen' Wert - bei mir hier geht es darum, ob jemand Anders den Pin auf LOW zieht - und Da ist die Abfrage, ob der Pin wirklich HIGH ist, nicht die schlechteste Wahl. MfG
Beitrag #5101939 wurde von einem Moderator gelöscht.
Beitrag #5101944 wurde von einem Moderator gelöscht.
... und da sind Sie, die Nazi-Vergleiche :) Wie war dazu der Fachbegriff? Jupp, dieser Post darf ohne Bedenken (mit) gelöscht werden. @Hater Die paar Takte Unterschied vom aktivem Setzen des Ausgang bis zum Einlesen dürften durch ein rjmp oder Interrupt-Aufruf locker erreicht werden. Mich interessiert, ob der IST mit dem SOLL-Zustand überein stimmt. Mein Ablauf: - Pin setzen (IN HIGH oder OUT LOW, das HIGH kommt von einem PullUp) - bei PinChange 'nachsehen', welchen Pgel wir gerade haben und, ob Das unser Pegel ist - bei LOW Außen und HIGH Innen kann ich davon ausgehen, daß da Jemand Anders 'funkt'. Die Zwischenzeit, Die der PIN braucht, um mein aktives Setzen umzusetzen, habe ich nach dem nächsten rjmp bereits überbrückt. Ich sehe in dieser Verzögerung keine Probleme. MfG PS: Wobei ich nicht der TO bin - nur nebenbei erwähnt
Beitrag #5101956 wurde von einem Moderator gelöscht.
Gast
#5101976
Patrick J. schrieb: > Die paar Takte Unterschied vom aktivem Setzen des Ausgang bis zum > Einlesen dürften durch ein rjmp oder Interrupt-Aufruf locker erreicht > werden. Natürlich. Aber wenn du in Assembler schreibst: sbi PORTy, BITx sbic PINy, BITx rjmp anywhere rjmp anywhereelse wirst du wider Erwarten bei anywhereelse landen. Und, es kann dir auch in plain C passieren, dass genau dies passiert, wenn du sinngemäß den gleichen Code schreibst. Übrigens ist das gerade dank der relativ guten Optimierung des Compilers so... Nur in dem Arduino kann das nicht passieren, weil der eben einfach lahm ist. Genau um die Unterdrückung dieser Information ging es vermutlich eigentlich im Wesentlichen bei der Löschung meines Posting. Und genau darum, dass ich nicht bereit bin das zu akzeptieren, weil ich das für einen niederen Beweggrund halte, geht es hier.
Beitrag #5101979 wurde von einem Moderator gelöscht.
Beitrag #5101994 wurde von einem Moderator gelöscht.
Rudolph R. schrieb: > Das ist eine gewagte These an deren Korrektheit ich Zweifel hege. Tu das. c-hater schrieb: > Aber wenn du in Assembler schreibst: > sbi PORTy, BITx > sbic PINy, BITx > rjmp anywhere > rjmp anywhereelse > wirst du wider Erwarten bei anywhereelse landen. Kommt drauf an. Auf die Taktfrequenz und die Last am Pin. Im ohmschen Normalfall geht es hier wie erwartet nach anywhere... c-hater schrieb: > AAABERR: mit einem 1284P im 7x7mm VQFN-Gehäuse geht die Sache schon ganz > anders aus (du ahnst, wie genau...) Und wenn du es nicht wahrhaben > willst: Probier es einfach selber aus, die Rauchwolke, als Entertainment > aufgefasst, ist die 7 Euro durchaus wert ;o) Werde ich tun. BTW: die Löschungen deiner Posts könnten in deiner unnötig unmöglichen Wortwahl liegen. Ich bin sicher, du weißt, was ich meine. Wenn solche Worte zu deinem Umgangsformen gehören, dann lass sie dort. Hierher gehören sie jedenfalls nicht.
Gast
#5102011
> Im ohmschen Normalfall geht es hier wie erwartet nach anywhere
Also bei mir (ein ATmega328P) geht es, wie erwartet, nach anywhereelse.
Gast
#5102022
Und die dazu gehörende Stelle im Datenblatt: "When reading back a software assigned pin value, a nop instruction must be inserted as indicated in Figure 14-4."
Gast
#5102023
Lothar M. schrieb: > Kommt drauf an. Auf die Taktfrequenz und die Last am Pin. Im ohmschen > Normalfall geht es hier wie erwartet nach anywhere... OMG. Nein. Du hast offensichtlich nicht ein AVR8 Datenblatt wirklich gelesen... Wenn schon die Zensoren so derart krass anfähig sind, wie soll sich denn dann jemals die Wahrheit durchsetzen? > BTW: die Löschungen deiner Posts könnten in deiner unnötig unmöglichen > Wortwahl liegen. Das kann dann höchstens "Arduidiot" gewesen sein. Ich finde den Begriff allerdings auch im Rückblick nicht nur sehr kreativ und lustig, sondern obendrein überaus zutreffend... Aber OK, ich kann voll verstehen, dass er den Arduidioten selber vermutlich nicht so gefällt und sie auch nicht in der Lage sind, das einfach an sich abgleiten zu lassen, wie erwachsene Nutzer des Internet das zu tun in der Lage wären... Als Kompromiss würde ich der Zensur vorschlagen, in Zukunft einfach nur solche mißliebigen Begriffe zu "schwärzen", statt gleich das ganze Posting zu löschen... Oh, ich weiß, dass das geht. Macht allerdings den Zensoren mehr Arbeit. So what: Für so viel Macht muss man auch mal ein wenig (mehr) arbeiten... Ihr seid euch doch hoffentlich bewußt, welch große Macht ihr ausübt? c-hater schrieb: > in Zukunft einfach nur solche mißliebigen Begriffe zu "schwärzen", statt > gleich das ganze Posting zu löschen... Habe ich dann ja auch gemacht. Allerdings ist es eben unglaublich mühsam, den Dreck anderer wegzuräumen. c-hater schrieb: > Nein. Du hast offensichtlich nicht ein AVR8 Datenblatt wirklich > gelesen... Doch schon mal. Aber danke für die Erinnerung an dieses Gebastel. Das war bei den ersten AVR übrigens noch nicht so, es kam erst mit dem ersten Shrink und der dabei eingeführten Synchronisationsstufen an den Eingängen. c-hater schrieb: > Aber OK, ich kann voll verstehen, dass er den Arduidioten selber > vermutlich nicht so gefällt und sie auch nicht in der Lage sind, das > einfach an sich abgleiten zu lassen, wie erwachsene Nutzer des Internet > das zu tun in der Lage wären... Erwachsene Nutzer sollten aber auch in der Lage sein, Postings ohne Beschimpfungen zu verfassen. > Als Kompromiss würde ich der Zensur vorschlagen, in Zukunft einfach nur > solche mißliebigen Begriffe zu "schwärzen", statt gleich das ganze > Posting zu löschen... Ich schlage vor, solche Begriffe ganz einfach nicht zu verwenden, wenn du nicht willst, dass deine Postings gelöscht werden. > Oh, ich weiß, dass das geht. Macht allerdings den Zensoren mehr Arbeit. > So what: Für so viel Macht muss man auch mal ein wenig (mehr) > arbeiten... Nur weil du dich nicht beherrschen kannst, sollen andere sich extra Arbeit machen? Lass die Beleidigungen einfach weg, dann wird auch nix gelöscht, und niemand hat irgendwelche Arbeit damit, deine Posting davon zu bereinigen. Die Moderatoren sind doch nicht deine Putzfrauen, die hinter dir her wischen... > Ihr seid euch doch hoffentlich bewußt, welch große Macht ihr ausübt? In den Nutzungsbedingungen steht klar, dass Beiträge, die Beleidigungen enthalten, gelöscht werden. Nicht vom Moderator so umformuliert, dass sie den Regeln entsprechen, sondern gelöscht!
Gast
#5102328
Lothar Miller schrieb: > Das war bei den ersten AVR übrigens noch nicht so, > es kam erst mit dem ersten Shrink und der dabei > eingeführten Synchronisationsstufen an den Eingängen. Wann soll das gewesen sein - beim AT90S1200? Mein ältester, ein AT90S8515-8PI von 9825, verhält sich genauso.
Gast
#5102407
c-hater schrieb: > Das kann dann höchstens "Arduidiot" gewesen sein. Ich finde den Begriff > allerdings auch im Rückblick nicht nur sehr kreativ und lustig, sondern > obendrein überaus zutreffend... Schade dass fachliche und soziale Kompetenz nicht immer in Personalunion in Erscheinung treten. Du bewegst dich, in Sachen sozialer Kompetenz, eher auf den Niveau einer Bordsteinkante. Zur Erinnerung: Das Grundgesetz spricht von "Würde". Und das Strafgesetz kennt die "Beleidigung". Du bewegst dich mit deinen Äußerungen im strafbaren Bereich, und findest das auch noch toll. Sogar stolz drauf. S. Landolt schrieb: > Mein ältester, ein AT90S8515-8PI von 9825, verhält sich genauso. Mhmmmm... Offenbar trügt mich die Erinnerung. Ich finde da auch nichts mehr. Oder ich verwechsle das tatsächlich mit dem 8051. Dieses Verhalten ist aus meiner Sicht als Hardware-Designer sowieso ein Fehler im Silizium. Aber wie heißt es so schön: "Wir waren jung und brauchten das Geld!" ;-)
Gast
#5102456
@Arduino Fanboy Du hast zwar Recht aber dein Beitrag ist auf ebenso niedrigem Nieveau. Nur die Wortwahl ist gepflegter. Lass ihn doch einfach, jeder bekommt irgendwann die gerechte Strafe für sein Handeln - sei es durch andere oder weil sie sich irgendwann selbst in die Sch*** rein reitet. Da muss man gar nicht nachhelfen. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|