Forum: Mikrocontroller und Digitale Elektronik Portauslesen mit Variable beim ATMEGA8


von bobby (Gast)


Lesenswert?

Folgendes Problem:

Ich habe das AVR Board LPT. Ich möchte mit einer Variable erkennen, 
welchen Taster ich gedrückt habe. Leider weiß ich nicht, was dann in der 
Variable drin steht (also ob Hex oder Binär oder sonst was) um die 
Variable zu vergleichen. Hatte mir das folgendermaßen gedacht.

uint8_t variable;
...
variable = PIND;

aber irgendwie kriege ich das nicht richtig hin. im prinzip möchte ich 
nur wissen wie man es hinkriegt, dass die variable erkennt welchen 
taster ich gedrückt habe.

vielen dank schonmal

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Deine Grundidee ist schon mal nicht schlecht. Details erfährst du bei 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Tasten_und_Schalter

von bobby (Gast)


Lesenswert?

habe mal den quellcode reingestellt. habe im prinzip noch 3 kleine 
fehler drin. die fehler habe ich unten angehängt. leider komme ich in 
der fehlerbehebung nicht weiter.



#define     F_CPU 3686400  // Taktferquenz des myAVR-Boards
#include  <avr\io.h>    // AVR Register und Konstantendefinitionen
#include    <stdint.h>
#include    <util\delay.h>

void set_pw(void);
void enter_pw(void);
void test_pw(void);


uint16_t counter=0;
char pw_org[8];
char pw_comp[8];
char pw_pressed[8];
bool pw_true=false;
bool pw=false;

main ()
{
 do
 {
  if (pw==false)
  {
   set_pw();
  }
  enter_pw();
  test_pw();

  if (pw_true==true)
  {
   pw_true=false;
   // relais auf();
  }
   else
   {
    enter_pw();
   }
  }
  while (true);
}




void set_pw(void)
{
 uint8_t port_c=0x00;
 uint16_t counter=0;
 bool pw=true;

 for(int i=0;i<7;i++)
 {
  pw_org[i]="x";
 }

 do
 {
  if ( (PINC & (1<<PINC0)) || (PINC & (1<<PINC1)) ) //alle ärgänzen
  {
   port_c=PINC;

   switch(port_c)
   {
    case 1: pw_org[counter]="0"; counter++; break;
    case 2: pw_org[counter]="1"; counter++; break;
    case 3: pw_org[counter]="2"; counter++; break;
    case 4: pw_org[counter]="3"; counter++; break;
    case 5: pw_org[counter]="4"; counter++; break;
    case 6: pw_org[counter]="5"; counter++; break;
    case 7: pw_org[counter]="6"; counter++; break;
    case 8: pw_org[counter]="7"; counter++; break;
    case 9: pw_org[counter]="8"; counter++; break;
    case 10: pw_org[counter]="9"; counter++; break;
   }
  }

 if (counter>7)
 {
  _delay_ms(3000);set_pw(); break;
 }
 if (PINC & (1<<PINC10)) // STERN-Taste
 {
  _delay_ms(3000);set_pw(); break;
 }
}while(PINC & (1<<PINC11)); //RAUTE-Taste


 if ((pw_org[3]=="x")||(pw_org[0]=="x"))
 {
  _delay_ms(3000);
  set_pw();
 }
}




void enter_pw(void)
{
 uint8_t port_c=0x00;
 counter=0;

 for(int i=0;i<7;i++)
 {
  pw_pressed[i]="x";
 }

 do
 {
  if ((PINC & (1<<PINC0)) || (PINC & (1<<PINC1)) ) //alle ärgänzen
  {
   port_c=PINC;

   switch(port_c)
   {
    case 1: pw_pressed[counter]="0"; counter++; break;
    case 2: pw_pressed[counter]="1"; counter++; break;
    case 3: pw_pressed[counter]="2"; counter++; break;
    case 4: pw_pressed[counter]="3"; counter++; break;
    case 5: pw_pressed[counter]="4"; counter++; break;
    case 6: pw_pressed[counter]="5"; counter++; break;
    case 7: pw_pressed[counter]="6"; counter++; break;
    case 8: pw_pressed[counter]="7"; counter++; break;
    case 9: pw_pressed[counter]="8"; counter++; break;
    case 10: pw_pressed[counter]="9"; counter++; break;
   }
  }

  if (counter>7)
  {
   _delay_ms(3000);enter_pw(); break;
  }
  if (PINC & (1<<PINC10)) // STERN-Taste
  {
   _delay_ms(3000);enter_pw(); break;
  }
 }while(PINC & (1<<PINC11)); //RAUTE-Taste

 if ((pw_pressed[3]=="x")||(pw_pressed[0]=="x"))
 {
  _delay_ms(3000);
  enter_pw();
 }
}




void test_pw(void)
{
 int k=1;
 for (int i=0;i<7;i++)
 {
  if (pw_org[i]==pw_pressed[i])
  {
   k++;
  }
 }
 if (k==8)
 {
  pw_true=true; //Passwort richtig
 }
}

compilieren ... codeschloss.cc  In function `void set_pw()':
codeschloss.cc:53  53: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:64  64: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:65  65: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:66  66: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:67  67: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:68  68: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:69  69: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:70  70: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:71  71: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:72  72: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:73  73: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:81  81: error: `PINC10' was not declared in this scope
codeschloss.cc:85  85: error: `PINC11' was not declared in this scope
codeschloss.cc:88  88: error: ISO C++ forbids comparison between pointer 
and integer
 88: error: ISO C++ forbids comparison between pointer and integer
codeschloss.cc  In function `void enter_pw()':
codeschloss.cc:105  105: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:116  116: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:117  117: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:118  118: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:119  119: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:120  120: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:121  121: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:122  122: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:123  123: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:124  124: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:125  125: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:133  133: error: `PINC10' was not declared in this scope
codeschloss.cc:137  137: error: `PINC11' was not declared in this scope
codeschloss.cc:139  139: error: ISO C++ forbids comparison between 
pointer and integer
 139: error: ISO C++ forbids comparison between pointer and integer
*' to `char'
codeschloss.cc:117  117: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:118  118: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:119  119: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:120  120: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:121  121: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:122  122: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:123  123: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:124  124: error: invalid conversion from `const char*' to 
`char'
codeschloss.cc:125  125: err

von bobby (Gast)


Lesenswert?

codeschloss.cc:133  133: error: `PINC10' was not declared in this scope
codeschloss.cc:137  137: error: `PINC11' was not declared in this scope


den bitte nicht beachten. das progge ich noch um. da weiß ich warum der 
kommt.

von ??? (Gast)


Lesenswert?

Aha...

von Johannes M. (johnny-m)


Lesenswert?

Erstens mal: Werde Dir mal klar über den Unterschied zwischen z.B. "1" 
und '1'... "1" sind ZWEI ASCII-Zeichen, und die passen erstens nicht 
in eine Array-Stelle und zweitens kann man in C keine Vergleiche mit 
mehreren Zeichen gleichzeitig durchführen.

Zweitens: Schau Dir in der libc-Doku die Beschreibung der 
_delay_XX-Funktionen an. _delay_ms(3000) geht mit keinem der üblichen 
CPU-Takte (nur mit Takten unter 87 kHz, und das dürfte bei Dir nicht der 
Fall sein).

von bobby (Gast)


Lesenswert?

vielen dank. hat funktioniert. so ein dummer fehler :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.