mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Evalboard AVR Mega128 Board


Autor: Andreas S. (akku75)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe Probleme mit der Programmierung von meinem Evalboard AVR 
Mega128 Board von Deltawave.
Damit ich mal sehe was passiert, wollte ich ein einfache Sache 
programmieren, am Pin 0 von Port G habe ich einen Taster über VCC 
angeschlossen, wenn ich den Taster betätige soll  der Pin 0 vom Port G 
high bekommen und den Ausgang Port D Pin 7 auf high setzen.
Schalten lässt sich einfach nix. Leider ist der Pin 7 an Port D ist 
immer high mit meinem Programm!

Vollständige Datei evalboard.c im Anhang

...

sei();
   while(1) {
  DDRG &= ~0x01; // Pin 0 von Port G als Eingang nutzen
  PORTG |= 0x01; // pull-up Widerstand aktivieren
  if ( (PING & 0x01) == 1) 
  { // Zustand auslesen
    DDRD |= 0x80; // Pin 7 von Port D als Ausgang nutzen
    PORTD |= 0x80; //auf 1 (=high) setzen
  }



Brauch dringend Hilfe!!!

Gruß
Andreas

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist doch klar, dass die LED immer an ist...

Du hast einen Taster vom Eingang nach VCC und gleichzeitig den Pullup 
aktiviert. Also zieht entweder der Pullup oder der Taster den Pin nach 
VCC. Somit bekommste als Ergebnis immer ne 1...

Mach mal den Taster nach GND. Dann sollte das funktionieren. Wenn du den 
Taster drückst hast du dann am Eingang ne 0. Sonst halt deine 1.

MfG
Marius

Autor: Andreas S. (akku75)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Marius,

habe es gerade versucht, es geht einfach nicht!
Pin 7 an Port D ist immer high.

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo in deinem Programm setzt du den PIN den wieder auf 0 ?

  if ( (PING & 0x01) == 1)
  { // Zustand auslesen
    DDRD |= 0x80; // Pin 7 von Port D als Ausgang nutzen
    PORTD |= 0x80; //auf 1 (=high) setzen
  } ^^^^^^^^^^^^^^
    Hier wird der nur immer auf 1 gesetzt

Was dur brauchst ist der "else" fall in deinem Programmm

also

else
{
   PORTD &= 0x7f;
}

Das DDR register brauchst du ueberigens nur am Anfang deines Programms 
einmal zu setzen.

Gruss Helmi

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die LED ist high, weil du deine if-Abfrage noch nicht angepasst hast. 
Wir haben hier negative Logik.
Außerdem fehlt der Code, der die LED auch wieder zurücksetzt, falls du 
den Taster los lässt. Hab das mal hinzugefügt.

Das sollte funktionieren:
sei();
   while(1) {
  DDRG &= ~0x01; // Pin 0 von Port G als Eingang nutzen
  PORTG |= 0x01; // pull-up Widerstand aktivieren
  if ( (PING & 0x01) == 0) 
  { // Zustand auslesen
    DDRD |= 0x80; // Pin 7 von Port D als Ausgang nutzen
    PORTD |= 0x80; //auf 1 (=high) setzen
  }
  else
  {
    PORTD &= 0x7F; // PD7 wieder auf low setzen
  }

Autor: akku75 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
euere Tips haben mir sehr weitergeholfen!
Jetzt will ich das Programm so erweitern, dass bei 3 Tastern immer nur 
ein Ausgang high hat! D.h.:Taster 1 muss LED2 oder LED3 zurücksetzen 
usw.
Leider bleibt keine LED dauernd an!
Was mach ich falsch?

[c]
 sei();
   while(1) {
  DDRG &= ~0x01; // Pin 0 von Port G als Eingang nutzen
  PORTG |= 0x01; // pull-up Widerstand aktivieren
  DDRD &= ~0x40; // Pin 6 von Port D als Eingang nutzen
  PORTD |= 0x40; // pull-up Widerstand aktivieren
  DDRD &= ~0x10; // Pin 4 von Port D als Eingang nutzen
  PORTD |= 0x10; // pull-up Widerstand aktivieren


if ( (PING & 0x01) == 0)
  { // Zustand auslesen
    DDRD |= 0x80; // Pin 7 von Port D als Ausgang nutzen
    PORTD |= 0x80; //auf 1 (=high) setzen
   PORTD &= 0x20; // PD5 wieder auf low setzen
    PORTD &= 0x08; // PD3 wieder auf low setzen
  }

if ( (PIND & 0x40) == 0)
  { // Zustand auslesen
    DDRD |= 0x20; // Pin 5 von Port D als Ausgang nutzen
    PORTD |= 0x20; //auf 1 (=high) setzen
   PORTD &= 0x80; // PD7 wieder auf low setzen
    PORTD &= 0x08; // PD3 wieder auf low setzen
  }

if ( (PIND & 0x10) == 0)
  { // Zustand auslesen
    DDRD |= 0x08; // Pin 3 von Port D als Ausgang nutzen
    PORTD |= 0x08; //auf 1 (=high) setzen
   PORTD &= 0x80; // PD7 wieder auf low setzen
    PORTD &= 0x20; // PD5 wieder auf low setzen
  }
  else
  {
    //PORTD &= 0x7F; // PD7 wieder auf low setzen

  }
[c]

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich dich richtig verstehe, dann soll die LED eingeschaltet werden 
und solange an bleiben, bis ein anderer Taster gedrückt wird.

Ich habe Ein- und Ausgangsdefinitionen sowie Pullups einfach mal aus der 
while-Schleife herausgezogen, da die nur einmal benötigt werden.

Also hier der Code dazu:
  sei();

  DDRG &= ~0x01; // Pin 0 von Port G als Eingang nutzen
  PORTG |= 0x01; // pull-up Widerstand aktivieren
  DDRD &= ~0x40; // Pin 6 von Port D als Eingang nutzen
  PORTD |= 0x40; // pull-up Widerstand aktivieren
  DDRD &= ~0x10; // Pin 4 von Port D als Eingang nutzen
  PORTD |= 0x10; // pull-up Widerstand aktivieren

  DDRD |= 0x08;  // PD3 als Ausgang
  DDRD |= 0x20;  // PD5 als Ausgang
  DDRD |= 0x80;  // PD7 als Ausgang
 
  while(1) {
    if ( (PING & 0x01) == 0)
    { // Zustand auslesen
      PORTD |= 0x80; //auf 1 (=high) setzen
      PORTD &= ~0x20; // PD5 wieder auf low setzen
      PORTD &= ~0x08; // PD3 wieder auf low setzen
    }

    if ( (PIND & 0x40) == 0)
    { // Zustand auslesen
      PORTD |= 0x20; //auf 1 (=high) setzen
      PORTD &= ~0x80; // PD7 wieder auf low setzen
      PORTD &= ~0x08; // PD3 wieder auf low setzen
    }

    if ( (PIND & 0x10) == 0)
    { // Zustand auslesen
      PORTD |= 0x08; //auf 1 (=high) setzen
      PORTD &= ~0x80; // PD7 wieder auf low setzen
      PORTD &= ~0x20; // PD5 wieder auf low setzen
    }
  }

So sollte das eigentlich funktionieren.

MfG
Marius

EDIT: beim Zurücksetzen natürlich negieren! ;-)

Autor: Andreas S. (akku75)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, funktioniert alles!

Jetzt will ich mit Taster4 die anderen 3 Taster erst freigeben, d.h. 
Taster 4 soll LED4 schalten und die anderen Taster in ihrer Funktion 
frei geben. Wird Taster 4 nochmal gedrückt soll die LED4 ausgehen und 
die 3 Taster werden in ihrer Funktion gesperrt!

Hoffentlich versteht mich jemand?!

Gruß
Andreas

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An sich kein Problem, aber eigentlich solltest du da doch auch selbst 
drauf kommen können, oder?

So schwer isses ja nicht. Überleg halt mal einfach, schau dir das 
Tutorial hier an und guck dir an, wie if-Abfragen etc. funktionieren ;-)

MfG
Marius

Autor: Andreas S. (akku75)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch die Portdef.:
sei();
 while(1) {

  DDRG &= ~0x01; // Pin 0 von Port G als Eingang nutzen
  PORTG |= 0x01; // pull-up Widerstand aktivieren
  DDRD &= ~0x40; // Pin 6 von Port D als Eingang nutzen
  PORTD |= 0x40; // pull-up Widerstand aktivieren
  DDRD &= ~0x10; // Pin 4 von Port D als Eingang nutzen
  PORTD |= 0x10; // pull-up Widerstand aktivieren
  DDRD &= ~0x04; // Pin 2 von Port D als Eingang nutzen
  PORTD |= 0x04; // pull-up Widerstand aktivieren
  
  DDRD |= 0x08;  // PD3 als Ausgang
  DDRD |= 0x20;  // PD5 als Ausgang
  DDRD |= 0x80;  // PD7 als Ausgang
  DDRG |= 0x02;  // PG1 als Ausgang
 
  while(1) {
    if ( (PING & 0x01) == 0)
    { // Zustand auslesen
      PORTD |= 0x80; //auf 1 (=high) setzen
      PORTD &= ~0x20; // PD5 wieder auf low setzen
      PORTD &= ~0x08; // PD3 wieder auf low setzen
    }

    if ( (PIND & 0x40) == 0)
    { // Zustand auslesen
      PORTD |= 0x20; //auf 1 (=high) setzen
      PORTD &= ~0x80; // PD7 wieder auf low setzen
      PORTD &= ~0x08; // PD3 wieder auf low setzen
    }

    if ( (PIND & 0x10) == 0)
    { // Zustand auslesen
      PORTD |= 0x08; //auf 1 (=high) setzen
      PORTD &= ~0x80; // PD7 wieder auf low setzen
      PORTD &= ~0x20; // PD5 wieder auf low setzen
    }
  }

Autor: Andreas S. (akku75)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich lese ja wie ein Bek..., aber er will mir das Programm nicht 
übersetzen!
Schau doch nochmal drüber!

Danke!
sei();
 while(1) {

  DDRG &= ~0x01; // Pin 0 von Port G als Eingang nutzen
  PORTG |= 0x01; // pull-up Widerstand aktivieren
  DDRD &= ~0x40; // Pin 6 von Port D als Eingang nutzen
  PORTD |= 0x40; // pull-up Widerstand aktivieren
  DDRD &= ~0x10; // Pin 4 von Port D als Eingang nutzen
  PORTD |= 0x10; // pull-up Widerstand aktivieren
  DDRD &= ~0x04; // Pin 2 von Port D als Eingang nutzen
  PORTD |= 0x04; // pull-up Widerstand aktivieren
  
  DDRD |= 0x08;  // PD3 als Ausgang
  DDRD |= 0x20;  // PD5 als Ausgang
  DDRD |= 0x80;  // PD7 als Ausgang
  DDRG |= 0x02;  // PG1 als Ausgang
 
  while(1) {
    if ( (PIND & 0x04) == 0)
{   PORTG |= 0x02; //auf 1 (=high) setzen

    { // Zustand auslesen
      PORTD |= 0x80; //auf 1 (=high) setzen
      PORTD &= ~0x20; // PD5 wieder auf low setzen
      PORTD &= ~0x08; // PD3 wieder auf low setzen
    }

    if ( (PIND & 0x40) == 0)
    { // Zustand auslesen
      PORTD |= 0x20; //auf 1 (=high) setzen
      PORTD &= ~0x80; // PD7 wieder auf low setzen
      PORTD &= ~0x08; // PD3 wieder auf low setzen
    }

    if ( (PIND & 0x10) == 0)
    { // Zustand auslesen
      PORTD |= 0x08; //auf 1 (=high) setzen
      PORTD &= ~0x80; // PD7 wieder auf low setzen
      PORTD &= ~0x20; // PD5 wieder auf low setzen
    }

else
  {
    PORTG &= ~0x02; // PG2 wieder auf low setzen
  }

 }

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn er das Programm nicht kompiliert, dann poste doch mal die 
Fehlermeldung, die der Compiler dir liefert.

Auf die schnelle sehe ich jetzt, dass vor dem else eine schließende 
geschweifte Klammer fehlt...
Außerdem hast du eine if-Abfrage gelöscht.

MfG
Marius

Autor: Andreas S. (akku75)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
die fehlende if-Anweisung und die Klamma ist wieder drin!
Es geht aber immer noch nicht so wie ich es brauche!
Durch drücken von Taster4 soll LED4 dauernd angeschaltet sein und die 
anderen 3 Taster in ihrer Funktion freigeben.
Wird Taster4 nochmal gedrückt soll die LED4 ausgehen und
die 3 Taster werden in ihrer Funktion gesperrt und zurückgesetzt!
 sei();
  DDRG &= ~0x01; // Pin 0 von Port G als Eingang nutzen(Taster1)
  PORTG |= 0x01; // pull-up Widerstand aktivieren
  DDRD &= ~0x40; // Pin 6 von Port D als Eingang nutzen(Taster2)
  PORTD |= 0x40; // pull-up Widerstand aktivieren
  DDRD &= ~0x10; // Pin 4 von Port D als Eingang nutzen(Taster3)
  PORTD |= 0x10; // pull-up Widerstand aktivieren
  DDRD &= ~0x04; // Pin 2 von Port D als Eingang nutzen(Taster4)
  PORTD |= 0x04; // pull-up Widerstand aktivieren
  
  DDRD |= 0x80;  // PD7 als Ausgang(LED1)
  DDRD |= 0x20;  // PD5 als Ausgang(LED2)
  DDRD |= 0x08;  // PD3 als Ausgang(LED3)
  DDRG |= 0x02;  // PG1 als Ausgang(LED4)
 
  while(1) {
    if ( (PIND & 0x04) == 0) // (Taster4)
 {  PORTG |= 0x02; //auf 1 (=high) setzen // (LED4)

    if ( (PING & 0x01) == 0) // (Taster1)
    { // Zustand auslesen
      PORTD |= 0x80; //auf 1 (=high) setzen // (LED1)
      PORTD &= ~0x20; // PD5 wieder auf low setzen // (LED2)
      PORTD &= ~0x08; // PD3 wieder auf low setzen // (LED3)
    }

    if ( (PIND & 0x40) == 0) // (Taster2)
    { // Zustand auslesen
      PORTD |= 0x20; //auf 1 (=high) setzen // (LED2)
      PORTD &= ~0x80; // PD7 wieder auf low setzen // (LED1)
      PORTD &= ~0x08; // PD3 wieder auf low setzen // (LED3)
    }

    if ( (PIND & 0x10) == 0) // (Taster3)
    { // Zustand auslesen
      PORTD |= 0x08; //auf 1 (=high) setzen // (LED3)
      PORTD &= ~0x80; // PD7 wieder auf low setzen // (LED1)
      PORTD &= ~0x20; // PD5 wieder auf low setzen // (LED2)
    }
 }
       }

Danke für die Hilfe!
Gruß
Andreas

Autor: Andreas S. (akku75)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo?!?

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal must du deine Tasten entprellen , sonst wird das nix.
Dann must du dir merken ob die Tasten freigeben sind oder nicht und 
davon deine entscheidung abhaengig machen. Und bei Taste 4 must du auch 
noch warten ob die Taste losgelassen wurde.

Autor: Andreas S. (akku75)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Helmut,
kann ich die Taster nicht softwareseitig entprellen?

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>kann ich die Taster nicht softwareseitig entprellen?

Das sollst du ja auch in Software machen.
Schreibe die erstmal eine Routine dazu wo du die 4 Tasten einliest und 
entprellst. Sonst wird das nicht mit der Taste 4 die ja zwischen den 
beiden Funktionen umschaltet.

Gruss Helmi

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.