Problem mit C Programm

Gast #1958901
Lesenswert?

Hallo zusammen,

um es vorweg zu nehmen, ich bin relativ neu auf dem Gebiet 
Mikrocontroller und C... Momentan schreibe ich an einer Uhr, das hat 
auch alles bisher wunderbar geklappt.
Die Ausgabe hat auch schon geklappt, jetzt habe ich allerdings noch 
versucht einen Teil einzubauen, seither wird aber nichts mehr 
dargestellt auf den Ausgängen auch nich wenn ich auf den alten Zustand 
zurückgeh. Ich habe extra noch ein anders Programm zum Ausgänge testen 
gemacht, un die funktionieren noch alle.

Den Code häng ich jetzt mal an.
1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <avr/iom16.h>
4
#include <avr/interrupt.h>
5

6

7
// CTC Funktionalität herstellen Clear on Compare/Match
8

9
#define t1ctc 0x04
10
#define t0ctc 0x01
11

12
// Maskierung das nur der TIMSK Teil von Timer 1 geändert wird
13

14
#define t1mask 0b00111100
15

16

17
//Maskierung für TIMSK von Timer0
18

19
#define t0mask 0b00000011
20

21

22
//Vorladewert da Timer 1ms darstellen soll
23

24
#define t0vor  124    // -1 weil bei 0 angefangen wird zu zählen
25

26
//CTC Vektor von Timer 0
27

28
#define ctc_vek_t0 TIMER0_COMP_vect
29

30

31
//Variablendefinition
32

33
volatile uint16_t millisek;
34
volatile uint8_t sek;
35
volatile uint8_t min,std;
36

37
//Funktionsdefinition
38

39
void timer0_config(void)
40
{
41

42
TCCR0 = (0b00000011 & 0b00000111);   // Prescaler von 64 daraus ergibt sich 8000000/64=125000
43

44
OCR0  =  t0vor;   // t0 vor = 124 d.h. bei jedem erreichen von t0vor wird das Interrupt flag des ISR Vectors gesetzt (8000000/64)/f(1000Hz) =125
45

46

47
TIMSK = (t0ctc & t0mask);      // CTC Funktionen herstellen
48

49

50

51
}
52

53

54
void main(void)
55
{
56
//Datenrichtungsregister
57

58
DDRA=0xFF;
59
DDRB=0xFF;
60
DDRC=0xFF;
61
DDRD=0xF8;  //Port D 0-2 als Eingang alle anderen Ausgang für Darstellung der Uhrzeit mit LED's
62

63

64
//Interruptroutine
65

66
timer0_config();
67

68
sei();
69

70
while(1)
71
{
72
/* uint8_t set; //auskommentiert da Funktion momentan nicht gegeben, und ohne Switch war Funktion vorhanden, jetzt nicht mehr.
73

74
set=PORTD;
75

76
switch(set)
77
{
78
case 3:
79
{
80
min++;
81
PORTB=min;
82
}
83

84
case 5:
85
{
86
std++;
87
PORTA=std;
88
}
89

90
default:
91
{
92
*/
93
PORTA=std;
94
PORTB=min;
95
PORTC=sek;
96
//}
97

98
//}
99
}
100

101
}
102

103

104
ISR(TIMER0_COMP_vect)
105
{
106
millisek=millisek+1; //Alternativ millisek++
107

108
if(millisek==1000)
109
{
110
sek++;
111
millisek=0;
112
}
113
if(sek==60)
114
{
115
min++;
116
sek=0;
117
}
118

119
if(min==60)
120
{
121
std++;
122
min=0;
123
if(std==24)
124
{
125
std=0;
126
}
127
}
128
}
Gast #1958973
Lesenswert?

Peter schrieb:
> wie kommst man denn auf soetwas, was erwartest du dir davon?

das war einfach für mich eine gedankenstütze welche Pins in dem Register 
überhaupt dazu gehören, sozusagen als "Sicherheit"

Habe jetzt die Breaks eingefügt und das ganze auch auf PIND abgeändert.

Aber momentan immernoch ohne Erfolg, leider. :(

Weiß noch jemand Rat?
#1958984
Lesenswert?

Mit deinem unübersichtlichen Bitgemurkse setzst du in TIMSK
das unterste Bit.
Dadurch wird ggf. ein Overflow-Interrupt ausgelöst. Den hast du aber
gar nicht definiert, sondern den Compare-Interrupt.
Also wird regelmäßig ein Reset ausgelöst.

Vorschlag: sauber neu schreiben.
#1958998
Lesenswert?

Klaus Wachtler schrieb:

> Vorschlag: sauber neu schreiben.

Das war auch mein erster Gedanke.
Das ist klassischer Code mit dem man sich selber austrickst.
Schmeiss als erster die ganzen #define raus und schreib das sauber.

Sowas
1
#define t1ctc 0x04
2
#define t0ctc 0x01
3

4
...
5

6
#define t0mask 0b00000011
7

8
....
9

10
TIMSK = (t0ctc & t0mask);      // CTC Funktionen herstellen
hat nur einen Zweck: maximale Konfusion zu erzeugen. Und zwar bei dir 
genaus wie bei deinen Lesern.

Und rück deinen Code ein!

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