1
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;
}
}