PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ich bruache hilfe beim Taster auswerten.



crabtack
22.06.2010, 13:15
Also, ich möcghte einen Taster auswerten, der an einer seite am atmegapin und internem pullup ist und am anderen an masse.
Aber irgendwie funktioniert das nicht.
Die zeit verändert sich nach frücken des tasters nicht.


#include <avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>
#include <stdint.h>

int main(void)
{
int time = 14;
int second = 0;
int time_e = 0;
int time_z = 0;



DDRB = 255;
DDRA = 225;
DDRD = 0;
PORTD = 255;
while(1)
{




if (PINB == (PINB & 00010000))// hier ist das problem
{
time--;
}

if (PINB == (PINB & 00100000))// hier ist das problem
{
time++;
}

time_z =(time/10);
time_e = time - (time_z*10);


if (time_z == 6)
{

PORTA = 0b00111111;

}
if (time_z == 5)
{
PORTA = 0b00011111;
}
if (time_z == 4)
{
PORTA = 0b00001111;
}
if (time_z == 3)
{
PORTA = 0b00000111;
}
if (time_z == 2)
{
PORTA = 0b00000011;
}
if (time_z == 1)
{
PORTA = 0b00000001;
}
if (time_z == 0)
{
PORTA = 0b00000000;
}
if (time_e==9)
{
PORTA = PORTA + 0b01000000;
PORTB = 0b11111111;
}
else if (time_e==8)
{
PORTB = 0b11111111;
}
else if (time_e==7)
{
PORTB = 0b01111111;
}
else if (time_e==6)
{
PORTB = 0b00111111;
}
else if (time_e==5)
{
PORTB = 0b00011111;
}
else if (time_e==4)
{
PORTB = 0b00001111;
}
else if (time_e==3)
{
PORTB = 0b00000111;
}
else if (time_e==2)
{
PORTB = 0b00000011;
}
else if (time_e==1)
{
PORTB = 0b00000001;
}
else if (time_e==0)
{
PORTB = 0b00000000;
}

_delay_ms(1000);
second ++;
if (second == 60)
{
time --;
second = 0;
}


}
}



Das ziel des ganzen ist eine Eieruhr.
Ich habe links 9 led´s fpür die minuten und rechts für 10 minuten.
Dann muss man addieren wieviel zeit noch bleibt.
also z.b. links 4 und rechts 2 wären 24 minuten.
Man soll die Zeit nun mit den tastern einstellen können.
Aber das geht halt aus irgendwelchen Gründen nicht.
Ich hoffe, dass ihr mir weiterhelfen könnt.

sternst
22.06.2010, 13:32
if (PINB == (PINB & 00010000))// hier ist das problem Zwei Dinge, über die du nachdenken solltest:

1) "00010000" ist keine binäre Konstante, sondern eine oktale.

2) Und wenn es eine binäre wäre, würde der Ausdruck prüfen, ob alle Bits Null sind, bis auf PB4, dessen Zustand wäre egal. Ich denke nicht, dass das das ist, was du willst.

Thomas$
22.06.2010, 13:37
0b fehlt noch davor würd ich sagen
(PINB & 0b00010000) !==0
bin nicht ganz fit in c

Hubert.G
22.06.2010, 17:38
Du hast auch Port A und B auf Ausgang gestellt und Port D auf Eingang mit PullUp.
Mit Port D machst du aber nichts.

crabtack
23.06.2010, 12:45
Danke euch 3 die taster funktionieren jetzt.
Ich habe beide zu port D gemcht.
Und jertzt habe ichd aran gedacht, dass alle oins mit pullup wiederstand spannung haben.

Jetzt habe ich noch 2 probleme:
1. wie kann ich eine 2. schleife extra für die taster machen? die dann parrallel zu der anderen läuft?
Also, damit man nicht immer 1 sekunde den t aster drücken muss bis es aktzeptiert wird.
2.
die led´s an porta pin 2,3,4 und 5 leuhten viel schwächer so, als wenn der atmega einen wiederstand an den pin gemcht hätte.
Und es ist derfinitiv kein hardware fehle rich ahbe 1k ohm wiederstände benutzt so wie an allen led pins.

Hubert.G
23.06.2010, 13:21
Da wirst du dich mit den Timer auseinander setzen müssen.
Einen Takt mit 1/10sec machen und daraus alles ableiten.

crabtack
23.06.2010, 15:08
Ich habe ne viel leichtere Lösung gefunden.


_delay_ms(200); /5 mal weniger warten
second ++;
if (second == 300) / 5 mal öfters zählen bis zu einer sekunde.
{
time --;
second = 0;

Timer und interrupts werde ich meiden, da verstehe ich überhaupt nichts.
Jetzt bleibt nur noch das problem mit dfen led´s, wenn es keine lösung durch das programm gibt muss ich einfach die wiederstände geghen draht austauchen.

Richard
23.06.2010, 16:28
Wie sind denn die LED`s angeschlossen? Die sollten mit den Widerstand
an + xyz Volt und mit den Ausgängen dann mit GND geschaltet werden.
Die Ausgänge können nur bei LO genügend Strom liefern. 1 k R`s
sind auch etwas sehr hochohmig, da kommt bei 12 V Versorgung schon
recht wenig bei den LED`s an....Außer Du hast LED`s die schon bei
~ 2 mAh gut leuchten, die gibt es auch, sind aber teurer. Dafür muß
der µC dann aber weniger Arbeiten.

Gruß Richard

crabtack
23.06.2010, 16:48
einfach amtega ausgang---1kohm wiederstand---led---gnd.
Ja meine brauchen nur 2 ma aber 7 cent, da sgeht doch.