Forum: Mikrocontroller und Digitale Elektronik Schaltung spinnt nach Einbau in Gehäuse (PP-Rohr)


von Claudia k. (Gast)


Lesenswert?

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...

von HildeK (Gast)


Lesenswert?

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 ...

von Juergen P. (optronik)


Lesenswert?

Die statische Aufladung des Kunststoffrohrs wird dein Gerät 
beeinflussen. Vermutlich hast du ein paar hochohmige Eingänge?

von Teo D. (teoderix)


Lesenswert?

Statische-Aufladung vs offene Eingene!?

von Florian S. (florian_s263)


Lesenswert?

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
von UhuBabyLaffJuSoMatsch (Gast)


Lesenswert?

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.

von Teo D. (teoderix)


Lesenswert?

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.ä.

von Claudia k. (Gast)


Angehängte Dateien:

Lesenswert?

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!

von bingo (Gast)


Lesenswert?

Mach an den Schalter bzw. PB2 einen externen Pullup hin, evtl. den Wert 
auf 1k oder niedriger

von Peter K. (Gast)


Lesenswert?

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.

von HildeK (Gast)


Lesenswert?

Wie groß ist R1? Ein 10n ... 100n nach GND am Reset wäre auch kein 
Fehler.

von Claudia k. (Gast)


Lesenswert?

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!

von Claudia k. (Gast)


Lesenswert?

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...

von Claudia k. (Gast)


Lesenswert?

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.

von Andreas B. (myratz)


Lesenswert?

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

von Joachim B. (jar)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

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.

von Johannes S. (Gast)


Lesenswert?

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.

von Jens G. (jensig)


Lesenswert?

@ Johannes S. (jojos)

>Leiterbahn, ist das eine selbstgefertigte Platine?

Claudia k. (Gast) schrieb:

>Ich habe auf Lochraster eine kleine Schaltung aufgebaut, wird über

von claudia k. (Gast)


Angehängte Dateien:

Lesenswert?

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!

von claudia k. (Gast)


Lesenswert?

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...

von Martin O. (ossi-2)


Lesenswert?

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.

von claudia k. (Gast)


Lesenswert?

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...

von Peter D. (peda)


Lesenswert?

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.

von claudia k. (Gast)


Lesenswert?

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!

von Max B. (citgo)


Lesenswert?

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"?

von Martin O. (ossi-2)


Lesenswert?

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?

von claudia k. (Gast)


Lesenswert?

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.

von Teo D. (teoderix)


Lesenswert?

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.

von Max B. (citgo)


Lesenswert?

Deswegen würde ich gerne den Aufbau mal sehen!

von Karl M. (Gast)


Lesenswert?

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!

von Mike B. (mike_b97) Benutzerseite


Lesenswert?

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

von claudia k. (Gast)


Angehängte Dateien:

Lesenswert?

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...

von bernte (Gast)


Lesenswert?

miss mal den oberflächenwiderstand vom rohrmaterial (messbereich vom 
multimeter auf ca 100k  stellen, abstand der messspitzen 1cm)

von Karl M. (Gast)


Lesenswert?

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.

von claudia k. (Gast)


Lesenswert?

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)
{

}

von claudia k. (Gast)


Lesenswert?

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...

von Karl M. (Gast)


Lesenswert?

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?

von Andreas B. (Gast)


Lesenswert?

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

von Patrick B. (p51d)


Lesenswert?

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
von claudia k. (Gast)


Lesenswert?

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!

von MaWin (Gast)


Lesenswert?

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.

von claudia k. (Gast)


Lesenswert?

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...

von HildeK (Gast)


Lesenswert?

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.

von Andreas B. (myratz)


Lesenswert?

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.

von HildeK (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.