Forum: Mikrocontroller und Digitale Elektronik Bekomme Simple LCD anst. nicht hin


von O. L. (revil77)


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

von Michael U. (amiga)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von O. L. (revil77)


Lesenswert?

@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).

von O. L. (revil77)


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...

von L. J. (luke1)


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.

von Michael U. (amiga)


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

von L. J. (luke1)


Lesenswert?

Naja, wenn du schon die Pullups aktiviert hast, kannst du mit dem Taster 
ja nur gegen Masse schalten, da der Ruhepegel schließlich 1 ist. Lässt 
du deine Software so wie sie ist trifft jedes case ja zu, da du den 
Eingang auf 1 abfragst und nicht auf 0.

von O. L. (revil77)


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

von spess53 (Gast)


Lesenswert?

HI

>Nach langer Fehlersuche hab ich die Ursache gefunden... PORTC ist im
>Ar*ch!

Oder JTAG-Fuse eingeschaltet.

MfG Spess

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.