www.mikrocontroller.net

Forum: Compiler & IDEs mein lcd zeit teilweise irgendwas an


Autor: Lowtzow .... (lowtzow)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!
// 
// Anpassungen im makefile:
//    ATMega8 => MCU=atmega8 im makefile einstellen
//    lcd-routines.c in SRC = ... Zeile anhängen
// 
#include <avr/io.h>
#include "lcd-routines.h"

#include <util/delay.h>
#include <stdlib.h>

#include <avr/signal.h> 

uint8_t sek=30;
uint8_t min=52;
uint8_t hour=20;

uint8_t var;

void int2lcd(int,int,int);
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin);

 
int main(void)
{


DDRB = (1<<DDB0); //PinB0 als Ausgang
DDRB &= ~(1<<DDB1); //PinB2 als Eingang
PORTB = (0<<PB0)| (1<<PB1); // PibB1 auf 0 & PINB2 PullUp auf vcc



// LCD initialisierung anfang****************************************
    lcd_init();
  set_cursor(0,1);
  lcd_string("Bewaesserung     "); 
    set_cursor(0,2); 
    lcd_string("initalisierung***");  
// LCD initialisierung ende****************************************


  
//Timer1 config anfang***********************************************
  TIMSK |= (1<<OCIE1A);        //Timer 1 Output Compare A Match Interrupt Enable
  OCR1A = 31250;             // von 0 bis zu diesem Wert wird gezählt => 1sek
  TCCR1B |= (1<<CS12) | (1<<WGM12);  //CTC MODE & 256Teiler  
     sei ();                //Globale Interrupts freigeben
//Timer1 config ende***************************************************

    
    while(1) //ENDLOSSCHLEIFE
    {  
//Tastenabfrage anfang***********************************************
  if (PINB & (1<<PINB1)) { 
  PORTB&= ~(1<<PB0);
                }
  else          {
  PORTB|=(1<<PB0);
              } 
//Tastenabfrage ende***********************************************

//Zeitabfrage anfang***********************************************
if (sek<=4&&min==0&&hour==7 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }

if (sek<=4&&min==10&&hour==8 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }

if (sek<=4&&min==0&&hour==9 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }

if (sek<=4&&min==0&&hour==12 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }

if (sek<=4&&min==0&&hour==13 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }
      
if (sek<=4&&min==0&&hour==18 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }

//Zeitabfrage anfang***********************************************
   
    set_cursor(0,1);        //Ausgabe in der 1.Zeile "Uhrzeit"
    lcd_string("Uhrzeit");
    
  int2lcd(hour,min,sek);  // Aufrufen des Unterprogrammes mit dem der int wert in ein acii umgewandelt wird und am lcd angezeigt wird

  }
  }

 
// ISR anfang**************************************************
ISR(TIMER1_COMPA_vect){

  

    sek++;    //sek wird erhöht
  if (sek>=60) {  //wenn sek =60
        sek=0;
        min++;
        }
  if (min>=60) {  //wenn sek =60
        min=0;
        hour++;
        }
  if (hour>=24) {  //wenn sek =60
        hour=0;
        }


  
    }
//ISR ende***************************************************



 //int2lcd anfang************************************************************
 void int2lcd(int temp1,int temp2,int temp3)
 {
  lcd_data(temp1);
  lcd_data(temp2);
  lcd_data(temp3);
  
  
    set_cursor(1,2);
    {
     char Buffer1[20]; // in diesem {} lokal
     itoa( temp1, Buffer1, 10 ); 
     lcd_string( Buffer1 );
    }
  set_cursor(2,2);
  lcd_data(':');
  //***************************************
  set_cursor(3,2);
    {
       char Buffer2[20]; 
       itoa( temp2, Buffer2, 10 ); 
     lcd_string( Buffer2 );
    }
  //*****************************************
  set_cursor(5,2);
  lcd_data(':');
  //***************************************
  set_cursor(6,2);

    {
       char Buffer3[20];      
       itoa( temp3, Buffer3, 10 ); 
       lcd_string( Buffer3 );
    }
   
 }

//int2lcd ende*********************************************************



 inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
    if ( ! (*port & (1 << pin)) )
    {
        /* Pin wurde auf Masse gezogen, 100ms warten   */
        _delay_ms(50);  // max. 262.1 ms / F_CPU in MHz
        _delay_ms(50); 
        if ( *port & (1 << pin) )
        {
            /* Anwender Zeit zum Loslassen des Tasters geben */
            _delay_ms(50);
            _delay_ms(50); 
            return 1;
        }
    }
    return 0;
}



Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> zwar schon den text was es ausgeben soll, jedoch noch einige komische
> zeichen.

Die zusätzlichen Zeichen kommen hierher:
  lcd_data(temp1);
  lcd_data(temp2);
  lcd_data(temp3);

Autor: Lowtzow .... (lowtzow)
Datum:

Bewertung
0 lesenswert
nicht 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! ;-)
// 
// Anpassungen im makefile:
//    ATMega8 => MCU=atmega8 im makefile einstellen
//    lcd-routines.c in SRC = ... Zeile anhängen
// 
#include <avr/io.h>
#include "lcd-routines.h"

#include <util/delay.h>
#include <stdlib.h>

#include <avr/signal.h> 

uint8_t sek=30;
uint8_t min=8;
uint8_t hour=21;

uint8_t var;

void int2lcd(int,int,int);
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin);

 
int main(void)
{


DDRB = (1<<DDB0); //PinB0 als Ausgang
DDRB &= ~(1<<DDB1); //PinB2 als Eingang
PORTB = (0<<PB0)| (1<<PB1); // PibB1 auf 0 & PINB2 PullUp auf vcc

lcd_init();      // LCD initialisierung

  
//Timer1 config anfang***********************************************
  TIMSK |= (1<<OCIE1A);        //Timer 1 Output Compare A Match Interrupt Enable
  OCR1A = 31250;             // von 0 bis zu diesem Wert wird gezählt => 1sek
  TCCR1B |= (1<<CS12) | (1<<WGM12);  //CTC MODE & 256Teiler  
     sei ();                //Globale Interrupts freigeben
//Timer1 config ende***************************************************

    
    while(1) //ENDLOSSCHLEIFE
    {  
//Tastenabfrage anfang***********************************************
  if (PINB & (1<<PINB1)) { 
  PORTB&= ~(1<<PB0);
                }
  else          {
  PORTB|=(1<<PB0);
              } 
//Tastenabfrage ende***********************************************

//Zeitabfrage anfang***********************************************
if (sek<=4&&min==0&&hour==7 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }

if (sek<=4&&min==10&&hour==8 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }

if (sek<=4&&min==0&&hour==9 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }

if (sek<=4&&min==0&&hour==12 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }

if (sek<=4&&min==0&&hour==13 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }
      
if (sek<=4&&min==0&&hour==18 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }

//Zeitabfrage anfang***********************************************
   
    set_cursor(0,1);        //Ausgabe in der 1.Zeile "Uhrzeit"
    lcd_string("Uhrzeit");
    
  int2lcd(hour,min,sek);  // Aufrufen des Unterprogrammes mit dem der int wert in ein acii umgewandelt wird und am lcd angezeigt wird

  }
  }

 
// ISR anfang**************************************************
ISR(TIMER1_COMPA_vect){

  lcd_init();

    sek++;    //sek wird erhöht
  if (sek>=60) {  //wenn sek =60
        sek=0;
        min++;
        }
  if (min>=60) {  //wenn sek =60
        min=0;
        hour++;
        }
  if (hour>=24) {  //wenn sek =60
        hour=0;
        }


  
    }
//ISR ende***************************************************



 //int2lcd anfang************************************************************
 void int2lcd(int temp1,int temp2,int temp3)
 {
  
    set_cursor(1,2);
    {
     char Buffer1[20]; // in diesem {} lokal
     itoa( temp1, Buffer1, 10 ); 
     lcd_string( Buffer1 );
    }
  set_cursor(2,2);
  lcd_data(':');
  //***************************************
  set_cursor(3,2);
    {
       char Buffer2[20]; 
       itoa( temp2, Buffer2, 10 ); 
     lcd_string( Buffer2 );
    }
  //*****************************************
  set_cursor(5,2);
  lcd_data(':');
  //***************************************
  set_cursor(6,2);

    {
       char Buffer3[20];      
       itoa( temp3, Buffer3, 10 ); 
       lcd_string( Buffer3 );
    }
   
 }

//int2lcd ende*********************************************************



 inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
    if ( ! (*port & (1 << pin)) )
    {
        /* Pin wurde auf Masse gezogen, 100ms warten   */
        _delay_ms(50);  // max. 262.1 ms / F_CPU in MHz
        _delay_ms(50); 
        if ( *port & (1 << pin) )
        {
            /* Anwender Zeit zum Loslassen des Tasters geben */
            _delay_ms(50);
            _delay_ms(50); 
            return 1;
        }
    }
    return 0;
}



Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lowtzow .... (lowtzow)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Lowtzow .... (lowtzow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo

habe jetzt mein programm leicht verändert.

für die lcd ausgabe verwende ich nun die befehle
  set_cursor(0,2);
  sprintf(text,"Uhrzeit:%02d:%02d:%02d ", hour, min, sek);
  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.

// 
// Anpassungen im makefile:
//    ATMega8 => MCU=atmega8 im makefile einstellen
//    lcd-routines.c in SRC = ... Zeile anhängen
// 
#include <avr/io.h>
#include "lcd-routines.h"

#include <util/delay.h>
#include <stdlib.h>

#include <avr/signal.h> 

volatile uint8_t sek=55;
volatile uint8_t min=9;
volatile uint8_t hour=8;

volatile uint8_t b=0; //Hilfsvariable für lcdausgabe (jede sekunde nur)

//uint8_t var;


inline uint8_t debounce(volatile uint8_t *port, uint8_t pin);

char text[34]; // wird für die ausgabe auf lcd benötigt
void lcdausgabe(void); //funktion damit lcd nur jede sekunde beschrieben wird
 
int main(void)
{


DDRB = (1<<DDB0); //PinB0 als Ausgang
DDRB &= ~(1<<DDB1); //PinB2 als Eingang
PORTB = (0<<PB0)| (1<<PB1); // PibB1 auf 0 & PINB2 PullUp auf vcc

lcd_init();      // LCD initialisierung

  
//Timer1 config anfang***********************************************
  TIMSK |= (1<<OCIE1A);        //Timer 1 Output Compare A Match Interrupt Enable
  OCR1A = 31250;             // von 0 bis zu diesem Wert wird gezählt => 1sek
  TCCR1B |= (1<<CS12) | (1<<WGM12);  //CTC MODE & 256Teiler  
     sei ();                //Globale Interrupts freigeben
//Timer1 config ende***************************************************


//ENDLOSSCHLEIFE anfang***********************************************************    
    while(1) 
    {  
//Tastenabfrage anfang***********************************************
  if (PINB & (1<<PINB1)) { 
  PORTB&= ~(1<<PB0);
                }
  else          {
  PORTB|=(1<<PB0);
              } 
//Tastenabfrage ende***********************************************

//Zeitabfrage anfang***********************************************
if (sek<=4&&min==0&&hour==7 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }

if (sek<=4&&min==10&&hour==8 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }

if (sek<=4&&min==0&&hour==9 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }

if (sek<=4&&min==0&&hour==12 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }

if (sek<=4&&min==0&&hour==13 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }
      
if (sek<=4&&min==0&&hour==18 ) {  //wenn sek =60
        PORTB|=(1<<PB0);
                }
//Zeitabfrage ende***********************************************

//LCD ausgabe anfang*********************************************
lcdausgabe();   
//LCD ausgabe ende************************************************
  }
//ENDLOSSCHLEIFE ende***********************************************************    
  }

//MAIN programm ende**************************************************
 
// ISR anfang**************************************************
ISR(TIMER1_COMPA_vect){
  
    sek++;    //sek wird erhöht
  if (sek>=60) {  //wenn sek =60
        sek=0;
        min++;
        }
  if (min>=60) {  //wenn sek =60
        min=0;
        hour++;
        }
  if (hour>=24) {  //wenn sek =60
        hour=0;
        }
    }
//ISR ende***************************************************


 inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
    if ( ! (*port & (1 << pin)) )
    {
        /* Pin wurde auf Masse gezogen, 100ms warten   */
        _delay_ms(50);  // max. 262.1 ms / F_CPU in MHz
        _delay_ms(50); 
        if ( *port & (1 << pin) )
        {
            /* Anwender Zeit zum Loslassen des Tasters geben */
            _delay_ms(50);
            _delay_ms(50); 
            return 1;
        }
    }
    return 0;
}

void lcdausgabe() //das LCD wird nur ca. jede sekunde beschrieben (weniger flimmern)
{
if (sek!=b) { 
  set_cursor(0,1);        
    lcd_string("Bewässerung......");
    
  set_cursor(0,2);
  sprintf(text,"Uhrzeit:%02d:%02d:%02d ", hour, min, sek);
  lcd_string(text);
      }
  b=sek;
}


mfg
low

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.