Mit einem Overflow schreibst du zwar zur gleichen Zeit das gleiche raus, aber warum sollten die Segmente doppelt so schnell angesteuert werden? Geschrieben wird ja ach nach der Reihe. Dann ist es ja wieder das selbe....
Die Idee mit dem Steckernetzteil ist klasse... Ok dann lege ich mir P-FET's zu, das ist das einfachste, aber ich weiß nicht ob ich die Segmente aufteilen werde...
Mein code:
Code:
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include <avr/interrupt.h>
#define ZERO 0x3f
#define ONE 0x06
#define TWO 0x5b
#define THREE 0x4f
#define FOUR 0x66
#define FIFE 0x6d
#define SIX 0x7d
#define SEVEN 0x07
#define EIGHT 0x7f
#define NINE 0x6f
#define t 0
#define hu 1
#define z 2
#define s 3
#define ds 4
#define m 5
#define dm 6
#define h 7
#define dh 8
#define defSek 16000
#define waits 61
volatile uint8_t stop = 0;
volatile uint8_t pause = 0;
volatile uint8_t Freigabe = 0;
volatile uint8_t block = 0;
ISR(INT0_vect) {
if(Freigabe && (stop > waits)){
Freigabe = 0;
block = 0;
}
else if(!Freigabe && (stop >waits)){
block = 0;
Freigabe = 1;
}
}
ISR(TIMER1_COMPA_vect){
pause=0;
}
ISR(TIMER2_OVF_vect){
stop++;
if(stop == 254)
stop = 254;
}
void func(uint8_t *A) {
A[t]++;
if(A[t] == 10) {
A[t]= 0;
A[hu]++;
if(A[hu] == 10){
A[hu]=0;
A[z]++;
if(A[z] == 10){
A[z] = 0;
A[s]++;
if(A[s] ==10){
A[s] = 0;
A[ds]++;
if(A[ds] == 6){
A[ds] = 0;
A[m]++;
if(A[m] == 10){
A[m] = 0;
A[dm]++;
if(A[dm]==6){
A[dm]=0;
A[h]++;
if(A[h]==10){
A[h]=0;
A[dh]++;
if(A[dh]==10)
A[dh]=0;
}
}
}
}
}
}
}
}
}
int main(void)
{
// set Ports
DDRD |= ((1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7));
PORTD &= ~((1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7));
DDRA = 0xff;
PORTA = 0xff;
// set Interrupt 0
GICR |= (1<<INT0);
MCUCR |= (1<<ISC01);
// set TImMER 1 to CTC Mode
TCCR1B |= (1<<CS10)|(1<<WGM12);
TIMSK |= (1<<OCIE1A);
// Set Timer 2 OVF INterrupt
TCCR2 |= (1<<CS22)|(1<<CS21)|(1<<CS20);
TIMSK |= (1<<TOIE2);
uint8_t LINE [9][10];
uint8_t A[9] = {0,0,0,0,0,0,0,0,0};
uint8_t COUNT[12] = {ZERO ,ONE, TWO , THREE, FOUR, FIFE, SIX, SEVEN, EIGHT, NINE};
uint8_t i = 0;
uint8_t j = 0;
OCR1A = defSek;
for (i = 0; i<10; i++)
for(j = 0; j<11; j++){
if(i == 1)
LINE[i][j] = COUNT[j]|0x80;
else
LINE[i][j] = COUNT[j];
}
sei();
while(1){
while(pause){
for(i = 0; i< 5; i++){
PORTD = 0x08<<i;
_delay_us(1);
PORTA = LINE[i][A[4-i]];
_delay_us(194);
PORTD = 0x08<<i;
_delay_us(1);
}
}
if(Freigabe)
func(A);
if(!block){
TCNT2 = 0;
stop = 0;
block = 1;
}
pause = 1;
}
cli();
return 0;
}
Lesezeichen