Forum: Compiler & IDEs mein lcd zeit teilweise irgendwas an


von Lowtzow .. (lowtzow)


Angehängte Dateien:

Lesenswert?

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
}

von Stefan E. (sternst)


Lesenswert?

> 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);

von Lowtzow .. (lowtzow)


Lesenswert?

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)


Lesenswert?

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?

von Lowtzow .. (lowtzow)


Angehängte Dateien:

Lesenswert?

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

von Lowtzow .. (lowtzow)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.