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
voidoutp(chard);
6
7
intmain(void)
8
{
9
charx;
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
return0;
33
}
34
35
voidoutp(chard)
36
{
37
switch(d)
38
{
39
case1:
40
lcd_gotoxy(0,0);
41
lcd_puts("~~~~ Reset ~~~~ ");
42
lcd_gotoxy(0,1);
43
lcd_puts("~~~~~~~~~~~~~~~~");
44
break;
45
46
case2:
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
case3:
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
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
> 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.
@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).
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...
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.
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
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.
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
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.