Re: Drehzahlmesser (bis ca. 20000 Upm) - Reicht ein mega8(8)
Zitat:
Zitat von HF SHOOTER
... planen den Bau eines Drehzahlmesser für ein Kart. ... 15k - 20k die bei Vollgas azuftreten. ... 5 stelliges Display aus 7-Segment LED-Anzeigen verwenden um den gesamten Bereich draufzubekommen. ...
Und wer soll das beim Vollgasstress dann ablesen? Ich bin der Meinung, dass es ergonomisch viel sinnvoller wäre für jeden Tausender, oder jeden zweiten, eine LED anzuzünden. Vielleicht für die unteren 10000 fünf in Orange (nicht rot, das würde die folgenden stören), danach 4 Stück für alle 2000 (oder acht für die interessanten 8000 - die beiden letzten dann BESONDERS hell) in Grün - also bis 18000 - und darüber in Rot !? Aber die Aufteilung ist sicher wurscht, blos - bei Vollgas will doch keiner ein 5stelliges 7-Segment-Display lesen - es gibt ja Gründe für Vollgas - und die liegen bei Kartbahnen vermutlich nicht in einer endlos langen Geraden, oder?
Und denk daran, die letzten zwei oder drei Stellen werden so unruhig hin und her zappeln, dass man Schädelweh bekommen wird - ablesen wird man da doch nix können, denke ich.
Das Display wird nicht unnütz sein - das bau irgendwo neben dem Motor ein, für Einstellzwecke.
Liste der Anhänge anzeigen (Anzahl: 1)
So in der Zwichenzeit habe ich mich ein wenig mit der Programmierumgebung etc. vertraut gemacht. Und habe auch schon erste Ergebnisse laufen.
Im Moment zählt der mega8 von 0 -9 und gibt die Zahl auf dem 7-Segment Display aus. Davon hab ich auch mal ein Bild gemacht.
Jetzt würde ich gerne noch eine LED an PB0 blinken lassen, über den Timer0.
Folgender Code funktioniert nicht, die ISR vom Timer0 wird einfach nicht aufgerufen.
Code:
/* Projekt: Drehzahlmesser
Anzeige der Drehzahl auf 5 7-Segment-Anzeigen.
Anzeigen werden im Multiplexverfahren angesteuert,
die Drehzahl alle 100ms aktualisiert.
Später sollen noch max. Drehzahlspeicherung sowie eine
Begrüßung beim Einschalten hinzukommen.
AUTOR: Benjamin Ruppert
DATUM: 01.11.2007 - gute Frage */
#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
#include <avr/interrupt.h>
/* Variablendeklaration */
uint8_t SEGMENT; // Bit0 = Seg. a ... Bit6 = Seg. g
uint8_t Zahl;
/* Prototypendeklaration */
void ZahlInSegment(uint8_t);
// Konvertierung Zahl -> Segmentanzeige
void ZahlInSegment(uint8_t Zahl) {
switch(Zahl) {
// Segment: gfedcba
case 0: SEGMENT = 0b00111111; break;
case 1: SEGMENT = 0b00000110; break;
case 2: SEGMENT = 0b01011011; break;
case 3: SEGMENT = 0b01001111; break;
case 4: SEGMENT = 0b01100110; break;
case 5: SEGMENT = 0b01101101; break;
case 6: SEGMENT = 0b01111100; break;
case 7: SEGMENT = 0b00000111; break;
case 8: SEGMENT = 0b01111111; break;
case 9: SEGMENT = 0b01100111; break;
// Segment: gfedcba
}
PORTC = 0x00; // PC0 - PC5 auf 0
PORTB &= ~(1 << 1); // PB1 auf 0
// Ausgänge setzen, wie 7-Segment angeschlossen ist
if (SEGMENT & (1 << 0)) { PORTC |= 0b00001000; } //a an PC3
if (SEGMENT & (1 << 1)) { PORTC |= 0b00010000; } //b an PC4
if (SEGMENT & (1 << 2)) { PORTC |= 0b00000001; } //c an PC0
if (SEGMENT & (1 << 3)) { PORTC |= 0b00000010; } //d an PC1
if (SEGMENT & (1 << 4)) { PORTB |= 0b00000010; } //e an PB1
if (SEGMENT & (1 << 5)) { PORTC |= 0b00000100; } //f an PC2
if (SEGMENT & (1 << 6)) { PORTC |= 0b00100000; } //g an PC5
}
// LED blinken lassen
ISR(TIMER0_OVF_vect)
{
if (PINB & (1 << 0)) { PORTB |= 0b00000000; }
else { PORTB |= 0b00000001; }
}
int main(void)
{
DDRC = 0b00111111; // PC0 - PC5 als Ausgang
DDRB = 0b00000011; // PB0 - PB1 als Ausgang
Zahl = 0;
// Timer konfigurieren und GIE-Flag setzen
TCCR0 |= (1 << CS01); // Vorteiler 8
sei();
while(1)
{
// Auf dem 7-Segment Display die Zahlen 0 - 9 anzeigen
ZahlInSegment(Zahl);
Zahl++;
if (Zahl > 9) { Zahl = 0; }
_delay_ms (250);
}
}
Über Tipps wäre ich dankbar.
EDIT: Habe vergessen den Timer0 Interrupt freizuschalten. Jetzt klappts.
mfg
Benny