Forum: Compiler & IDEs Funktion wird nicht aufgerufen


von Christian (Gast)


Lesenswert?

Guten Abend,
ich zerbreche mir seit etwa drei Stunden den Kopf über einen Problem, 
das ich mir nicht erklären kann.
Ich habe mir eine Platine erstellt um mit zwei PWM Kanälen MOSFETs zu 
steuern. Die Eingestellt Leistung soll dann über zwei Bargraphen 
dargestellt werden.
Die Platine ist soweit fertig und ich habe mir ein Programm geschrieben 
um die Funktion zu prüfen. Soweit zum Hintergrund...
In dem Testprogramm wollte ich die Ausgänge blinken lassen um eben mit 
meinen Oszilloskop zu prüfen ob die Platine i.O. ist. Das Programm sieht 
wie folgt aus:
1
#ifndef F_CPU
2
#define F_CPU 8000000L
3
#endif
4
5
#include <avr/io.h>
6
#include <util/delay.h>
7
8
9
void susi(void){
10
  DDRD |= (1<<PD1)|(1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7);
11
  DDRC |= (1<<DDC2)|(1<<DDC3)|(1<<DDC4)|(1<<DDC5);
12
  DDRB |= (1<<DDB1)|(1<<DDB2);
13
  
14
}
15
16
void test(void){
17
  _delay_ms(200);
18
  PORTD |= (1<<PD7);
19
  _delay_ms(10);
20
  PORTD &= ~(1<<PD7);
21
}
22
23
int main(void)
24
{
25
    //Wenn die folgende Zeile nicht auskommentiert ist, funktionieren die
26
    //Pins an PORTD
27
    //DDRD |= (1<<PD1)|(1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7);
28
    
29
    susi();  // <-- Dieser Aufruf funktioniert nicht
30
    while(1)
31
    {
32
    test();
33
        
34
    }
35
}
Wird der Funktionsaufruf "susi();" auskommentiert und alle Anweisungen 
die in der Funktion enthalten sind direkt vor die while-Schleife 
geschrieben, funktioniert alles wie geplant.
Weil ich mir das überhaupt nicht erklären kann, habe ich die Funktion 
"test();" erstellt und den Inhalt der while-Schleife darin 
untergebracht. Dieser Aufruf funktioniert jedoch wie geplant.

Ich bedanke mich schonmal freundlichst für die Hilfe, vielleicht sehe 
ich einfach den Wald vor lauter Bäumen nicht.

von Peter II (Gast)


Lesenswert?

Christian schrieb:
> Ich bedanke mich schonmal freundlichst für die Hilfe, vielleicht sehe
> ich einfach den Wald vor lauter Bäumen nicht.

welche CPU für den Compiler gewählt?

Um welchen µC geht es überhaupt und wie sind die fuse gesetzt?

von ork (Gast)


Lesenswert?

Du benutzt einmal P... und einmal DD... Warum ist das nicht einheitlich?

Beim Init in main wird nur ein Port initialisiert. In der Funktion drei. 
Eventuell hast du einen Kurzschluss an einem der anderen Ports???

von Lenny D. (le-do)


Lesenswert?

Höchstinteressantes Verhalten... ;)
Hätte Tippfehler oder so was dummes vermutet, sieht aber alles OK aus.
Probier doch mal die Ausgänge direkt in der Routine zu schalten, dann 
siehst du ob sie wenigstens aufgerufen wird. Susi umbennen hast du 
bestimmt schon probiert und sollte eigentlich nicht das Problem sein 
(susi in ner header schon leer definiert?)

Kann es sein dass die Variablenänderungen auf magische Art und Weise 
lokal bleiben oder sonst wie irgendwie wegoptimiert werden?

: Bearbeitet durch User
von Christian (Gast)


Lesenswert?

In den "PDn" Makros steht ja das gleiche wie in den "DDn" Makros, das 
hab ich schon getestet. Daher stehen hier die "PDn" Makros. Ursprünglich 
standen die "DDn" Makros drin.

Verwendet wird ein ATMega8-AU. Die Fuses sind auf internen 8MHz Takt 
64ms Delay gestellt, ansonsten auf Auslieferungszustand.

Compiliert wurde mit dem AVR-Studio 6. Zuvor hatte ich mit Xcode in 
Verbindung mit AVR-GCC aus dem AVR-Crosspack gearbeitet. Das Resultat 
war aber identisch.

Gebrannt wurde mit dem AVRISP mkII.
Soweit die Daten zum Projekt.

Wie gesagt, mich wundert, dass die Funktion "susi()" nicht innerhalb der 
"main" aufgerufen wird. Wenn jedoch alle Anweisungen aus "susi()" in der 
"main" stehen, klappt alles wie gehabt.
Merkwürdigerweise wird die Funktion "test()" aus der while-Schleife 
innerhalb der "main" aufgerufen.

von Thomas E. (thomase)


Lesenswert?

Christian schrieb:
> Verwendet wird ein ATMega8-AU.

Wird das Programm auch für diesen Controller kompiliert und das richtige 
File geflasht? Etwas anderes kommt kaum in Frage.

mfg.

von Lumbart (Gast)


Lesenswert?

Poste bitte die Listdatei.

von Frank (Gast)


Lesenswert?

Hallo Christian

In den Fuses den hacken bei Comp raus dann geht's.
Das ist ein Kompatibilitäts Modus für ältere Varianten.
Hatte ich auch.

Das Programm hängt sich beim Rücksprung auf da die Stack bereinigung 
nicht stimmt.

Frank

von Thomas E. (thomase)


Lesenswert?

Frank schrieb:
> In den Fuses den hacken bei Comp raus dann geht's.
Was ist ein "hacken"?

> Das ist ein Kompatibilitäts Modus für ältere Varianten.
> Hatte ich auch.
Aber nicht bei einem Atmega8.

mfg.

von Oliver S. (oliverso)


Lesenswert?

Frank schrieb:
> In den Fuses den hacken bei Comp raus dann geht's.
> Das ist ein Kompatibilitäts Modus für ältere Varianten.
> Hatte ich auch.

1. Fuses haben keine Hacken
2. Der Mega8 hat keinen Kompatibilitätsmodus für "ältere Varianten". 
Sowas gibt z.B. beim Mega128
3. Ja nee, is klar...

Oliver

von Christian (Gast)


Lesenswert?

Ok, hier mal das Listing.
1
Builds/main.elf:     file format elf32-avr
2
3
Sections:
4
Idx Name          Size      VMA       LMA       File off  Algn
5
  0 .text         0000007a  00000000  00000000  00000074  2**1
6
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
7
  1 .data         00000000  00800060  0000007a  000000ee  2**0
8
                  CONTENTS, ALLOC, LOAD, DATA
9
  2 .stab         0000054c  00000000  00000000  000000f0  2**2
10
                  CONTENTS, READONLY, DEBUGGING
11
  3 .stabstr      00000c3a  00000000  00000000  0000063c  2**0
12
                  CONTENTS, READONLY, DEBUGGING
13
  4 .comment      00000011  00000000  00000000  00001276  2**0
14
                  CONTENTS, READONLY
15
  5 .debug_aranges 00000020  00000000  00000000  00001288  2**3
16
                  CONTENTS, READONLY, DEBUGGING
17
  6 .debug_info   000000be  00000000  00000000  000012a8  2**0
18
                  CONTENTS, READONLY, DEBUGGING
19
  7 .debug_abbrev 00000014  00000000  00000000  00001366  2**0
20
                  CONTENTS, READONLY, DEBUGGING
21
  8 .debug_line   00000058  00000000  00000000  0000137a  2**0
22
                  CONTENTS, READONLY, DEBUGGING
23
24
Disassembly of section .text:
25
26
00000000 <__vectors>:
27
   0:  12 c0         rjmp  .+36       ; 0x26 <__ctors_end>
28
   2:  19 c0         rjmp  .+50       ; 0x36 <__bad_interrupt>
29
   4:  18 c0         rjmp  .+48       ; 0x36 <__bad_interrupt>
30
   6:  17 c0         rjmp  .+46       ; 0x36 <__bad_interrupt>
31
   8:  16 c0         rjmp  .+44       ; 0x36 <__bad_interrupt>
32
   a:  15 c0         rjmp  .+42       ; 0x36 <__bad_interrupt>
33
   c:  14 c0         rjmp  .+40       ; 0x36 <__bad_interrupt>
34
   e:  13 c0         rjmp  .+38       ; 0x36 <__bad_interrupt>
35
  10:  12 c0         rjmp  .+36       ; 0x36 <__bad_interrupt>
36
  12:  11 c0         rjmp  .+34       ; 0x36 <__bad_interrupt>
37
  14:  10 c0         rjmp  .+32       ; 0x36 <__bad_interrupt>
38
  16:  0f c0         rjmp  .+30       ; 0x36 <__bad_interrupt>
39
  18:  0e c0         rjmp  .+28       ; 0x36 <__bad_interrupt>
40
  1a:  0d c0         rjmp  .+26       ; 0x36 <__bad_interrupt>
41
  1c:  0c c0         rjmp  .+24       ; 0x36 <__bad_interrupt>
42
  1e:  0b c0         rjmp  .+22       ; 0x36 <__bad_interrupt>
43
  20:  0a c0         rjmp  .+20       ; 0x36 <__bad_interrupt>
44
  22:  09 c0         rjmp  .+18       ; 0x36 <__bad_interrupt>
45
  24:  08 c0         rjmp  .+16       ; 0x36 <__bad_interrupt>
46
47
00000026 <__ctors_end>:
48
  26:  11 24         eor  r1, r1
49
  28:  1f be         out  0x3f, r1  ; 63
50
  2a:  cf e5         ldi  r28, 0x5F  ; 95
51
  2c:  d4 e0         ldi  r29, 0x04  ; 4
52
  2e:  de bf         out  0x3e, r29  ; 62
53
  30:  cd bf         out  0x3d, r28  ; 61
54
  32:  1e d0         rcall  .+60       ; 0x70 <main>
55
  34:  20 c0         rjmp  .+64       ; 0x76 <_exit>
56
57
00000036 <__bad_interrupt>:
58
  36:  e4 cf         rjmp  .-56       ; 0x0 <__vectors>
59
60
00000038 <susi>:
61
#include <avr/io.h>
62
#include <util/delay.h>
63
64
65
void susi(void){
66
    DDRD |= (1<<PD1)|(1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7);
67
  38:  81 b3         in  r24, 0x11  ; 17
68
  3a:  8e 6f         ori  r24, 0xFE  ; 254
69
  3c:  81 bb         out  0x11, r24  ; 17
70
    DDRC |= (1<<DDC2)|(1<<DDC3)|(1<<DDC4)|(1<<DDC5);
71
  3e:  84 b3         in  r24, 0x14  ; 20
72
  40:  8c 63         ori  r24, 0x3C  ; 60
73
  42:  84 bb         out  0x14, r24  ; 20
74
    DDRB |= (1<<DDB1)|(1<<DDB2);
75
  44:  87 b3         in  r24, 0x17  ; 23
76
  46:  86 60         ori  r24, 0x06  ; 6
77
  48:  87 bb         out  0x17, r24  ; 23
78
  4a:  08 95         ret
79
80
0000004c <test>:
81
  #else
82
    //round up by default
83
    __ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
84
  #endif
85
86
  __builtin_avr_delay_cycles(__ticks_dc);
87
  4c:  2f ef         ldi  r18, 0xFF  ; 255
88
  4e:  81 ee         ldi  r24, 0xE1  ; 225
89
  50:  94 e0         ldi  r25, 0x04  ; 4
90
  52:  21 50         subi  r18, 0x01  ; 1
91
  54:  80 40         sbci  r24, 0x00  ; 0
92
  56:  90 40         sbci  r25, 0x00  ; 0
93
  58:  e1 f7         brne  .-8        ; 0x52 <test+0x6>
94
  5a:  00 c0         rjmp  .+0        ; 0x5c <test+0x10>
95
  5c:  00 00         nop
96
    
97
}
98
99
void test(void){
100
    _delay_ms(200);
101
    PORTD |= (1<<PD7);
102
  5e:  97 9a         sbi  0x12, 7  ; 18
103
  60:  8f e1         ldi  r24, 0x1F  ; 31
104
  62:  9e e4         ldi  r25, 0x4E  ; 78
105
  64:  01 97         sbiw  r24, 0x01  ; 1
106
  66:  f1 f7         brne  .-4        ; 0x64 <test+0x18>
107
  68:  00 c0         rjmp  .+0        ; 0x6a <test+0x1e>
108
  6a:  00 00         nop
109
    _delay_ms(10);
110
    PORTD &= ~(1<<PD7);
111
  6c:  97 98         cbi  0x12, 7  ; 18
112
  6e:  08 95         ret
113
114
00000070 <main>:
115
{
116
    //Wenn die folgende Zeile nicht auskommentiert ist, funktionieren die
117
    //Pins an PORTD
118
    //DDRD |= (1<<PD1)|(1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7);
119
    
120
    susi();  // <-- Dieser Aufruf funktioniert nicht
121
  70:  e3 df         rcall  .-58       ; 0x38 <susi>
122
    while(1)
123
    {
124
        test();
125
  72:  ec df         rcall  .-40       ; 0x4c <test>
126
  74:  fe cf         rjmp  .-4        ; 0x72 <main+0x2>
127
128
00000076 <_exit>:
129
  76:  f8 94         cli
130
131
00000078 <__stop_program>:
132
  78:  ff cf         rjmp  .-2        ; 0x78 <__stop_program>

von (prx) A. K. (prx)


Lesenswert?

Christian schrieb:
> void susi(void){
>   DDRD |=
> (1<<PD1)|(1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7);
>   DDRC |= (1<<DDC2)|(1<<DDC3)|(1<<DDC4)|(1<<DDC5);
>   DDRB |= (1<<DDB1)|(1<<DDB2);
>
> }

Reduziere das mal auf genau den einen für den Test interessanten Port 
und Pin, also PD7. Dein Ersatzcode in main() enthält nur einen der 
Ports, die Susi alle. Wenn die übrigen Ports mit der Umschaltung auf 
Output einen Kurzen erzeugen, dann resetted dir u.U. der Controller weg.

: Bearbeitet durch User
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.