Forum: Compiler & IDEs Schalter PORTC 1-5 C


von Halgn H. (Gast)


Lesenswert?

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 */
17
  while( PINC & (!(1<<PINC1)) ) {
18
  /* Aktion */
19
  PORTC |= (1 << PC0); // PC0 aktivieren
20
  }
21
22
  _delay_ms(300); 
23
   PORTC &= ~(1 << PC0); // PC0 deaktivieren 
24
25
  // Wert von PC2 prüfen 
26
  while(PINC & (!(1 << PINC2)))
27
  {
28
  PORTC |= (1 << PC0); // PC0 aktivieren
29
  }
30
31
  _delay_ms(300); 
32
   PORTC &= ~(1 << PC0); // PC0 deaktivieren

MfG nightalex

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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:
1
while ((PINC & (1 << PINC1)) != 0) ...

von Nobody (Gast)


Lesenswert?

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.

von Halgn H. (Gast)


Lesenswert?

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
int main()
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
33
   PORTC &= ~(1 << PC0); // PC0 deaktivieren 
34
35
  // Wert von PC3 prüfen 
36
  while(PINC & (!(1 << PC3)))
37
  {
38
  PORTC |= (1 << PC0); // PC0 aktivieren
39
  }
40
41
  _delay_ms(300); 
42
   PORTD &= ~(1 << PD0); // PD0 deaktivieren 
43
44
  // Wert von PC4 prüfen 
45
  while(PINC & (!(1 << PC4)))
46
  {
47
  PORTC |= (1 << PC0); // PC0 aktivieren
48
  }
49
50
  _delay_ms(300); 
51
   PORTD &= ~(1 << PD0); // PD0 deaktivieren 
52
53
  // Wert von PC5 prüfen 
54
  while(PINC & (!(1 << PC5)))
55
  {
56
  PORTC |= (1 << PC0); // PC0 aktivieren
57
  }
58
59
  _delay_ms(300); 
60
   PORTC &= ~(1 << PC0); // PD0 deaktivieren 
61
62
  // Wert von PC1 prüfen 
63
  while(PINC & (!(1 << PC1)))
64
  {
65
  PORTC |= (1 << PC0); // PC0 aktivieren
66
  }
67
68
   while(1) { } //Hauptprogramm
69
    return 0;
70
}

von Nobody (Gast)


Lesenswert?

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?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von tsaG (Gast)


Lesenswert?

Was für ein Controller? Eventuell JTAG Fuse abschalten.

von Halgn H. (Gast)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

Alexander Ljubizki schrieb:
> Könnt ihr einfach mal hier mal das
> Fertige  Posten?

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Alexander Ljubizki schrieb:
>>Eventuell JTAG Fuse abschalten.
> Wie schalte ich sie aus? Hab Avr Studio 4

Die hat der Mega8 (zum Glück für dich) nicht.

Oliver

von Rolf Magnus (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Halgn H. (Gast)


Lesenswert?

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
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
8
//#include "pcd8544.h"
9
#include "main.h"
10
11
bool PC_LCD = 0;
12
bool PC_END = 1;
13
14
int R1;//Zwischenspeicher
15
int R2;
16
int R3;
17
int R4;
18
// Register Bsp:
19
//0 = Bit
20
//1 = Bit
21
//2 = Bit
22
//3 = Bit
23
24
void Funktion_Go(int r1, int r2);
25
void LED(int On);
26
void ELED(int On);
27
28
int main()
29
{
30
31
  //Status LED an
32
    DDRC |= (1 << PC0); // PC0 als Ausgang festlegen
33
  
34
  //ELED
35
  DDRB |= (1 << PB6);
36
37
38
  LED(1);
39
  ELED(2);
40
  _delay_ms(50);
41
42
/*  if(PC_LCD)
43
  {
44
  LcdInit(); //LCD Start
45
  LcdContrast(0x7F); //Kontrast
46
  LcdImage(waitImage); //Bild
47
  LcdGotoXYFont(1,4); //Zeile
48
    LcdFStr(FONT_1X,(unsigned char*)PSTR("PC Startet...")); //Startet
49
  LcdUpdate();// Auf Display
50
  _delay_ms(100);
51
  LcdClear(); //Bildschirm räumen
52
  }*/
53
54
  DDRC  &= ~(1<<DDC1);  /* Pin PC1-5 als Eingang */
55
  DDRC  &= ~(1<<DDC2);
56
  DDRC  &= ~(1<<DDC3);
57
  DDRC  &= ~(1<<DDC4);
58
  DDRC  &= ~(1<<DDC5);
59
60
    /* internen Pull-Up an PC1-5 aktivieren */
61
  PORTC = ( 1 << PC1 ) | ( 1 << PC2 );
62
  PORTC |= (1<<PC3);
63
  PORTC |= (1<<PC4);
64
  PORTC |= (1<<PC5);
65
66
/*---- POST TEST ----*/
67
bool Post = 1;
68
int a = 4;
69
while(Post)
70
{
71
  if(a == 4) if((PINC & ( 1 << PC2 )) == 0) { LED(1); _delay_ms(300); LED(0); a=3;}
72
  if(a == 3) if((PINC & ( 1 << PC3 )) == 0) { LED(1); _delay_ms(300); LED(0); a=2;}
73
  if(a == 2) if((PINC & ( 1 << PC4 )) == 0) { LED(1); _delay_ms(300); LED(0); a=1;}
74
  if(a == 1) if((PINC & ( 1 << PC5 )) == 0) { LED(1); _delay_ms(300); Post = 0; }
75
}
76
LED(0); _delay_ms(100);
77
/*---- POST ENDE ----*/
78
79
80
bool Bit = 0;
81
int R11 =0;
82
int R22 =0;
83
  /* Hauptfunktion */
84
  while(PC_END)
85
  {
86
87
  if((PINC & ( 1 << PC1 )) == 0)
88
  {
89
  //Reinigen
90
  R1 = 0; R2 = 0; R3 = 0; R4 = 0;
91
92
  //Festplattedatten fomatieren
93
  if((PINC & ( 1 << PC2 )) == 0) R1 = 1;
94
  if((PINC & ( 1 << PC3 )) == 0) R2 = 1;
95
  if((PINC & ( 1 << PC4 )) == 0) R3 = 1;
96
  if((PINC & ( 1 << PC5 )) == 0) R4 = 1;
97
98
  //Daten zusammenfassen
99
  if(!Bit)
100
  {
101
  R11 = 0000;
102
  R11 = R1*1000;
103
  R11 = R11 + (R2*100);
104
  R11 = R11 + (R3*10);
105
  R11 = R11 + (R4*1);
106
  Bit = 1;
107
  if(R11 == 1111) { LED(1); _delay_ms(100); LED(0); }
108
  LED(1); _delay_ms(100); LED(0); 
109
  }
110
  else
111
  {
112
  R22 = R1*1000;
113
  R22 = R11 + R2*100;
114
  R22 = R11 + R3*10;
115
  R22 = R11 + R4*1;
116
  //Funktion Go
117
  LED(1); _delay_ms(100); LED(0); _delay_ms(100); LED(1); _delay_ms(100); LED(0);
118
  Funktion_Go(R11, R22);
119
  Bit = 0;
120
  }
121
  }
122
  }
123
124
  _delay_ms(300);
125
   PORTC &= ~(1 << PC0); // PC0 deaktivieren 
126
127
/*
128
129
    LcdInit();
130
  LcdContrast(0x7F);
131
132
133
  PORTD &= ~(1 << PD0); // PD0 deaktivieren 
134
135
    _delay_ms(300);
136
137
    LcdClear();
138
    LcdImage(waitImage); 
139
    LcdUpdate();
140
141
142
    _delay_ms(100);
143
    LcdContrast(0x00);
144
    LcdUpdate();
145
    _delay_ms(100);
146
147
    //display string
148
    LcdClear();
149
150
  LcdPixel ( 10, 10, 1);
151
152
    LcdUpdate();// Auf Display
153
*/
154
155
   while(1) { } //Hauptprogramm
156
    return 0;
157
}
158
159
void PC_Down()
160
{
161
PC_END = 0;
162
}

von Halgn H. (Gast)


Lesenswert?

geht nun brauch keine hilfe mehr :F bzw. bekamm sie hier nicht so

---*topic closs*----

von Karl H. (kbuchegg)


Lesenswert?

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
1
bool Post = 1;
2
int a = 4;
3
while(Post)
4
{
5
  if(a == 4) if((PINC & ( 1 << PC2 )) == 0) { LED(1); _delay_ms(300); LED(0); a=3;}
6
  if(a == 3) if((PINC & ( 1 << PC3 )) == 0) { LED(1); _delay_ms(300); LED(0); a=2;}
7
  if(a == 2) if((PINC & ( 1 << PC4 )) == 0) { LED(1); _delay_ms(300); LED(0); a=1;}
8
  if(a == 1) if((PINC & ( 1 << PC5 )) == 0) { LED(1); _delay_ms(300); Post = 0; }
9
}
10
LED(0); _delay_ms(100);

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.

von Halgn H. (Gast)


Lesenswert?

Vielen Dank^^

ich muss zugeben das ich den Fehler spähter gefunden hab. Ich werde mich 
bessern.

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.