mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Portauslesen mit Variable beim ATMEGA8


Autor: bobby (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Grundidee ist schon mal nicht schlecht. Details erfährst du bei 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Autor: bobby (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: bobby (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: bobby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank. hat funktioniert. so ein dummer fehler :)

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.