Hochzähler in C..Microkontroller



  • Hallo, müssen einen Code zum Hochzählen einer 7SEG Anzeige (0000-9999) erstellen, dass ganze soll auf einem AVR Microkontroller laufen. Sprache C. Handelt sich um ein Unterprogramm.

    Könnte evtl. jemand kurz drüberschauen? Ist nochn Fehler drin bzw. lässt sich etwas vereinfachen?

    /* Anmerkungen: 
    - zahlen[] beinhaltet die a,b,c,d,e,f,g Kombinationen für die jeweiligen Zahlen
    - aktWert[] wird dazu verwendet um den Zählstand mit der Timer-Zähl-Routine auszutauschen
    - aktStand ist im Prinzip dasselbe, nur als integer...
    - zustand dient zur Erfassung der steigenden Flanke( bei 0-Logik das Loslassen der Taste )
    
    - die Initialisierung vom Timer muss eventuell noch getrimmt werden...(man müsste halt wissen wie schnell gezählt werden soll)
    - in dem Beispiel wird davon ausgegangen dass beim Loslassen des Tasters(an PINB) der Zählvorgang gestartet wird
    
    */
    
    #define F_CPU 8000000
    
    // #include <stdio.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    const unsigned char zahlen[10] = {0x3f, 0x08, 0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    unsigned char aktWert[4] = { 0,0,0,0}; // am Anfang 0
    bool zustand = true;
    
    int main(){
    	/* Initialisierung der PORTS
    		PORTA : a-g
    		PORTB : Eingang für Schalter
    		PORTC : Segment0 - Segment3
    	*/
    	DDRA = 0xff;		// A auf Ausgang
    	PORTB = 0xff;
    	DDRC = 0xff;		// C auf Ausgang
    
    				// Timer initialisieren
    	TCCR0 = 3;		// Systemtakt / 64
    	TIMSK |= (1<<TOIE0);
    
    	while(1){
    		for(int i=0, k=1; i<4; i++, k*=2){
    			PORTA = zahlen[aktWert[i]];
    			PORTC = k;
    		}
    
    		if(PINB == 0xff && zustand==false) { sei();}		
    		else if(PINB != 0xff) zustand = false;
    		else zustand = true;
    
    	}
    }
    
    ISR(TIMER0_OVF_vect){
    	static signed int aktStand = 0;
    
    	unsigned int tmp;
    	if(aktStand==9999){aktWert[0]=0; aktWert[1]=0; aktWert[2]=0; aktWert[3]=0; aktStand = -1;}
    	aktStand++;
    	tmp = aktStand;
    	for(int i=0; i<4; i++){
    		aktWert[i]= tmp % 10;
    		tmp /= 10;
    	}
    
    }
    

Anmelden zum Antworten