www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Entprellung?


Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi zusammen!
Ich bastel im Moment mein erstes µC-Projekt.
Aus dem AVR-Tutorial habe ich diese Funktion zum entprellen kopiert:

inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
        if ( ! (*port & (1 << pin)) )
        {
                /* Pin wurde auf Masse gezogen, 100ms warten   */
                _delay_ms(100);
                if ( ! (*port & (1 << pin)) )
                {
                        /* Anwender Zeit zum Loslassen des Tasters
geben */
                        _delay_ms(100);
                        return 1;
                }
        }
        return 0;
}

in meiner Mainfunktion soll dann überprüft werden, ob ein gewisser
Schalter gedrückt wurde. Falls ja, dann wird countdownfrom runter bzw.
hochgezählt und auf einer 7-Segment-Anzeige ausgegeben.

int main(void)
{
  init();

  uint8_t countdownfrom = 2;

  while (1) // Endlosschleife
  {
        //if (debounce(&PINC, PC0)) countdown2(14);  /* Falls Taster an
PIN PC0 gedrueckt..    */
    if (debounce(&PINC, PC1) && (countdownfrom>1))
    {
      countdownfrom--;
      shownumber(countdownfrom);
    }
    if (debounce(&PINC, PC2) && (countdownfrom<19))
    {
      countdownfrom++;
      shownumber(countdownfrom);
    }
  }
  return 0;
}

Die Ports der Taster sind mittels 10k-Pullup auf 5V gezogen.

Hier noch die init()-Funktion:

void init(void)
{
  DDRA = 0xff;  // PortA als Ausgang deklarieren
  PORTA = 0xff;  // PortsA auf HIGH schalten
  PORTA = 0b00000000; //0 ausgeben

  DDRB = 0xff;  // PortB als Ausgang deklarieren
  PORTB = 0x00;  // PortsB auf LOW schalten

  DDRC = 0x00;  // PortC als Eingang deklarieren
  PORTC = 0b00000111 ;      /* Pullup-Widerstand aktivieren  */
}

Dummerweise habe ich dabei 2 Probleme. Bei der Simmulation (AVRStudio)
bekommt mein Rechner sich nicht mehr ein. 99% CPU-Last und nix tut sich
mehr ?!?!
2. Wenn ich das Programm auf den AVR (Atmega16) lade, dann fängt er
sofort an hochzuzählen??!?!?
Kann mir einer sgaen wodran das liegt?

Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okey, ich habe gerade die Variable countdownfrom erstmal global
definiert :)

Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
keine ne Idee, wieso das nicht klappt? :(

Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, ich habe inzwischen selbst was rausgefunden.
Obwohl der PORTC bei meinem atmega16 als Ausgang festgelegt wird,
liegen an PC2(TCK),PC3(TMS) und PC5(TDI) high Pegel an.
Kann es sein, das das JTAG-Interface eingeschaltet ist, oder ähnliches?
Falls ja, gibt es einen Weg die PORTs als I/O-Pins zu schalten?

Autor: Läubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JTAG abschalten ;)
z.B: in den Fuse bits

Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht das auch über nen C-Befehl? Ich spiele so ungerne mit den Fuse-Bits
rum. Habe gehört, da kan man schnell was kaputt machen ;)
Bin ja noch neu auf dem Gebiet.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da wirst du nicht drumherum kommen...

Autor: Läubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
einfach das JTAG Fuse Deaktiviern, kaputt gehn kann da nix solange du
nicht an anderen einstellungen rumspielst.
Ich hab IRGENWANN mal im Forum geshen das jemand meinte das Ginge auch
über eine Assemblerbefehl... aber frag mich nicht wie, den das Fuse
einmal umprogramieren ist kein Akt, du solt ja nciht rumspielen sondern
NUR das Jtag fuse verändern, da kann nxi bei passieren, nur finger weg
von den anderen Fuses wenn du nicht genau weißt wozu sie da sind.

Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, wenn ich mit PonyProg die Fuses auslese, dann sind angeblich alle
unprogrammiert. Unmöglicht!
Hat PonyProg da nen Bug oder so bzw. gibt es noch andere Programme um
die Fuses zu setzten?

Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, aber hat sich soeben erledigt. Bei Ponyprog hatte ich AVR-Auto
eingestellt damit geht es NICHT!
Einfach mal eben den Typ ausgewählt und schon werden die Fuses ohne
Probleme richtig gelesen.

Jetzt klappt es auch mit den PORTs! Alles liegt tatsächlich auf LOW!
SUPER VIELEN DANK!
Jetzt kann ich ja in Ruhe weiterbasteln ;)

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht auch ohne Änderung der Fuses:

 in wl,mcucsr               ;JTAG-
 sbr wl,1<<jtd              ;Interface
 out mcucsr,wl              ;deaktivieren
 out mcucsr,wl              ;(PortC aktivieren)

Diese Sequenz in der INIT-Routine (gleich nach dem Initialisieren des
Stackpointers) schaltet das JTAG-Interface aus. Im Datenblatt ist das
glaube sogar beschrieben.

...

Autor: Läubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Hannes, eventuell sollte man das mal in die AVR Checkliste
aufnehmen?

Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke!
Im Datenblatt habe ich das nicht gefunden und zudem kann ich mit
Assembler noch nix anfangen.
Da arbeite ich mich gerade erst ein. Scheint aber sehr viel effizienter
zu sein als das was gcc-avr erzeugt.
Wo wir gerade beim Thema sind:
Im Assembler-Tutorial ist der Link zu den Assemblerdirektiven defekt.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich mache die Links nicht, bitte beim Administrator melden.

Die ASM-Direktiven findest du aber auch in der Hilfe zum AVR-Studio und
im Instruction-set. Die Hilfe zum AVR-Studio ist neben den
AVR-Datenblättern eine recht brauchbare Informationsquelle.

ASM ist nicht unbedingt effizienter (Profis arbeiten nicht umsonst
unter C), es zwingt aber zum Lesen des Datenblattes und zum Verstehen
der Architektur. Und im Datenblatt gibt es die I/O-Registerliste und
die Erklärungen zu jedem Bit in jedem Register, also auch zu JTD in
MCUCSR. Sicher versteht man nicht alles auf einmal (auch ich nicht),
aber bei jedem Nachschlagen wird es (das was man versteht) etwas mehr.

Wenn man die Bedeutung jedes Bits in jedem I/O-Register in die
Checkliste aufnehmen wollte, dann würde das die Checkliste dermaßen
aufblähen, dass sie niemand mehr lesen würde.

...

Autor: Läubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sit kalr, aber das Problem mit dme Mega16 kommt ja immer wieder und
ein Hinweis auf die Möglcihkeit das per software abzuschalten wäre
sinnvoll denke ich :)

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht auch in C:
MCUCSR |= (1<<JTD);
MCUCSR |= (1<<JTD);

Autor: abc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum verwendet eigentlich niemand einen 74C922 bzw. 74C923 um
Taster/Tastaturen zum µC anzuschliessen. Dann gibt es keine
Tastenprellprobleme mehr...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@abc,

Ganz einfach, die kosten doch Geld und Platz !

Und 10 Zeilen Software kosten überhaupt nix.


Wenn ich auch nur nen Widerstand durch ne Zeile Software einsparen
kann, dann nehme ich natürlich die Software, gar keine Frage.


Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.