C-Program für Atmega8

OP #1091274
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);
}
//---------------------------------------------------------------------- 
--
Gast #1091283
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     |  ???
OP #1091433
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?
Gast #1091445
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);
}
OP #1091448
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.