Portauslesen mit Variable beim ATMEGA8

Gast #703492
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
Gast #704042
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
Gast #704046
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.
#704077
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).

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