Forum: Mikrocontroller und Digitale Elektronik Problem mit C Programm


von Alien (Gast)


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
}

von Peter (Gast)


Lesenswert?

> TCCR0 = (0b00000011 & 0b00000111);

wie kommst man denn auf soetwas, was erwartest du dir davon?

von Timmo H. (masterfx)


Lesenswert?

Vielleicht gehts nicht weil du die "break;"'s in der Switch-Anweisung 
vergessen hast.

von Floh (Gast)


Lesenswert?

Alien schrieb:
> /* uint8_t set; //auskommentiert da Funktion momentan nicht gegeben, und ohne 
Switch war Funktion vorhanden, jetzt nicht mehr.
>
> set=PORTD;

Wenn du damit die Taster einlesen willst, ist das falsch.
Das geht mit PIND.
:-)

von Alien (Gast)


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?

von Timmo H. (masterfx)


Lesenswert?

Mach mal das "#include <avr/iom16.h>" raus, die wird eh durch io.h 
eingebunden, steht auch in der Quelle:
1
/* This file should only be included from <avr/io.h>, never directly. */

Welchen AVR hast du? Ist er auch richtig beim Compiler/AVR Studio 
eingestellt?

von Klaus W. (mfgkw)


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.

von Karl H. (kbuchegg)


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!

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.