Forum: Mikrocontroller und Digitale Elektronik 7Segment-Uhr


von Davut P. (Firma: //) (padawan)


Lesenswert?

Hallo vorab,
ich habe hier im Forum in der letzten Zeit wo wir in der Schule 
programmieren bisschen recherchiert gehabt und hoffe, dass mir hier 
geholfen werden kann :/ also ich habe den Auftrag bekommen eine 7Segment 
Uhr zu programmieren im Muster " HH.MM.SS. 
"(H=Stunde,M=Minute,S=Sekunde). Wie es scheint bin ich einfach zu doof, 
aber ich kapiere die Interuppt-Programmierung einfach nicht habe mir 
schon dutzende Programme angeschaut aber ich blicke nicht durch :/

Zum Zählen hatte ich folgendes vorgesehen :
1
#define F_CPU  20000000
2
3
#include <avr\io.h>
4
#include <util\delay.h>
5
#include <avr\interrupt.h>
6
7
8
uint8_t zahlen[10]={0b11000000,
9
          0b11111001,
10
          0b10100100,
11
          0b10110000,
12
          0b10011001,
13
          0b10010010,
14
          0b10000010,
15
          0b11111000,
16
          0b10000000,
17
          0b10010000};
18
19
uint8_t counter_Sekunden=0;
20
uint8_t counter_Minuten=0;
21
uint8_t counter_Stunden=0;
22
23
int main(void){
24
25
  DDRA=0xff;
26
  DDRB=0xff;
27
28
          
29
    PORTB=zahlen[counter_Sekunden];
30
        
31
  counter_Sekunden++;
32
  _delay_ms(1000);
33
34
    if(counter_Sekunden==10){
35
       counter_Sekunden=0;
36
       counter_Minuten++;
37
      if(counter_Minuten==60){
38
        counter_Minuten=0;
39
        counter_Stunden++;
40
             if(counter_Stunden==24){
41
               counter_Stunden=0;
42
               }
43
                     }
44
             }
45
      }
46
}

Hiermit zählt er mir nun am 1. Segment für die Sekunden HH.MM.SS
HH.MM.S0
HH.MM.S1
HH.MM.S2
HH.MM.S3
HH.MM.S4
HH.MM.S5
HH.MM.S6
HH.MM.S7
HH.MM.S8
HH.MM.S9
HH.MM.S0
...

die anderen sind ja durch das multiplexing ausgeblendet, nur habe ich 
keine Ahnnung wie man einen ISR timer programmiert und ich habe auch 
keine ahnung was der Unterschied zwischen ISR(TIMER1_COMPA_vect) oder 
auch
ISR(TIMER2_OVF_vect) ist , bräuchte demnach nen Crashkurs und mein 
Lehrer kann mir natürlich nicht helfen , da dies eine eigenständige 
Arbeit sein soll und wir uns im Internet schlau machen und durchs 
probieren herausfinden sollen wie es funktioniert und ich kann auch 
niemand andenr aus der Klasse fragen, da sie erstens so wenig wie ich 
verstehen von Interrupt-Programmierung und wir alle nen anderes Thema 
haben.


Wir nutzen den Atmega644 , AtmelStudio6 und ich dachte mir ich nutze 
PortA als Steuerung für die Auswahl welches Segment Spannung bekommt und 
PortB dafür welches Teilsegment Spannung bekommt (a,b,c,d,...)

Falls noch Fragen bestehen werde ich versuchen so viel wie ihr benötigt 
herauszufinden und euch mitzuteilen und beachtet bei den Antworten das 
ich noch mega neu bin und macht mich nicht zu doll fertig :) ich 
verstehe nähmlich recht wenig vom Interrupt, habe halt kapiert, dass der 
Interrupt ISR meinen Zählvorgang beinhalten muss laut meines Lehrers 
aber habe keine Ahnung welchen Zähler und was der Unterschied ist wie 
oben gesagt und ich bin überfodert. :(


Mfg Davut Paylan

von Markus Müller (Gast)


Lesenswert?

Davut Paylan schrieb:
> _delay_ms(1000);

_delay_ms hat in einem vernünftigen Programm nichts zu suchen.

von Karl H. (kbuchegg)


Lesenswert?

> nur habe ich keine Ahnnung wie man einen ISR timer programmiert

Dann wirds Zeit. Ohne Timer kommst du bei dieser Aufgabenstellung nicht 
weiter.

 >>> FAQ <<<
ganz unten, Abschnitt 11: Der Timer

Vergiss fürs erste deine Uhr und sieh zu, dass du mit dem Timer eine LED 
im Sekundentakt zum blinken bringst. (Kann ja ruhig auch eine der LEDs 
aus einer der 7-Seg Anzeige sein).

Aber ehe du diese Basis-Aufgabenstellung nicht unter Kontrolle hast, hat 
es keinen Sinn an eine Uhr zu denken.

von Dennis (Gast)


Lesenswert?

Davut Paylan schrieb:
> if(counter_Sekunden==10){
>        counter_Sekunden=0;
>        counter_Minuten++;

Seit wann hat eine Minute nurnoch 10s?

von Roberta Williams (Gast)


Lesenswert?

Tip: Du stellst einen Timer so ein, das er 1000 Interrupts/Sekunde 
erzeugt. Damit hast du dann eine genaue Zeitbasis sowohl für das Zählen 
der Sekunden als auch für das Multiplexen des Displays. Beispiele siehe 
Codebase.

von Davut P. (Firma: //) (padawan)


Lesenswert?

ich poste euch später nochmal eine beispielschaltung


und

@ Dennis das liegt daran das das Versuchsbord an dem ich das Programm 
teste (bevor ich es in groß baue) nur 2 Segmente drauf hat und deshalb 
die Minute 10Sekunden hat (ätte auch 3 sekunden wählen können) um zu 
sehen ob mir 2 segmente angezeigt werden :)

@Karl Heinz danke werde ich mich morgen mal mit befassen heute noch zu 
viel anderes um die Ohren :)

von Davut P. (Firma: //) (padawan)


Angehängte Dateien:

Lesenswert?

1
#include <avr/interrupt.h>
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
6
#define F_CPU        20000000UL          /* 20.000.000 Hz  */
7
8
#define  IRQS_PER_SECOND   1000            /*   1ms       */
9
10
11
12
/* Timer1-Werte berechnen */
13
14
15
volatile int timer_ms;
16
//                   Dgfedcba
17
volatile int Array[18] = {  0b00111111,        // 0
18
              0b00000110,        // 1
19
              0b01011011,        // 2
20
              0b01001111,        // 3
21
              0b01100110,        // 4
22
              0b01101101,        // 5
23
              0b01111101,        // 6
24
              0b00000111,        // 7
25
              0b01111111,        // 8
26
              0b01101111,        // 9
27
28
              0b01110111,        // A
29
              0b01111100,        // B
30
              0b01011000,        // C
31
              0b01011110,        // D
32
              0b01111001,        // E
33
              0b01110001,        // F
34
              0b01000000,        // -
35
              0b00000000};        // " "
36
37
38
volatile int  Stunden, Minuten, Sekunden;
39
volatile int  Ausgabe[8] = {0,0,16,0,0,16,0,0};
40
volatile char counts[100];
41
volatile char status_alt = 0;
42
volatile int  impulse = 0;
43
volatile char fertig = 0;
44
45
46
//------------------------------------------------------------------------------
47
/* Interruptroutine Steuerung 1x pro ms*/
48
ISR(TIMER1_COMPA_vect)
49
{
50
  static int spalte=0;
51
52
  PORTD = Array[Ausgabe[spalte]];
53
  PORTA = spalte + 8;        
54
55
  spalte = (spalte + 1) & 7;
56
57
58
  if (timer_ms != 0)
59
    timer_ms--;
60
61
/*
62
  if (counts[impulse] <= 255)
63
  {
64
    if ( (PINC&(1<<PC0)) != status_alt)    // Status Taster an PC0 verändert ?
65
   {
66
    impulse++;
67
    status_alt = ~ status_alt;
68
   }
69
   if (impulse < 100)
70
   { 
71
    counts[impulse]++; 
72
   }
73
   else
74
   {
75
    fertig = 1;
76
   }
77
  }
78
  else
79
  {
80
  fertig = 1;
81
  }
82
*/
83
}
84
85
86
87
88
/* diverse Dinge initialisieren */
89
void init(void)
90
{
91
    DDRA  = 0xff;       // Alle Pin    => Ausgang (Multiplexen der 8 Segmente)         
92
    DDRD  = 0xff;    // Alle Pin    => Ausgang (Segmentansteuerung)
93
    DDRC  = 0b11111100;    // Pin C2 - C7 => Ausgang (Pin C0, PIN C1 => Eingang)
94
  
95
96
  DDRC  &= ~((1<<PC0)|(1<<PC1));           /* PINS PC0+PC1  auf Eingang (Taster)       */
97
      PORTC |= (1 <<PC0)|(1<<PC1);            /* Pullup-Widerstände aktivieren            */
98
//  status_alt = !(PINC&(1<<PC0));
99
100
101
102
  /* Timer und Interrupt initialisieren*/
103
  TCCR1A  =  0;                                /* keine PWM             */
104
  TCCR1B   =  (1 << WGM12) | (1 << CS10);                    /* kein Vorteiler 0x01         */
105
  OCR1A  =  (unsigned short) ((unsigned long) F_CPU / IRQS_PER_SECOND -1);  /* Zähler-Obergrenze        */
106
  TIMSK1 |=  (1 << OCIE1A);                          /* OutputCompareA-Interrupt Timer 1 */
107
  sei();
108
}
109
110
111
112
113
/* Wartezeit in ms   */
114
void Uhr(int warte)
115
{
116
 timer_ms = warte;
117
 while(timer_ms);
118
119
 Ausgabe[7]++;
120
 if (Ausgabe[7] == 10)
121
   {
122
  Ausgabe[7] = 0;
123
  Ausgabe[6]++;
124
  if (Ausgabe[6] == 6)
125
    {
126
    Ausgabe[6] = 0;
127
    Ausgabe[4]++;
128
    if (Ausgabe[4] == 10)
129
      {
130
      Ausgabe[4] = 0;
131
      Ausgabe[3]++;
132
      if (Ausgabe[3] == 6)
133
        {
134
        Ausgabe[3] = 0;
135
        Ausgabe[1]++;
136
        if (Ausgabe[1] == 10)
137
          {
138
          Ausgabe[1] = 0;
139
          Ausgabe[0]++;
140
          if (Ausgabe[0] == 3)
141
            {
142
            Ausgabe[0] = 0;
143
            }
144
          }
145
        }
146
      }
147
    }
148
  }
149
}
150
151
152
153
154
int main (void) 
155
{
156
  int wert = 0;
157
  int led = 0;
158
159
  init();
160
  Stunden = 17;
161
  Minuten = 49;
162
  Sekunden = 50;
163
164
   Ausgabe[0] = (unsigned short)  Stunden/10;
165
   Ausgabe[1] = Stunden - 10*Ausgabe[0];
166
   Ausgabe[3] = (unsigned short)  Minuten/10;
167
   Ausgabe[4] = Minuten - 10*Ausgabe[3];
168
   Ausgabe[6] = (unsigned short)  Sekunden/10;
169
   Ausgabe[7] = Sekunden - 10*Ausgabe[6];
170
171
  while(1);
172
173
}

Tut mir verdammt Leid, dass ich solange inaktiv war, aber wir hatten 
einfach zu viele Klausuren zuschreiben, dass ich E-technick bissl nach 
hintenstellen musste :) also dieses Programm hat mir mein Lehrer gegeben 
und sagte es funktioniert, aber es funktioniert nicht.... also ich muss 
dazu sagen das ich den PortD auf PortB wechseln muss, da ich auf A und B 
arbeite und evtl mach ich da einen fehler wäre nett wenn jemand das 
abändern würde, sodass es auf A und B funktioniert , habe hier im 
Programm schon rumprobiert und es sollte halt so funktionieren laut 
meinem Lehrer, aber würde ungern ihn fragen, damit ich jetzt nicht noch 
mehr Notenpunkte verliere, also wäre echt nett wenn jemand sich dafür 
die zeit nehmen kann, schicke das programm auch nochmal als .txt mit :)

von Route_66 H. (route_66)


Lesenswert?

Hallo!
Dein Lehrer sollte gefeuert werden.

von Davut P. (Firma: //) (padawan)


Lesenswert?

Route 66 schrieb:
> Hallo!Dein Lehrer sollte gefeuert werden.

Danke für die Info , aber wie ist es denn richtig ? könntest du mir dann 
etwas besseres machen ? bzw. etwas was ich verstehe ?

von Bulli (Gast)


Lesenswert?

Bin ich froh, heutzutage nicht mehr zur Schule zu müssen. War der vorher 
Biologielehrer und wurde auf Informatik "umgeschult"? So ein Programm 
als Lehrbeispiel zu benutzen sollte strafbar sein...

von Davut P. (Firma: //) (padawan)


Lesenswert?

Bulli schrieb:
> Bin ich froh, heutzutage nicht mehr zur Schule zu müssen. War der 
vorherBiologielehrer und wurde auf Informatik "umgeschult"? So ein Programmals 
Lehrbeispiel zu benutzen sollte strafbar sein...

Ihr seid ja total lieb, dass ihr mich in der Meinung unterstützt, aber 
das hilft mir mit dem Programm bei aller Liebe nicht weiter. Bräuchte 
nen Crashkurs oder sowas ähnliches, wäre nett wie oben gesagt wenn mir 
jemand ein funktionstüchtiges Programm zeigen könnte.

von Karl H. (kbuchegg)


Lesenswert?

Davut Paylan schrieb:

> Ihr seid ja total lieb, dass ihr mich in der Meinung unterstützt, aber
> das hilft mir mit dem Programm bei aller Liebe nicht weiter. Bräuchte
> nen Crashkurs oder sowas ähnliches, wäre nett wie oben gesagt wenn mir
> jemand ein funktionstüchtiges Programm zeigen könnte.


Naja. Sooo schlimm ist das Programm dann auch wieder nicht. Das solltest 
du eigentlich schon verstehen, wie das funktionieren soll. Und ja: So 
wie das Programm ist, läuft die Uhr nicht sondern du hast erst mal nur 
eine statische Anzeige (wenn die Portverdrahtung richtig ist). Zum 
laufen bringen musst du dir Uhr schon selber. Aber es ist alles da (wenn 
auch etwas ungewöhnlich), was dazu notwendig ist.

von Karl H. (kbuchegg)


Lesenswert?

Wie kommt es eigentlich, dass du und Röwschen die gleiche IP-Adresse 
habt? Auch dein Programm ganz oben und das von Röwschen gepostete ähneln 
sich extrem stark.

Beitrag "Re: 7-Segment-Anzeiger mit Interrupt"


So etwas mögen wir hier nicht besonders, wenn du dir unter 2 
verschiedenen Namen Dinge erschleichen möchtest. Das lässt deine Bitte 
im anderen Thread nach einem Beispiel unter einem ganz anderen Licht 
erscheinen. Du hast nämlich ein Beispiel. Du müsstest es nur in der 
Port-Belegung an deine konkreten Verhältnisse anpassen - und das ist 
eigentlich eine simple Übung, die jeder der seine Basisübungen "erste 
Stunde, erste Übung" gemacht hat, eigentlich in 30 Sekunden hinkriegen 
sollte. Wenn du das als Student nicht alleine hinkriegst, dann finde 
zumindest ich, dass du dir den Abschluss in diesem Fach nicht verdient 
hast.

von Route_66 H. (route_66)


Lesenswert?

Hallo!
@kbuchegg
> Und ja: So wie das Programm ist, läuft die Uhr nicht sondern du hast
> erst mal nur eine statische Anzeige.
Da bleibt ihm der lustige Anblick nach Mitternacht erspart.

von Karl H. (kbuchegg)


Lesenswert?

Route 66 schrieb:
> Hallo!
> @kbuchegg
>> Und ja: So wie das Programm ist, läuft die Uhr nicht sondern du hast
>> erst mal nur eine statische Anzeige.
> Da bleibt ihm der lustige Anblick nach Mitternacht erspart.

Wenn ich so rekapituliere und auch den anderen Thread ins Kalkül ziehe, 
komme ich immer mehr zum Schluss, dass sein Lehrer ihm absichtlich etwas 
Halbfertiges gegeben hat, um zu sehen, ob er wenigstens die einfachen 
Dinge hinkriegt. Den Aufsatz eines Timers, die ISR und das Multiplexen 
hat er ihm ja abgenommen. OK, mit den Datentypen steht er ein wenig auf 
Kriegsfuss, aber das seh ich ihm nach.

Mit diesem Beispiel und dem was wir ihm im anderen Thread gelehrt haben 
(und noch einfacher kann nicht mal ich es ihm erklären), denke ich, das 
es kein Problem sein sollte, da eine funktionierende tickende Uhr mit 
einer gemultiplexten 7-Seg Anzeige zu programmieren.

Irgendwie traurig, woran es hier am Semesterende scheitert. Entweder hat 
er das ganze Semester über wirklich nix getan oder aber er hat 
tatsächlich das schlimmste Minus-Talent zum Programmieren, das ich je 
gesehen habe. Wobei: Port austauschen ist Handwerk, das hat mit Talent 
nix zu tun. Selbst ein zeichnerisch völlig unbegabter Maler kann ein 
akzeptables Rechteck malen.

In letzterem Fall wird er sich in Zukunft extrem schwer tun. Ohne 
Programmierung geht in der E-Technik nicht mehr viel.

von dolf (Gast)


Lesenswert?

nun ja nen auftrag hab ich nicht bekommen aber es liegen noch 5stk 
atmega32_16 jahrelang ungenutzt im schrank.
ich werde keine anderen controller mehr kaufen.....
ich such nur die software für ne einfache per tasten zu stellende 
sechsstellige quarzuhr ohne dcf aber mit wecker.
es sollen vorhandene siebensegmentanzeigen mit gem. anode verwendet 
werden.
die software soll per ponnyprog und lpt isp programmer in den controller 
gebrannt werden.
mfg

von Stefan (Gast)


Lesenswert?

@dolf
Und warum schreibst Du das? Erwartest Du jetzt ein Angebot oder gar, daß 
jemand ein fertiges Programm für Dich aus dem Hut zaubert?

Ich kann nur den Kopf schütteln. Wir geben hier im Forum gerne 
Ratschläge, aber wir liefern keine kostenlose Software und wir 
analysieren auch nicht kostenslos tausende Zeilen fremdem Code. 
Geschenke bekommt man bei der Oma, nicht hier.

von Christian F. (cmf) Benutzerseite


Lesenswert?

Stefan schrieb:
> aber wir liefern keine kostenlose Software und wir
> analysieren auch nicht kostenslos tausende Zeilen fremdem Code.

Falsch. Wir machen sowas NICHT, wenn der Frager keinerlei Einsicht 
bzw. Verstand zeigt und nicht auf unsere Hinweise eingeht. Sonst 
natürlich schon!

von Karl H. (kbuchegg)


Lesenswert?

Nur der Vollständigkeit halber.
"dolf" ( Beitrag "Re: 7Segment-Uhr" ) scheint 
wieder ein anderer Poster zu sein. Seine IP Adresse ist eine komplett 
andere.

von Karl H. (kbuchegg)


Lesenswert?

Christian F. schrieb:
> Stefan schrieb:
>> aber wir liefern keine kostenlose Software und wir
>> analysieren auch nicht kostenslos tausende Zeilen fremdem Code.
>
> Falsch. Wir machen sowas NICHT, wenn der Frager keinerlei Einsicht
> bzw. Verstand zeigt und nicht auf unsere Hinweise eingeht. Sonst
> natürlich schon!

Und ich hab für mich noch eine Regel hinzugefügt:
Wenn zu erkennen ist, dass es sich um eine schulische bzw. universitäre 
Arbeit handelt, zieh ich mich auch weiter zurück als normal. Einem 
Bastler, der sich eine Uhr bauen will, aber nicht weiter kommt und eine 
Denkblockade hat, wird immer geholfen. Aber wenn die Arbeit benotet wird 
oder wenn es gar so ist, dass damit eine schulischer/akademischer 
Abschluss verbunden ist, bin ich vorsichtig. Dann frag ich mich: Will 
ich wirklich haben, dass mir im Berufsleben so jemand als Vorgesetzter 
vorgesetzt wird, der zwar ein Zeugnis vorweisen kann, allerdings das was 
im Zeugnis behauptet wird, nicht wirklich beherrscht.

von oldmax (Gast)


Lesenswert?

Hi
Na ja, allerdings kannst du dich dann aber damit trösten, die guten 
Noten hast du erreicht.....
Gruß oldmax

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.