Forum: Mikrocontroller und Digitale Elektronik Frage zu Initialisieren?


von Huber M. (michael_h784)


Lesenswert?

Hallo,

ich möchte mir als Anfänger eine Uhr auf dem lcd Display erstellen. Dazu 
habe ich mir erstellt..

Hauptprogramm.c // incl. int main(void)
lcd-routunes.c
lcd-routines.h
Timer1.c
Timer2.h

kann mir auch soweit alles am lcd anzeigen lassen. Jetzt wollt ich mir 
eine einfache Tastenfunktion ein bauen.
1
////////////////////////////////////////////////
2
// UHRZEIT_STELLEN
3
  sekundensteller()
4
  {
5
  if (!(PINB&(1<<PB1)))
6
  {
7
    sekunden = 0;
8
  }
9
  }

Dazu wollte ich die Eingänge Initialisieren mit
1
DDRB = ~(1<<PB1);
2
PORTD |= (1<<PB);//PULLUP
 aber da bekomme ich nur Fehlermeldungen und keine Funktion.

wo und wie müsste ich das jetzt Initialisieren, in Timer1.h, Timer1.c 
oder im Hauptprogramm???

HAUPTPROGRAMM
1
#define F_CPU 1000000
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
7
8
9
int main(void)
10
{  
11
   
12
  
13
  
14
   ///////////////////////////////////////////
15
  //DISPLAY wird Hochgefahren
16
  lcd_init();
17
  lcd_setcursor(0,1);
18
  lcd_string(".....Display....");
19
  lcd_setcursor(0,2);
20
  lcd_string("..faehrt Hoch...");
21
  _delay_ms(3500);
22
  lcd_clear();
23
   ///////////////////////////////////////////
24
   //TIMER aus Timer.h aufrufen
25
   TIMER1_INIT();
26
  
27
  
28
   
29
  while(1)
30
  {    
31
  asm("NOP");
32
  }
33
}

Timer1.h
1
/*
2
 * IncFile1.h
3
 *
4
 * Created: 30.01.2017 15:38:13
5
 *  Author: USER
6
 */ 
7
8
9
#ifndef Timer1_H_
10
#define Timer1_H_
11
12
volatile uint8_t sekunden = 0;
13
volatile uint8_t minuten = 0;
14
volatile uint8_t stunden = 0;
15
16
17
18
char outpt [16];
19
20
void sekundenzaehler (void);
21
void minutenzaehler (void);
22
void stundenzaehler (void);
23
24
void Reset_All (void);
25
26
/////////////////////////////////////////////////
27
//UHRZEIT_STELLEN
28
void sekundensteller (void);
29
void minutensteller  (void);
30
void stundensteller  (void);
31
32
33
34
35
36
#endif

Timer1.c
1
/* 
2
*
3
*
4
*
5
*
6
*
7
*
8
*
9
*
10
*
11
*
12
*/
13
#include <avr/io.h>
14
#include "TIMER1.h"
15
#include <avr/interrupt.h>
16
17
         
18
void TIMER1_INIT (void)
19
 {
20
              
21
  TCCR1B |= (1 << CS12);        // Vorteiler auf 256 und Timer start
22
  TCCR1B |= (1 << WGM12);       // Mode 4, CTC on OCR1A
23
  OCR1A = 31249;                // Compare match auf 31249 setzen
24
  TIMSK1 |= (1 << OCIE1A);     // Interrupt bei compare match aktivieren
25
  
26
  sei();   
27
  
28
  
29
 }
30
 
31
ISR (TIMER1_COMPA_vect)         // Timer1 Compare Match Interrupt
32
{
33
  
34
35
  sekundenzaehler();
36
  minutenzaehler();
37
  stundenzaehler();
38
  Reset_All();
39
  
40
  
41
  itoa(stunden,outpt,10);
42
  lcd_setcursor(4,2);
43
  lcd_string(outpt);
44
  itoa( minuten, outpt, 10);
45
  lcd_setcursor(6,2);
46
  lcd_string(":");
47
  lcd_string(outpt);
48
  lcd_string(":");
49
  itoa(sekunden,outpt,10);
50
  lcd_string(outpt);
51
  lcd_setcursor(4,1);
52
  lcd_string("UHRZEIT:");
53
54
  
55
  
56
  
57
}
58
59
60
//////////////////////////////////////////////////
61
//HIER  Funktionen 
62
63
void sekundenzaehler(void)
64
{
65
  sekunden++;
66
}
67
68
/////////////////////////////////////////////////
69
//RESET SEKUNDEN // ZAEHLT MINUTEN
70
void minutenzaehler (void)
71
{  
72
  if ( sekunden == 60 )
73
  {
74
    lcd_clear();
75
    sekunden = 0;
76
    minuten++;
77
  }
78
}
79
/////////////////////////////////////////////////
80
//RESET MINUTEN // ZAEHLT STUNDEN
81
void stundenzaehler(void)
82
{
83
  if ( minuten == 60 )
84
  {
85
    lcd_clear();
86
    minuten = 0;
87
    stunden++;
88
  }
89
  
90
}
91
92
/////////////////////////////////////////////////
93
//24 STUNDEN// RESET STD MIN SEK 00:00:00
94
void Reset_All (void)
95
{
96
  if (stunden == 24)
97
  {
98
    lcd_clear();
99
    sekunden = 0;
100
    minuten  = 0;
101
    stunden  = 0;
102
  }
103
  
104
}
105
106
////////////////////////////////////////////////
107
// UHRZEIT_STELLEN
108
  sekundensteller()
109
  {
110
  if (!(PINB&(1<<PB1)))
111
  {
112
    sekunden = 0;
113
  }
114
  }

Grüsse Huber

von Huber M. (michael_h784)


Lesenswert?

Hallo,

ich möchte mir als Anfänger eine Uhr auf dem lcd Display erstellen. Dazu 
habe ich mir erstellt..

Hauptprogramm.c // incl. int main(void)
lcd-routunes.c
lcd-routines.h
Timer1.c
Timer2.h

kann mir auch soweit alles am lcd anzeigen lassen. Jetzt wollt ich mir 
eine einfache Tastenfunktion ein bauen.
1
////////////////////////////////////////////////
2
// UHRZEIT_STELLEN
3
  sekundensteller()
4
  {
5
  if (!(PINB&(1<<PB1)))
6
  {
7
    sekunden = 0;
8
  }
9
  }

Dazu wollte ich die Eingänge Initialisieren mit
1
DDRB = ~(1<<PB1);
2
PORTD |= (1<<PB);//PULLUP
 aber da bekomme ich nur Fehlermeldungen und keine Funktion.

wo und wie müsste ich das jetzt Initialisieren, in Timer1.h, Timer1.c 
oder im Hauptprogramm???

HAUPTPROGRAMM
1
#define F_CPU 1000000
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
7
8
9
int main(void)
10
{  
11
   
12
  
13
  
14
   ///////////////////////////////////////////
15
  //DISPLAY wird Hochgefahren
16
  lcd_init();
17
  lcd_setcursor(0,1);
18
  lcd_string(".....Display....");
19
  lcd_setcursor(0,2);
20
  lcd_string("..faehrt Hoch...");
21
  _delay_ms(3500);
22
  lcd_clear();
23
   ///////////////////////////////////////////
24
   //TIMER aus Timer.h aufrufen
25
   TIMER1_INIT();
26
  
27
  
28
   
29
  while(1)
30
  {    
31
  asm("NOP");
32
  }
33
}

Timer1.h
1
/*
2
 * IncFile1.h
3
 *
4
 * Created: 30.01.2017 15:38:13
5
 *  Author: USER
6
 */ 
7
8
9
#ifndef Timer1_H_
10
#define Timer1_H_
11
12
volatile uint8_t sekunden = 0;
13
volatile uint8_t minuten = 0;
14
volatile uint8_t stunden = 0;
15
16
17
18
char outpt [16];
19
20
void sekundenzaehler (void);
21
void minutenzaehler (void);
22
void stundenzaehler (void);
23
24
void Reset_All (void);
25
26
/////////////////////////////////////////////////
27
//UHRZEIT_STELLEN
28
void sekundensteller (void);
29
void minutensteller  (void);
30
void stundensteller  (void);
31
32
33
34
35
36
#endif

Timer1.c
1
/* 
2
*
3
*
4
*
5
*
6
*
7
*
8
*
9
*
10
*
11
*
12
*/
13
#include <avr/io.h>
14
#include "TIMER1.h"
15
#include <avr/interrupt.h>
16
17
         
18
void TIMER1_INIT (void)
19
 {
20
              
21
  TCCR1B |= (1 << CS12);        // Vorteiler auf 256 und Timer start
22
  TCCR1B |= (1 << WGM12);       // Mode 4, CTC on OCR1A
23
  OCR1A = 31249;                // Compare match auf 31249 setzen
24
  TIMSK1 |= (1 << OCIE1A);     // Interrupt bei compare match aktivieren
25
  
26
  sei();   
27
  
28
  
29
 }
30
 
31
ISR (TIMER1_COMPA_vect)         // Timer1 Compare Match Interrupt
32
{
33
  
34
35
  sekundenzaehler();
36
  minutenzaehler();
37
  stundenzaehler();
38
  Reset_All();
39
  
40
  
41
  itoa(stunden,outpt,10);
42
  lcd_setcursor(4,2);
43
  lcd_string(outpt);
44
  itoa( minuten, outpt, 10);
45
  lcd_setcursor(6,2);
46
  lcd_string(":");
47
  lcd_string(outpt);
48
  lcd_string(":");
49
  itoa(sekunden,outpt,10);
50
  lcd_string(outpt);
51
  lcd_setcursor(4,1);
52
  lcd_string("UHRZEIT:");
53
54
  
55
  
56
  
57
}
58
59
60
//////////////////////////////////////////////////
61
//HIER  Funktionen 
62
63
void sekundenzaehler(void)
64
{
65
  sekunden++;
66
}
67
68
/////////////////////////////////////////////////
69
//RESET SEKUNDEN // ZAEHLT MINUTEN
70
void minutenzaehler (void)
71
{  
72
  if ( sekunden == 60 )
73
  {
74
    lcd_clear();
75
    sekunden = 0;
76
    minuten++;
77
  }
78
}
79
/////////////////////////////////////////////////
80
//RESET MINUTEN // ZAEHLT STUNDEN
81
void stundenzaehler(void)
82
{
83
  if ( minuten == 60 )
84
  {
85
    lcd_clear();
86
    minuten = 0;
87
    stunden++;
88
  }
89
  
90
}
91
92
/////////////////////////////////////////////////
93
//24 STUNDEN// RESET STD MIN SEK 00:00:00
94
void Reset_All (void)
95
{
96
  if (stunden == 24)
97
  {
98
    lcd_clear();
99
    sekunden = 0;
100
    minuten  = 0;
101
    stunden  = 0;
102
  }
103
  
104
}
105
106
////////////////////////////////////////////////
107
// UHRZEIT_STELLEN
108
  sekundensteller()
109
  {
110
  if (!(PINB&(1<<PB1)))
111
  {
112
    sekunden = 0;
113
  }
114
  }

Grüsse Huber

von Huh (Gast)


Lesenswert?

Huber M. schrieb:
> bekomme ich nur Fehlermeldungen

Und die lauten wie?

von Armin S. (knall_e)


Lesenswert?

Hier mal ein kleiner Monolog...

Hat ein Button etwas mit einem Timer zu tun?
-> Nein.

Gehört eine Portinitialisierung für einen Button demnach zu dem Timer?
-> Nein.

Ich frag mal weiter....
Gehört eine Zeitauswertung für deine Uhr in ein Timer-Modul?
-> Nicht zwingend. Könnte man in ein Clock-Modul auslagern.

Findet dein Button in diesem ausgelagerten Clock-Modul Anwendung?
-> Wahrscheinlich.

Macht es dann Sinn verwendete Buttons (sofern nicht anderweitig zentral 
verwaltet) in Applikationsmodul (z.b. Clock) auch darin zu 
konfigurieren?
-> Vermutlich, ja.

Vielleicht helfen dir solche Fragen weiter als Gedankenanstoss...

von Huber M. (michael_h784)


Lesenswert?

Armin S. schrieb:
> Findet dein Button in diesem ausgelagerten Clock-Modul Anwendung?
> -> Wahrscheinlich.
>
> Macht es dann Sinn verwendete Buttons (sofern nicht anderweitig zentral
> verwaltet) in Applikationsmodul (z.b. Clock) auch darin zu
> konfigurieren?
> -> Vermutlich, ja.

Nein, kein Clock-Modul. Ich möchte mir vorerst mit der internen Cpu 
Frequenz über den Timer Variablen hochzählen lassen.

von Fred_Ram (Gast)


Lesenswert?

Huber M. schrieb:
> lcd_init();
>   lcd_setcursor(0,1);
>   lcd_string(".....Display....");
>   lcd_setcursor(0,2);
>   lcd_string("..faehrt Hoch...");
>   _delay_ms(3500);
>   lcd_clear();

Sowas habe ich schon lange nicht mehr gesehen.
Was soll das bringen?

von Huber M. (michael_h784)


Lesenswert?

Fred_Ram schrieb:
> Huber M. schrieb:
>> lcd_init();
>>   lcd_setcursor(0,1);
>>   lcd_string(".....Display....");
>>   lcd_setcursor(0,2);
>>   lcd_string("..faehrt Hoch...");
>>   _delay_ms(3500);
>>   lcd_clear();
>
> Sowas habe ich schon lange nicht mehr gesehen.
> Was soll das bringen?

das bringt gar nichts ausser, ne kurze anzeige zum Spass. Aber mein 
Problem ist, wo und wie baue ich mir unter Verwendung von c und h 
Dateien einen Taster ein ?

denn , wenn ich das jetzt im Hauptprogramm mache so wie ich es immer 
mache, ohne h und c files  ist das ja grundsätzlich kein Problem. Wenn 
ich jetzt, aber Sekunden = 0; mit hinzufüge, inclusive der h-Datei wo 
das drin steht, sagt der Compiler mir, das Sekunden double....

von Egon H. (Gast)


Lesenswert?

Huber M. schrieb:
> sagt der Compiler mir, das Sekunden double....

Ja, und weiter? Was sagt er?
Lautet die Fehlermeldung wirklich nur "das Sekunden double..."?

von Huber M. (michael_h784)


Angehängte Dateien:

Lesenswert?

Egon H. schrieb:
> Huber M. schrieb:
>> sagt der Compiler mir, das Sekunden double....
>
> Ja, und weiter? Was sagt er?
> Lautet die Fehlermeldung wirklich nur "das Sekunden double..."?

hier die C Datei
1
#define F_CPU 1000000
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
7
8
9
10
int main(void)
11
{   
12
  DDRB |= ~(1<<PINB1);
13
  PORTD |= (1<<PINB1);
14
  
15
   ///////////////////////////////////////////
16
  //DISPLAY wird Hochgefahren
17
  lcd_init();
18
  lcd_setcursor(0,1);
19
  lcd_string(".....Display....");
20
  lcd_setcursor(0,2);
21
  lcd_string("..faehrt Hoch...");
22
  _delay_ms(3500);
23
  lcd_clear();
24
   ///////////////////////////////////////////
25
   //TIMER aus Timer.h aufrufen
26
   TIMER1_INIT();
27
  
28
  
29
  while(1)
30
  {    
31
  if (!(PINB&(1<<PINB1)))
32
  {
33
    sekunden = 0;
34
  }
35
  }
36
}
hier der Fehlercode siehe , bild, da ich die liste nicht kopieren kann

von Egon H. (Gast)


Lesenswert?

Die Fehlermeldungen lauten unter anderem:
multiple definition of "sekunden"
multiple definition of "minuten"
multiple definition of "stunden"

in dem Code-Abschnitt kommen aber gar keine sekunden, minuten oder 
stunden vor. Irgendwas stimmt da nicht. Falschen Code gepostet?

Jedenfalls bedeuten die Fehlermeldungen, daß du diese Variablen schon wo 
anders definiert hast und an der Fehlerstelle nochmal definieren 
wolltest. Jetzt schau mal deine Files durch, ob du irgendwo die gleiche 
Definition mehrfach findest.

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.