www.mikrocontroller.net

Forum: Compiler & IDEs Drehzahlmesser mit LCD


Autor: crasher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich bin noch ziemlich unerfahren mit Programmierung.
Als Controller verwende ich ein Atmega8.

Ich hab am PC5 ein Funktionsgenerator dran wo ich erstmal 50Hz 
einspeise.
An dem LCD zeigt es aber kein konstanten Wert an nur mal 0.. mal -100, 
mal 567.
...........
Ist der Eingang vielleicht der falsche?
#include <avr/io.h>
#include <inttypes.h>
#include "lcd-routines.c"
#include <avr/interrupt.h>


extern int sprintf(char *__s, const char *__fmt, ...); //Umwandeln einer Zahl in einen String

//globale Variablen
unsigned long int xa=0;
unsigned long int xb=0;
char zeitstring[5];


// Interrupt Service Routine fuer Timer1
ISR(TIMER1_OVF_vect) {        
      TCNT1 = 34286;          //Zaehlregister mit Vorladewert V vorladen / Berechnung: siehe unten
      PORTD ^= (1<<PD7);      //LED toggeln
      xa=0;      //Zählwert auf
      xb=1;      //Zahl im main ausgeben
}


void AUSGABE(void){
      sprintf(zeitstring, "%d", xa);                  // Wandelt y nach String   
  set_cursor(12, 1);lcd_string("     ");    // Zahl im LCD löschen
  set_cursor(12, 1);lcd_string(zeitstring);  // Zahl in LCD schreiben
  xb=0;            
}

int main(void){
  
        DDRB |=  (1<<PB0);   // PB0 ist Status-LED Ausgang
  DDRD |=  (1<<PD7);   // PD7 ist Status-LED Ausgang
  DDRC &= ~(1<<PC5);  // PC5 ist Status-Eingang
  PORTC|=  (1<<PC5);   //internen Pull-Up-Widerstand einschalten
  
  lcd_init();
  lcd_clear();
  
  set_cursor(1, 1); lcd_string("Drehzahl:");
  
sei(); //Interrupts ermoeglichen
       
   
    // fuer Timer:     
    TIMSK |= (1<<TOIE1);
    TCCR1B |= (1<<CS11) |  (1<<CS10);     //Prescaler = 64
    TCNT1 = 0xFFFF;//Zaehlregister vorladen mit FFFF zum Sofortstart

while (1)  {  
    
    if (!(PINC &(1<<PINC5)) ) xa++; //Zähle immer eins hoch an PINC5
    if (xb==1)   AUSGABE();    
    
    }

    return(0);
}

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wenn ich das richtig sehe, dann fragst du alle paar µs den Port ab 
(while(1)) und schaust wie der Zustand ist. Wenn er LOW ist wird xa 
inkrementiert. Wenn du eine Rechteckspannung misst, dann liegt ja der 
Pegel länger auf LOW. Es kann also sein, dass du einige 100 mal Pro LOW 
xa inkrementierst. Dann hast du noch das Problem, dass vor der "AUSGABE" 
xa bereits wieder durch den Timer interrupt auf 0 gesetzt wurde. Also 
irgendwie ist das alles sehr komisch.
Du darfst ja nur hochzählen wenn sich der Zustand geändert hat. Also
while(1){
  aktuellerpegel = PINC &(1<<PINC5);
  if(alterpegel != aktuellerpegel){ 
    xa++;
    alterpegel = aktuellerpegel;
  }
}
Und für die Ausgabe musst du dir natürlich auch noch was einfallen 
lassen, dass der Wert noch konsistent ist. Und immer schön volatile 
Variablen verwenden, wenn du in interrupt-routinen mit Globalen 
Variablen spielst.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles das was Timmo gesagt hat.
Plus: Bitte immer darauf achten bei printf und Konsorten die richtigen 
Codes zu verwenden. %d ist definitiv falsch für unsigned long. Und das 
ist kein Kavaliersdelikt!

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.