- SF800 Solar Speicher Tutorial         
Ergebnis 11 bis 15 von 15

Thema: Drehzahlmesser (bis ca. 20000 Upm) - Reicht ein mega8(8) ?

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #15
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2007
    Ort
    Bayern
    Alter
    36
    Beiträge
    116
    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
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken img_1264_.jpg  

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress