hallo
mein display zeit falsch an.
zwar schon den text was es ausgeben soll, jedoch noch einige komische
zeichen.
codes hab ich ausm gcc turtorial und angepasst
hab schon in die isr ein lcd_clear(); aber dann schmiert mein lcd
irgendwann ab. (vielleicht zuviel clear)
vielleicht hat wer nen tipp wie man nur das nazeigt was man möchte!
1 //
2 // Anpassungen im makefile:
3 // ATMega8 => MCU=atmega8 im makefile einstellen
4 // lcd-routines.c in SRC = ... Zeile anhängen
5 //
6 #include <avr/io.h>
7 #include "lcd-routines.h"
8
9 #include <util/delay.h>
10 #include <stdlib.h>
11
12 #include <avr/signal.h>
13
14 uint8_t sek = 30 ;
15 uint8_t min = 52 ;
16 uint8_t hour = 20 ;
17
18 uint8_t var ;
19
20 void int2lcd ( int , int , int );
21 inline uint8_t debounce ( volatile uint8_t * port , uint8_t pin );
22
23
24 int main ( void )
25 {
26
27
28 DDRB = ( 1 << DDB0 ); //PinB0 als Ausgang
29 DDRB &= ~ ( 1 << DDB1 ); //PinB2 als Eingang
30 PORTB = ( 0 << PB0 ) | ( 1 << PB1 ); // PibB1 auf 0 & PINB2 PullUp auf vcc
31
32
33
34 // LCD initialisierung anfang****************************************
35 lcd_init ();
36 set_cursor ( 0 , 1 );
37 lcd_string ( "Bewaesserung " );
38 set_cursor ( 0 , 2 );
39 lcd_string ( "initalisierung***" );
40 // LCD initialisierung ende****************************************
41
42
43
44 //Timer1 config anfang***********************************************
45 TIMSK |= ( 1 << OCIE1A ); //Timer 1 Output Compare A Match Interrupt Enable
46 OCR1A = 31250 ; // von 0 bis zu diesem Wert wird gezählt => 1sek
47 TCCR1B |= ( 1 << CS12 ) | ( 1 << WGM12 ); //CTC MODE & 256Teiler
48 sei (); //Globale Interrupts freigeben
49 //Timer1 config ende***************************************************
50
51
52 while ( 1 ) //ENDLOSSCHLEIFE
53 {
54 //Tastenabfrage anfang***********************************************
55 if ( PINB & ( 1 << PINB1 )) {
56 PORTB &= ~ ( 1 << PB0 );
57 }
58 else {
59 PORTB |= ( 1 << PB0 );
60 }
61 //Tastenabfrage ende***********************************************
62
63 //Zeitabfrage anfang***********************************************
64 if ( sek <= 4 && min == 0 && hour == 7 ) { //wenn sek =60
65 PORTB |= ( 1 << PB0 );
66 }
67
68 if ( sek <= 4 && min == 10 && hour == 8 ) { //wenn sek =60
69 PORTB |= ( 1 << PB0 );
70 }
71
72 if ( sek <= 4 && min == 0 && hour == 9 ) { //wenn sek =60
73 PORTB |= ( 1 << PB0 );
74 }
75
76 if ( sek <= 4 && min == 0 && hour == 12 ) { //wenn sek =60
77 PORTB |= ( 1 << PB0 );
78 }
79
80 if ( sek <= 4 && min == 0 && hour == 13 ) { //wenn sek =60
81 PORTB |= ( 1 << PB0 );
82 }
83
84 if ( sek <= 4 && min == 0 && hour == 18 ) { //wenn sek =60
85 PORTB |= ( 1 << PB0 );
86 }
87
88 //Zeitabfrage anfang***********************************************
89
90 set_cursor ( 0 , 1 ); //Ausgabe in der 1.Zeile "Uhrzeit"
91 lcd_string ( "Uhrzeit" );
92
93 int2lcd ( hour , min , sek ); // Aufrufen des Unterprogrammes mit dem der int wert in ein acii umgewandelt wird und am lcd angezeigt wird
94
95 }
96 }
97
98
99 // ISR anfang**************************************************
100 ISR ( TIMER1_COMPA_vect ){
101
102
103
104 sek ++ ; //sek wird erhöht
105 if ( sek >= 60 ) { //wenn sek =60
106 sek = 0 ;
107 min ++ ;
108 }
109 if ( min >= 60 ) { //wenn sek =60
110 min = 0 ;
111 hour ++ ;
112 }
113 if ( hour >= 24 ) { //wenn sek =60
114 hour = 0 ;
115 }
116
117
118
119 }
120 //ISR ende***************************************************
121
122
123
124 //int2lcd anfang************************************************************
125 void int2lcd ( int temp1 , int temp2 , int temp3 )
126 {
127 lcd_data ( temp1 );
128 lcd_data ( temp2 );
129 lcd_data ( temp3 );
130
131
132 set_cursor ( 1 , 2 );
133 {
134 char Buffer1 [ 20 ]; // in diesem {} lokal
135 itoa ( temp1 , Buffer1 , 10 );
136 lcd_string ( Buffer1 );
137 }
138 set_cursor ( 2 , 2 );
139 lcd_data ( ':' );
140 //***************************************
141 set_cursor ( 3 , 2 );
142 {
143 char Buffer2 [ 20 ];
144 itoa ( temp2 , Buffer2 , 10 );
145 lcd_string ( Buffer2 );
146 }
147 //*****************************************
148 set_cursor ( 5 , 2 );
149 lcd_data ( ':' );
150 //***************************************
151 set_cursor ( 6 , 2 );
152
153 {
154 char Buffer3 [ 20 ];
155 itoa ( temp3 , Buffer3 , 10 );
156 lcd_string ( Buffer3 );
157 }
158
159 }
160
161 //int2lcd ende*********************************************************
162
163
164
165 inline uint8_t debounce ( volatile uint8_t * port , uint8_t pin )
166 {
167 if ( ! ( * port & ( 1 << pin )) )
168 {
169 /* Pin wurde auf Masse gezogen, 100ms warten */
170 _delay_ms ( 50 ); // max. 262.1 ms / F_CPU in MHz
171 _delay_ms ( 50 );
172 if ( * port & ( 1 << pin ) )
173 {
174 /* Anwender Zeit zum Loslassen des Tasters geben */
175 _delay_ms ( 50 );
176 _delay_ms ( 50 );
177 return 1 ;
178 }
179 }
180 return 0 ;
181 }
> zwar schon den text was es ausgeben soll, jedoch noch einige komische
> zeichen.
Die zusätzlichen Zeichen kommen hierher:1 lcd_data ( temp1 );
2 lcd_data ( temp2 );
3 lcd_data ( temp3 );
danke hab anscheinend das vom herumprobieren zu beginn vergessen zu
entfernen ;-)
hab jedoch noch immer falschanzeige.
1. in der ersten zeile seh ich auf poistion 12und 13 ne zahl
2. in der unteren zeile wird "uhrzeit" ab position 8 angezeigt (aber nur
wenn sek größer als 9 ist. (ist ein 2x16lcd)
glaube es liegt irgendwie an der umrechnung, gibts da eigentlich einen
kürzeren weg für int nach acii??
hier der verbesserte code danke! ;-) 1 //
2 // Anpassungen im makefile:
3 // ATMega8 => MCU=atmega8 im makefile einstellen
4 // lcd-routines.c in SRC = ... Zeile anhängen
5 //
6 #include <avr/io.h>
7 #include "lcd-routines.h"
8
9 #include <util/delay.h>
10 #include <stdlib.h>
11
12 #include <avr/signal.h>
13
14 uint8_t sek = 30 ;
15 uint8_t min = 8 ;
16 uint8_t hour = 21 ;
17
18 uint8_t var ;
19
20 void int2lcd ( int , int , int );
21 inline uint8_t debounce ( volatile uint8_t * port , uint8_t pin );
22
23
24 int main ( void )
25 {
26
27
28 DDRB = ( 1 << DDB0 ); //PinB0 als Ausgang
29 DDRB &= ~ ( 1 << DDB1 ); //PinB2 als Eingang
30 PORTB = ( 0 << PB0 ) | ( 1 << PB1 ); // PibB1 auf 0 & PINB2 PullUp auf vcc
31
32 lcd_init (); // LCD initialisierung
33
34
35 //Timer1 config anfang***********************************************
36 TIMSK |= ( 1 << OCIE1A ); //Timer 1 Output Compare A Match Interrupt Enable
37 OCR1A = 31250 ; // von 0 bis zu diesem Wert wird gezählt => 1sek
38 TCCR1B |= ( 1 << CS12 ) | ( 1 << WGM12 ); //CTC MODE & 256Teiler
39 sei (); //Globale Interrupts freigeben
40 //Timer1 config ende***************************************************
41
42
43 while ( 1 ) //ENDLOSSCHLEIFE
44 {
45 //Tastenabfrage anfang***********************************************
46 if ( PINB & ( 1 << PINB1 )) {
47 PORTB &= ~ ( 1 << PB0 );
48 }
49 else {
50 PORTB |= ( 1 << PB0 );
51 }
52 //Tastenabfrage ende***********************************************
53
54 //Zeitabfrage anfang***********************************************
55 if ( sek <= 4 && min == 0 && hour == 7 ) { //wenn sek =60
56 PORTB |= ( 1 << PB0 );
57 }
58
59 if ( sek <= 4 && min == 10 && hour == 8 ) { //wenn sek =60
60 PORTB |= ( 1 << PB0 );
61 }
62
63 if ( sek <= 4 && min == 0 && hour == 9 ) { //wenn sek =60
64 PORTB |= ( 1 << PB0 );
65 }
66
67 if ( sek <= 4 && min == 0 && hour == 12 ) { //wenn sek =60
68 PORTB |= ( 1 << PB0 );
69 }
70
71 if ( sek <= 4 && min == 0 && hour == 13 ) { //wenn sek =60
72 PORTB |= ( 1 << PB0 );
73 }
74
75 if ( sek <= 4 && min == 0 && hour == 18 ) { //wenn sek =60
76 PORTB |= ( 1 << PB0 );
77 }
78
79 //Zeitabfrage anfang***********************************************
80
81 set_cursor ( 0 , 1 ); //Ausgabe in der 1.Zeile "Uhrzeit"
82 lcd_string ( "Uhrzeit" );
83
84 int2lcd ( hour , min , sek ); // Aufrufen des Unterprogrammes mit dem der int wert in ein acii umgewandelt wird und am lcd angezeigt wird
85
86 }
87 }
88
89
90 // ISR anfang**************************************************
91 ISR ( TIMER1_COMPA_vect ){
92
93 lcd_init ();
94
95 sek ++ ; //sek wird erhöht
96 if ( sek >= 60 ) { //wenn sek =60
97 sek = 0 ;
98 min ++ ;
99 }
100 if ( min >= 60 ) { //wenn sek =60
101 min = 0 ;
102 hour ++ ;
103 }
104 if ( hour >= 24 ) { //wenn sek =60
105 hour = 0 ;
106 }
107
108
109
110 }
111 //ISR ende***************************************************
112
113
114
115 //int2lcd anfang************************************************************
116 void int2lcd ( int temp1 , int temp2 , int temp3 )
117 {
118
119 set_cursor ( 1 , 2 );
120 {
121 char Buffer1 [ 20 ]; // in diesem {} lokal
122 itoa ( temp1 , Buffer1 , 10 );
123 lcd_string ( Buffer1 );
124 }
125 set_cursor ( 2 , 2 );
126 lcd_data ( ':' );
127 //***************************************
128 set_cursor ( 3 , 2 );
129 {
130 char Buffer2 [ 20 ];
131 itoa ( temp2 , Buffer2 , 10 );
132 lcd_string ( Buffer2 );
133 }
134 //*****************************************
135 set_cursor ( 5 , 2 );
136 lcd_data ( ':' );
137 //***************************************
138 set_cursor ( 6 , 2 );
139
140 {
141 char Buffer3 [ 20 ];
142 itoa ( temp3 , Buffer3 , 10 );
143 lcd_string ( Buffer3 );
144 }
145
146 }
147
148 //int2lcd ende*********************************************************
149
150
151
152 inline uint8_t debounce ( volatile uint8_t * port , uint8_t pin )
153 {
154 if ( ! ( * port & ( 1 << pin )) )
155 {
156 /* Pin wurde auf Masse gezogen, 100ms warten */
157 _delay_ms ( 50 ); // max. 262.1 ms / F_CPU in MHz
158 _delay_ms ( 50 );
159 if ( * port & ( 1 << pin ) )
160 {
161 /* Anwender Zeit zum Loslassen des Tasters geben */
162 _delay_ms ( 50 );
163 _delay_ms ( 50 );
164 return 1 ;
165 }
166 }
167 return 0 ;
168 }
von
holger (Gast)
05.02.2009 22:12
volatile uint8_t sek=30;
volatile uint8_t min=8;
volatile uint8_t hour=21;
>// ISR anfang**************************************************
>ISR(TIMER1_COMPA_vect){
> lcd_init();
Was zum Teufel hat das lcd_init() im
Timerinterrupt zu suchen?
Einmal reicht ja wohl, oder nicht?
hallo
habe volatile hinzugefügt, das habe ich verstanden, eventuell kann was
wegoptimiert werden.
lcd_init(); habe ich wieder rausgenommen, meine idee dahinter war, wenn
das display was komisches anzeigt dann initialisier ich es einfach neu,
hat sich dann aber eh nach einer minute aufgehängt! ist jetzt wieder
draußen aus der ISR
das problem mit der komischen anzeige besteht noch, hab es mal ein bild
angehängt
hätte noch eine frage zur ISR, kann ich da evetuell auch noch die
zeitabfrage oder die umwandlung von int2lcd hineingeben oder ist das
unklug da die isr sonst zu lang durchlaufen wird?!
und mein letztes problem die eigentliche umrechnung von int2lcd schaut
mir irgendwie zu komplizert aus, si funktioniert zwar recht gut aber da
muss es doch etwas kürzeres geben, kann ja nicht immer 20zeilen code
schreiben wenn ich ne umwandlung brauch oder macht es sinn sowas in eine
int2lcd.h zu packen
danke & mfg
alex
hallo
habe jetzt mein programm leicht verändert.
für die lcd ausgabe verwende ich nun die befehle 1 set_cursor ( 0 , 2 );
2 sprintf ( text , "Uhrzeit:%02d:%02d:%02d " , hour , min , sek );
3 lcd_string ( text );
die jede sekunde abgerufen werden, und das nicht in der isr sondern in
einer nebenroutine. die falschanzeigen sind aber trozdem noch da, werd
mal ein neus lcd bestellen brauch sowieso wieder welche.
anbei noch mein gesamter code.
1 //
2 // Anpassungen im makefile:
3 // ATMega8 => MCU=atmega8 im makefile einstellen
4 // lcd-routines.c in SRC = ... Zeile anhängen
5 //
6 #include <avr/io.h>
7 #include "lcd-routines.h"
8
9 #include <util/delay.h>
10 #include <stdlib.h>
11
12 #include <avr/signal.h>
13
14 volatile uint8_t sek = 55 ;
15 volatile uint8_t min = 9 ;
16 volatile uint8_t hour = 8 ;
17
18 volatile uint8_t b = 0 ; //Hilfsvariable für lcdausgabe (jede sekunde nur)
19
20 //uint8_t var;
21
22
23 inline uint8_t debounce ( volatile uint8_t * port , uint8_t pin );
24
25 char text [ 34 ]; // wird für die ausgabe auf lcd benötigt
26 void lcdausgabe ( void ); //funktion damit lcd nur jede sekunde beschrieben wird
27
28 int main ( void )
29 {
30
31
32 DDRB = ( 1 << DDB0 ); //PinB0 als Ausgang
33 DDRB &= ~ ( 1 << DDB1 ); //PinB2 als Eingang
34 PORTB = ( 0 << PB0 ) | ( 1 << PB1 ); // PibB1 auf 0 & PINB2 PullUp auf vcc
35
36 lcd_init (); // LCD initialisierung
37
38
39 //Timer1 config anfang***********************************************
40 TIMSK |= ( 1 << OCIE1A ); //Timer 1 Output Compare A Match Interrupt Enable
41 OCR1A = 31250 ; // von 0 bis zu diesem Wert wird gezählt => 1sek
42 TCCR1B |= ( 1 << CS12 ) | ( 1 << WGM12 ); //CTC MODE & 256Teiler
43 sei (); //Globale Interrupts freigeben
44 //Timer1 config ende***************************************************
45
46
47 //ENDLOSSCHLEIFE anfang***********************************************************
48 while ( 1 )
49 {
50 //Tastenabfrage anfang***********************************************
51 if ( PINB & ( 1 << PINB1 )) {
52 PORTB &= ~ ( 1 << PB0 );
53 }
54 else {
55 PORTB |= ( 1 << PB0 );
56 }
57 //Tastenabfrage ende***********************************************
58
59 //Zeitabfrage anfang***********************************************
60 if ( sek <= 4 && min == 0 && hour == 7 ) { //wenn sek =60
61 PORTB |= ( 1 << PB0 );
62 }
63
64 if ( sek <= 4 && min == 10 && hour == 8 ) { //wenn sek =60
65 PORTB |= ( 1 << PB0 );
66 }
67
68 if ( sek <= 4 && min == 0 && hour == 9 ) { //wenn sek =60
69 PORTB |= ( 1 << PB0 );
70 }
71
72 if ( sek <= 4 && min == 0 && hour == 12 ) { //wenn sek =60
73 PORTB |= ( 1 << PB0 );
74 }
75
76 if ( sek <= 4 && min == 0 && hour == 13 ) { //wenn sek =60
77 PORTB |= ( 1 << PB0 );
78 }
79
80 if ( sek <= 4 && min == 0 && hour == 18 ) { //wenn sek =60
81 PORTB |= ( 1 << PB0 );
82 }
83 //Zeitabfrage ende***********************************************
84
85 //LCD ausgabe anfang*********************************************
86 lcdausgabe ();
87 //LCD ausgabe ende************************************************
88 }
89 //ENDLOSSCHLEIFE ende***********************************************************
90 }
91
92 //MAIN programm ende**************************************************
93
94 // ISR anfang**************************************************
95 ISR ( TIMER1_COMPA_vect ){
96
97 sek ++ ; //sek wird erhöht
98 if ( sek >= 60 ) { //wenn sek =60
99 sek = 0 ;
100 min ++ ;
101 }
102 if ( min >= 60 ) { //wenn sek =60
103 min = 0 ;
104 hour ++ ;
105 }
106 if ( hour >= 24 ) { //wenn sek =60
107 hour = 0 ;
108 }
109 }
110 //ISR ende***************************************************
111
112
113 inline uint8_t debounce ( volatile uint8_t * port , uint8_t pin )
114 {
115 if ( ! ( * port & ( 1 << pin )) )
116 {
117 /* Pin wurde auf Masse gezogen, 100ms warten */
118 _delay_ms ( 50 ); // max. 262.1 ms / F_CPU in MHz
119 _delay_ms ( 50 );
120 if ( * port & ( 1 << pin ) )
121 {
122 /* Anwender Zeit zum Loslassen des Tasters geben */
123 _delay_ms ( 50 );
124 _delay_ms ( 50 );
125 return 1 ;
126 }
127 }
128 return 0 ;
129 }
130
131 void lcdausgabe () //das LCD wird nur ca. jede sekunde beschrieben (weniger flimmern)
132 {
133 if ( sek != b ) {
134 set_cursor ( 0 , 1 );
135 lcd_string ( "Bewässerung......" );
136
137 set_cursor ( 0 , 2 );
138 sprintf ( text , "Uhrzeit:%02d:%02d:%02d " , hour , min , sek );
139 lcd_string ( text );
140 }
141 b = sek ;
142 }
mfg
low
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.