mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ein- ung Ausgänge einzeln zuweisen - ATMEGA32 - WINAVR


Autor: Finn A. (finnchi89)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie kann ich genau die einzelnen Ein- und Ausgänge in WINAVR in C 
programmieren? Also sozusagen am Anfang diese definieren und später 
wieder in dem Programm verwenden?

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

Bewertung
0 lesenswert
nicht lesenswert
Avr-gcc-Tutorial

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mist, zu langsam ;-)

Autor: Finn A. (finnchi89)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab schon darüber es versucht, aber irgendwie klappt das bei mir net.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Am einfachsten als Bitvariable, z.B.:

http://www.mikrocontroller.net/attachment/30300/lcd_drv.zip


Peter

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

Bewertung
0 lesenswert
nicht lesenswert
Finn A. schrieb:
> hab schon darüber es versucht, aber irgendwie klappt das bei mir net.

WAS klappt denn nicht und WAS hast du versucht?

Noch ausführlicher als im Tutorial kann dir das im Forum auch kein 
Mensch beantworten. Zumindest wird keiner große Lust dazu haben.

Wenn du aber konkrete Fragen hast und bei einem konkreten Code-Stück 
hängst, sieht die Sache gaaaanz anders aus.

Autor: Finn A. (finnchi89)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so sieht jetzt mein programm aus, jedoch zeigen die beiden leds (PD 5, 
PD 6) nur dauerlicht an. an PD2 ist ein taster angeschlossen.
#include <stdlib.h>
#include <avr/io.h>
#include "util/delay.h"


int main(void)
{
  
  DDRD  &= ~(1 << PD2);
  PORTD |=  (1 << PD2);
  DDRD  |=  (1 << PD5);
  DDRD  |=  (1 << PD6);
  
  
  if (PIND & (1 << PD2)) 
    {
    PORTD |=  (1 << PD5);
    _delay_ms(95);
    PORTD |=  (1 << PD6);
    _delay_ms(95);
    }
    
  else 
    {
    while (1)
      {
      PORTD |=  (1 << PD5);
      PORTD |=  (1 << PD6);
      _delay_ms(95);
      }
    }
}

Autor: Jean (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Code ist ja ziemlich Sinnfrei.
Wenn Taster auf VCC = Led's an.
Wenn Taster gegen GND = Led's an.

Wenn du den Port Pin auschalten willst ---> PORTD &= ~(1<<PD5),......

Gruß

Autor: Duff (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bleibt er nicht ewig in der while Schleife hängen?

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

Bewertung
0 lesenswert
nicht lesenswert
Duff schrieb:
> Bleibt er nicht ewig in der while Schleife hängen?

Kommt drauf an, ob die Taste beim anlegen der Versorgungsspanngun 
bereits gedrückt war oder nicht.

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

Bewertung
0 lesenswert
nicht lesenswert
Du willst, dass der µC immer macht:

  wenn Taste gedrückt
    Led einschalten
  else
    Led ausschalten
int main(void)
{
  
  DDRD  &= ~(1 << PD2);
  PORTD |=  (1 << PD2);
  DDRD  |=  (1 << PD5);
  DDRD  |=  (1 << PD6);
  
  while( 1 ) {                    // mache immer

    if (PIND & (1 << PD2))        // wenn Taste nicht gedrückt
    {
      PORTD |=  (1 << PD5);    // Pin auf 1
      _delay_ms(95);
      PORTD |=  (1 << PD6);    // Pin auf 1
      _delay_ms(95);
    }
    
    else                          // Taste ist gedrückt
    {
      PORTD &=  ~(1 << PD5);   // Pin auf 0: Led geht dann ...
      PORTD &=  ~(1 << PD6);   // Pin auf 0: Led geht dann ...
      _delay_ms(95);
    }
  }
}

Wozu sollen eigentlich die _delay_ms gut sein. 95ms sind knapp 1/1000 
Sekunde. Das ist eine Zeitdauer, die du nicht bewusst sehen kannst.
AUsserdem: Du schaltest dowohl in dem einen Fall, als auch im anderen 
Fall die LED ein. Da wirst da also wenig Unterschied sehen können und 
die Fälle unterscheiden können.
int main(void)
{
  
  DDRD  &= ~(1 << PD2);
  PORTD |=  (1 << PD2);
  DDRD  |=  (1 << PD5);
  DDRD  |=  (1 << PD6);
  
  while( 1 ) {                    // mache immer

    if (PIND & (1 << PD2))        // wenn Taste nicht gedrückt
    {
      PORTD |=  (1 << PD5);
      _delay_ms(95);
      PORTD |=  (1 << PD6);
      _delay_ms(95);
    }
    
    else                          // Taste ist gedrückt
    {
      PORTD &=  ~(1 << PD5);
      PORTD &=  ~(1 << PD6);
      _delay_ms(95);
    }
  }
}

Autor: Finn A. (finnchi89)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also der ablauf ist so gedacht. durch betätigen des tasters an pd2 soll 
die if bedingung erfüllt sein und die leds (pd 5 & 6) sollen abwechselnd 
blinken. bei else sollen beide leds (pd 5 & 6) blinken wenn der taster 
an pd2 nicht betätigt wurde.

was muss ich an meinem programm ändern, dass es so funktioniert, wie ich 
es beschrieben habe?

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

Bewertung
0 lesenswert
nicht lesenswert
Finn A. schrieb:
> also der ablauf ist so gedacht. durch betätigen des tasters an pd2 soll
> die if bedingung erfüllt sein und die leds (pd 5 & 6) sollen abwechselnd
> blinken. bei else sollen beide leds (pd 5 & 6) blinken wenn der taster
> an pd2 nicht betätigt wurde.
>
> was muss ich an meinem programm ändern, dass es so funktioniert, wie ich
> es beschrieben habe?

Vergiss das Blinken zunächst. Konzentriere dich zunächst auf Ein/Aus

(Blinken ist auch nichts anderes als Ein/Aus. Aber mit einer Zeit 
dazwischen. Aber um Blinken zu können, musst du wissen wie du 
Einschaltest, bzw. wie du Ausschaltest).
Aber Blinken, zusätzlich mit einer Tasterinteraktion ist gar nicht so 
einfach, wie man zunächst meinen sollte.

Autor: Finn A. (finnchi89)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok,

dann erst mal ein und aus. also ich habe auf meinem pollin 
evaluationboard 3 taster und 2 leds. mit dem taster 1 (pd2) die beiden 
leds (pd5 & pd6) einschalten und taster 2 (pd3) wieder ausschalten.

erst mal ein und ausgänge:

  DDRD  &= ~(1 << PD2);    // Eingang: Taster 1
  PORTD |=  (1 << PD2);
  DDRD  &= ~(1 << PD3);    // Eingang: Taster 2
  PORTD |=  (1 << PD3);
  DDRD  |=  (1 << PD5);    // Ausgang: LED 1
  DDRD  |=  (1 << PD6);    // Ausgang: LED 2

richtig oder falsch die angaben?

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

Bewertung
0 lesenswert
nicht lesenswert
Finn A. schrieb:

> richtig oder falsch die angaben?

grundsätzlich: ok.

Dazu noch der generelle Programmaufbau
#include <avr/io.h>

int main()
{
   ....
   alle initialisieren
   Datenrichtungen einstellen
   etc.

   while( 1 ) {

      hier, innerhalb der while-Schleife spielt sich die
      Programmlogik ab

   }
}

und schon bist du mitten drinnen

Autor: Finn A. (finnchi89)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber?  gibts noch ne andere möglichkeit?

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

Bewertung
0 lesenswert
nicht lesenswert
Finn A. schrieb:
> aber?  gibts noch ne andere möglichkeit?

nix aber.

Wie gehts weiter?
Damit hast du ja nur erst mal die Datenrichtungen eingestellt. Das ist 
zwar auch wichtig aber noch nicht besonders aufregend.
Wie gehts weiter?

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

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Finn A. schrieb:
>> aber?  gibts noch ne andere möglichkeit?
>
> nix aber.

Ich sollte dazu sagen.
Nix aber, solange du verstanden hast, was diese Zeilen machen und warum 
sie genau so und nicht anderes aussehen.

Autor: Finn A. (finnchi89)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jetzt will ich ja mit dem taster 1 die schleife starten also leds an und 
mit dem taster 2 wieder beenden. und an der stelle weiß ich net wie das 
programm in etwa aufgebaut werden muss.

#include <stdlib.h>
#include <avr/io.h>
#include "util/delay.h"


int main(void)
{

  DDRD  &= ~(1 << PD2);
  PORTD |=  (1 << PD2);
  DDRD  &= ~(1 << PD3);
  PORTD |=  (1 << PD3);
  DDRD  |=  (1 << PD5);
  DDRD  |=  (1 << PD6);

while (1)
  {
    if (PIND & (1 << PD2))
    {
    PORTD ^=  _BV(PD5);
    _delay_ms(500);
    PORTD ^=  _BV(PD6);
    _delay_ms(500);
    }

    else
    {
    DDRD  |=  (1 << PD5);
    DDRD  |=  (1 << PD6);
    _delay_ms(500);
    PORTD &= ~(1 << PD5);
    PORTD &= ~(1 << PD6);
    _delay_ms(500);
    }
  }
}

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.