mikrocontroller.net

Forum: Compiler & IDEs komisches problem


Autor: tubbu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo, ich habe versucht eine tastatur an meinen atmel uC anzuschliessen
und werte das clock signal über einen interupt aus.
komischerweise erhielt ich bei jedem tastendruck immer einen anderen
Wert, der sich nach 11 Perioden widerholte. Es sieht so aus, als ob die
bits bei jedem tastendruck nach links geshiftet werden. Trotzdem sind
es aber 11 Perioden und nicht 8.
Nach einigem rumprobieren, hab ich dann auf den standart algorythmus
aus einem pdf-document zurückgegriffen, aber der fehler ist nach wie
vor der gleiche.
Wahrscheinlich handelt es sich um einen simplem Denkfehler, den ich
aber einfach nicht finden kann.
Also hier der code (Ausschnitt):

SIGNAL(SIG_INTERRUPT0)  //wird aufgerufen beim interrupt auf int0
{
static unsigned char data; // Holds the received scan code

if ((bitcount <  11) && (bitcount > 2))    // Bit 3 to 10 is data.
Parity bit is ignored
{
  data = (data >> 1);
  if(bit_is_set(PIND, 3)) data = data | 0x80;
}

if((--bitcount) == 0)    // All bits received
{
  SendeChar(data);
            data=0;
            bitcount = 11;
}
}
bitcount ist global deklariert.
Wär echt nett, wenn sichs mal jemand anschauen könnete, Danke!

Autor: tubbu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schieb
sry, aber wär echt nett, wenn sichs mal jemand anschaun könnte..

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo tubbu!

Hast Du mal logisch versucht, nachzuvollziehen, was da in Deiner ISR
überhaupt passiert?
Ein kleiner Tipp: unsigned char ist genau ein byte groß!

Gruß,
Patrick...

Autor: OldBug (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Uh oh... Sorry, da hab ich wohl gepennt!

Hab das "if ((bitcount <  11) && (bitcount > 2))" völlig überlesen!
Ich habe mal in den mspgcc examples nachgeschaut, da ist ebenfalls ein
Beispiel für ein PC-Keyboard drin, das sieht allerdings etwas anders
aus. Ich habe mal die Makros aufgelöst und nur die ISR in ein file
gepackt, ich denke, das solltest Du auf den AVR anpassen können...
Die Routine sendechar solltest Du von Deinem main aus aufrufen. Dazu
einfach in der ISR noch ein Flag setzen (z.B. received = TRUE oder so
ähnlich) und in der main auf TRUE prüfen. nach dem verarbeiten das Flag
einfach wieder auf FALSE setzen.

Gruß,
Patrick...

Autor: martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

ich bin mit dem code aus dem appnote 910 auch nicht so ganz
klargekommen, also hab ich alles neu programmiert.

meine interruptroutine (clock) sieht so aus:

SIGNAL(SIG_INTERRUPT0)
{
  if(bitcount == 0)
    key = 0;

  if(bitcount > 0 && bitcount < 9)
  {
    unsigned char data = 0;

    data = PIN(KB_PORT);
    data >>= KB_DATAPIN;

    if(data & 1)
      key |= 1 << (bitcount-1);
  }

  bitcount++;

  if(bitcount == 11)
  {
    if(bufcount < KB_BUFSIZE-1)
    {
      if(key != 0xF0)
      {
        if(lku == 0)
        {
          keybuf[bufcount] = key;
          bufcount++;
        }
        lku = 0;
      }
      else
        lku = 1;
    }

    bitcount = 0;
  }
}


ich möchte dich ja nicht zum c&p verleiten, aber hoffe das hilft dir.
die variablen sollten klar sein, den rest solltest du auch hinbekommen.

Autor: tubbu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, jetzt hat es funktioniert.
Allerdings erst, nachdem ich nicht 11, sondern 12 Bits gezählt habe,
keine Ahung warum, aber ist mir auch irgendwie egal, thx

Autor: DeltaEx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich komme mit den Beiden Zeilen nicht klar:

    data = PIN(KB_PORT);
    data >>= KB_DATAPIN;

Was ist PIN() für eine funktion und wo finde ich die?

und verstehe ich das richtig das KB_PORT zb PORTB ist und KB_DATAPIN
zb. PD6 ist ?

Danke im voraus

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.