www.mikrocontroller.net

Forum: Compiler & IDEs Schalter PORTC 1-5 C


Autor: Halgn H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...
  //Status LED an
   DDRC |= (1 << PC0); // PC0 als Ausgang festlegen

  DDRC  &= ~(1<<DDC1);  /* Pin PC1-5 als Eingang */
  DDRC  &= ~(1<<DDC2);
  DDRC  &= ~(1<<DDC3);
  DDRC  &= ~(1<<DDC4);
  DDRC  &= ~(1<<DDC5);

  PORTC |= (1<<PC1);    /* internen Pull-Up an PC1-5 aktivieren */
  PORTC |= (1<<PC2);
  PORTC |= (1<<PC3);
  PORTC |= (1<<PC4);
  PORTC |= (1<<PC5);

  /* Fuehre Aktion aus, wenn Bit Nr. 1 (das "zweite" Bit) in PINC gesetzt (1) ist */
  while( PINC & (!(1<<PINC1)) ) {
  /* Aktion */
  PORTC |= (1 << PC0); // PC0 aktivieren
  }

  _delay_ms(300); 
   PORTC &= ~(1 << PC0); // PC0 deaktivieren 

  // Wert von PC2 prüfen 
  while(PINC & (!(1 << PINC2)))
  {
  PORTC |= (1 << PC0); // PC0 aktivieren
  }

  _delay_ms(300); 
   PORTC &= ~(1 << PC0); // PC0 deaktivieren 


MfG nightalex

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Nobody (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Halgn H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
while ((PINC & (1 << PINC1)) != 0) ...
geht nicht, es leuchtet ständig, auch wenn ich !=1 mache O.o
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdio.h>
#include <string.h>

int main()
{


  //Status LED an
   DDRC |= (1 << PC0); // PC als Ausgang festlegen

  DDRC  &= ~(1<<DDC1);  /* Pin PC1-5 als Eingang */
  DDRC  &= ~(1<<DDC2);
  DDRC  &= ~(1<<DDC3);
  DDRC  &= ~(1<<DDC4);
  DDRC  &= ~(1<<DDC5);

  //PORTC |= (1<<PC1);    /* internen Pull-Up an PC1-5 aktivieren */
  PORTC |= (1<<PC2);
  PORTC |= (1<<PC3);
  PORTC |= (1<<PC4);
  PORTC |= (1<<PC5);

  /* Wenn Taster gelickt ist soll LED an gehen*/
  while( PINC & (!(1<<PINC2)) ) {
  /* Aktion */
  PORTC |= (1 << PC0); // PC0 aktivieren
  }

  _delay_ms(300); //300 M Secunden warten und Auschalten
   PORTC &= ~(1 << PC0); // PC0 deaktivieren 

  // Wert von PC3 prüfen 
  while(PINC & (!(1 << PC3)))
  {
  PORTC |= (1 << PC0); // PC0 aktivieren
  }

  _delay_ms(300); 
   PORTD &= ~(1 << PD0); // PD0 deaktivieren 

  // Wert von PC4 prüfen 
  while(PINC & (!(1 << PC4)))
  {
  PORTC |= (1 << PC0); // PC0 aktivieren
  }

  _delay_ms(300); 
   PORTD &= ~(1 << PD0); // PD0 deaktivieren 

  // Wert von PC5 prüfen 
  while(PINC & (!(1 << PC5)))
  {
  PORTC |= (1 << PC0); // PC0 aktivieren
  }

  _delay_ms(300); 
   PORTC &= ~(1 << PC0); // PD0 deaktivieren 

  // Wert von PC1 prüfen 
  while(PINC & (!(1 << PC1)))
  {
  PORTC |= (1 << PC0); // PC0 aktivieren
  }

   while(1) { } //Hauptprogramm
    return 0;
}

Autor: Nobody (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: tsaG (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für ein Controller? Eventuell JTAG Fuse abschalten.

Autor: Halgn H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Halgn H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdio.h>
#include <string.h>  


//#include "pcd8544.h"
#include "main.h"

bool PC_LCD = 0;
bool PC_END = 1;

int R1;//Zwischenspeicher
int R2;
int R3;
int R4;
// Register Bsp:
//0 = Bit
//1 = Bit
//2 = Bit
//3 = Bit

void Funktion_Go(int r1, int r2);
void LED(int On);
void ELED(int On);

int main()
{

  //Status LED an
    DDRC |= (1 << PC0); // PC0 als Ausgang festlegen
  
  //ELED
  DDRB |= (1 << PB6);


  LED(1);
  ELED(2);
  _delay_ms(50);

/*  if(PC_LCD)
  {
  LcdInit(); //LCD Start
  LcdContrast(0x7F); //Kontrast
  LcdImage(waitImage); //Bild
  LcdGotoXYFont(1,4); //Zeile
    LcdFStr(FONT_1X,(unsigned char*)PSTR("PC Startet...")); //Startet
  LcdUpdate();// Auf Display
  _delay_ms(100);
  LcdClear(); //Bildschirm räumen
  }*/

  DDRC  &= ~(1<<DDC1);  /* Pin PC1-5 als Eingang */
  DDRC  &= ~(1<<DDC2);
  DDRC  &= ~(1<<DDC3);
  DDRC  &= ~(1<<DDC4);
  DDRC  &= ~(1<<DDC5);

    /* internen Pull-Up an PC1-5 aktivieren */
  PORTC = ( 1 << PC1 ) | ( 1 << PC2 );
  PORTC |= (1<<PC3);
  PORTC |= (1<<PC4);
  PORTC |= (1<<PC5);

/*---- POST TEST ----*/
bool Post = 1;
int a = 4;
while(Post)
{
  if(a == 4) if((PINC & ( 1 << PC2 )) == 0) { LED(1); _delay_ms(300); LED(0); a=3;}
  if(a == 3) if((PINC & ( 1 << PC3 )) == 0) { LED(1); _delay_ms(300); LED(0); a=2;}
  if(a == 2) if((PINC & ( 1 << PC4 )) == 0) { LED(1); _delay_ms(300); LED(0); a=1;}
  if(a == 1) if((PINC & ( 1 << PC5 )) == 0) { LED(1); _delay_ms(300); Post = 0; }
}
LED(0); _delay_ms(100);
/*---- POST ENDE ----*/


bool Bit = 0;
int R11 =0;
int R22 =0;
  /* Hauptfunktion */
  while(PC_END)
  {

  if((PINC & ( 1 << PC1 )) == 0)
  {
  //Reinigen
  R1 = 0; R2 = 0; R3 = 0; R4 = 0;

  //Festplattedatten fomatieren
  if((PINC & ( 1 << PC2 )) == 0) R1 = 1;
  if((PINC & ( 1 << PC3 )) == 0) R2 = 1;
  if((PINC & ( 1 << PC4 )) == 0) R3 = 1;
  if((PINC & ( 1 << PC5 )) == 0) R4 = 1;

  //Daten zusammenfassen
  if(!Bit)
  {
  R11 = 0000;
  R11 = R1*1000;
  R11 = R11 + (R2*100);
  R11 = R11 + (R3*10);
  R11 = R11 + (R4*1);
  Bit = 1;
  if(R11 == 1111) { LED(1); _delay_ms(100); LED(0); }
  LED(1); _delay_ms(100); LED(0); 
  }
  else
  {
  R22 = R1*1000;
  R22 = R11 + R2*100;
  R22 = R11 + R3*10;
  R22 = R11 + R4*1;
  //Funktion Go
  LED(1); _delay_ms(100); LED(0); _delay_ms(100); LED(1); _delay_ms(100); LED(0);
  Funktion_Go(R11, R22);
  Bit = 0;
  }
  }
  }

  _delay_ms(300);
   PORTC &= ~(1 << PC0); // PC0 deaktivieren 

/*

    LcdInit();
  LcdContrast(0x7F);


  PORTD &= ~(1 << PD0); // PD0 deaktivieren 

    _delay_ms(300);

    LcdClear();
    LcdImage(waitImage); 
    LcdUpdate();


    _delay_ms(100);
    LcdContrast(0x00);
    LcdUpdate();
    _delay_ms(100);

    //display string
    LcdClear();

  LcdPixel ( 10, 10, 1);

    LcdUpdate();// Auf Display
*/

   while(1) { } //Hauptprogramm
    return 0;
}

void PC_Down()
{
PC_END = 0;
}

Autor: Halgn H. (Gast)
Datum:

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

---*topic closs*----

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
  else
  {
  R22 = R1*1000;
  R22 = R11 + R2*100;
  R22 = R11 + R3*10;
  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
bool Post = 1;
int a = 4;
while(Post)
{
  if(a == 4) if((PINC & ( 1 << PC2 )) == 0) { LED(1); _delay_ms(300); LED(0); a=3;}
  if(a == 3) if((PINC & ( 1 << PC3 )) == 0) { LED(1); _delay_ms(300); LED(0); a=2;}
  if(a == 2) if((PINC & ( 1 << PC4 )) == 0) { LED(1); _delay_ms(300); LED(0); a=1;}
  if(a == 1) if((PINC & ( 1 << PC5 )) == 0) { LED(1); _delay_ms(300); Post = 0; }
}
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:
  ...

  if( (PINC & ( 1 << PC2 )) == 0 )
  {
    LED(1);
    _delay_ms(300);
    LED(0);
  }

  if( (PINC & ( 1 << PC3 )) == 0 )
  {
    LED(1);
    _delay_ms(300);
    LED(0);
  }

  if( (PINC & ( 1 << PC4 )) == 0 )
  {
    LED(1);
    _delay_ms(300);
    LED(0);
  }

  if( (PINC & ( 1 << PC5 )) == 0 )
  {
    LED(1);
    _delay_ms(300);
    LED(0);
  }

  LED(0);
  _delay_ms(100);

  ...

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.

Autor: Halgn H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank^^

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.