www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ausgänge reagieren bei tastendruck falsch


Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuch jetzt seit Stunden den Fehler zu finden.
Irgendwie hab ich mir mein Programm zerschossen und weiß nicht wo der 
Fehler liegt:
#define KEY_DDR         DDRD
#define KEY_PORT        PORTD
#define KEY_PIN         PIND
#define KEY0            0
#define KEY1            1
#define KEY2            2
#define KEY3            3
#define KEY4            4
#define KEY5            5
#define KEY6            6
#define KEY7            7

#define NR_KONFIGS    9
#define NR_KEYS      7

#define OUT_DDR         DDRC
#define OUT_PORT        PORTC
#define OUT_PIN         PINC
#define OUT0            0
#define OUT1            1
#define OUT2            2
#define OUT3            3
#define OUT4            4
#define OUT5            5
#define ALL_OUT      (1<<OUT0 | 1<<OUT1 | 1<<OUT2 | 1<<OUT3 | 1<<OUT4 | 1<<OUT5)

#define LED0      (1<<OUT0)
#define LED1      (1<<OUT1)
#define LED2      (1<<OUT2)
#define LED3      (1<<OUT3)
#define LED4      (1<<OUT4)
#define LED5      (1<<OUT5)

// Tabelle von Zeigern auf die Tastenkonfigurationen erstellen
// ===========================================================
uint8_t KonfigPattern[NR_KONFIGS][NR_KEYS] =
  {
    {LED0,LED0,LED4,LED3,LED1,LED2,0},            // Konfiguration 1 (C64)
    {LED1,LED0,LED3,LED2,LED5,LED4,1},            // Konfiguration 2
    {LED5,LED4,LED0,LED2,LED1,LED3,5},            // Konfiguration 3
    {LED3,LED1,LED2,LED0,LED4,LED5,3},            // Konfiguration 4
    {LED4,LED1,LED2,LED3,LED0,LED5,4},            // Konfiguration 5
    {LED5,LED1,LED2,LED3,LED4,LED0,5},            // Konfiguration 6
    {LED0,LED1,LED2,LED3,LED4,LED5,0},            // Konfiguration 7
    {LED0,LED1,LED2,LED3,LED4,LED5,0},            // Konfiguration 8
    {LED0,LED1,LED2,LED3,LED4,LED5,0},            // Konfiguration 9
   };

volatile uint8_t nKonfig = 0;

int main(void)
{
  while(1)
  {
      Summe = 0;

      if(!(KEY_PIN &(1<<KEY2)))              // Wenn Taste PortD.2 auf LOW
        Summe |= KonfigPattern[nKonfig][0];
      if(!(KEY_PIN &(1<<KEY3)))              // Wenn Taste PortD.3 auf LOW
        Summe |= KonfigPattern[nKonfig][1];
      if(!(KEY_PIN &(1<<KEY4)))              // Wenn Taste PortD.4 auf LOW
        Summe |= KonfigPattern[nKonfig][2];
      if(!(KEY_PIN &(1<<KEY5)))              // Wenn Taste PortD.5 auf LOW
        Summe |= KonfigPattern[nKonfig][3];
      if(!(KEY_PIN &(1<<KEY6)))              // Wenn Taste PortD.6 auf LOW
        Summe |= KonfigPattern[nKonfig][4];
      if(!(KEY_PIN &(1<<KEY7)))              // Wenn Taste PortD.7 auf LOW
        Summe |= KonfigPattern[nKonfig][5];

      OUT_PORT = Summe;
...

Wenn ich jetzt zb. die Taste von PortD.4 drücke bekomme ich am Ausgang 
PortC.2 und PortC.5 ein HIGH.
Bei den anderen tasten ebenfalls immer 2 verschiedene Ports auf HIGH.
Bei PortD.5 überhaupt ein HIGH auf C.0, C.2 und C.4.

???

Autor: Ephraim Hahn (ephi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ephraim Hahn schrieb:
> Entprellung

Daran kanns nicht liegen.
Das ganze hat ja schon funktioniert.
Außerdem hab ich bewusst hier von eienr Entprellung abgesehen.

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:
> OUT_PORT = Summe;
> ...

ist hier das programm zu Ende?

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe den Fehler jetzt eingeschränkt.
Hier mal der Teil des ganzen Programmes der für den Fehler 
verantwortlich ist:
// ************************************************************************
// *                                                                      *
// *                             Arcade Stick                             *
// *                         Tastenprogrammierung                         *
// *                                                                      *
// ************************************************************************
 
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "lcd.h"

#ifndef F_CPU
#define F_CPU      4000000                  // Processor Takt-Frequenz definieren
#warning kein F_CPU definiert
#endif

// Tasteneingänge definieren
// =========================
#define KEY_DDR         DDRD
#define KEY_PORT        PORTD
#define KEY_PIN         PIND
#define KEY0            0
#define KEY1            1
#define KEY2            2
#define KEY3            3
#define KEY4            4
#define KEY5            5
#define KEY6            6
#define KEY7            7
#define ALL_KEYS        (1<<KEY0 | 1<<KEY1 | 1<<KEY2 | 1<<KEY3 | 1<<KEY4 | 1<<KEY5 | 1<<KEY6 | 1<<KEY7)

// Tastendrückwiederholungsdauer definieren
// ========================================
#define REPEAT_MASK     (1<<KEY0 | 1<<KEY1)
#define REPEAT_START    50                               // nach 500ms
#define REPEAT_NEXT     20                              // alle 200ms

// Tasten-Ausgänge definieren
// ==========================
#define OUT_DDR         DDRC
#define OUT_PORT        PORTC
#define OUT_PIN         PINC
#define OUT0            0
#define OUT1            1
#define OUT2            2
#define OUT3            3
#define OUT4            4
#define OUT5            5
#define ALL_OUT      (1<<OUT0 | 1<<OUT1 | 1<<OUT2 | 1<<OUT3 | 1<<OUT4 | 1<<OUT5)

#define LED0      (1<<OUT0)
#define LED1      (1<<OUT1)
#define LED2      (1<<OUT2)
#define LED3      (1<<OUT3)
#define LED4      (1<<OUT4)
#define LED5      (1<<OUT5)

// LCD-Ausgänge definieren
// =======================
#define LCD_DDR         DDRB
#define LCD_PORT        PORTB
#define LCD_PIN         PINB
#define LCD0            0
#define LCD1            1
#define LCD2            2
#define LCD3            3
#define LCD4            4
#define LCD5            5
#define LCD6            6
#define LCD7            7
#define ALL_LCD        (1<<LCD0 | 1<<LCD1 | 1<<LCD2 | 1<<LCD3 | 1<<LCD4 | 1<<LCD5 | 1<<LCD6 | 1<<LCD7)

#define NR_KONFIGS    9
#define NR_KEYS      7
#define DELAY      300

#define NO_ACTION      0
#define EXIT_ACTION      1
#define DEF_KEY_ACTION    2
#define DEF_REPEAT_ACTION  3
#define LCD_ACTION      4
#define LED_ACTION      5
#define SAVE_ACTION      6

// Tabelle von Zeigern auf die Tastenkonfigurationen erstellen
// ===========================================================
uint8_t KonfigPattern[NR_KONFIGS][NR_KEYS] =
  {
    {LED0,LED0,LED4,LED3,LED1,LED2,0},            // Konfiguration 1 (C64)
    {LED1,LED0,LED3,LED2,LED5,LED4,1},            // Konfiguration 2
    {LED5,LED4,LED0,LED2,LED1,LED3,5},            // Konfiguration 3
    {LED3,LED1,LED2,LED0,LED4,LED5,3},            // Konfiguration 4
    {LED4,LED1,LED2,LED3,LED0,LED5,4},            // Konfiguration 5
    {LED5,LED1,LED2,LED3,LED4,LED0,5},            // Konfiguration 6
    {LED0,LED1,LED2,LED3,LED4,LED5,0},            // Konfiguration 7
    {LED0,LED1,LED2,LED3,LED4,LED5,0},            // Konfiguration 8
    {LED0,LED1,LED2,LED3,LED4,LED5,0},            // Konfiguration 9
   };

// LCD-Menüeinträge definieren
// ===========================
const char menu_000[] = " Multifunktions ";  //
const char menu_001[] = "ArcadeController";  //
const char menu_002[] = "** HAUPTMENUE **";  //

const char menu_100[] = "Tastenzuordnung>";  // 0
const char menu_101[] = "[X        ]    1";  // 1
const char menu_102[] = "[XX       ]    2";  // 2
const char menu_103[] = "[XXX      ]    3";  // 3
const char menu_104[] = "[XXXX     ]    4";  // 4
const char menu_105[] = "[XXXXX    ]    5";  // 5
const char menu_106[] = "[XXXXXX   ]    6";  // 6
const char menu_107[] = "[XXXXXXX  ]    7";  // 7
const char menu_108[] = "[XXXXXXXX ]    8";  // 8
const char menu_109[] = "[XXXXXXXXX]    9";  // 9

const char menu_200[] = "<  Dauerfeuer  >";  // 10
const char menu_201[] = "[         ]  AUS";  // 11
const char menu_202[] = "[X        ]    1";  // 12
const char menu_203[] = "[XX       ]    2";  // 13
const char menu_204[] = "[XXX      ]    3";  // 14
const char menu_205[] = "[XXXX     ]    4";  // 15
const char menu_206[] = "[XXXXX    ]    5";  // 16
const char menu_207[] = "[XXXXXX   ]    6";  // 17
const char menu_208[] = "[XXXXXXX  ]    7";  // 18
const char menu_209[] = "[XXXXXXXX ]    8";  // 19
const char menu_210[] = "[XXXXXXXXX]    9";  // 20

const char menu_300[] = "< Beleuchtung  >";  // 21
const char menu_301[] = "[          ] AUS";  // 22
const char menu_302[] = "[X         ]   1";  // 23
const char menu_303[] = "[XX        ]   2";  // 24
const char menu_304[] = "[XXX       ]   3";  // 25
const char menu_305[] = "[XXXX      ]   4";  // 26
const char menu_306[] = "[XXXXX     ]   5";  // 27
const char menu_307[] = "[XXXXXX    ]   6";  // 28
const char menu_308[] = "[XXXXXXX   ]   7";  // 29
const char menu_309[] = "[XXXXXXXX  ]   8";  // 30
const char menu_310[] = "[XXXXXXXXX ]   9";  // 31
const char menu_311[] = "[XXXXXXXXXX]  10";  // 32

const char menu_400[] = "<   LED-Test   >";  // 33
const char menu_401[] = "  [EIN]   AUS   ";  // 34
const char menu_402[] = "   EIN   [AUS]  ";  // 35

const char menu_500[] = "<  Speichern   >";  // 36

const char menu_600[] = "<   Beenden     ";  // 37

typedef struct def_menustruktur
{
  const char *text;

  unsigned char next;
  unsigned char previous;
  unsigned char sub;
  unsigned char up;

  unsigned char ActionCode;
  uint8_t ActionValue;
}menustruktur;

// Tabelle von Zeigern auf die Texte erstellen
// ===========================================
menustruktur menu[] = 
{
  {menu_100, 10, 0, 1, 0, NO_ACTION, 0},
    {menu_101, 2, 1, 0, 0, DEF_KEY_ACTION, 1},
    {menu_102, 3, 1, 0, 0, DEF_KEY_ACTION, 2},
    {menu_103, 4, 2, 0, 0, DEF_KEY_ACTION, 3},
    {menu_104, 5, 3, 0, 0, DEF_KEY_ACTION, 4},
    {menu_105, 6, 4, 0, 0, DEF_KEY_ACTION, 5},
    {menu_106, 7, 5, 0, 0, DEF_KEY_ACTION, 6},
    {menu_107, 8, 6, 0, 0, DEF_KEY_ACTION, 7},
    {menu_108, 9, 7, 0, 0, DEF_KEY_ACTION, 8},
    {menu_109, 9, 8, 0, 0, DEF_KEY_ACTION, 9},
  {menu_200, 21, 0, 11, 10, NO_ACTION, 0},
    {menu_201, 12, 11, 10, 10, DEF_REPEAT_ACTION, 0},
    {menu_202, 13, 11, 10, 10, DEF_REPEAT_ACTION, 1},
    {menu_203, 14, 12, 10, 10, DEF_REPEAT_ACTION, 2},
    {menu_204, 15, 13, 10, 10, DEF_REPEAT_ACTION, 3},
    {menu_205, 16, 14, 10, 10, DEF_REPEAT_ACTION, 4},
    {menu_206, 17, 15, 10, 10, DEF_REPEAT_ACTION, 5},
    {menu_207, 18, 16, 10, 10, DEF_REPEAT_ACTION, 6},
    {menu_208, 19, 17, 10, 10, DEF_REPEAT_ACTION, 7},
    {menu_209, 20, 18, 10, 10, DEF_REPEAT_ACTION, 8},
    {menu_210, 20, 19, 10, 10, DEF_REPEAT_ACTION, 9},
  {menu_300, 33, 10, 22, 21, NO_ACTION, 0},
    {menu_301, 23, 22, 21, 21, LCD_ACTION, 0},
    {menu_302, 24, 22, 21, 21, LCD_ACTION, 25},
    {menu_303, 25, 23, 21, 21, LCD_ACTION, 50},
    {menu_304, 26, 24, 21, 21, LCD_ACTION, 75},
    {menu_305, 27, 25, 21, 21, LCD_ACTION, 100},
    {menu_306, 28, 26, 21, 21, LCD_ACTION, 125},
    {menu_307, 29, 27, 21, 21, LCD_ACTION, 150},
    {menu_308, 30, 28, 21, 21, LCD_ACTION, 175},
    {menu_309, 31, 29, 21, 21, LCD_ACTION, 200},
    {menu_310, 32, 30, 21, 21, LCD_ACTION, 225},
    {menu_311, 32, 31, 21, 21, LCD_ACTION, 255},
  {menu_400, 36, 21, 34, 33, NO_ACTION, 0},
    {menu_401, 35, 34, 33, 33, LED_ACTION, 0},
    {menu_402, 35, 34, 33, 33, LED_ACTION, 1},
  {menu_500, 37, 33, 36, 36, SAVE_ACTION, 1},
  {menu_600, 37, 36, 37, 37, EXIT_ACTION, 1}
};

volatile uint8_t nKonfig = 0;                    // Tasten-Konfiguration
volatile uint8_t Summe;                      // Tastenzuordnung bei gedrückten Tasten


// Initialisierung der Ports
// =========================
void init()
{

// Ports initialisieren
// --------------------
  OUT_DDR |= ALL_OUT;                      // Controller als Ausgang definieren
  LCD_DDR |= ALL_LCD;                      // LCD als Ausgang definieren  
  KEY_DDR &= ~ALL_KEYS;                    // Tastenports als Eingang definieren
  KEY_PORT |= ALL_KEYS;                    // Tastenports PullUp
}

int main(void)
{
  init();                            // Einschaltsequenz starten

  while(1)
  {
      Summe = 0;

      if(!(KEY_PIN &(1<<KEY2)))              // Wenn Taste PortD.2 auf LOW
        Summe |= KonfigPattern[nKonfig][0];
      if(!(KEY_PIN &(1<<KEY3)))              // Wenn Taste PortD.3 auf LOW
        Summe |= KonfigPattern[nKonfig][1];
      if(!(KEY_PIN &(1<<KEY4)))              // Wenn Taste PortD.4 auf LOW
        Summe |= KonfigPattern[nKonfig][2];
      if(!(KEY_PIN &(1<<KEY5)))              // Wenn Taste PortD.5 auf LOW
        Summe |= KonfigPattern[nKonfig][3];
      if(!(KEY_PIN &(1<<KEY6)))              // Wenn Taste PortD.6 auf LOW
        Summe |= KonfigPattern[nKonfig][4];
      if(!(KEY_PIN &(1<<KEY7)))              // Wenn Taste PortD.7 auf LOW
        Summe |= KonfigPattern[nKonfig][5];

      OUT_PORT = Summe;

  }
}

Entferne ich den Teil:
menustruktur menu[] = 
{
  {menu_100, 10, 0, 1, 0, NO_ACTION, 0},
    {menu_101, 2, 1, 0, 0, DEF_KEY_ACTION, 1},
    {menu_102, 3, 1, 0, 0, DEF_KEY_ACTION, 2},
    {menu_103, 4, 2, 0, 0, DEF_KEY_ACTION, 3},
    {menu_104, 5, 3, 0, 0, DEF_KEY_ACTION, 4},
    {menu_105, 6, 4, 0, 0, DEF_KEY_ACTION, 5},
    {menu_106, 7, 5, 0, 0, DEF_KEY_ACTION, 6},
    {menu_107, 8, 6, 0, 0, DEF_KEY_ACTION, 7},
    {menu_108, 9, 7, 0, 0, DEF_KEY_ACTION, 8},
    {menu_109, 9, 8, 0, 0, DEF_KEY_ACTION, 9},
  {menu_200, 21, 0, 11, 10, NO_ACTION, 0},
    {menu_201, 12, 11, 10, 10, DEF_REPEAT_ACTION, 0},
    {menu_202, 13, 11, 10, 10, DEF_REPEAT_ACTION, 1},
    {menu_203, 14, 12, 10, 10, DEF_REPEAT_ACTION, 2},
    {menu_204, 15, 13, 10, 10, DEF_REPEAT_ACTION, 3},
    {menu_205, 16, 14, 10, 10, DEF_REPEAT_ACTION, 4},
    {menu_206, 17, 15, 10, 10, DEF_REPEAT_ACTION, 5},
    {menu_207, 18, 16, 10, 10, DEF_REPEAT_ACTION, 6},
    {menu_208, 19, 17, 10, 10, DEF_REPEAT_ACTION, 7},
    {menu_209, 20, 18, 10, 10, DEF_REPEAT_ACTION, 8},
    {menu_210, 20, 19, 10, 10, DEF_REPEAT_ACTION, 9},
  {menu_300, 33, 10, 22, 21, NO_ACTION, 0},
    {menu_301, 23, 22, 21, 21, LCD_ACTION, 0},
    {menu_302, 24, 22, 21, 21, LCD_ACTION, 25},
    {menu_303, 25, 23, 21, 21, LCD_ACTION, 50},
    {menu_304, 26, 24, 21, 21, LCD_ACTION, 75},
    {menu_305, 27, 25, 21, 21, LCD_ACTION, 100},
    {menu_306, 28, 26, 21, 21, LCD_ACTION, 125},
    {menu_307, 29, 27, 21, 21, LCD_ACTION, 150},
    {menu_308, 30, 28, 21, 21, LCD_ACTION, 175},
    {menu_309, 31, 29, 21, 21, LCD_ACTION, 200},
    {menu_310, 32, 30, 21, 21, LCD_ACTION, 225},
    {menu_311, 32, 31, 21, 21, LCD_ACTION, 255},
  {menu_400, 36, 21, 34, 33, NO_ACTION, 0},
    {menu_401, 35, 34, 33, 33, LED_ACTION, 0},
    {menu_402, 35, 34, 33, 33, LED_ACTION, 1},
  {menu_500, 37, 33, 36, 36, SAVE_ACTION, 1},
  {menu_600, 37, 36, 37, 37, EXIT_ACTION, 1}
};

dann funktioniert alles perfekt.
Dubios!

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könntest Du Deine Ergüsse mal als Anhang posten?

So toll, daß sie jeder lesen muß, sind sie auch wieder nicht.

Autor: komische idee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sowas gehört ins flash !!


menustruktur menu[] PROGMEM= 
{


const char menu_000[] = PROGMEM " Multifunktions ";  //






is dein RAM vieleicht voll ?
wenn der menüzeug fehlt wird ne menge ram frei

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> is dein RAM vieleicht voll ?
>wenn der menüzeug fehlt wird ne menge ram frei

Sowas in der Richtung hatte ich schon vermutet.
Jedoch funktioniert die LCD-Library damit nicht korrekt.

Mit lcd_puts_p(menu[menu_index].text);
bekomme ich nur verstümmelte Zeichen.

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.