Ein- ung Ausgänge einzeln zuweisen - ATMEGA32 - WINAVR

#1527317
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.
OP #1527325
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
}
#1527351
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
}
OP #1527355
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?
#1527358
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.
OP #1527388
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?
#1527391
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
OP #1527430
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren