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
intmain(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
volatileuint8_tsekunden=0;
13
volatileuint8_tminuten=0;
14
volatileuint8_tstunden=0;
15
16
17
18
charoutpt[16];
19
20
voidsekundenzaehler(void);
21
voidminutenzaehler(void);
22
voidstundenzaehler(void);
23
24
voidReset_All(void);
25
26
/////////////////////////////////////////////////
27
//UHRZEIT_STELLEN
28
voidsekundensteller(void);
29
voidminutensteller(void);
30
voidstundensteller(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
voidTIMER1_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
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
intmain(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
volatileuint8_tsekunden=0;
13
volatileuint8_tminuten=0;
14
volatileuint8_tstunden=0;
15
16
17
18
charoutpt[16];
19
20
voidsekundenzaehler(void);
21
voidminutenzaehler(void);
22
voidstundenzaehler(void);
23
24
voidReset_All(void);
25
26
/////////////////////////////////////////////////
27
//UHRZEIT_STELLEN
28
voidsekundensteller(void);
29
voidminutensteller(void);
30
voidstundensteller(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
voidTIMER1_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
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...
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.
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?
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....
Huber M. schrieb:> sagt der Compiler mir, das Sekunden double....
Ja, und weiter? Was sagt er?
Lautet die Fehlermeldung wirklich nur "das Sekunden double..."?
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
intmain(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
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.