UHR- if-bedingung

Gast #3264089
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
  }
Gast #3264104
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.
Gast #3264108
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.
Gast #3264119
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.
Gast #3264127
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.
Gast #3264128
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
Gast #3264139
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?
#3264142
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.
#3264145
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.

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