Bekomme Simple LCD anst. nicht hin

OP #1597935
Lesenswert?

Hallo.
Trotz Suche fand ich in keinem eurer Threads die Lösung zu meinem 
Problem. Hoffe ihr könnt mir hier weiter helfen:

Ich will ein HD44780 LCD (P.Fleury lib ;) ) so ansteuern, dass es bei 
bestimmten Pin zuständen, einen bestimmten Text ausgibt.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include "lcd.h"
4

5
void outp(char d);
6

7
int main(void)
8
{
9
  char x;
10
  DDRC=0x00;
11
  DDRB=0xff;
12
  
13
  lcd_init(LCD_DISP_ON);
14
  lcd_puts("~~~ POWER ON ~~~");    
15
  lcd_gotoxy(0,1);  
16
  lcd_puts("~~~~~~~~~~~~~~~~");
17
  _delay_ms(2000);
18
  while(1)
19
  {
20
    PORTB=0x01;  //Status LED
21
    x=0;                   // x rücksetzen
22
    if(PINC & (1<<PINC0))  //PINC0 high
23
      x=1;
24
    if(PINC & (1<<PINC1))  //PINC1 high
25
      x=2;
26
    if(PINC & (1<<PINC2))  //PINC2 high
27
      x=3;
28
    _delay_ms(30);  //entplellung??
29
      outp(x);
30
    _delay_ms(100); //Anzeigedauer
31
  }
32
  return 0;
33
}
34

35
void outp(char d)
36
{
37
  switch(d)
38
  {
39
    case 1:
40
      lcd_gotoxy(0,0);
41
      lcd_puts("~~~~ Reset ~~~~ ");
42
      lcd_gotoxy(0,1);
43
      lcd_puts("~~~~~~~~~~~~~~~~");
44
    break;
45

46
    case 2:
47
      lcd_gotoxy(0,0);
48
      lcd_puts("Heutiges Datum: ");
49
      lcd_gotoxy(0,1);
50
      lcd_puts(" So  14.02.2010 ");
51
    break;
52

53
    case 3:
54
      lcd_gotoxy(0,0);
55
      lcd_puts("Text 1 *********");
56
      lcd_gotoxy(0,1);
57
      lcd_puts("Text 2 *********");
58
    break;
59

60
    default:
61
      lcd_gotoxy(0,0);
62
      lcd_puts("!!!!! Fail !!!!!");
63
      lcd_gotoxy(0,1);
64
      lcd_puts(" ERROR !! ERROR ");
65
    break;
66
  }
67
}

Das POWER ON zeigt er noch ordnungsgemäß an, der nachfolgende ist zwar 
einer meiner CASEes (meistens case 2") allerdings zeigt er das immer an, 
also vollig unabhängig davon ob oder wo ich meinem Taster betätige.

Da "POWER ON" funzt, kann es eig nur am Prog liegen, aber wo..?
ich mein Pins fragt man ja mit
1
if(PINC & (1<<PINC0))
 ab oder?

Achja, mein Taster ist im Mom ein Kabel(+5V) welches ich an den 
betreffenden Pin hänge.

Und ExtInt verwende ich nicht da ich PORTD verwenden MUSS.

Dankbar für jede hilfe,
Olli
#1597947
Lesenswert?

Hallo,

O. L. schrieb:
> Hallo.
> Trotz Suche fand ich in keinem eurer Threads die Lösung zu meinem
> Problem. Hoffe ihr könnt mir hier weiter helfen:
>...
> Achja, mein Taster ist im Mom ein Kabel(+5V) welches ich an den
> betreffenden Pin hänge.

Ja, ich habe für Dich gesucht...
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen

Gruß aus Berlin
Michael
Moderator (Firma: Titel) Persönliche Seite #1598017
Lesenswert?

>  entplellung??
voll klass ey  ;-)

> Achja, mein Taster ist im Mom ein Kabel(+5V) welches ich an den
> betreffenden Pin hänge.
Offene uC-Eingangspins haben i.A. keinen zuverlässigen und definierten 
Zustand. Du solltest den Pullup des Pins einschalten und dann den Taster 
gegen GND verdrahten. Also low = betätigt, high = unbetätigt.
OP #1598056
Lesenswert?

@Lothar
Hab jetzt die Internen Pullups ankiviert
1
DDRC=0x00; PORTC |= ( 1 << PC0 )|( 1 << PC1 )|( 1 << PC2 );
dennoch hab am LCD immer einen undef. case text an, auch wenn ich x=0 
hab zeigt er nicht den default case, sondern iein anderen an.

Weiß echt nicht mehr weiter...
#1598092
Lesenswert?

Also, wenn beispielsweise an PINC0 eine 1 anliegt sollte das Display ja 
was anderes anzeigen oder? So habe ich das jetzt verstanden. Wenn das so 
ist mein ich, dass die Abfrage auf dem ersten Blick richtig ist. Nur 
frag ich mich, ob du das wirklich so gemacht hast, oder aber ob du gegen 
masse schaltest, weil sonst noch ein ! vor(1<<PINC0) kommt. Das musst du 
jetzt mal nachschauen.
#1598287
Lesenswert?

Hallo,

O. L. schrieb:
> @Michael
> Hilft mir nicht wirklich weiter (Pullab hin oder her ;D ).
> Das LCD zeigt immer nur den case3 text an, auch wenn kein Pin
> angesprochen wird (x=0).

Ausführlicher?

1. offene Eingänge an einem CMOS-IC (der AVR ist einer) nehmen nach Lust 
und Laune jeden Zustand an weil sie sehr hochohmig sind.
Ob Du PullUp- oder PullDown-Widerstände brauchst, hängt davon ab, 
welchen Ruhepegel Du bei nicht gedrückter Taste haben willst.
H-Pegel -> PullUp, L-Pegel -> PullDown.
Da die AVR interne PullUp-Widerstände haben, werden von den meisten 
Leuten diese benutzt (Ruhepegel H) und die Tasten gegen GND geschaltet.
Natürlich muß die Software das dann auch so behandeln, also Test, ob Pin 
auf L wenn Taste gedrückt.

Dein Programm habe ich mir nicht weiter angeschaut, einfach deshalb, 
weil es wenig Sinn macht, an der Software zu basteln, bevor die Hardware 
eindeutige Zustände liefert, die das Programm dann sinnvoll auswerten 
kann...

Gruß aus Berlin
Michael
OP #1599458
Lesenswert?

Nach langer Fehlersuche hab ich die Ursache gefunden... PORTC ist im 
Ar*ch!
Hab ca 7 Atmega32 herumliegen und hab genau den erwischt, der opfer 
eines Kurzschlusses wurde (fiel mir damals nicht auf, da PORTB 
einwandrei funzt).

Also hab ich den µC getauscht und siehe da... ES LEEEBT

Danke für eure Hilfe (besonders der Pullup-Ratschlag !!!)
euer
Olli

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