Forum: Mikrocontroller und Digitale Elektronik Problem mit dem einlesen bei AtMega128


von Oliver K. (Firma: TGM) (oliver1990)


Lesenswert?

Hi!

Ich habe folgendes Problem:
Ich besitze ein ATMega128 testboard von Ribu und dieses hat ja am PortD 
4 Taster ausgeführt. Diese möchte ich jetzt zum testen einlesen, bzw. 
wenn sie gedrückt sind 4,5, etc ausgeben. Eigentlich ist ja das Programm 
relativ simpel, aber dennoch funktioniert es nicht.

Hier mal die Funktion zum einlesen:
1
void einlesen()
2
{  
3
  DDRD=0x00;
4
  int s=0;
5
  lcd_clrscr();
6
    lcd_puts("Bitte folgende  \n");
7
     lcd_puts("Waerte eingeben:");
8
  delayms(7000);
9
  lcd_clrscr();    
10
    lcd_command(0x0F);  //Cursor blinkend ein
11
    lcd_puts("Laenge von X:");
12
  lcd_gotoxy(7,1);
13
  delayms(1000);
14
  while(s!=0)
15
  {
16
  switch(PIND)
17
  {
18
    case 0x01:
19
      laengex[0]=0; lcd_putc('0'); s=1;
20
      break;
21
    case 0x02:
22
      laengex[0]=1; lcd_putc('1'); s=1;
23
      break;
24
    case 0x04:
25
      laengex[0]=2; lcd_putc('2'); s=1;
26
      break;
27
    case 0x08:
28
      laengex[0]=3; lcd_putc('3'); s=1;
29
      break;
30
    case 0x10:
31
      laengex[0]=4; lcd_putc('4'); s=1;
32
      break;
33
    case 0x20:
34
      laengex[0]=5; lcd_putc('5'); s=1;
35
      break;
36
    case 0x40:
37
      laengex[0]=6; lcd_putc('6'); s=1;
38
      break;
39
    case 0x80:
40
      laengex[0]=7; lcd_putc('7'); s=1;
41
      break;
42
43
  }
44
  }
45
46
}

laengex hab ich global als integer definiert. natürlich als array.

Bitte um schnelle Hilfe.

Danke schon mal im Voraus!

Lg Oliver

von MWS (Gast)


Lesenswert?

Wohin schalten die Taster ? Nach VCC ? Oder eher nach GND ? Wenn 
Letzteres, dann an's Einschalten der PUps gedacht ?

Wenn gewartet werden soll, bis eine Taste gedrückt ist, wäre bei der 
Logik hier eher while(s==0) angebracht.

von Oliver K. (Firma: TGM) (oliver1990)


Lesenswert?

MWS schrieb:
> Wohin schalten die Taster ? Nach VCC ? Oder eher nach GND ? Wenn
> Letzteres, dann an's Einschalten der PUps gedacht ?
>
> Wenn gewartet werden soll, bis eine Taste gedrückt ist, wäre bei der
> Logik hier eher while(s==0) angebracht.

Auf VCC.

Sry, peinlich! Da hab ich mich vertippt gehabt.

Vielen dank für die schnelle Antwort!

Aber jetzt hab ich folgendes Problem, auf den Pins 0-3 hängt ein 
Optokoppler wobei am Eingang null anliegt, was auch eine LED davor 
nochmal bestätigt. Nur wenn ich in der Case Anweisung nicht maskier mit 
&0xF0, dann gibt mir mein LCD 2 aus, was ja bedeutet, dass am PD1 HIGH 
anliegt.
Weis du da vl auch eine Lösung?

Danke nochmal!

Lg oliver

von MWS (Gast)


Lesenswert?

Ein Optokoppler an vier Ports ? Oder eher an PD1 ? Wenn der klassisch 
geschaltet ist, mit Emitter nach GND und Widerstand von Collector nach 
VCC, dann ergibt das im ausgeschalteten Zustand einen High-Level.
Maskieren würde Sinn machen, denn wenn auf den Optokoppler reagiert 
werden soll, so stört/blockiert der dann natürlich die Tasterabfrage.

von Oliver K. (Firma: TGM) (oliver1990)


Lesenswert?

Das Problem hab ich schon selber gefunden. Der PD2 hängt am MAX232 für 
die RS232. Das heißt ganz einfach ich sollte ihn auslassen. Jetzt muss 
ich anfangen zum Pin sparen :-( gg


Aber echt vielen Dank für die schnellen Hilfen immer. Tut mir leid, dass 
es so blöde Fehler waren.
Ist hier echt ein super Forum.

Lg

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.