4x4 Matrix-Tastatur geht nicht mit adcsra-Register

Hallo,

mein Problem ist, dass meine Matrix-Tastatur nur ohne die Register geht. Sobald ich das ADCSRA einfüge funktioniert sie nicht mehr und das LC-Display zeigt dementsprechend nichts mehr an. Da komische ist, es geht nur nicht wenn ich das adcsra-Register einfüge.

Hier ist der Code für das Hauptprogramm(Register sind auskommentiert)

#include <LiquidCrystal.h>
#include <avr/io.h>

// Pin Nummern der Tastatur
int s1=22;  // Spalten Ausgang
int s2=24;
int s3=26;
int s4=28;

int r1=30;  // Reihen  Eingang
int r2=32;
int r3=34;
int r4=36;

// Deklaration der Variablen:
int k = 0; // Laufvariable fürs Eingabefeld
unsigned char feld[100]; // Zum Speichern der Eingaben
int screen = 1; // unterschiedliche Bildschirme und Eingaben verbinden
int wert;
char x[100];
// LCD Setup:    rs  e  d4 d5 d6 d7 - Digital Pinnummern Arduino
// rw auf GND
LiquidCrystal lcd(12, 10, 5, 4, 3, 2);

// the setup routine runs once when you press reset:
void setup() {                
  lcd.begin(16, 2);
// Setzen der Tastenfeldmatrix:
  pinMode(r1, INPUT); digitalWrite(r1, HIGH);  //PIN 30 auf Eingang, Pullup aktiviert, Reihe 1
  pinMode(r2, INPUT); digitalWrite(r2, HIGH);  //PIN 32 auf Eingang, Pullup aktiviert, Reihe 2
  pinMode(r3, INPUT); digitalWrite(r3, HIGH);  //PIN 34 auf Eingang, Pullup aktiviert, Reihe 3
  pinMode(r4, INPUT); digitalWrite(r4, HIGH);  //PIN 36 auf Eingang, Pullup aktiviert, Reihe 4
  
  pinMode(s1, OUTPUT); digitalWrite(s2, HIGH);  //PIN 22 auf Ausgang, Spalte 1
  pinMode(s2, OUTPUT); digitalWrite(s2, HIGH);  //PIN 24 auf Ausgang, Spalte 2
  pinMode(s3, OUTPUT); digitalWrite(s3, HIGH);  //PIN 26 auf Ausgang, Spalte 3
  pinMode(s4, OUTPUT); digitalWrite(s4, HIGH);  //PIN 28 auf Ausgang, Spalte 4

  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("Menue: ");
  lcd.blink();
  k=0;
  screen=1;
  
//   ADCSRA=0;
//   ADMUX=0;
//   ADCSRB=0; // ADTS auf Null free running mit ADate
//
//    ADMUX =  B01100000;
//    ADCSRA = B11101011;
}

// the loop routine runs over and over again forever:
void loop() {

 keyboard_read(); // von der Matrix-Tastatur einlesen
 // verwendet s1 bis s4 und r1 bis r4
  
 // Auswertung - beispielsweise 
if ((feld[k] == 'F') || (feld[k] == 'C') || (feld[k] == 'E')|| (feld[k] == 'A')) 
// E bedeutet "ENTER"; F bedeutet "Start"; C bedeutet in eine zweite Eingabeebene bzw. Fenster wechseln; A bedeutet eum Menü zurück
{
    if (screen == 1 && k == 1)
    {  if       (feld[1] == 'F') {lcd.clear(); lcd.setCursor(0,1); lcd.print("Start: ");}
       else if  (feld[1] == 'C') { screen=2;lcd.clear(); lcd.setCursor(0,1); lcd.print("2. Schirm: ");}
       else if  (feld[1] == 'A') { screen=1; lcd.clear(); lcd.setCursor(0,1); lcd.print("Menue: ");}
       else { screen=1; lcd.clear(); lcd.setCursor(0,1); lcd.print("Menue: ");}
       k = 0;
     }
    else if (screen == 1 && k == 3)
    {wert= feld[1]*10+feld[2];  itoa(wert,x,10); lcd.clear(); lcd.setCursor(0,1);lcd.print(x);
       k = 0;
    }
    else if (screen == 1 && k == 4)
    {wert= feld[1]*100+feld[2]*10+feld[3];  itoa(wert,x,10); lcd.clear(); lcd.setCursor(0,1);lcd.print(x);
       k = 0;
    }
    else if (screen == 2 && k == 1)  
    {  if  (feld[1] == 'A') { screen=1; lcd.clear(); lcd.setCursor(0,1); lcd.print("Menue: ");}  
       else { screen=1; lcd.clear(); lcd.setCursor(0,1); lcd.print("Menue: ");}       
       k=0;
    } 
   else   
   {   lcd.clear(); lcd.setCursor(0,1);   
       lcd.print("falsche Eingabe");
       k=0;  // unerlaubte Eingabe
   } 
  // usw...
} 
}

Hier ist der Code für Unterprogramm keyboard_read()

  void keyboard_read()
{
  // Tastatur Abfrage - EINGABEN INS FELD
  digitalWrite(s1, LOW);  //Spalte 1 wird auf LOW gesetzt 
  digitalWrite(s2, HIGH);
  digitalWrite(s3, HIGH);
  digitalWrite(s4, HIGH);	
  if(digitalRead(r1) == LOW){lcd.print("1"); delay(200);k++;feld[k]=1;}	//Abfragen von Reihe 1
  if(digitalRead(r2) == LOW){lcd.print("4"); delay(200);k++;feld[k]=4;}	//Abfragen von Reihe 2
  if(digitalRead(r3) == LOW){lcd.print("7"); delay(200);k++;feld[k]=7;}	//Abfragen von Reihe 3
  if(digitalRead(r4) == LOW){lcd.print("A"); delay(200);k++;feld[k]='A';}  //Abfragen von Reihe 4
  
  digitalWrite(s1, HIGH);   
  digitalWrite(s2, LOW);  //Spalte 2 wird auf LOW gesetzt
  digitalWrite(s3, HIGH);
  digitalWrite(s4, HIGH);	
  if(digitalRead(r1) == LOW){lcd.print("2"); delay(200);k++;feld[k]=2;}	//Abfragen von Reihe 1
  if(digitalRead(r2) == LOW){lcd.print("5"); delay(200);k++;feld[k]=5;}	//Abfragen von Reihe 2
  if(digitalRead(r3) == LOW){lcd.print("8"); delay(200);k++;feld[k]=8;}	//Abfragen von Reihe 3
  if(digitalRead(r4) == LOW){lcd.print("0"); delay(200);k++;feld[k]=0;}	//Abfragen von Reihe 4

  digitalWrite(s1, HIGH);  
  digitalWrite(s2, HIGH);
  digitalWrite(s3, LOW);  //Spalte 3 wird auf LOW gesetzt 
  digitalWrite(s4, HIGH);	
  if(digitalRead(r1) == LOW){lcd.print("3"); delay(200);k++;feld[k]=3;}	//Abfragen von Reihe 1
  if(digitalRead(r2) == LOW){lcd.print("6"); delay(200);k++;feld[k]=6;}	//Abfragen von Reihe 2
  if(digitalRead(r3) == LOW){lcd.print("9"); delay(200);k++;feld[k]=9;}	//Abfragen von Reihe 3
  if(digitalRead(r4) == LOW){lcd.print("B"); delay(200);k++;feld[k]='B';}  //Abfragen von Reihe 4
  
  digitalWrite(s1, HIGH);   
  digitalWrite(s2, HIGH);
  digitalWrite(s3, HIGH);
  digitalWrite(s4, LOW);  //Spalte 4 wird auf LOW gesetzt	
  if(digitalRead(r1) == LOW){lcd.print("F"); delay(200);k++;feld[k]='F';}  //Abfragen von Reihe 1
  if(digitalRead(r2) == LOW){lcd.print("E"); delay(200);k++;feld[k]='E';}  //Abfragen von Reihe 2
  if(digitalRead(r3) == LOW){lcd.print("D"); delay(200);k++;feld[k]='D';}  //Abfragen von Reihe 3
  if(digitalRead(r4) == LOW){lcd.print("C"); delay(200);k++;feld[k]='C';}  //Abfragen von Reihe 4
  
}

Weiße jemand warum es nicht geht?

Danke schon mal im Vorraus.

Laß mich raten: Du verwendest einen Mega? Vielleicht hat eine Bbiliothek damit Probleme?

Eine einfache Erklärung habe ich leider nicht. Kannst Du das Programm so abspecken, daß sich die Auswirkung auf die benutzen Pins einkreisen läßt?

Da Du ADCSRA erst 0 und später was anderes zuweist, kannst Du das Nullen testhalber mal weglassen? Oder erst mal nur lesen, nicht ändern?

Ja ich verwende einen Mega.

Habe das Nullen jetzt weg gelassen, aber es änder sich leider nichts.

Was genau macht denn ADCSRA=B11101011? Kannst Du die Bits mal einzeln dazuschreiben?
Wird da der Interrupt eingeschaltet? Vielleicht macht der ISR Ärger?

Hier die einzelnen Bits dazu:
ADMUX = (1<<REFS0); // AVcc externe Referenz
ADMUX |= (1<<ADLAR); // left adjusting
ADMUX |= (1<<MUX1); // Input ADC2 select
ADCSRA = (1<<ADPS2); // Prescaler 16
ADCSRA |= (1<<ADATE); // Auto Trigger enable
ADCSRA |= (1<<ADIE); // Interrupt enable
ADCSRA |= (1<<ADEN); // ADC general enabled
ADCSRA |= (1<<ADSC); // start conversion
ADCSRB = 0; // free running

Nein, der interrupt wird nicht aufgerufen. Ich glaub es hat was mit dem Unterprogramm keyboard_read() zu tun? vielleicht muss man es in in binärerer Schreibweise schreiben?

ADIE macht nur Sinn zusammen mit einem ISR. Laß den Interrupt erst mal abgeschaltet, und teste das dann.