Forum: Mikrocontroller und Digitale Elektronik UHR- if-bedingung


von Azubi (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Kann mir mal einer sagen wieso diese if-bedingung bei meiner Schaltung
plotzlich wahr wird :(
1
if ( !(PINC & ( 1 << PINC5)))
2
    {
3
      while (1)
4
      {
5
        PORTD = 0xFF;
6
      }
7
    }

von hilmar (Gast)


Lesenswert?

Weil an PINC5 Low angelegt wird?

von Peter II (Gast)


Lesenswert?

Wiel wichtiger ist doch die Frage, warum du uns eine C# Projekt 
angehangen hast.

von Azubi (Gast)


Lesenswert?

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
5
int sekunde = 0;      //globale Variable sekunde
6
int stunde_a = 1;
7
int stunde_b = 3;
8
9
int minute_c = 4;
10
int minute_d = 3;
11
12
13
14
int main (void)
15
{
16
  int ausgabe[10];
17
  ausgabe [0] = 0x01;
18
  ausgabe [1]  = 0x37;
19
  ausgabe [2] = 0x42;
20
  ausgabe [3] = 0x12;
21
  ausgabe [4] = 0x34;
22
  ausgabe [5] = 0x18;
23
  ausgabe [6] = 0x08;
24
  ausgabe [7] = 0x31;
25
  ausgabe [8] = 0x00;
26
  ausgabe [9] = 0x10;
27
  
28
  DDRD = 0xFF;
29
  PORTD = 0xFF;
30
  
31
  DDRC = 0x0F;
32
  PORTC = ( 1 << PC4)|( 1 << PC5);    
33
  
34
  
35
36
  TCCR1B |= (1 << WGM12); 
37
38
  TIMSK |= (1 << OCIE1A);
39
40
  sei(); //  
41
42
  OCR1A   = 15624; 
43
44
  TCCR1B |= ((1 << CS10) | (1 << CS11)); 
45
46
  for (;;)
47
  {
48
    if ( !(PINC & ( 1 << PINC5)))
49
    {
50
      while (1)
51
      {
52
        PORTD = 0xFF;
53
      }
54
    }
55
    
56
    
57
    
58
    
59
    PORTC = ( 1<<PC0);
60
    PORTD = ausgabe[stunde_a];
61
    _delay_ms(5);
62
    
63
    PORTC = (1<<PC1);
64
    PORTD = ausgabe[stunde_b];
65
    _delay_ms(5);
66
    
67
    
68
    
69
    
70
    PORTC = ( 1<< PC2);
71
    PORTD = ausgabe[minute_c];
72
    _delay_ms(5);
73
    
74
    PORTC = (1 << PC3);
75
    PORTD = ausgabe[minute_d];
76
    _delay_ms(5);    
77
  }
78
}
79
80
81
82
83
ISR(TIMER1_COMPA_vect)
84
{
85
  sekunde++;
86
  
87
  if (sekunde == 60)
88
  {
89
    minute_d++;
90
    sekunde = 0;
91
    
92
    if (minute_d == 10)
93
    {
94
      minute_d = 0;
95
      minute_c++;
96
      
97
      if (minute_c == 6)
98
      {
99
        minute_c = 0;
100
        stunde_b++;
101
        if (stunde_b == 10)
102
        {
103
          stunde_b = 0;
104
          stunde_a++;
105
          
106
          if (stunde_a == 3)
107
          {
108
            stunde_a = 0;
109
          }
110
        }
111
      }
112
      
113
    }
114
    
115
  }

von Azubi (Gast)


Lesenswert?

>Wiel wichtiger ist doch die Frage, warum du uns eine C# Projekt
>angehangen hast.


:(

von Peter II (Gast)


Lesenswert?

> PINC & ( 1 << PINC5)

und

> PORTC = (1 << PC3);

passt nicht wirklich zusammen. Du darst nur die Ausgänge manipulieren.


Außerdem fehler noch die volatiles bei den ganzen ISR variablen.

von hilmar (Gast)


Lesenswert?

Wenn C.5 auf GND (oder LOW) gelegt wird, schaltest du deinen PORTD auf 
0xFF (alles HIGH) und das machst du so lange, bis du dem µC den Strom 
wegnimmst.
Alles, was darunter steht, wird niemals erreicht.
Die ISR wird zwar arbeiten, aber die verändert ja nur stunde, minute, 
sekunden. Die Ausgabe erfolgt nie.

von amateur (Gast)


Lesenswert?

1
PINC         | lese Port C | ??0????? oder ??1?????
2
( 1 << PINC5)| 00100000    | 00100000      00100000
3
&            |             | 00000000      00100000
4
             |             | False         True
5
!            |             | True          False
Ich würde es mal mit 0-Pegel an Pin C5 Probieren - oder auch nicht.

von Azubi (Gast)


Lesenswert?

>Die ISR wird zwar arbeiten, aber die verändert ja nur stunde, minute,
>sekunden. Die Ausgabe erfolgt nie.

Wenn die Taste gedrückt wird soll keine ausgabe mehr erfolgen.

von Azubi (Gast)


Lesenswert?

> PINC & ( 1 << PINC5)

>und

> PORTC = (1 << PC3);

>passt nicht wirklich zusammen. Du darst nur die Ausgänge manipulieren.

kannst du mir das bitte genauer erklären?

von Peter II (Gast)


Lesenswert?

Azubi schrieb:
>> PORTC = (1 << PC3);
>
>>passt nicht wirklich zusammen. Du darst nur die Ausgänge manipulieren.
>
> kannst du mir das bitte genauer erklären?

wenn ein PullUP eingeschaltet ist, dann wird diese mit PORTC = (1 << 
PC3); wieder abgeschaltet.

Man sollte einfach nur das Bit ändern, was man braucht. Und nicht den 
kompletten port zuweisen.

von hilmar (Gast)


Lesenswert?

>  DDRC = 0x0F;
>  PORTC = ( 1 << PC4)|( 1 << PC5);

Die Datenrichtung ist: Ausgang für C0 bis C3 und Eingang für C4 bis C7
C4 und C5 erhalten einen Pullup.

> wenn ein PullUP eingeschaltet ist, dann wird diese mit PORTC = (1 <<
> PC3); wieder abgeschaltet.

Ein Ausgang hat keinen Pullup!
C3 ist ein Ausgang, er wird durch "PORTC = (1 << PC3);" auf HIGH 
gesetzt.

von Azubi (Gast)


Lesenswert?

>wenn ein PullUP eingeschaltet ist, dann wird diese mit PORTC = (1 <<
>PC3); wieder abgeschaltet.

Nur zum Verständnis:

PORTC = ( 1 << PC0); entspricht PORTC = b'0000 0001'

dadurch schalte ich mein Pull-up Widerstand ab, also muss ich
PORTC = ( 1 << PC0); durch PORTC = b'00100001' ersetzen um meinen 
Pull-up Widestand eben nicht abzuschalten.

Ich hoffe ich habe es jetzt richtig verstanden

von hilmar (Gast)


Lesenswert?

DDRC ist das Datenrichtungs-Register. Dort, wo eine 1 steht, ist ein 
Ausgang, bei einer 0 ist das Bit ein Eingang.

Für die Eingangsbits: Wenn du auf PORTC schreibst, bedeutet ein 1-Bit, 
daß der Pullup eingeschaltet wird und ein 0-Bit, daß der Pullup aus ist.

Für die Ausgangsbits: Ein 1-Bit bedeutet, daß der Ausgang auf 1 (also 
HIGH) geht, ein 0-Bit, daß der Ausgang auf LOW geht.

Also erstmal sagen, was Eingang und was Ausgang ist mit DDRC.
Und dann bei Eingängen die Pullups und bei Ausgängen die Ausgangspegel 
setzen, ok?

von Karl H. (kbuchegg)


Lesenswert?

hilmar schrieb:
>>  DDRC = 0x0F;
>>  PORTC = ( 1 << PC4)|( 1 << PC5);
>
> Die Datenrichtung ist: Ausgang für C0 bis C3 und Eingang für C4 bis C7
> C4 und C5 erhalten einen Pullup.
>
>> wenn ein PullUP eingeschaltet ist, dann wird diese mit PORTC = (1 <<
>> PC3); wieder abgeschaltet.
>
> Ein Ausgang hat keinen Pullup!
> C3 ist ein Ausgang, er wird durch "PORTC = (1 << PC3);" auf HIGH
> gesetzt.

Schon.
Was er sagen wollte.
Durch die Zuweisung wird nicht nur PC3 auf High gesetzt.
Als Nebeneffekt werden alle anderen BIts in PORTC auf 0 gesetzt. Und 
damit ist dann der schöne Pullup, der hier eingeschaltet wurde
>>  PORTC = ( 1 << PC4)|( 1 << PC5);
nur noch Geschichte.

von Azubi (Gast)


Lesenswert?

>ok?

Danke, das habe ich schon verstanden

von Karl H. (kbuchegg)


Lesenswert?

Azubi schrieb:
>>wenn ein PullUP eingeschaltet ist, dann wird diese mit PORTC = (1 <<
>>PC3); wieder abgeschaltet.
>
> Nur zum Verständnis:
>
> PORTC = ( 1 << PC0); entspricht PORTC = b'0000 0001'
>
> dadurch schalte ich mein Pull-up Widerstand ab, also muss ich
> PORTC = ( 1 << PC0); durch PORTC = b'00100001' ersetzen um meinen
> Pull-up Widestand eben nicht abzuschalten.
>
> Ich hoffe ich habe es jetzt richtig verstanden

Im Prinzip ja.
Nur mahct man das nicht so.
Du willst dir doch nicht ewig und immer und überall merken, welche 
anderen Pins du in welchem Portregister du zusätzlich auch noch mit 
berücksichtigen musst!

Hier
1
  TIMSK |= (1 << OCIE1A);

hast du es doch so schön geschrieben:
In TIMSK ausschliesslich und nur das OCIE1A Bit setzen. Alle anderen 
Bits bleiben so wie sie sind.

von Peter II (Gast)


Lesenswert?

Azubi schrieb:
> dadurch schalte ich mein Pull-up Widerstand ab, also muss ich
> PORTC = ( 1 << PC0); durch PORTC = b'00100001' ersetzen um meinen
> Pull-up Widestand eben nicht abzuschalten.

ja aber nicht sehr komfortabel. du sollte einfach nur ein Bit setzen und 
die andere einfach nicht anfassen!

PORTC  |= ( 1 << PC0)

http://www.mikrocontroller.net/articles/Bitmanipulation

von Karl H. (kbuchegg)


Lesenswert?

Ein Bit setzen
1
    Register |= ( 1 << Bitname );

Ein Bit löschen
1
    Register &= ~( 1 << Bitname );

ein Bit auf 1 abfragen
1
    if( Register & ( 1 << Bitname ) )

ein Bit auf 0 abfragen
1
    if( !(Register & ( 1 << Bitname )) )


Bitmanipulation

von Azubi (Gast)


Lesenswert?

>PORTC  |= ( 1 << PC0)

jetzt dämmerts :D

von Azubi (Gast)


Lesenswert?

danke euch allen fÜr die Hilfe

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.