Ich habe hier ein kleines Problem. Zwar funktioniert alles wie ich mir
das soweit vorstelle. Leider jedoch ist die Letzte Ausgabe auf die
Letzte Röhre logischerweise immer heller als die anderen, da sie ja
immer aktiv während der Interrupt auf einen neuen Auslöser wartet.
Nehme ich nun meinen Interrupt im Teiler so weit zurück das alle
gleichmäßig leuchten, bremst der Interrupt alle anderen Sachen komplett
aus, sodas die µC ausschließlich mit dem Interrupt beschäftigt ist. :/
Hat jemand einen kleinen Tipp wo ich anfangen kann zu suchen um dieses
Problem her zu werden?!
Ist ein Atmega32 mit 8Mhz und einem MAX6921 als Treiber - auf 6x Nixie
VFD Röhren.
1
#define clk PortB.F4 //Clock
2
#define dat PortB.F5 //Data
3
#define lod PortB.F7 //Load
4
5
volatileunsignedlongoutp=0;
6
volatileunsignedshortVOut[6];
7
volatileunsignedshorti,k,j;
8
volatileunsignedlongmask=1;
9
10
volatileunsignedshortZbit[10][7]={
11
{18,17,16,15,14,13,0},//0
12
{17,16,0,0,0,0,0},//1
13
{18,17,12,14,15,0,0},//2
14
{18,17,16,15,12,0,0},//3
15
{13,12,17,16,0,0,0},//4
16
{18,13,12,16,15,0,0},//5
17
{18,13,12,16,15,14,0},//6
18
{18,17,16,0,0,0,0},//7
19
{18,17,16,15,14,13,12},//8
20
{18,13,12,17,16,0,0},//9
21
};
22
23
voidsetbit(longsp)
24
{
25
outp|=((unsignedlong)1<<sp);
26
}
27
28
voidTimer0Overflow_ISR()orgIVT_ADDR_TIMER0_OVF
29
{
30
j=0;
31
for(i=3;i<9;i++)//Röhren hängen am Treiber auf Bit 3-8
32
{
33
outp=0;
34
setbit(i);//Röhre - weswegen ich multiplexen muss
35
36
for(k=0;k<7;k++)//Die 7 Bits aus der Bitmaske für die Zahl schreiben
37
{
38
setbit(Zbit[VOut[j+1]][k]);
39
}
40
41
mask=1;
42
for(z=0;z<20;z++)//Ausgabe an das Schieberegister des Treibers
Oje oje, wie missverstanden.
Nicht alle 6 Stellen in einem Interrupt for(i=3;i<9;i++) beschcciekn,
sondern jeweils die NÄCHSTE Stelle pro Interrupt
void Timer0Overflow_ISR() org IVT_ADDR_TIMER0_OVF
{
static int j=0;
:
if(j==6) j=3;
i=j+3;
outp = 0;
setbit(i);
:
:
j++;
}
Oh mein Gott :D
Vielen Dank, natürlich - das macht natürlich teuflischen Sinn und
funktioniert nun auch seeehr wunderbar :D Ich hab das i allerdings
komplett weggekürzt:
1
waiter++;
2
if(waiter==60)
3
{
4
j++;
5
if(j==6)j=0;
6
7
setbit(j+3);
8
9
outp=0;
10
for(k=0;k<7;k++)//Die 7 Bits aus der Bitmaske für die Zahl schreiben
11
{
12
setbit(Zbit[VOut[j+1]][k]);
13
}
14
15
mask=1;
16
for(z=0;z<20;z++)//Ausgabe an das Schieberegister des Treibers