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


von Finn A. (finnchi89)


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?

von Karl H. (kbuchegg)


Lesenswert?

Avr-gcc-Tutorial

von Falk B. (falk)


Lesenswert?


von Falk B. (falk)


Lesenswert?

Mist, zu langsam ;-)

von Finn A. (finnchi89)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Am einfachsten als Bitvariable, z.B.:

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


Peter

von Karl H. (kbuchegg)


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.

von Finn A. (finnchi89)


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.
1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include "util/delay.h"
4
5
6
int main(void)
7
{
8
  
9
  DDRD  &= ~(1 << PD2);
10
  PORTD |=  (1 << PD2);
11
  DDRD  |=  (1 << PD5);
12
  DDRD  |=  (1 << PD6);
13
  
14
  
15
  if (PIND & (1 << PD2)) 
16
    {
17
    PORTD |=  (1 << PD5);
18
    _delay_ms(95);
19
    PORTD |=  (1 << PD6);
20
    _delay_ms(95);
21
    }
22
    
23
  else 
24
    {
25
    while (1)
26
      {
27
      PORTD |=  (1 << PD5);
28
      PORTD |=  (1 << PD6);
29
      _delay_ms(95);
30
      }
31
    }
32
}

von Jean (Gast)


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ß

von Duff (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


Lesenswert?

Du willst, dass der µC immer macht:

  wenn Taste gedrückt
    Led einschalten
  else
    Led ausschalten
1
int main(void)
2
{
3
  
4
  DDRD  &= ~(1 << PD2);
5
  PORTD |=  (1 << PD2);
6
  DDRD  |=  (1 << PD5);
7
  DDRD  |=  (1 << PD6);
8
  
9
  while( 1 ) {                    // mache immer
10
11
    if (PIND & (1 << PD2))        // wenn Taste nicht gedrückt
12
    {
13
      PORTD |=  (1 << PD5);    // Pin auf 1
14
      _delay_ms(95);
15
      PORTD |=  (1 << PD6);    // Pin auf 1
16
      _delay_ms(95);
17
    }
18
    
19
    else                          // Taste ist gedrückt
20
    {
21
      PORTD &=  ~(1 << PD5);   // Pin auf 0: Led geht dann ...
22
      PORTD &=  ~(1 << PD6);   // Pin auf 0: Led geht dann ...
23
      _delay_ms(95);
24
    }
25
  }
26
}

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.
1
int main(void)
2
{
3
  
4
  DDRD  &= ~(1 << PD2);
5
  PORTD |=  (1 << PD2);
6
  DDRD  |=  (1 << PD5);
7
  DDRD  |=  (1 << PD6);
8
  
9
  while( 1 ) {                    // mache immer
10
11
    if (PIND & (1 << PD2))        // wenn Taste nicht gedrückt
12
    {
13
      PORTD |=  (1 << PD5);
14
      _delay_ms(95);
15
      PORTD |=  (1 << PD6);
16
      _delay_ms(95);
17
    }
18
    
19
    else                          // Taste ist gedrückt
20
    {
21
      PORTD &=  ~(1 << PD5);
22
      PORTD &=  ~(1 << PD6);
23
      _delay_ms(95);
24
    }
25
  }
26
}

von Finn A. (finnchi89)


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?

von Karl H. (kbuchegg)


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.

von Finn A. (finnchi89)


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?

von Karl H. (kbuchegg)


Lesenswert?

Finn A. schrieb:

> richtig oder falsch die angaben?

grundsätzlich: ok.

Dazu noch der generelle Programmaufbau
1
#include <avr/io.h>
2
3
int main()
4
{
5
   ....
6
   alle initialisieren
7
   Datenrichtungen einstellen
8
   etc.
9
10
   while( 1 ) {
11
12
      hier, innerhalb der while-Schleife spielt sich die
13
      Programmlogik ab
14
15
   }
16
}

und schon bist du mitten drinnen

von Finn A. (finnchi89)


Lesenswert?

aber?  gibts noch ne andere möglichkeit?

von Karl H. (kbuchegg)


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?

von Karl H. (kbuchegg)


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.

von Finn A. (finnchi89)


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);
    }
  }
}

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.