Problem mit Entprellung?

Gast #230849
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?
Gast #230852
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?
Gast #230856
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.
Gast #230858
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 ;)
#230859
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.

...
Gast #230861
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.
#230862
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.

...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren