Forum: Mikrocontroller und Digitale Elektronik Zähler gibt falschen wert aus


von Ma M. (monk3000)


Lesenswert?

Hallo,

bin neu hier und habe noch nicht so viel Erfahrung mit conrollern und 
brauche ein bisschen Hilfe.

ich bin zur Zeit einen counter mit einem Atmega32 am bauen. Die Zeit 
soll über vier 7Seg Anzeigen ausgegeben werden (2 segmente minuten, 2 
segmente sekunden). Die Ausgänge des Controllers gehen auf einen 
BCD/7Segment converter(74HC453)und dann auf die einzelnen Elemente.

Mein Problem ist, dass die Anzeige die Zahlen 0,1,3,7 ausgibt und dann 
vermulich über 9 läuft. Das sieht für mich so aus, als ob die Werte 
nacheinander addiert werden anstatt die Werte immer mit eins zu 
addieren.
Wenn ich die Segmente mit festen Werten ansteuer werden die 
entsprechenden Zahlen richtig dargestellt.

seht Ihr villeicht in dem Programm einen fehler? (die zeit des Timers 
stimmt noch nicht)

----------------------------------------------------------------------
1
#define F_CPU 8000000UL
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
volatile uint8_t counter = 0;
5
volatile uint8_t time_sec_ein;
6
volatile uint8_t time_sec_zehn;
7
volatile uint8_t time_min_ein;
8
volatile uint8_t time_min_zehn;
9
volatile uint8_t time_min_set;
10
11
12
ISR (TIMER0_OVF_vect)
13
{
14
     counter++;
15
16
}
17
int sec_ein()
18
{
19
     if (counter==50)
20
     {
21
         time_sec_ein++;
22
         counter = 0;
23
     }
24
     if (time_sec_ein == 10)
25
     {
26
         time_sec_ein = 0;
27
     }
28
29
}
30
31
32
int main(void)
33
{
34
35
     DDRA = 0xff;
36
     DDRC = 0xff;
37
38
     TIMSK |= (1 << TOIE0);
39
     TCCR0 |= (1<< CS00) | (1<< CS01);
40
     sei();
41
42
     while(1)
43
     {
44
     switch (time_sec_zehn)
45
     {
46
         case 1: PORTC |= (1<<PC4);break;
47
         case 2: PORTC |= (1<<PC6);break;
48
         case 3: PORTC |= (1<<PC4)|(1<<PC6);break;
49
         case 4: PORTC |= (1<<PC7);break;
50
         case 5: PORTC |= (1<<PC7)|(1<<PC4);break;
51
         case 6: PORTC |= (1<<PC7)|(1<<PC6);break;
52
         case 7: PORTC |= (1<<PC7)|(1<<PC6)|(1<<PC4);break;
53
         case 8: PORTC |= (1<<PC5);break;
54
         case 9: PORTC |= (1<<PC5)|(1<<PC4);break;
55
56
     }
57
58
     switch (time_sec_ein)
59
     {
60
         case 1: PORTC |= (1<<PC3);break;
61
         case 2: PORTC |= (1<<PC1);break;
62
         case 3: PORTC |= (1<<PC3)|(1<<PC1);break;
63
         case 4: PORTC |= (1<<PC0);break;
64
         case 5: PORTC |= (1<<PC0)|(1<<PC3);break;
65
         case 6: PORTC |= (1<<PC0)|(1<<PC1);break;
66
         case 7: PORTC |= (1<<PC0)|(1<<PC1)|(1<<PC3);break;
67
         case 8: PORTC |= (1<<PC2);break;
68
         case 9: PORTC |= (1<<PC2)|(1<<PC3);break;
69
     }
70
71
72
     switch (time_min_zehn)
73
     {
74
         case 1: PORTA |= (1<<PA3);break;
75
         case 2: PORTA |= (1<<PA1);break;
76
         case 3: PORTA |= (1<<PA3)|(1<<PA1);break;
77
         case 4: PORTA |= (1<<PA0);break;
78
         case 5: PORTA |= (1<<PA0)|(1<<PA3);break;
79
         case 6: PORTA |= (1<<PA0)|(1<<PA1);break;
80
         case 7: PORTA |= (1<<PA0)|(1<<PA1)|(1<<PA3);break;
81
         case 8: PORTA |= (1<<PA2);break;
82
         case 9: PORTA |= (1<<PA2)|(1<<PA3);break;
83
     }
84
85
     switch (time_min_ein)
86
     {
87
         case 1: PORTA |= (1<<PA4);break;
88
         case 2: PORTA |= (1<<PA6);break;
89
         case 3: PORTA |= (1<<PA4)|(1<<PA6);break;
90
         case 4: PORTA |= (1<<PA7);break;
91
         case 5: PORTA |= (1<<PA7)|(1<<PA4);break;
92
         case 6: PORTA |= (1<<PA7)|(1<<PA6);break;
93
         case 7: PORTA |= (1<<PA7)|(1<<PA6)|(1<<PA4);break;
94
         case 8: PORTA |= (1<<PA5);break;
95
         case 9: PORTA |= (1<<PA5)|(1<<PA4);break;
96
     }
97
98
     }
99
}

: Bearbeitet durch User
von 4toTakoe (Gast)


Lesenswert?

Und wo löschst du die Bits in den Port-Registern? Bei dir wird alles 
oder verknüpft...

von Peter II (Gast)


Lesenswert?

sec_ein wird nie aufgerufen, damit können sie die Variabel nie ändern.

von dunno.. (Gast)


Lesenswert?

Ich vermisse den Aufruf der Funktion
1
 int sec_ein();

Da kann doch so garnix zählen..?

Probier erstmal die Ausgabe deiner zahlen aus, zähl einfach die Zahl 
hoch und gib sie aus, damit du weißt ob deine Ansteuerung stimmt..

Außerdem ist die Lösung mit der ISR und der extra funktion nicht 
interruptsave. aber darum kannst du dich kümmern wenn die ausgabe 
richtig geht..

Benutze bitte beim Posten von Code das Code Highlighting.

Gruß

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.