Forum: Mikrocontroller und Digitale Elektronik C-Program für Atmega8


von P. I. (pimi)


Lesenswert?

Liebe Forum User
Ich habe follgendes Programmproblem:
Nach meiner Logik müsste nach Erfüllen der Bedingung PORTD gesetzt
werden, sonst PORTD=0.
Das Programm funktioniert wie folgt:
Wenn PINC 04=0 oder 02=0, dann PORTD=1 (4,8V)
sonst: Wenn PINC 04=1 und 02=1 (5V), to PORTD= 2,4V Zu erwarten wäre 
jedoch PORTD=0

Bitte um Hilfe

Danke im Voraus

main()
{
    DDRD = 0xFF;
    DDRC = 0x00;
    PORTC = 0x02;
    PORTC = 0x04;

    do {
        if (!(PINC&0x02)||!(PINC&0x04))
            PORTD = 0xFF;
          else
            PORTD = 0x00;
    } while (true);
}
//---------------------------------------------------------------------- 
--

von Hmm... (Gast)


Lesenswert?

Zunächst...was meinst du mit PINC 04=1? Ist damit der Pin #4 am PortC 
gemeint?
1
main()
2
{
3
    DDRD = 0xFF;
4
    DDRC = 0x00;
5
    PORTC = 0x02;
6
    PORTC = 0x04;
7
8
    do {
9
        if (!(PINC&0x02)||!(PINC&0x04))
10
            PORTD = 0xFF;
11
          else
12
            PORTD = 0x00;
13
    } while (true);
14
}

Dir ist bewusst, dass du in Zeile 6 den zuvor aktivierten Pullup an Pin 
#1 wieder deaktivierst? Besser wäre hier

PORTC = 0x02|0x04;

> Das Programm funktioniert wie folgt:
> Wenn PINC 04=0 oder 02=0, dann PORTD=1 (4,8V)
> sonst: Wenn PINC 04=1 und 02=1 (5V), to PORTD= 2,4V Zu erwarten wäre
> jedoch PORTD=0

Das versteh ich nicht. Wieso soll denn an irgendeinem Pin von PortD die 
halbe Betriebsspannung liegen? Entweder liegt ~Vcc an oder eben ~0V

Schreib doch mal eine Logiktabelle auf, was du eigentlich genau willst.

PortC.1  |  PortC.2  | PORTD
------------------------------
  0      |     0     |  ???
------------------------------
  1      |     0     |  ???
------------------------------
  0      |     1     |  ???
------------------------------
  1      |     1     |  ???

von wt (Gast)


Lesenswert?

Probier mal so

main()
{
    DDRD = 0xFF;
    PORTD = 0x00;
    DDRC = 0x00;
    PORTC = 0x06;

    do {
        if (!(PINC&0x06))
            PORTD = 0xFF;
        else
            PORTD = 0x00;
    } while (true);
}

von P. I. (pimi)


Lesenswert?

Zunächst...was meinst du mit PINC 04=1? Ist damit der Pin #4 am PortC
gemeint?
Ich habe damit gemeint Pin 2 weil (PINC&0x04)

außerdem ich will:
PortC.1  |  PortC.2  | PORTD
------------------------------
  0      |     0     |   1
------------------------------
  1      |     0     |   1
------------------------------
  0      |     1     |   1
------------------------------
  1      |     1     |   0

leider ich habe:
PortC.1  |  PortC.2  | PORTD
------------------------------
  0      |     0     |  1(4,8V)
------------------------------
  1      |     0     |  1(4,8V)
------------------------------
  0      |     1     |  1(4,8V)
------------------------------
  1      |     1     |  ?(2,4V)

ich verstehe auch nicht warum?

von wt (Gast)


Lesenswert?

dann Probier mal so

main()
{
    DDRD = 0xFF;
    PORTD = 0x00;
    DDRC = 0x00;
    PORTC = 0x06;

    do {
        if ((PINC&0x06) == 0x06)
            PORTD = 0x00;
        else
            PORTD = 0xFF;
    } while (true);
}

von P. I. (pimi)


Lesenswert?

Jetzt hat geklappt. Ich habe wie Sie mir empfohlen haben statt
    PORTC = 0x02;
    PORTC = 0x04;
Das eingesetzt:
    PORTC = 0x02|0x04;
Danke
So wies aussieht ich muss das Grundwissen lernen. Weiß jemand wo finde 
ich spezial C-Sprache für Atmel Mikricontroller.

von wt (Gast)


Lesenswert?

selbsterkenntnis ist immer was wert:) viel glück

von wt (Gast)


Lesenswert?

C-Sprache für Atmel Mikricontroller gibt's auf Atmel Seite

von Marvin M. (Gast)


Lesenswert?


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.