Zähler gibt falschen wert aus

OP #3798838
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
}
Gast #3798847
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ß

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.