Forum: Mikrocontroller und Digitale Elektronik Atmega/C: eine Funktion aus einer Funktions heraus aufrufen


von 006 (Gast)


Lesenswert?

Hallo Zusammen,

Habe ein Software Problem bei einem Mikrocontroller Programm:

Umgebung: AtmelStudio, JTAGICE3, C, ATmega64, 3,3V

Ich habe in meinem Code mehrere Funktionen, die sich alle durch die main 
Funktion aufrufen lassen. So weit funktioniert alles.

ABER: Wenn ich in "main" eine Funktion aufrufe, und aus dieser Funktion 
eine andere Funktion aufrufe, bleibt der Mikrocontroller hängen. Weiß 
jemand wieso? Ist das Problem bekannt?

Funktionen deklariere ich immer folgendermaßen:
1
void Sende_Ziffer(uint8_t ziffer)
2
{
3
  //mein code
4
}
5
6
void Sende_Alle_Ziffern(uint8_t s1,uint8_t s2,uint8_t s3,uint8_t i1,uint8_t i2,uint8_t i3)
7
{
8
  //mein code
9
  Sende_Ziffer(2);
10
}
11
12
int main(void)
13
{
14
15
  //mein code
16
  
17
  while(1)
18
  {
19
    Sende_alle_Ziffern(1,2,3,4,5,6);
20
  }
21
}

Danke und Grüße,
006

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Stacküberlauf

von 006 (Gast)


Lesenswert?

Andreas Schweigstill schrieb:
> Stacküberlauf

Das heißt? Kann ich das generell nicht bei ATmega Mikrocontrollern?

von M. S. (elpaco)


Lesenswert?

Ich weiß nicht, ob dein Code hier nur beispielhaft ist. Jedoch sendest 
du, wenn du "Sende_alle_Ziffern" aufrufst, hier immer nur eine "2". 
Unabhängig davon, mit welchen Argumenten "Sende_alle_Ziffern" aufgerufen 
wird.

von Max B. (theeye)


Lesenswert?

006 schrieb:
> Das heißt? Kann ich das generell nicht bei ATmega Mikrocontrollern?

Doch das kannst du natürlich! Hier die gesuchten Infos: 
http://avr.myluna.de/doku.php?id=de:stackueberlaeufe_erkennen

Gruß Max

von 006 (Gast)


Lesenswert?

Ist nur ein stark reduzierter Beispielcode. Konnte das Problem so weit 
eingrenzen, dass der Controller sich definitiv beim Aufruf der 2 
Funktion verabschiedet

von M. S. (elpaco)


Lesenswert?

In dem Fall sind vielleicht sechs Argumente für die Funktion zu viel

von Ingo (Gast)


Lesenswert?

006 schrieb:
> void Sende_Ziffer(uint8_t ziffer)
> {
>   //mein code
> }

Was verbirgt sich hinter "mein Code"???

von 006 (Gast)


Lesenswert?

M. S. schrieb:
> In dem Fall sind vielleicht sechs Argumente für die Funktion zu viel

Werde mal alle Unterfunktionen zu einer einzigen Zusammenfassen. Ist 
zwar häßlich wegen hoher Coderedundanz, scheint mir dafür aber die 
einfachste Lösung. Und ist in der Ausführung sicher auch schneller, da 
weniger Sprungbefehle auftauchen.

von Karl H. (kbuchegg)


Lesenswert?

006 schrieb:
> M. S. schrieb:
>> In dem Fall sind vielleicht sechs Argumente für die Funktion zu viel
>
> Werde mal alle Unterfunktionen zu einer einzigen Zusammenfassen.

Das wird dir nicht viel bringen.

Das Problem in deinem Programm lässt sich nicht auf 'die eine Zeile' 
reduzieren. Dein Programm verbraucht, wenn die Ad Hoc Diagnose 
'Stack+berlauf' zutrifft, in seiner Gesamtheit einfach zuviel SRAM. Das 
müsste schon sehr an der Kippe stehen, wenn dir das bischen 
Returnstack-Einsparung durch einen eingesparten Funktionsaufruf die 
Sache rettet. Vor allen Dingen bringt das nur ganz kurze Abhilfe. Bei 
der nächsten Änderung fliegt dir dann wieder alles um die Ohren.

Also: Speicherverbrauch feststellen und nachsehen wo man ein wenig SRAM 
sparen kann.

> Ist
> zwar häßlich wegen hoher Coderedundanz, scheint mir dafür aber die
> einfachste Lösung.

Mit Sicherheit nicht.

von Max B. (theeye)


Lesenswert?

Karl Heinz schrieb:
> Also: Speicherverbrauch feststellen und nachsehen wo man ein wenig SRAM
> sparen kann.

Eventuell Strings oder andere Daten, die sich nicht ändern, in den Flash 
auslagern. Versuche selbst gerade ein Menu bzw. die Strings mit __flash 
dorthin zu bekommen und wieder auszugeben. Mein SRAM ist nämlich auch 
voll ;-)

Gruß Max

von 006 (Gast)


Lesenswert?

Hier der Quellcode. Ich habe 6 Zahlenwerte und möchte die über 
Schieberegister jeweils auf zwei 7-Segmentanzeigen ausgeben (2stellig 
00-99).

Weiß nicht, was da jetzt für den Speicher kritisch werden sollte... Hat 
jemand eine Idee?
1
/*
2
 * Main_64_v01.c
3
 *
4
 * Created: 11.09.2014 14:28:26
5
 *  Author: test1
6
 */ 
7
 
8
9
//Bibliotheken
10
#include <avr/io.h>
11
#include <stdint.h>
12
13
14
// PINOUT - Anzeigemodul
15
#define SCK  3    //PE3: Speichertakt
16
#define DATA 4    //PE4: Serielle Datenleitung
17
#define CLK  5    //PE5: Schiebetakt
18
#define OE   6    //PE6: Output Enabled
19
//Board
20
#define LED  6    //PB6: Status LED auf dem Board
21
22
23
// Funktionen Deklaration
24
25
uint8_t Dez_To_7Seg(uint8_t dez) // CHECKED 
26
{
27
  // kodiere eine Dezimalzahl für die 7-Segment-Anzeige
28
  // Input :    Dezimalzahl typ uint8_t
29
  // Output :    Code für 7-Segment Anzeige
30
  
31
  // Pin Zuordnung
32
  // Qn: Schieberegister Ausgang Nr. n
33
  // n:  7-Segment-Anzeige Balken Nr. n
34
  // Q0  ->  nc
35
  // Q1  ->  6  ->  b
36
  // Q2  ->  7  ->  a
37
  // Q3  ->  4  ->  c
38
  // Q4  ->  2  ->  d
39
  // Q5  ->  9  ->  f
40
  // Q6  ->  1  ->  e
41
  // Q7  ->  10  ->  g
42
  
43
  switch(dez) {     //gefdcab-
44
    case 0: return 0b01111110; break;
45
    case 1: return 0b00001010; break;
46
    case 2: return 0b11010110; break;
47
    case 3: return 0b10011110; break;
48
    case 4: return 0b10101101; break;
49
    case 5: return 0b10111100; break;
50
    case 6: return 0b11111100; break;
51
    case 7: return 0b00001110; break;
52
    case 8: return 0b11111110; break;
53
    case 9: return 0b10111110; break;
54
    default: return 0b11110100; break; // -> E: Error
55
  }
56
57
}
58
59
void Sende_Ziffer(uint8_t ziffer)
60
{
61
  
62
  if ( ziffer & ( 1 << 7 ) ) {  PORTE |= (1 << DATA);  }  //Wenn Bit 7 = High, dann High ausgeben
63
  else              {  PORTE &= ~(1 << DATA); };  //Wenn Bit 7 = Low, dann Low ausgeben
64
  PORTE |= (1 << CLK);                    // Datenleitung = HIGH
65
  PORTE &= ~(1 << CLK);                    // Schiebetakt = HIGH, LOW
66
  if ( ziffer & ( 1 << 6 ) ) {  PORTE |= (1 << DATA);  }
67
  else              {  PORTE &= ~(1 << DATA); };
68
  PORTE |= (1 << CLK);                    // Datenleitung = HIGH
69
  PORTE &= ~(1 << CLK);                    // Schiebetakt = HIGH, LOW
70
  if ( ziffer & ( 1 << 5 ) ) {  PORTE |= (1 << DATA);  }
71
  else              {  PORTE &= ~(1 << DATA); };
72
  PORTE |= (1 << CLK);                    // Datenleitung = HIGH
73
  PORTE &= ~(1 << CLK);                    // Schiebetakt = HIGH, LOW
74
  if ( ziffer & ( 1 << 4 ) ) {  PORTE |= (1 << DATA);  }
75
  else              {  PORTE &= ~(1 << DATA); };
76
  PORTE |= (1 << CLK);                    // Datenleitung = HIGH
77
  PORTE &= ~(1 << CLK);                    // Schiebetakt = HIGH, LOW
78
  if ( ziffer & ( 1 << 3 ) ) {  PORTE |= (1 << DATA);  }
79
  else              {  PORTE &= ~(1 << DATA); };
80
  PORTE |= (1 << CLK);                    // Datenleitung = HIGH
81
  PORTE &= ~(1 << CLK);                    // Schiebetakt = HIGH, LOW
82
  if ( ziffer & ( 1 << 2 ) ) {  PORTE |= (1 << DATA);  }
83
  else              {  PORTE &= ~(1 << DATA); };
84
  PORTE |= (1 << CLK);                    // Datenleitung = HIGH
85
  PORTE &= ~(1 << CLK);                    // Schiebetakt = HIGH, LOW
86
  if ( ziffer & ( 1 << 1 ) ) {  PORTE |= (1 << DATA);  }
87
  else              {  PORTE &= ~(1 << DATA); };
88
  PORTE |= (1 << CLK);                    // Datenleitung = HIGH
89
  PORTE &= ~(1 << CLK);                    // Schiebetakt = HIGH, LOW
90
  if ( ziffer & ( 1 << 0 ) ) {  PORTE |= (1 << DATA);  }
91
  else              {  PORTE &= ~(1 << DATA); };
92
  PORTE |= (1 << CLK);                    // Datenleitung = HIGH
93
  PORTE &= ~(1 << CLK);                    // Schiebetakt = HIGH, LOW
94
}
95
96
void Sende_Alle_Ziffern(uint8_t s1,uint8_t s2,uint8_t s3,uint8_t i1,uint8_t i2,uint8_t i3)
97
{
98
  uint8_t buffer;
99
  
100
  buffer = s3/10;            //10er ermitteln
101
  buffer = Dez_To_7Seg(buffer);    //Für die 7-Segmentanzeige codieren
102
  Sende_Ziffer(buffer);        //an Schieberegister senden
103
104
  buffer = s3 % 10;          //1er ermitteln
105
  buffer = Dez_To_7Seg(buffer);    //Für die 7-Segmentanzeige codieren
106
  Sende_Ziffer(buffer);        //an Schieberegister senden
107
  
108
  buffer = i3/10;
109
  buffer = Dez_To_7Seg(buffer);
110
  Sende_Ziffer(buffer);
111
112
  buffer = i3 % 10;
113
  buffer = Dez_To_7Seg(buffer);
114
  Sende_Ziffer(buffer);
115
  
116
  buffer = s2/10;
117
  buffer = Dez_To_7Seg(buffer);
118
  Sende_Ziffer(buffer);
119
120
  buffer = s2 % 10;
121
  buffer = Dez_To_7Seg(buffer);
122
  Sende_Ziffer(buffer);
123
  
124
  buffer = i2/10;
125
  buffer = Dez_To_7Seg(buffer);
126
  Sende_Ziffer(buffer);
127
128
  buffer = i2 % 10;
129
  buffer = Dez_To_7Seg(buffer);
130
  Sende_Ziffer(buffer);
131
  
132
  buffer = s1/10;
133
  buffer = Dez_To_7Seg(buffer);
134
  Sende_Ziffer(buffer);
135
136
  buffer = s1 % 10;
137
  buffer = Dez_To_7Seg(buffer);
138
  Sende_Ziffer(buffer);
139
  
140
  buffer = i1/10;
141
  buffer = Dez_To_7Seg(buffer);
142
  Sende_Ziffer(buffer);
143
144
  buffer = i1 % 10;
145
  buffer = Dez_To_7Seg(buffer);
146
  Sende_Ziffer(buffer);
147
148
  PORTE |= (1 << SCK);  //Schiebetakt
149
  PORTE &= ~(1 << SCK);  //Schiebetakt  
150
  
151
  PORTB |= (1 << LED);
152
}
153
154
int main(void)
155
{
156
  DDRE = 0b01111001;      //Ausgänge an PortE definieren (Anzeigemodul)
157
  DDRB = 0b01000000;      //Ausgänge an PortB definieren (Status LED)
158
  
159
  
160
  PORTE &= ~(1 << CLK);    //Alle Signalleitungen zu den Schieberegistern auf 0
161
  PORTE &= ~(1 << OE);
162
  PORTE &= ~(1 << SCK);
163
  PORTE &= ~(1 << DATA);
164
  
165
  uint8_t M1_Soll = 88;    //Drei Sollwerte
166
  uint8_t M2_Soll = 88;
167
  uint8_t M3_Soll = 88;
168
  uint8_t M1_Ist = 88;    //Drei Istwerte
169
  uint8_t M2_Ist = 88;
170
  uint8_t M3_Ist = 88;
171
  
172
          
173
  while(1)
174
    {
175
    Sende_Alle_Ziffern(M1_Soll, M2_Soll, M3_Soll, M1_Ist, M2_Ist, M3_Ist);  //Gebe die Zahlen auf den 7-Segment-Anzeigen aus
176
    PORTB |= (1 << LED);                          //Status-LED einschalten
177
    }
178
}

von Thomas E. (thomase)


Lesenswert?

Ein Atmega64 hat 4K RAM. Das dauert schon ein wenig, bis der Stack 
überläuft.

M. S. schrieb:
> Ich weiß nicht, ob dein Code hier nur beispielhaft ist

Jetzt zeig mal ein richtiges Programm, das auch läuft. An dem Extrakt 
oben lässt sich nur die Qualität der Optimierung erkennen.

mfg.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Da ist auch nichts kritisches (ausser dass man den Code auch um 50% 
kleiner schreiben kann und so die Unübersicht los wird).


Die Funktionsaufrufe sind es jedenfalls nicht.
Was hängt da für ein Schieberegister drann? 74595? Wie ist es 
verdrahtet?

von 006 (Gast)


Lesenswert?

Karl Heinz schrieb:
> Was hängt da für ein Schieberegister drann? 74595? Wie ist es

74HC595. Läßt sich problemslos ansteuern so lange ich die Befehle 
sequenziell in eine funktion packe... Daher wird die Verdrahtung wohl 
stimmen.

von Karl H. (kbuchegg)


Lesenswert?

006 schrieb:
> Karl Heinz schrieb:
>> Was hängt da für ein Schieberegister drann? 74595? Wie ist es
>
> 74HC595. Läßt sich problemslos ansteuern so lange ich die Befehle
> sequenziell in eine funktion packe... Daher wird die Verdrahtung wohl
> stimmen.

Trotzdem ist da was anderes faul.
Hast du in der IDE den korrekten µC-Typ eingstellt?

von Christoph V. (nexttopmodel)


Lesenswert?

Der Code sollte so laufen, doch schau mal in der Funktion

uint8_t Dez_To_7Seg(uint8_t dez)

nach, alle return's werden durch den switch erzeugt.
Entferne mal den default und gib das als Standard zurück.

Ich glaube aber auch das es eher die Schaltung ist, z.B 
Spannungseinbruch durch Schalten eines Pins zum Kurzschluss.

Gruß, Christoph

von 006 (Gast)


Lesenswert?

Christoph Vogel schrieb:
> Ich glaube aber auch das es eher die Schaltung ist, z.B
> Spannungseinbruch durch Schalten eines Pins zum Kurzschluss.

Also habe die Funktionen jetzt zu einer mit relativ hoher Coderedundanz 
zusammengeführt. Läuft fehlerfrei!

Ist halt nur häßlich...

von Karl H. (kbuchegg)


Lesenswert?

006 schrieb:
> Christoph Vogel schrieb:
>> Ich glaube aber auch das es eher die Schaltung ist, z.B
>> Spannungseinbruch durch Schalten eines Pins zum Kurzschluss.
>
> Also habe die Funktionen jetzt zu einer mit relativ hoher Coderedundanz
> zusammengeführt. Läuft fehlerfrei!

Bis zum nächsten Fehler.
Dein Code ist an sich in Ordnung. Da ist irgendwas faul, was wir hier 
nicht sehen können. An den Funktionsaufrufen hängt es ganz sicher nicht.

>
> Ist halt nur häßlich...

Und unwartbar

von Stefan E. (sternst)


Lesenswert?

Zustand der M103C-Fuse?

von Thomas E. (thomase)


Lesenswert?

Karl Heinz schrieb:
> Dein Code ist an sich in Ordnung. Da ist irgendwas faul, was wir hier
> nicht sehen können. An den Funktionsaufrufen hängt es ganz sicher nicht.

Hat eigentlich schon jemand den Klassiker ins Spiel gebracht?

100nF an JEDEM 595er.

006 schrieb:
> Ist halt nur häßlich...

Das ist der ursprüngliche Code aber auch. Funktionieren sollte er 
trotzdem.

Karl Heinz schrieb:
> Bis zum nächsten Fehler.

Und der wird nicht lange auf sich warten lassen.

mfg.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Thomas Eckmann schrieb:
> Karl Heinz schrieb:
>> Dein Code ist an sich in Ordnung. Da ist irgendwas faul, was wir hier
>> nicht sehen können. An den Funktionsaufrufen hängt es ganz sicher nicht.
>
> Hat eigentlich schon jemand den Klassiker ins Spiel gebracht?
>

nicht das ich wüsste. Sollte man aber mal klären.

006. Teste mal diesen Code. Das ist wichtig, dass wir das jetzt ein für 
alle mal hinkriegen. Du kannst nicht vernünftig weiterarbeiten, wenn 
nicht klargestellt ist, was da in deinem System los ist.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <stdint.h>
4
5
6
// PINOUT - Anzeigemodul
7
#define SCK  3    //PE3: Speichertakt
8
#define DATA 4    //PE4: Serielle Datenleitung
9
#define CLK  5    //PE5: Schiebetakt
10
#define OE   6    //PE6: Output Enabled
11
//Board
12
#define LED  6    //PB6: Status LED auf dem Board
13
14
15
  // Q0  ->  nc
16
  // Q1  ->  6  ->  b
17
  // Q2  ->  7  ->  a
18
  // Q3  ->  4  ->  c
19
  // Q4  ->  2  ->  d
20
  // Q5  ->  9  ->  f
21
  // Q6  ->  1  ->  e
22
  // Q7  ->  10  ->  g
23
24
uint8_t digitPattern[] = {
25
          0b01111110,
26
          0b00001010,
27
          0b11010110,
28
          0b10011110,
29
          0b10101101,
30
          0b10111100,
31
          0b11111100,
32
          0b00001110,
33
          0b11111110,
34
          0b10111110,
35
          0b11110100     // -> E: Error
36
};
37
38
uint8_t Dez_To_7Seg( uint8_t dez )
39
{
40
  if( dez < 10 )
41
    return digitPattern[dez];
42
43
  return digitPattern[10];
44
}
45
46
void DisplayDigit( uint8_t digit )
47
{
48
  uint8_t i;
49
  uint8_t pattern = Dez_To_7Seg( digit );
50
51
  for( i = 0; i < 8; i++ ) {
52
    if( pattern & 0x80 )
53
      PORTE |= ( 1 << DATA );
54
    else
55
      PORTE &= ~( 1 << DATA );
56
57
    PORTE |= (1 << CLK);
58
    PORTE &= ~(1 << CLK);
59
60
    pattern <<= 1;
61
  }
62
}
63
64
void DisplayNumber( uint8_t number )
65
{
66
  DisplayDigit( number / 10 );
67
  DisplayDigit( number % 10 );
68
}
69
70
void Sende_Alle_Ziffern(uint8_t s1,uint8_t s2,uint8_t s3,uint8_t i1,uint8_t i2,uint8_t i3)
71
{
72
  DisplayNumber( s3 );
73
  DisplayNumber( i3 );
74
  DisplayNumber( s2 );
75
  DisplayNumber( i2 );
76
  DisplayNumber( s1 );
77
  DisplayNumber( i1 );
78
79
  PORTE |= (1 << SCK);
80
  PORTE &= ~(1 << SCK);  
81
}
82
83
int main(void)
84
{
85
  DDRE = (1<<SCK) | (1<<DATA) | (1<<CLK) | (1<<OE);
86
  DDRB = (1<<LED);
87
  
88
  
89
  PORTE &= ~(1 << CLK);
90
  PORTE &= ~(1 << SCK);
91
  PORTE &= ~(1 << DATA);
92
  PORTE &= ~(1 << OE);
93
  
94
  uint8_t M1_Soll = 88;    //Drei Sollwerte
95
  uint8_t M2_Soll = 88;
96
  uint8_t M3_Soll = 88;
97
  uint8_t M1_Ist = 88;    //Drei Istwerte
98
  uint8_t M2_Ist = 88;
99
  uint8_t M3_Ist = 88;
100
  
101
  // eindeutige Blinkerei an der LED, damit man erkennt
102
  // ob es einen ungewollten Prozessorreset gibt
103
  PORTB &= ~(1<<LED);
104
  _delay_ms( 1000 );
105
  PORTB |= (1 << LED);
106
  _delay_ms( 1000 );
107
  PORTB &= ~(1<<LED);
108
  _delay_ms( 1000 );
109
  PORTB |= (1 << LED);
110
          
111
  while(1)
112
  {
113
    Sende_Alle_Ziffern(M1_Soll, M2_Soll, M3_Soll, M1_Ist, M2_Ist, M3_Ist);  //Gebe die Zahlen auf den 7-Segment-Anzeigen aus
114
  }
115
}

von Thomas E. (thomase)


Lesenswert?

Karl Heinz schrieb:
>> Hat eigentlich schon jemand den Klassiker ins Spiel gebracht?
>>
>
> nicht das ich wüsste. Sollte man aber mal klären.

Das war auch eher eine rhetorische Frage.
Ich würde mich auch zu einer Wette hinreissen lassen.

mfg.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Karl Heinz schrieb:
> // eindeutige Blinkerei an der LED, damit man erkennt
>   // ob es einen ungewollten Prozessorreset gibt
>   PORTB &= ~(1<<LED);
>   _delay_ms( 1000 );
>   PORTB |= (1 << LED);
>   _delay_ms( 1000 );
>   PORTB &= ~(1<<LED);
>   _delay_ms( 1000 );
>   PORTB |= (1 << LED);

 Kürzer ?
1
  for( i = 0; i < 2; i++ ) {
2
    PINB |= (1<<LED);
3
    _delay_ms( 1000 );
4
  }

von Route_66 H. (route_66)


Lesenswert?

Marc Vesely schrieb:
> Kürzer ?
>   for( i = 0; i < 2; i++ ) {
>     PINB |= (1<<LED);
>     _delay_ms( 1000 );
>   }

Was nützt es Dir, in einer Schleife die LED dauernd einzuschalten? So 
entsteht kein BLINKEN!

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Route 66 schrieb:
> Was nützt es Dir, in einer Schleife die LED dauernd einzuschalten? So
> entsteht kein BLINKEN!

 Warum schreist du den ?
 Und bist du sicher, dass es dauernd eingeschaltet wird ?

von Karl H. (kbuchegg)


Lesenswert?

Marc Vesely schrieb:
> Route 66 schrieb:
>> Was nützt es Dir, in einer Schleife die LED dauernd einzuschalten? So
>> entsteht kein BLINKEN!
>
>  Warum schreist du den ?
>  Und bist du sicher, dass es dauernd eingeschaltet wird ?

Auf einem Mega64 gibt es die Toggle-Funktionalität mittels PINx Register 
noch nicht. Wenn schon, dann hätte man es so schreiben können.
1
  for( i = 0; i < 4; i++ ) {
2
    PORTB ^= (1<<LED);
3
    _delay_ms( 1000 );
4
  }

4 Umschaltungen mach ich deshalb, weil ich nicht weiß, wie seine LED 
angebunden ist. Bei 4 mal ergibt das auf jeden Fall irgendetwas 
unmissverständlich sichtbares.

Aber: in meinen Augen ist das jetzt ehrlich gesagt ein Streit um des 
Kaisers Bart, ob man da eine Schleife nimmt, oder per Copy&Paste 
programmiert. Man muss nicht päpstlicher als der Papst sein. Der Zweck 
ist auf jeden Fall so oder so erfüllt und im fertigen Programm kommts 
dann sowieso wieder raus.

von 006 (Gast)


Lesenswert?

Karl Heinz schrieb:
> 006. Teste mal diesen Code. Das ist wichtig, dass wir das jetzt ein für
> alle mal hinkriegen. Du kannst nicht vernünftig weiterarbeiten, wenn
> nicht klargestellt ist, was da in deinem System los ist.

Hallo Karl Heinz,
habe deinen Code probiert.
Eine Warnung:
Warning  1  #warning "F_CPU not defined for <util/delay.h>" [-Wcpp] 
c:\program files (x86)\atmel\atmel toolchain\avr8 
gcc\native\3.4.1056\avr8-gnu-toolchain\avr\include\util\delay.h  90  3 
GccApplication2

Programm ließ sich kompilieren und übertragen. Die 7-Segment-Anzeigen 
zeigen weiterhin alte Ziffern, die noch im Latch der Schieberegister 
hingen.

Die Status LED leuchtet kurz auf (t>0.2s) bleibt dann ca. 1s aus 
leuchtet dann ca. 1s auf und bleibt wieder eine 1s aus. Dann wiederholt 
sich das Spiel.

von Karl H. (kbuchegg)


Lesenswert?

006 schrieb:

> Die Status LED leuchtet kurz auf (t>0.2s) bleibt dann ca. 1s aus
> leuchtet dann ca. 1s auf und bleibt wieder eine 1s aus. Dann wiederholt
> sich das Spiel.

Wie?
Die LED blinkt immer wieder?


Dann stürzt dein Prozessor laufend ab und der Verdacht, das es sich um 
ein  elektrisches Problem handelt verdichtet sich. Poste mal deinen 
Schaltplan oder häng gleich mal prophylaktisch 100nF Kondensatoren an 
die Versorgungsspannung des Prozessors und der 595 (jeder IC kriegt 
seinen eigenen Kondensator, möglichst dicht ans Gehäuse des IC)

von 006 (Gast)


Lesenswert?

006 schrieb:
> Die Status LED leuchtet kurz auf (t>0.2s) bleibt dann ca. 1s aus
> leuchtet dann ca. 1s auf und bleibt wieder eine 1s aus. Dann wiederholt
> sich das Spiel.

Ich meinte <0,2s. Wirklich nur kaum wahrnehmbar

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Karl Heinz schrieb:
> Auf einem Mega64 gibt es die Toggle-Funktionalität mittels PINx Register

 Das wusste ich nicht.

von Stefan E. (sternst)


Lesenswert?

Auch auf die Gefahr hin, wieder ignoriert zu werden:
Wie ist der Zustand der M103C-Fuse?

von Karl H. (kbuchegg)


Lesenswert?

Stefan Ernst schrieb:
> Auch auf die Gefahr hin, wieder ignoriert zu werden:
> Wie ist der Zustand der M103C-Fuse?

Guter Einwand. Wusste gar nicht, dass der Mega64 die auch hat (so wie 
der 128).
Und Atmel hat (in meinen Augen) denselben Mist gemacht, wie beim 128-er. 
Default ist die Fuse 'programmed', sprich man muss erst mal an die Fuse 
ran, ehe man dann tatsächlich einen M64 vor sich hat.

von 006 (Gast)


Angehängte Dateien:

Lesenswert?

Stefan Ernst schrieb:
> Wie ist der Zustand der M103C-Fuse?

Heißt das bei mir anders? Ein Bild ist im Anhang

von Stefan E. (sternst)


Lesenswert?

006 schrieb:
> Heißt das bei mir anders? Ein Bild ist im Anhang

Vermutlich "CompMode".

von 006 (Gast)


Lesenswert?

Karl Heinz schrieb:
> Dann stürzt dein Prozessor laufend ab und der Verdacht, das es sich um
> ein  elektrisches Problem handelt verdichtet sich. Poste mal deinen
> Schaltplan oder häng gleich mal prophylaktisch 100nF Kondensatoren an
> die Versorgungsspannung des Prozessors und der 595 (jeder IC kriegt
> seinen eigenen Kondensator, möglichst dicht ans Gehäuse des IC)

Ich seh grade dass ich einen Vcc Eingang des Controllers nicht mit 100nF 
entstört habe. Die Spannung schwangt hier un ca. 50mV. Mal sehen ob ich 
noch einen einlöten kann.

von Karl H. (kbuchegg)


Lesenswert?

006 schrieb:
> Karl Heinz schrieb:
>> Dann stürzt dein Prozessor laufend ab und der Verdacht, das es sich um
>> ein  elektrisches Problem handelt verdichtet sich. Poste mal deinen
>> Schaltplan oder häng gleich mal prophylaktisch 100nF Kondensatoren an
>> die Versorgungsspannung des Prozessors und der 595 (jeder IC kriegt
>> seinen eigenen Kondensator, möglichst dicht ans Gehäuse des IC)
>
> Ich seh grade dass ich einen Vcc Eingang des Controllers nicht mit 100nF
> entstört habe. Die Spannung schwangt hier un ca. 50mV. Mal sehen ob ich
> noch einen einlöten kann.

Hast du dich um die Fuse gekümmert? Die Abblockkondensatoren sind 
natürlich wichtig, helfen aber bei aktiviertem Kompatibilitätsmodus 
nichts.
Solange der eingeschaltet ist, hast du keinen Mega64 vor dir sondern 
einen Mega-103. Und der hat eine andere Speicherbelegung, was ganz 
zwanglos die Abstürze erklären würde.
Um es ganz klar zu sagen: Du KANNST diese Thematik nicht ignorieren!

(Und dem Mann, der sich bei Atmel den Unsinn ausgedacht hat, dass diese 
µC mit aktiviertem 103-Modus ausgeliefert werden, würde ich am liebsten 
den Hals umdrehen)

: Bearbeitet durch User
von Paul (Gast)


Lesenswert?

Karl Heinz schrieb:
> Und der hat eine andere Speicherbelegung, was ganz
> zwanglos die Abstürze erklären würde.

Ich würde eher sagen:
..., was ganz zwangsweise die Abstürze erklären würde.

Hab ich schon erlebt, nur wusste ich nicht, dass der M64 die auch hat. 
Ist ja n Ding.

von 006 (Gast)


Lesenswert?

Karl Heinz schrieb:
> Hast du dich um die Fuse gekümmert? Die Abblockkondensatoren sind
> natürlich wichtig, helfen aber bei aktiviertem Kompatibilitätsmodus
> nichts.

Hey, das war genau der Fehler. Das Progamm von Karl Heinz läuft jetzt!!! 
:) Vielen Dank euch allen für die schnelle und freundliche Hilfe.

von Karl H. (kbuchegg)


Lesenswert?

006 schrieb:

> Hey, das war genau der Fehler. Das Progamm von Karl Heinz läuft jetzt!!!
> :) Vielen Dank euch allen für die schnelle und freundliche Hilfe.

Stefan gebührt die Ehre.

Da muss ich wohl in meinem persönlichen 
Fehlermöglichkeiten-Gedächtnis-Ordner einen neuen Punkt für den M64 
einfügen. Beim M128 hat man sich ja schon daran gewöhnt, dass das 
Fehlerbild 'Absturz beim Funktionsreturn' auf eine fehlerhafte 
Kompatibilitätsfuse hinweist.

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.