Forum: Mikrocontroller und Digitale Elektronik AVR Controller Spinnt Probleme mit 16Bit Variabeln!?


von Banana M. (Firma: Banana) (schlock)


Angehängte Dateien:

Lesenswert?

Hallo,
Ich brauch leider nun Hilfe von euch, mein AVR macht "komische" 
sachen...
Obs am AVR liegt ? Defekt? dieser ist aber noch recht neu...
oder ob ich einen Denkfehler habe?! oder ob der GCC mist baut...


Code Optimierungen habe ich schon ausprobiert 0,1,2,3,S..
hilft aber alles nicht wirklich.

Der Quellcode ist nicht recht unordendlich, als bitte nicht hauen,
ist noch Prototypen entwicklung, was mich nur wundert ist das der avr 
teils einfach neustartet, es aber nicht an der strom versorgung liegt, 
dies macht er immer an der gleichen stelle...

es geht hier um ein multiplex programm das werte von einer externen fft 
auf dem display multiplexen soll..

das ist ein AVR Mega1284P, liegt es an den 16 Bit Variabeln?
und Returns mit den 16 Bit breiten oder habe ich irgend wo einen 
Denkfehler?

über hilfe würde ich mich sehr freuen

gruß philip

von Peter D. (peda)


Lesenswert?

Dein Code ist ja prächtig kommentiert, erwartest Du wirklich, daß sich 
jeder da erst reinpfitzen soll?
Wenn Du Hilfe willst, solltest Du erstmal kommentieren.

Und keiner kennt Deinen Schaltplan. Wo da was ausgegeben wird, 
erschließt sich mir nicht.

Multiplexen erfordert zwingend einen Timerinterrupt, alles andere ist 
nur Murks. Und erzähl mir nicht, daß man erstmal mit Murks anfangen 
kann.

Das Multiplexen darf auch nur die fertigen Daten anzeigen, alles andere 
kostet viel zu viel Zeit und Deine CPU erstickt unter der Last. Es ist 
auch Unsinn, die gleichen Daten jedesmal neu aufzubereiten.

Die Aufbereitung der Daten macht dann in aller Ruhe das Main.

Und nach jedem Bildaufbau wartet das Main erstmal, bis das Bild mehrere 
Multiplexzyklen lang angezeigt wurde, damit der Mensch es auch sehen 
kann.
Eine Bildrate von max 10fps sollte dicke reichen.

Und falls der Bildaufbau stören sollte, nimmt man einfach 2 Bildpuffer 
und schaltet sie um.

von Thomas E. (thomase)


Lesenswert?

1
void makeGraph(void){
2
3
  databufferG1[0]  = makeGraphLine1(fftBuffer[0]);
4
  databufferG1[1]  = makeGraphLine1(fftBuffer[1]);
5
  databufferG1[2]  = makeGraphLine1(fftBuffer[2]);
6
  databufferG1[3]  = makeGraphLine1(fftBuffer[3]);
7
  databufferG1[4]  = makeGraphLine1(fftBuffer[4]);
8
  databufferG1[5]  = makeGraphLine1(fftBuffer[5]);
9
  databufferG1[6]  = makeGraphLine1(fftBuffer[6]);
10
  databufferG1[7]  = makeGraphLine1(fftBuffer[7]);
11
  databufferG1[8]  = makeGraphLine1(fftBuffer[8]);
12
  databufferG1[9]  = makeGraphLine1(fftBuffer[9]);
13
  databufferG1[10] = makeGraphLine1(fftBuffer[10]);
14
  databufferG1[11] = makeGraphLine1(fftBuffer[11]);
15
  databufferG1[12] = makeGraphLine1(fftBuffer[12]);
16
  databufferG1[13] = makeGraphLine1(fftBuffer[13]);
17
  databufferG1[14] = makeGraphLine1(fftBuffer[14]);
18
  databufferG1[15] = makeGraphLine1(fftBuffer[15]);
19
20
  databufferG2[0]  = makeGraphLine1(fftBuffer[16]);
21
  databufferG2[1]  = makeGraphLine1(fftBuffer[17]);
22
  databufferG2[2]  = makeGraphLine1(fftBuffer[18]);
23
  databufferG2[3]  = makeGraphLine1(fftBuffer[19]);
24
  databufferG2[4]  = makeGraphLine1(fftBuffer[20]);
25
  databufferG2[5]  = makeGraphLine1(fftBuffer[21]);
26
  databufferG2[6]  = makeGraphLine1(fftBuffer[22]);
27
  databufferG2[7]  = makeGraphLine1(fftBuffer[23]);
28
  databufferG2[8]  = makeGraphLine1(fftBuffer[24]);
29
  databufferG2[9]  = makeGraphLine1(fftBuffer[25]);
30
  databufferG2[10] = makeGraphLine1(fftBuffer[26]);
31
  databufferG2[11] = makeGraphLine1(fftBuffer[27]);
32
  databufferG2[12] = makeGraphLine1(fftBuffer[28]);
33
  databufferG2[13] = makeGraphLine1(fftBuffer[29]);
34
  databufferG2[14] = makeGraphLine1(fftBuffer[30]);
35
  databufferG2[15] = makeGraphLine1(fftBuffer[31]);
36
37
  databufferG3[0]  = makeGraphLine1(fftBuffer[32]);
38
  databufferG3[1]  = makeGraphLine1(fftBuffer[33]);
39
  databufferG3[2]  = makeGraphLine1(fftBuffer[34]);
40
  databufferG3[3]  = makeGraphLine1(fftBuffer[35]);
41
  databufferG3[4]  = makeGraphLine1(fftBuffer[36]);
42
  databufferG3[5]  = makeGraphLine1(fftBuffer[37]);
43
  databufferG3[6]  = makeGraphLine1(fftBuffer[38]);
44
  databufferG3[7]  = makeGraphLine1(fftBuffer[39]);
45
  databufferG3[8]  = makeGraphLine1(fftBuffer[40]);
46
  databufferG3[9]  = makeGraphLine1(fftBuffer[41]);
47
  databufferG3[10] = makeGraphLine1(fftBuffer[42]);
48
  databufferG3[11] = makeGraphLine1(fftBuffer[43]);
49
  databufferG3[12] = makeGraphLine1(fftBuffer[44]);
50
  databufferG3[13] = makeGraphLine1(fftBuffer[45]);
51
  databufferG3[14] = makeGraphLine1(fftBuffer[46]);
52
  databufferG3[15] = makeGraphLine1(fftBuffer[47]);
53
54
  databufferG4[0]  = makeGraphLine1(fftBuffer[48]);
55
  databufferG4[1]  = makeGraphLine1(fftBuffer[49]);
56
  databufferG4[2]  = makeGraphLine1(fftBuffer[50]);
57
  databufferG4[3]  = makeGraphLine1(fftBuffer[51]);
58
  databufferG4[4]  = makeGraphLine1(fftBuffer[52]);
59
  databufferG4[5]  = makeGraphLine1(fftBuffer[53]);
60
  databufferG4[6]  = makeGraphLine1(fftBuffer[54]);
61
  databufferG4[7]  = makeGraphLine1(fftBuffer[55]);
62
  databufferG4[8]  = makeGraphLine1(fftBuffer[56]);
63
  databufferG4[9]  = makeGraphLine1(fftBuffer[57]);
64
  databufferG4[10] = makeGraphLine1(fftBuffer[58]);
65
  databufferG4[11] = makeGraphLine1(fftBuffer[59]);
66
  databufferG4[12] = makeGraphLine1(fftBuffer[60]);
67
  databufferG4[13] = makeGraphLine1(fftBuffer[61]);
68
  databufferG4[14] = makeGraphLine1(fftBuffer[62]);
69
  databufferG4[15] = makeGraphLine1(fftBuffer[63]);
70
71
  databufferR1[0]  = makeGraphLine2(fftBuffer[0]);
72
  databufferR1[1]  = makeGraphLine2(fftBuffer[1]);
73
  databufferR1[2]  = makeGraphLine2(fftBuffer[2]);
74
  databufferR1[3]  = makeGraphLine2(fftBuffer[3]);
75
  databufferR1[4]  = makeGraphLine2(fftBuffer[4]);
76
  databufferR1[5]  = makeGraphLine2(fftBuffer[5]);
77
  databufferR1[6]  = makeGraphLine2(fftBuffer[6]);
78
  databufferR1[7]  = makeGraphLine2(fftBuffer[7]);
79
  databufferR1[8]  = makeGraphLine2(fftBuffer[8]);
80
  databufferR1[9]  = makeGraphLine2(fftBuffer[9]);
81
  databufferR1[10] = makeGraphLine2(fftBuffer[10]);
82
  databufferR1[11] = makeGraphLine2(fftBuffer[11]);
83
  databufferR1[12] = makeGraphLine2(fftBuffer[12]);
84
  databufferR1[13] = makeGraphLine2(fftBuffer[13]);
85
  databufferR1[14] = makeGraphLine2(fftBuffer[14]);
86
  databufferR1[15] = makeGraphLine2(fftBuffer[15]);
87
88
  databufferR2[0]  = makeGraphLine2(fftBuffer[16]);
89
  databufferR2[1]  = makeGraphLine2(fftBuffer[17]);
90
  databufferR2[2]  = makeGraphLine2(fftBuffer[18]);
91
  databufferR2[3]  = makeGraphLine2(fftBuffer[19]);
92
  databufferR2[4]  = makeGraphLine2(fftBuffer[20]);
93
  databufferR2[5]  = makeGraphLine2(fftBuffer[21]);
94
  databufferR2[6]  = makeGraphLine2(fftBuffer[22]);
95
  databufferR2[7]  = makeGraphLine2(fftBuffer[23]);
96
  databufferR2[8]  = makeGraphLine2(fftBuffer[24]);
97
  databufferR2[9]  = makeGraphLine2(fftBuffer[25]);
98
  databufferR2[10] = makeGraphLine2(fftBuffer[26]);
99
  databufferR2[11] = makeGraphLine2(fftBuffer[27]);
100
  databufferR2[12] = makeGraphLine2(fftBuffer[28]);
101
  databufferR2[13] = makeGraphLine2(fftBuffer[29]);
102
  databufferR2[14] = makeGraphLine2(fftBuffer[30]);
103
  databufferR2[15] = makeGraphLine2(fftBuffer[31]);
104
105
  databufferR3[0]  = makeGraphLine2(fftBuffer[32]);
106
  databufferR3[1]  = makeGraphLine2(fftBuffer[33]);
107
  databufferR3[2]  = makeGraphLine2(fftBuffer[34]);
108
  databufferR3[3]  = makeGraphLine2(fftBuffer[35]);
109
  databufferR3[4]  = makeGraphLine2(fftBuffer[36]);
110
  databufferR3[5]  = makeGraphLine2(fftBuffer[37]);
111
  databufferR3[6]  = makeGraphLine2(fftBuffer[38]);
112
  databufferR3[7]  = makeGraphLine2(fftBuffer[39]);
113
  databufferR3[8]  = makeGraphLine2(fftBuffer[40]);
114
  databufferR3[9]  = makeGraphLine2(fftBuffer[41]);
115
  databufferR3[10] = makeGraphLine2(fftBuffer[42]);
116
  databufferR3[11] = makeGraphLine2(fftBuffer[43]);
117
  databufferR3[12] = makeGraphLine2(fftBuffer[44]);
118
  databufferR3[13] = makeGraphLine2(fftBuffer[45]);
119
  databufferR3[14] = makeGraphLine2(fftBuffer[46]);
120
  databufferR3[15] = makeGraphLine2(fftBuffer[47]);
121
122
  databufferR4[0]  = makeGraphLine2(fftBuffer[48]);
123
  databufferR4[1]  = makeGraphLine2(fftBuffer[49]);
124
  databufferR4[2]  = makeGraphLine2(fftBuffer[50]);
125
  databufferR4[3]  = makeGraphLine2(fftBuffer[51]);
126
  databufferR4[4]  = makeGraphLine2(fftBuffer[52]);
127
  databufferR4[5]  = makeGraphLine2(fftBuffer[53]);
128
  databufferR4[6]  = makeGraphLine2(fftBuffer[54]);
129
  databufferR4[7]  = makeGraphLine2(fftBuffer[55]);
130
  databufferR4[8]  = makeGraphLine2(fftBuffer[56]);
131
  databufferR4[9]  = makeGraphLine2(fftBuffer[57]);
132
  databufferR4[10] = makeGraphLine2(fftBuffer[58]);
133
  databufferR4[11] = makeGraphLine2(fftBuffer[59]);
134
  databufferR4[12] = makeGraphLine2(fftBuffer[60]);
135
  databufferR4[13] = makeGraphLine2(fftBuffer[61]);
136
  databufferR4[14] = makeGraphLine2(fftBuffer[62]);
137
  databufferR4[15] = makeGraphLine2(fftBuffer[63]);
138
}

Schon mal was von Schleifen gehört?
1
void makeGraph(void)
2
{
3
  for (unsigned char nInd = 0; nInd < 16; nInd++)
4
  {  
5
    databufferG1[nInd]  = makeGraphLine1(fftBuffer[nInd]);
6
    databufferG2[nInd]  = makeGraphLine1(fftBuffer[nInd + 16]);
7
    databufferG3[nInd]  = makeGraphLine1(fftBuffer[nInd + 32]);
8
    databufferG4[nInd]  = makeGraphLine1(fftBuffer[nInd + 48]);
9
10
    databufferR1[nInd]  = makeGraphLine2(fftBuffer[nInd]);
11
    databufferR2[nInd]  = makeGraphLine2(fftBuffer[nInd + 16]);
12
    databufferR3[nInd]  = makeGraphLine2(fftBuffer[nInd + 32]);
13
    databufferR4[nInd]  = makeGraphLine2(fftBuffer[nInd + 48]);
14
  }
15
}
mfg.

von tobi (Gast)


Lesenswert?

Phil Schlock schrieb im Beitrag
> dies macht er immer an der gleichen stelle...
>
> es geht hier um ein multiplex programm das werte von einer externen fft
> auf dem display multiplexen soll..
>
> das ist ein AVR Mega1284P, liegt es an den 16 Bit Variabeln?
> und Returns mit den 16 Bit breiten oder habe ich irgend wo einen
> Denkfehler?
>
> über hilfe würde ich mich sehr freuen

KanDu.meintest ja er haengt sich immer an der selben stelle weg...kannst 
du das ding debuggen? Wenn.ja wo haengt er sich weg..... Ich h

von Banana M. (Firma: Banana) (schlock)


Lesenswert?

@Thomas Eckmann
ja ich kenne schleifen...
hatte aber probeweise diese rausgenommen... ich bin immoment etwas am 
verzweifeln, habe sonst immer einen mega32 genommen dies ging ohne 
probleme..., damit meine ich der avr springt nicht einfach auf den reset 
zurück... das ist ja was mich so wundert, teils läuft es, teils haut er 
sich zamm... strom versorgung ist aber ok, ich habe auch noch ein paar 
mehr abblock kondensatoren (1nF, 100nF, 1pF) dazu gelötet...
angesteuert werden 4 alte Samsung 16x16 LED Pannels mit Schieberegister 
IC..

habe nun einen debugger da.. werde ihn nun auch mal ausprobieren, löte 
mir gerade einen adapter.. und werde dann ein pannel raus nehmen.. da 
dies leider an den debugger pins sitzt..

sorry für den unkommentierten code... ich änder immoment zu oft etwas 
das ich da noch nicht so viel kommentieren konnte, immoment wär ich froh 
wenn das multiplexen und die manipulation der "framaes" klappt ohne das 
der avr
sachen macht, die sich für mich nicht logisch aus dem code ergeben...

multiplexen via interrupt finde ich auch besser...
aber hatte damit probleme... denke meine timer routine dauerte zu lange,
die zu multiplexenden daten werden alle in einer anderen methode 
aufbereitet... aber der avr hängt wohl zu lange in der interrupt 
routine..
komischerweise geht er wenn diese durchgelaufen ist auch nicht mehr 
richtig in das haupt programm zurück, er hat sich hier auch total 
komsich verhalten...

werde nun mit dem debugger mal schauen was da los ist,
falls jemand noch tipps für mich hat würde ich mich sehr freuen

gruß phil

von oldmax (Gast)


Lesenswert?

Hi
Ich hab von C keine Ahnung und wenn das Programm auch noch schlecht 
dokumentiert ist, macht es auch keinen Sinn, sich da reinzudenken. An 
diesem Punkt geb ich Peter völlig recht: ein schlampig angefangenes 
Programm bleit schlampig. Wenn es nicht läuft, verbrät man viel Zeit mit 
der Suche nach Flüchtigkeitsfehlern und wenn es läuft, warum dann 
aufräumen. Ich hab genug Programme gesehen ( und teilweise auch 
überarbeiten müssen) wo diese Aussage zutrifft. Aber nun zu deinem 
Problem:
Wenn deine Software auf einem anderen Controller läuft und nur bei 
diesem Typ dieser Fehler auftritt, dann denk ich sofort an die 
controllerspezifische Datei. Auch die Frage: ist die IVT richtig 
deklariert oder taucht ein freigegebener Interrupt auf und aufgrund 
fehlender Vektoradresse landet er in der Startroutine. Was ja einem 
Neustart gleichkommt. Ich seh zwar eine freigabe der globalen Interrupts 
und auch eine Initialisierung vom Timer, aber die entsprechende ISR hab 
ich nicht gesehen. Kann aber an meinen mangelhaften C- Kenntnissen 
liegen.
Gruß oldmax

von dkar (Gast)


Lesenswert?

Ist SPI_NO_INTERRUPT auch als 0 definiert?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.