Hallo Members hab ein Problem,
Ich will einach nur die LED anschalten wenn PortC1(danach PortC2) an ist
aber es geht nicht.
Im Internet wurde ich nicht fündig bitte hilft mir...
1
//Status LED an
2
DDRC|=(1<<PC0);// PC0 als Ausgang festlegen
3
4
DDRC&=~(1<<DDC1);/* Pin PC1-5 als Eingang */
5
DDRC&=~(1<<DDC2);
6
DDRC&=~(1<<DDC3);
7
DDRC&=~(1<<DDC4);
8
DDRC&=~(1<<DDC5);
9
10
PORTC|=(1<<PC1);/* internen Pull-Up an PC1-5 aktivieren */
11
PORTC|=(1<<PC2);
12
PORTC|=(1<<PC3);
13
PORTC|=(1<<PC4);
14
PORTC|=(1<<PC5);
15
16
/* Fuehre Aktion aus, wenn Bit Nr. 1 (das "zweite" Bit) in PINC gesetzt (1) ist */
Alexander Ljubizki schrieb:> while( PINC & (!(1<<PINC1)) ) {
Das ist nicht, was du willst. Wenn du dir über die Logik nicht
ganz sicher bist, dann vermeide derartige Abkürzungen und schreib
es lieber aus:
Alexander Ljubizki schrieb:> Im Internet wurde ich nicht fündig
Wonach hast Du gesucht? Nach "es geht nicht"?
Zunächst mal lies Dir http://www.mikrocontroller.net/articles/Netiquette
durch und überarbeite Deine Frage.
Kompilierbaren Code posten.
Beschreibung was das Programm machen soll.
Beschreibung was es tatsächlich macht.
Beschreibung auf welche Weise im Detail der Code das machen soll, was Du
willst was es tun soll.
Etcpp.
Hallo,
soory hab mich koregiert:
>Kompilierbaren Code posten.
Siehe unten
>Beschreibung was das Programm machen soll.
Wenn ich auf den Taster PortC1 Klicke soll die LED 300 Mls an sein.
Danach ist sie aus und macht es wieder wenn der Taster PortC2 geklickt
ist. So geht es weiter bist PortC5
>Beschreibung was es tatsächlich macht.
Es bleibt beim ersten Taster stecken und leuchtet nicht.
>Beschreibung auf welche Weise im Detail der Code das machen soll, was Du willst
was es tun soll.
1
while((PINC&(1<<PINC1))!=0)...
geht nicht, es leuchtet ständig, auch wenn ich !=1 mache O.o
1
#include<avr/io.h>
2
#include<avr/pgmspace.h>
3
#include<util/delay.h>
4
#include<stdio.h>
5
#include<string.h>
6
7
intmain()
8
{
9
10
11
//Status LED an
12
DDRC|=(1<<PC0);// PC als Ausgang festlegen
13
14
DDRC&=~(1<<DDC1);/* Pin PC1-5 als Eingang */
15
DDRC&=~(1<<DDC2);
16
DDRC&=~(1<<DDC3);
17
DDRC&=~(1<<DDC4);
18
DDRC&=~(1<<DDC5);
19
20
//PORTC |= (1<<PC1); /* internen Pull-Up an PC1-5 aktivieren */
21
PORTC|=(1<<PC2);
22
PORTC|=(1<<PC3);
23
PORTC|=(1<<PC4);
24
PORTC|=(1<<PC5);
25
26
/* Wenn Taster gelickt ist soll LED an gehen*/
27
while(PINC&(!(1<<PINC2))){
28
/* Aktion */
29
PORTC|=(1<<PC0);// PC0 aktivieren
30
}
31
32
_delay_ms(300);//300 M Secunden warten und Auschalten
Alexander Ljubizki schrieb:> Danach ist sie aus und macht es wieder wenn der Taster PortC2 geklickt> ist.
Entschuldige, aber das ist Geschwafel. Die LED ist nicht einfach an
irgendeinem Puntk im Programmablauf aus. Sie wird gesteuert, d.h. der
Prozessor ändert an irgendeinem Punkt im Programmablauf die
Port-Konfiguration so, das die LED keinen Strom bekommt.
Die LED macht auch nichts aufgrund eines Tastendrucks. Das kann sie
nämlich nicht erkennen. Der Prozessor macht etwas.
> Es bleibt beim ersten Taster stecken und leuchtet nicht.
Was heisst "steckenbleiben"? Wir reden hier nicht von Mechanik.
>> Beschreibung auf welche Weise im Detail der Code das machen soll, was Du >>
willst was es tun soll.
> while ((PINC & (1 << PINC1)) != 0) ...geht nicht, es leuchtet ständig, auch wenn
ich !=1 mache O.o
Du hast es nicht verstanden! Da steht "geht nicht" und was tatsächlich
geschieht. Danach habe ich nicht gefragt. Du sollst erklären, warum Du
meinst, das das Programm
Das war viel zu schnell. Nimm Dir ein paar Stunden Zeit und überdenke
das Ganze.
"Etcpp" und Netiqette hast Du auch übersehen. Wo ist der Schaltplan?
Alexander Ljubizki schrieb:> while ((PINC & (1 << PINC1)) != 0) ...geht nicht, es leuchtet ständig,
Dann korrigiere bitte die weiteren Logikfehler da drin. Aber mit
deiner ursprünglichen Formulierung brauchst du es gar nicht erst
probieren, denn der sieht man bereits auf den ersten Blick an, dass
sie gar nicht funktionieren kann (zumindest nicht in dem Sinne,
den du wolltest).
Hab den Controller Atmega8 - 16. Könnt ihr einfach mal hier mal das
Fertige Posten? Dann könnte ich sehen was ich falsch gemacht hab
>Eventuell JTAG Fuse abschalten.
Wie schalte ich sie aus? Hab Avr Studio 4
Alexander Ljubizki schrieb:> Hab den Controller Atmega8 - 16. Könnt ihr einfach mal hier mal das> Fertige Posten? Dann könnte ich sehen was ich falsch gemacht hab
Dir wurde schon die Zeile gezeigt, wo du einen Fehler hast. Es wurde
auch schon der korrekte Ersatz dafür angegeben. Schaffst du es wirklich
nicht selbst, diese Ersetzung in deinen Code zu überführen?
Sorry, aber das nehme ich dir nicht ab.
Alexander Ljubizki schrieb:> Dann könnte ich sehen was ich falsch gemacht hab
Ich denke, das Hauptproblem was du falsch machst ist:
Du unterschätzt programmieren.
Die Tutorialsbeispiele oder die Beispiele die du hier überall findest,
sehen alle so primitiv aus.
Eine LED, die sich einschaltet wenn man eine Taste drückt und die wieder
ausgeht, wenn man die Taste loslässt. Was soll daran schon aufregend
sein? Und doch schulen sie das Verständnis dessen, was man tut.
Deine selbst gewählte Aufgabenstellung ist eine Erweiterung davon. Wer
das einfache Beispiel hinkriegt, sollte mit deiner Aufgabenstellung
nicht mehr allzuviele Probleme haben. Der Schlüssel liegt in der
richtigen Abfrage des Portpins. Hast du das mit dem einfachen Beispiel
geschafft, schaffst du es auch mit dem komplizierteren.
Was du für das einfache Beispiel brauchst, findest du alles im
AVR-GCC-Tutorial
Danke jetzt geht es aber nun hab ich ein anderes problem(wieder taster)
Was ich will:
Er soll 5 Tasten kucken wenn die 1 gedrück ist sollen die anderen 4
gespeichert werden( 1111 )
Wenn ich 2 mal das gemacht hab soll er beides senden(R1 1111 R2 1111)
Was es tut:
Der Post test geht aber er gibt keine 1111 raus und da weiß ich nicht
weiter. Hab schon 2 mal ALLES neu gecodet aber nützt nichts hoffe auf
hilfe.
Hab Atmega8-16 inter. 1 Mhz
2 LED: PC0 PB6
Alexander Ljubizki schrieb:> bzw. bekamm sie hier nicht so
Das liegt wohl daran, dass
* deine Aufgabenstellung Scheisse beschrieben ist
* dein geposteter Code unnötig kompliziert ist
* mit nichtssagenden Kommentaren gepflastert ist
* über keinerlei Einrückstruktur verfügt
* die Analyse was du da eigentlich getrieben hast für die
vermeintlich einfache Aufgabenstellung zu vielAufwand darstellt
* das Extrahieren, wo du falsch gearbeitet hast bzw. das Formulieren
von Empfehlungen um dich wieder auf den richtigen Pfad zu bringen
im Vergleich zur Aufgabenstellung verdammt viel Aufwand ist, wobei
man auch noch berücksichtigen mus, dass man das Programm wie gepostet
am besten wegschmeisst und in einem Drittel der Zeilen neu schreibt.
* Immer noch nicht klar ist, was du eigentlich genau willst: Eine Aktion
bei Tastemdruck machen, oder eine Aktion machen solange eine Taste
gedrückt ist. Das sind 2 verschiedene Paar Schuhe. Deine Beschreibung
klingt nach ersterem, du implementierst aber letzteres mit einem
Haufen _delay_ms dazwischen.
Mag sein, dass das genau das ist, was du willst. Auf meiner Seite
des Bildschirms geht das aus der dürftigen Beschreibung der
Funktionalität nicht hervor und die 'seltsamen' Variablennamen
bringen auch keine Klarheit.
Aber rein aus Analogiegründen, ohne eine Analyse gemacht zu habe, denke
ich, das das hier
1
else
2
{
3
R22=R1*1000;
4
R22=R11+R2*100;
5
R22=R11+R3*10;
6
R22=R11+R4*1;
nicht stimmen kann. Du berechnest R22 neu, benutzt aber auf der rechten
Seite laufend R11. Ein Flüchtigkeitsfehler, zugegeben. Aber den könntest
du auch alleine finden, wenn du dein Programm zb im Debugger einfach mal
durchgehst und dir die Variablen ansiehst.
So wie du auch noch viele andere Dinge im Debugger gesehen und gefunden
hättest. Ein besonderes Bonmont ist ja das hier
Mit der while-Schleife und der a-Variablen ist das ja die schon fast
maximal komplizierte und verschleiernde Art zu schreiben:
1
...
2
3
if((PINC&(1<<PC2))==0)
4
{
5
LED(1);
6
_delay_ms(300);
7
LED(0);
8
}
9
10
if((PINC&(1<<PC3))==0)
11
{
12
LED(1);
13
_delay_ms(300);
14
LED(0);
15
}
16
17
if((PINC&(1<<PC4))==0)
18
{
19
LED(1);
20
_delay_ms(300);
21
LED(0);
22
}
23
24
if((PINC&(1<<PC5))==0)
25
{
26
LED(1);
27
_delay_ms(300);
28
LED(0);
29
}
30
31
LED(0);
32
_delay_ms(100);
33
34
...
wozu das allerdings gut sein soll? Man weiß es nicht. Sinn ergibt das
alles nicht viel. Die LED leuchtet für jede gedrückte Taste 300ms. Aber
welche Taste gerade gedrückt ist, lässt sich daraus nicht ableiten. Aber
ok. Wenn dir die Anzahl der Tasten schon reicht.
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.