Hallo liebes Forum, ich stehe vor einem Problem und kann mir keine Lösung zusammenreimen: Ich habe auf Lochraster eine kleine Schaltung aufgebaut, wird über Batterie versorgt. Über einen Pushbutton werden einfach ein paar LEDS geschaltet, nix aufregendes. Als Gehäuse für mein Gerät habe ich ein 32mm PP-Abflußrohr genommen. Und ab hier wird es kurios: Packe ich die Schaltung in das Rohr, spinnt die Schaltung, nehme ich sie aus dem Rohr raus, läuft alles so, wie es soll. Die Schaltung spinnt auch nicht komplett, sondern interpretiert dann ein Tastendruck anscheinend als zwei, als wäre der Taster nicht entprellt, was ich aber softwaremäßig mache; habe jetzt eine Entprellzeit von ca. 60ms, aber es hilft nicht. Nehme ich das Rohr (welches die Platine auch nirgends berührt!) wieder weg, läuft alles so, wie es soll, also meine Billo-Entprellroutine funktioniert da einwandfrei. Kann irgendwer mit mir rumrätseln, was da los ist..? Leider ist die Kamera von meinem Telefon kaputt und ich kann euch keine Fotos schicken... Bin ratlos und über jeden Tip dankbar...
Claudia k. schrieb: > Leider ist die Kamera von meinem Telefon kaputt und ich kann euch keine > Fotos schicken... Wichtiger wäre wahrscheinlich der Schaltplan und die Software ...
Die statische Aufladung des Kunststoffrohrs wird dein Gerät beeinflussen. Vermutlich hast du ein paar hochohmige Eingänge?
Hallo, solche Abflussrohre laden sich gerne Mal statisch auf. Das hat sicherlich Auswirkungen auf deine Schaltung. Probiere Mal ein anderes Gehäuse oder das Rohr zu "entladen". Reicht evtl. schon es an ein Heizungsrohr zu halten.
:
Bearbeitet durch User
Florian mutmaßte:
> solche Abflussrohre laden sich gerne Mal statisch auf.
Naja, die Ladung fließt aber ganz schnell wieder ab, denn es handelt
sich ja schließlich um ein Abflußrohr.
Florian S. schrieb: > Probiere Mal ein anderes > Gehäuse oder das Rohr zu "entladen". Einen NICHTleiter??? Lieber die eine Hand an die Heizung und mit der Andren über die Plasteoberfläche streichen. Kleb Alufolie innen drüber o.ä.
Oh, danke für die schnellen Antworten, es wird wohl die statische Aufladung sein. Alle Pins sind belegt, ein Eingang mit internen Pullups (Attiny45). Kann ich das Rohr einfach mit meinem Ground verbinden? (Nichtlackiertes) Heizungsrohr hat nicht geholfen... Sonst wohl den Eingang extern beschalten... Muss kurz weg, bin in halber Stunde wieder da. Bis gleich und DANKE!
Mach an den Schalter bzw. PB2 einen externen Pullup hin, evtl. den Wert auf 1k oder niedriger
Claudia k. schrieb: > Kann irgendwer mit mir rumrätseln, was da los ist..? Nimm mal versuchsweise ein Katzenfell (o.ä.) und reibe kräftig über das PP-Rohr. Dies könnte die Probleme beheben oder zumindest signifikant verringern.
Wie groß ist R1? Ein 10n ... 100n nach GND am Reset wäre auch kein Fehler.
So: 1k als externen Pullup an den Eingang und alles läuft, wie es soll! Auf die statische Aufladung bin ich nicht gekommen... R1 ist 22k, hab noch einen 47n als Reset-Beschaltung hinzugefügt. Danke für die schnelle und erfolgreiche Hilfe! Schönen Abend euch allen!
Hat leider nur bei den ersten zwei Tests geholfen, jetzt wieder das gleiche Problem. Mist. Naja, probier ichs mal mit nem kleineren Widerstand und sonst Alufolie, wobei das auch nervt... Falls irgendwer noch ne andere Idee hat, i'm very open minded...
Peter K. schrieb: > Nimm mal versuchsweise ein Katzenfell (o.ä.) und reibe kräftig > über das PP-Rohr. Dies könnte die Probleme beheben oder zumindest > signifikant verringern. Habe gerade die Katzenfalle aufgestellt. Wenn Nachbars Katze heute nacht reintappt, probier ich das morgen.
Hallo Claudia, ich würde am Taster 10kOhm nach Plus und 10nF nach Masse schalten. Außerdem 100 Ohm in Reihe zum Eingang. Den internen Pull Up ausschalten. Der Microcontroller ist CMOS, deshalb braucht er 10nF Ceramic zwischen VDD und GND. Das liegt am komplementär MOS. Bei einer Push/Pull Schaltung wird theoretisch immer nur eine FET leitend. In der Praxis schalten für einen kurzen Augenblick beide gleichzeitig durch. Um die dadurch entstehende Stromspitzen auf der Versorgungsspannung zu vermeiden, muss der Kondensator so nahe wie möglich an die Pins. Vergisst man das, gibt das die ulkigsten Effekte ;-) Grüße, Andreas
Claudia k. schrieb: > Hat leider nur bei den ersten zwei Tests geholfen, jetzt wieder das > gleiche Problem. Mist. Naja, probier ichs mal mit nem kleineren > Widerstand und sonst Alufolie, wobei das auch nervt... > Falls irgendwer noch ne andere Idee hat, i'm very open minded... kalte Lötstelle? es scheint mir komisch das es im ausgebuten Zustandfunktioniert, Verspannung beim Einbau? Ich hatte das in meiner Industriezeit mit DIP Switches, auf dem ICT unter Vakuum mit Verbiegung arbeitete der Switch perfekt, in der Klimakammer fiel er aus, die Gehäuseschalen vom switch waren nicht passgenau zusammengefügt.
Joachim B. schrieb: > kalte Lötstelle? > es scheint mir komisch das es im ausgebuten Zustandfunktioniert, > Verspannung beim Einbau? Da hatte ich auch daran gedacht. Wie wird die Platine im Rohr mechanisch gehalten? Wird sie verklemmt oder verbogen? Claudia k. schrieb: > Leider ist die Kamera von meinem Telefon kaputt Keine richtige Kamera? Dann das Handy des Freunds / Kumpel /Partners? Bitte Bildformate beachten.
Joachim B. schrieb: > kalte Lötstelle? soetwas würde ich auch eher vermuten, oder einen Haarriss in einer Leiterbahn, ist das eine selbstgefertigte Platine? Eine statische Aufladung ist nach kurzer Zeit weg, die hat keinen dauerhaften, immer gleichen Einfluss auf die Funktion.
@ Johannes S. (jojos) >Leiterbahn, ist das eine selbstgefertigte Platine? Claudia k. (Gast) schrieb: >Ich habe auf Lochraster eine kleine Schaltung aufgebaut, wird über
also: ja, ist auf Lochraster aufgebaut. Habe allerdings drei Sück aufgebaut und durchprobiert, bei allen tritt das Problem auf. Auch nie direkt nachm Einbau sondern erst etwas später; Erst dachte ich auch, es wäre meine Entprellroutine, hab da alles mögliche durchprobiert und hat auch keine Abhilfe geschaffen. Dann dachte ich an die Befestigung und quasi das "Biegen" der Platine beim drücken des Tasters (denn sie "hing" quasi nur an der 5-poligen Stiftleiste, siehe Board oben). Hab dann Platine gegen das Biegen gesichert, auch keine Abhilfe. Gestern dann noch den Tip von Andreas B. ausprobiert (siehe Schaltplan). Auch da nochmal etwas mit Werten rumgespielt und C3 auch mal direkt an PB2 gesetzt, hat alles nicht geholfen. Katze war auch keine in der Falle. Hatte gestern Abend keine Alufolie (ist bei meiner Kamera), aber jetzt welche. Dann etwas Zeitungspapier um die Platine und dreimal Alufolie drum, et voila: läuft! Ich hab die statische Aufladung in drei Versuchsrohren nicht wegbekommen. Ich hatte auch schonmal ein identisches Rohr als Gehäuse genommen, da wurde ein Taster und zwei Potis ausgelesen, ohne großartige Sicherheitsmaßnahmen, das Gerät läuft bis heute ohne Probleme (ist aber auch von außen quasi von einem großen Schrumpfschlauch eingeschweißt). Tatsächlich trat das Problem immer erst nach einer kurzen Weile auf. Und alle Jubeljahre hat es dann mal richtig funktioniert. Also zumindest bei mir verschwand die statische Aufladung irgendwie nicht, oder kam vielleicht immer sehr schnell wieder, weil manchmal hat es ja funktioniert. Vielen lieben Dank für das rege Interesse und auch für die teilweise weiterführenden Hinweise! Jetzt weiß ich endlich was CMOS wirklich bedeutet! Danke und schönen Tag euch allen!
Schon wieder denkste: hab jetzt nochmal ne ganze Weile rumgespielt, das Problem trat immer noch auf, aber eher 1 von 10mal (und auch erst nach einer Menge guten Versuchen). Jetzt von außen Alufolie um das Rohr um neue Aufladung zu verhindern, bisher klappten 20 Versuche. Setze Versuchsreihe fort und berichte...
Ich würd mal testen ob der Fehler nicht vielleicht doch auch ausserhalb des Rohres auftritt. Denn das ganze klingt doch sehr nach Magie, die es bekanntlich nicht gibt.
Noch während der Testreihe schonmal die Frage: Alufolie um die Platine wickeln hat ja schon recht ordentlich geholfen; Gilt da wohl eigentlich auch die "Viel hilft viel"-Devise? Denn hatte jetzt auch wieder einmal das gleiche Fehlerbild. Also mit Alufolie von außen um Rohr und dreifach um Platine ca.1 von 30 Versuchen schlecht...
Claudia k. schrieb: > sondern interpretiert dann ein Tastendruck anscheinend als > zwei, als wäre der Taster nicht entprellt Exakt so isses, ein Delay ist eben noch lange kein Entprellen. Du nimmst zum Einlesen den externen Interrupt und das ist der Fehler. Wenn Du nach dem Delay den Interrupt wieder freigibst, hat der Preller schon lange das Interruptflag gesetzt und der nächste Interrupt wird ausgeführt. Daher erkennst Du immer 2 Tastendrücke. Eine saubere Entprellung mit Timerinterrupt und Mehrfachabfrage macht diesen Fehler nicht.
Wirklich: habs hundertmal ohne Rohr probiert, NIE ein Fehler. Sobald das Rohr drum ist (ohne Berührung der Platine) tritt das Problem sofort auf (ohne Alufolie). Ist mir tatsächlich ein Rätsel, weil wie gesagt, hatte schonmal einen ähnlichen Aufbau, ging reibungslos. Wie gesagt, verschiedene Platinen, verschiedene Rohre, verschiedene Led-Stränge. In allen Kombinationen: ohne Rohr bisher NIE einen Fehler, mit Rohr sehr häufig. Aber ich wills auch nicht auschließen, dass der Fehler woanders liegen könnte, hab da aber irgendwie schon alles, was mir einfällt, woran es noch liegen könnte, probiert. Probiere aber auch alle anderen erdenklichen Tips aus, bin auf gar keinen Fall beratungsresistent. Code jedoch würde ich tatsächlich ausschließen. Ich mach mal Mittagspause und hol ne Kamera und schick dann endlich mal Fotos!
Hi, ich würde gerne mal wissen wie denn die tasten gedrückt werden, wenn die Schaltung im Rohr steckt. Sprich: Wie und wo gehen denn die Taster nach "außen"?
habs hundertmal ohne Rohr probiert, Glaub ich gerne. Ich habe mal einen Fehler in einem Messgerät gehabt, der nur alle 500000 Versuche auftrat. Das war Ätzend. Vielleicht spielt das Biegen von Kabeln eine Rolle? Evtl dadurch veranlasste Kurzschlüsse/Unterbrechungen?
Peter D. schrieb: > Eine saubere Entprellung mit Timerinterrupt und Mehrfachabfrage macht > diesen Fehler nicht. Entprellung läuft ohne Delay über Timer, NICHT über Tastengesteuertes Interrupt sondern über Abfrage ca. alle 20 ms (auch da schon diverse Werte ausprobiert.) Wird momentan dreifach abgefragt. Hab auch schon fünfach abgefragt und was weiß ich ausprobiert, es ist nicht die Entprellroutine. Wie gesagt, ich mach mal Pause, ich kann dann auch meinen Code posten, aber da wird der Fehler nicht liegen. Weil eben eine mehr als signifikante Verbesserung nach der Alufolie auftrat. Und NIE ein Fehler ausserhalb des Rohres, mit allen möglichen Versuchen, blöde zu drücken. Essen, Fotos, Code. Und danke für eure Mithilfe.
Ich würde die Alufolie innen vollflächig aufs Rohr kleben. Dann kann sich innen schon mal überhaupt keine Ladung aufbauen. Außen angebracht, könnten sich innen immer noch unterschiedliche Ladungsbereiche auf der Plaste bilden. Ich glaue aber auch nicht mehr dran, das es daran liegt. Nicht nach all deinen Verbesserungen. Irgendetwas übersiehst du sicher, die Ladung müsste mittlerweile so hoch sein, um noch für die Störungen verantwortlich zu sein, das es den µC zerstörten würde.
Deswegen würde ich gerne den Aufbau mal sehen!
Hallo, claudia k. schrieb: > meine Entprellroutine, Was ist denn deine "Entprellroutine"? Die R6, R7, C3 an PB2 ist auch nicht korrekt! An PB2 ist dadurch kein RC-Tiefpass geschaltet, der HF Filter. Der Taster schliesst beim Betätigen C3 kurz, das führt zu einem hohen Strom und defekte Kontakte!
Würde es etwas helfen, das Rohr mit dem GND der Platine zu verbinden? also zusätzlich zur Abschirmung der Platine mittels Alufolie/Käfig
Also hier jetzt mal Fotos, ich denke, alles wichtige ist darauf zu erkennen. Vor allem: bei meinen Versuchsreihen ändere ich quasi tatsächlich nur die Position des Rohres, welches weder die Platine berührt. Auch habe ich das Batteriepack nicht reingepackt, also die Kabel sind nicht geknickt, sieht man auch auf den Fotos. Außerdem nochmal die Unterseite der Platine, ist jetzt etwas unsauber weil an der gestern noch viel Rumprobiergelöte, aber alles durchgefiept, nirgendwo Kontakt. So und jetzt ist es (endlich!) mal passiert: Ich sitz ja hier nebenbei rum und teste die ganze zeit, grad ohne Rohr drum, der Fehler ist jetzt auch so einmal aufgetreten. Also bei einem von ca. 50 Versuchen in dieser Reihe. Vorher ca. 100 Versuche ohne diesen Fehler. Vielleicht liegts doch an der Entprellung, dann Asche auf mein Haupt. Schicke gleich nen Post zu Code und Programmablauf...
miss mal den oberflächenwiderstand vom rohrmaterial (messbereich vom multimeter auf ca 100k stellen, abstand der messspitzen 1cm)
Hallo, Ich habe diese Rohre auch im Einsatz und verbaue hier HF-Schaltungen, Antennen Anpassungen, Schrauben V2A, V4A und Stecker PTFE und für die Aussenmontage spezifiziert. Somit alles Wasserdicht. Nein das ist kein Leiter, sonst wäre auch die Annahme der Elektronenaufladung unsinnig.
Unten gleich der relevante Code, zum Programmablauf: Programm is schlafen, wird über PinChange Interrupt aufgeweckt. Über den Taster können quasi vier Programme aufgerufen werden: Wird der Taster nach dem Anschalten für Zeit a gedrückt, kommt Programm 1, für Zeit 2a, dann Programm 2 usw. Der Fehler fällt auf, weil Programm 1 ein kleines Glücksspiel ist, quasi wie Münze werfen: es flackern immer abwechselnd 2 LEDS, Benutzer*in drückt irgendwann den Knopf, und das Programm pendelt quasi aus, also die Leds blinken abwechselnd immer langsamer, bis irgendwann das Ergebnis feststeht. Ich hoffe, ist einigermaßen verständlich. Der Fehler der nun die ganze Zeit auftrat: Direkt nach dem Anschalten springt das Programm quasi schon in den Pendelmodus, also als hätte jemand ganz schnell zweimal gedrückt (das vor allem im Rohr), obwohl ich sehr sicher bin, das eigentlich über entprellung zu unterbinden. Aber ich lass mich gerne eines besseren belehren... Und bitte nicht gleich schimpfen, wenn ihr den Code seht, ich bin noch sehr am üben und bring mir alles selber bei. Und weil jetzt das Problem auftrat hab ich den noch nicht hübsch gemacht... Timer1 ist für das LED-Geflacker, habe ein paar Sachen gekürzt (...) #include <avr/sleep.h> #include <avr/power.h> #include <avr/interrupt.h> #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #define F_CPU 1000000 #define button_down (!(PINB & (1 << PINB2))) #define kerze_1 PB0 #define kerze_2 PB3 #define orakel_1 PB1 #define orakel_2 PB4 #define ORAKEL 0 #define LAMPE_01 1 #define LAMPE_02 2 #define LAMPE_03 3 #define ZUFALLSWERT_ORAKEL ((rand() % 25) + 7) #define ABSCHALTZEIT 30 volatile uint8_t counter_timer0_flag = 0; volatile uint8_t counter_timer1_flag = 0; volatile uint8_t orakel_finale_flag = 0; volatile uint8_t orakel_links_rechts = 0; volatile uint8_t modus_counter = 0; volatile uint8_t lampenmodus_flag = 0; volatile uint8_t time_counter_bruchsekunde = 0; volatile uint8_t time_counter_sekunde = 0; volatile uint8_t time_counter_minute = 0; void init_timer0() { //timer_0 TCCR0A |= (1 << WGM01); //clear timer on compare match TCCR0B |= (1 << CS02) | (1 << CS00); // clock presscaler 1024 } void init_timer_CTC() { //timer_1 TCCR1 |= (1 << CTC1); // clear timer on compare match TCCR1 |= (1 << CS13) | (1 << CS12) | (1 << CS10); //clock prescaler 4096 OCR1C = 244; // compare match value TIMSK |= (1 << OCIE1A); // enable compare match interrupt } void stop_timer0() { TCCR0A &= ~(1 << WGM01); //clear timer on compare match TCCR0B &= ~((1 << CS02) | (1 << CS00)); } void initInterrupt(void) { GIMSK |= (1 << PCIE); // pin change interrupt enable PCMSK |= (1 << PCINT2); // pin change interrupt enabled for PCINT0 TIMSK |= (1 << OCIE0A) | (1 << OCIE1A); // enable compare match interrupt sei(); // enable interrupts } void sleep_now() { cli(); PCMSK |= (1 << PCINT2); PORTB &= ~((1 << orakel_1) | (1 << orakel_2) | (1 << kerze_1) | (1 << kerze_2)); _delay_ms(500); //stop_timer0(); set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sei(); sleep_mode(); sleep_disable(); TIMSK |= (1 << OCIE1A); init_timer_CTC(); init_timer0(); } void awake_now() { OCR0A = 20; PCMSK &= ~(1 << PCINT2); TIMSK |= (1 << OCIE1A); counter_timer0_flag = 0; counter_timer1_flag = 0; orakel_finale_flag = 0; orakel_links_rechts = 0; time_counter_sekunde = 0; time_counter_minute = 0; } uint8_t button_entprellt() { /* timer0 als zeitquelle; mit prescaler 1024 taktfrequenz von ca. 1/1000s; mit OCR0A = 20 ca. 20ms entprellzeit pro vollem durchlauf; */ uint8_t counter_intern = 0; uint8_t counter_entprellt = 0; uint8_t entprellrunden = 3; //je 20ms counter_timer0_flag = 0; for (uint8_t i = 0; i < entprellrunden; i++) { while (counter_timer0_flag != 1) { } counter_timer0_flag = 0; if (button_down) { counter_entprellt++; } } if (counter_entprellt == entprellrunden) { return 1; } else { return 0; } } uint8_t modus_choice() { uint8_t durchlaeufe = 30; OCR1C = 25; uint8_t counter_intern = 0; uint8_t counter_intern_timer0 = 3; PORTB |= (1 << orakel_1); PORTB &= ~(1 << orakel_2); while ((button_down) && (counter_intern < 3 * durchlaeufe)) { if (counter_timer0_flag == counter_intern_timer0) { counter_intern++; counter_timer0_flag = 0; } if ((counter_intern > durchlaeufe) && (counter_intern <= 2 * durchlaeufe)) { TIMSK &= ~(1 << OCIE1A); PORTB &= ~((1 << orakel_1) | (1 << orakel_2)); PORTB |= (1 << kerze_1) | (1 << kerze_2); } if ((counter_intern > 2 * durchlaeufe) && (counter_intern <= 3 * durchlaeufe)) { PORTB |= (1 << orakel_1) | (1 << orakel_2); } } if (counter_intern < durchlaeufe) { return ORAKEL; } if ((counter_intern >= durchlaeufe) && (counter_intern < 2 * durchlaeufe)) { return LAMPE_01; } if ((counter_intern >= 2 * durchlaeufe) && (counter_intern < 3 * durchlaeufe)) { return LAMPE_02; } else { return LAMPE_03; } } void orakel_endspiel(uint8_t spielzeit) { ... } void orakel_modus() { ... } void lampe_01_modus() { ... } void lampe_02_modus() { ... } void lampe_03_modus() { ... } int main(void) { //Ausgänge DDRB |= (1 << kerze_1) | (1 << kerze_2) | (1 << orakel_1) | (1 << orakel_2); //Eingang DDRB &= ~(1 << PINB2); //interne Pullups hoch //PORTB |= (1 << PB2); //Timer initialisieren init_timer0; init_timer_CTC(); //Interrupt initialisieren initInterrupt(); OCR0A = 20; while(1) { sleep_now(); awake_now(); //button_entprellt(); switch(modus_choice()) { case ORAKEL: orakel_modus(); break; case LAMPE_01: lampe_01_modus(); break; case LAMPE_02: lampe_02_modus(); break; case LAMPE_03: lampe_03_modus(); break; default: break; } } } ISR(TIMER0_COMPA_vect) { cli(); counter_timer0_flag++; time_counter_bruchsekunde++; if (time_counter_bruchsekunde == 50) { time_counter_bruchsekunde = 0; time_counter_sekunde++; if (time_counter_sekunde == 60) { time_counter_minute++; time_counter_sekunde = 0; } } sei(); } ISR(TIMER1_COMPA_vect) { ... } ISR(PCINT0_vect) { }
oh oh... Hab grad was gesehen, nämlich dass da ein Aufruf meiner Entprellung (quasi als delay) auskommentiert war... oh oh. An einer recht relevanten Stelle, gleich nachm Aufwachen... Heiei... Was einiges erklären würde, zwar nicht warum es vor allem im Rohr auftritt, aber sonst... Das wäre jetzt peinlich...
Hallo, ein kleiner Formalismus: In einer ISR löscht nicht und gibt das globale Interrupt Flag nicht frei, wenn man nicht weiss, was man tut!
1 | ISR(TIMER0_COMPA_vect) |
2 | {
|
3 | cli(); |
4 | :
|
5 | sei(); |
6 | }
|
Man frage sich bitte, was passiert, wenn eine Interrupt Anforderung erfolgt und der Interrupt Vektor angesprungen wird. Was passiert dann auf dem Stack?
Hallo, es sieht so aus als würdest du den externen Interrupt nicht disable, nachdem du die Taste erkannt hast. Ich würde folgendes vorschlagen: Timer aus Flankeninterrupt auf fallende Flanke aktivieren Wenn Taste gedrückt wird, kommt der Flankeninterrupt. In der Isr Flankeninterrupt disable und Timer starten Nach 20ms Timer stop. Portlevel checken, wenn Port low, dann Taste gedrückt, Flankeninterrupt auf steigende Flanke programmieren. Wenn Port high war, war Taste nicht lange genug gedrückt - Flankeninterrupt auf fallende Flanke programmieren. Wenn Taste losgelassen wurde kommt der Interrupt für steigende Flanke - key release Anschließend wieder auf fallende Flanke programmieren. Anmerkung: 20ms reichen normalerweise zur Entprellung Die Taste prellt nur beim Drücken, nicht beim Loslassen. Normalerweise wacht die CPU selbst auf bei einem Interrupt. Grüße Andreas
Ich glaube nicht, dass das dein Code ist. Da wird nirgends die Funktion "button_entprellen" aufgreufen, ausser im Main. Und dort ist es auskommentiert! Zudem macht die Funktion wenig sinn... nachfolgend habe ich nur die Variablen angepasst. Aber da man nicht erkennt wie die Funktion aufgerufen wird, ist das nur eine Vermutung für eine Verbesserung!
1 | uint8_t button_entprellt() |
2 | {
|
3 | /* timer0 als zeitquelle;
|
4 | mit prescaler 1024 taktfrequenz von ca. 1/1000s;
|
5 | mit OCR0A = 20 ca. 20ms entprellzeit pro vollem durchlauf;
|
6 | */
|
7 | //uint8_t counter_intern = 0; //<= WIRD NICHT VERWENDET
|
8 | uint8_t counter_entprellt = 0; |
9 | const uint8_t entprellrunden = 3; //<= KONSTANT |
10 | counter_timer0_flag = 0; |
11 | |
12 | for (uint8_t i = 0; i < entprellrunden; i++) |
13 | {
|
14 | while (counter_timer0_flag != 1) |
15 | {
|
16 | }
|
17 | |
18 | counter_timer0_flag = 0; |
19 | if (button_down) |
20 | {
|
21 | counter_entprellt++; |
22 | }
|
23 | else //<= PRELLEN MUSS COUNTER AUF 0 SETZEN |
24 | {
|
25 | counter_entprellt = 0; |
26 | }
|
27 | }
|
28 | |
29 | if (counter_entprellt == entprellrunden) |
30 | {
|
31 | return 1; |
32 | }
|
33 | else
|
34 | {
|
35 | return 0; |
36 | }
|
37 | }
|
Und die Funktion ist blockierend. Soll das so sein?
:
Bearbeitet durch User
Mir scheint, nach einer kurzen Testreihe, dass dieses kurze auskommentierte quasi-delay der Fehler war. Ich versinke vor Scham im Boden... Ich bin für alle Hinweise zu meiner Programmierung dankbar, weil da geht noch einiges besser... Muß jetzt aber erstmal zur Arbeit, nehme das Gerät mit und teste und schau heute Nacht hier nochmal vorbei... danke an alle!
claudia k. schrieb: > Habe allerdings drei Sück aufgebaut und durchprobiert, bei allen tritt > das Problem auf Dann kann man einen Wackelkontakt der beim Drücken des Tasters mechanisch auf die Platine übertragen wird zumindest ausschliessen, das wäre nämlich mein erster Gedanke gewesen.
Ganz kurz noch: Patrick B. schrieb: > Ich glaube nicht, dass das dein Code ist. Da wird nirgends die Funktion > "button_entprellen" aufgreufen, ausser im Main. Und dort ist es > auskommentiert! Habe ein paar unwichtige Codeteile weggelassen (void orakel..., void lampen...) da wird die Entprellung öfter aufgerufen, in dem Stil hier: void lampe_02_modus() { uint8_t go_sleep = 0; PORTB |= (1 << kerze_1) | (1 << kerze_2) | (1 << orakel_1) | (1 << orakel_2); time_counter_minute = 0; while ((go_sleep == 0) && (time_counter_minute < ABSCHALTZEIT)) { if (button_down) { if (button_entprellt()) { go_sleep = 1; } } } } Hier quasi als Ausschalter, an anderer Stelle als Stop-Schalter (für das das Münzspiel) Patrick B. schrieb: > Und die Funktion ist blockierend. Soll das so sein? Ist in der Anwendung gerade etwas egal, weil es passiert ja nichts außer LED-Geflacker, und das läuft über Timer1 und wird somit ja nicht blockiert. Ich bring mir gerade die Nutzung der Timer bei, würde mich auch freuen, es bald nicht-blockierend zu lösen, aber eins nach dem anderen... Offensichtlich haperts bei mir ja noch an grundlegenderen Dingen. Jetzt muss ich wirklich los, danke und ich nehm mir heute nacht alle anderen Anregungen zu Herzen...
Andreas B. schrieb: > Die Taste prellt nur beim Drücken, nicht beim Loslassen. Das würde ich nicht unterstreichen! Außer du hast eine Taste mit Hg-benetzten Kontakten, die prellt dann aber auch beim Drücken nicht.
HildeK schrieb: > Andreas B. schrieb: >> Die Taste prellt nur beim Drücken, nicht beim Loslassen. > > Das würde ich nicht unterstreichen! > Außer du hast eine Taste mit Hg-benetzten Kontakten, die prellt dann > aber auch beim Drücken nicht. Normalerweise prellt die Taste beim Loslasen nicht, problematisch sind höchsten Schiebeschalter. Das ist auch klar, wenn man sich die Mechanik anschaut. Da werden die zwei Kontakte mit Federkraft, ausgelöst durch den Tastendruck, aufeinandergepresst. Man kann das auch sehr schön mit einem Speicherscope anschauen. Zur zusätzlichen Sicherung habe ich ja den Kondensator gegen Masse empfohlen. Mit dem Widerstand bildet das einen Tiefpass.
@Andreas B. Du schreibst "Die Taste ...". Das kann man nicht unkommentiert stehen lassen, oder gibt es nur die eine? :-) Ich kenne viele und auch sehr schlechte darunter. Ich würde allgemein einfach nicht darauf bauen ...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.