Forum: Compiler & IDEs Programmsprünge Funktionen


von Newbie (Gast)


Lesenswert?

Hi Leute, ich bin ein AVR Anfänger,

ich hab mir ein kleines Programm geschrieben. Jetzt frage ich mich aber, 
wieso das Programm beim Debuggen nicht in die Funktion "Initialisierung" 
springen will.

1
#include <avr/io.h>
2
#include <avr/iom644p.h>
3
#include <avr/interrupt.h>
4
#include <math.h>
5
#include <stdlib.h>
6
#include <avr/pgmspace.h>
7
#include <avr/wdt.h>
8
#include <avr/alloca.h>
9
#include <avr/inttypes.h>
10
#include <util/delay.h>
11
#include <avr/eeprom.h>
12
#include <avr/cpufunc.h>
13
#include <avr/common.h>
14
#include <avr/twislave.h>
15
16
#ifndef F_CPU
17
#define F_CPU 16000000UL
18
#endif
19
20
//###################### Slave-Adresse
21
#define SLAVE_ADRESSE 0x50                 // Slave-Adresse
22
23
//###################### Macros
24
#define uniq(LOW,HEIGHT)  ((HEIGHT << 8)|LOW)      // 2x 8Bit   --> 16Bit
25
#define LOW_BYTE(x)          (x & 0xff)          // 16Bit   --> 8Bit
26
#define HIGH_BYTE(x)         ((x >> 8) & 0xff)      // 16Bit   --> 8Bit
27
28
29
30
31
32
#define sbi(ADDRESS,BIT)   ((ADDRESS) |= (1<<(BIT)))  // set Bit
33
#define cbi(ADDRESS,BIT)   ((ADDRESS) &= ~(1<<(BIT)))  // clear Bit
34
#define  toggle(ADDRESS,BIT)  ((ADDRESS) ^= (1<<BIT))    // Bit umschalten
35
36
#define  bis(ADDRESS,BIT)  (ADDRESS & (1<<BIT))    // bit is set?
37
#define  bic(ADDRESS,BIT)  (!(ADDRESS & (1<<BIT)))    // bit is clear?
38
39
40
41
void Initialisierung(void)
42
  {
43
  cli();
44
  //### PORTS  
45
  
46
  //### TWI 
47
  init_twi_slave(SLAVE_ADRESSE);      //TWI als Slave mit Adresse slaveadr starten 
48
  
49
  sei();
50
  }
51
  
52
53
int main()
54
{
55
  while(1)
56
  {
57
    Initialisierung();
58
  }
59
}

von Helfer (Gast)


Lesenswert?

Debugger (welcher?) falsch angeschlossen (JTAG) oder bedient (AVR Studio 
u.a.)?

von Ralf (Gast)


Lesenswert?

Newbie schrieb:
> ich hab mir ein kleines Programm geschrieben.
Wozu dann die riesige Liste Includes?

> Jetzt frage ich mich aber,
> wieso das Programm beim Debuggen nicht in die Funktion "Initialisierung"
> springen will.

Was passiert in init_twi_slave? Wenn da (testweise) nichts drinsteht, 
dann erkennt der Compiler, dass er sich eine Endlos-Initialisierung 
sparen kann und erzeugt dafür keinen Code.

von Peter II (Gast)


Lesenswert?

Ralf schrieb:
> Was passiert in init_twi_slave? Wenn da (testweise) nichts drinsteht,
> dann erkennt der Compiler, dass er sich eine Endlos-Initialisierung
> sparen kann und erzeugt dafür keinen Code.

das cli und sei darf er aber nicht einsparen.

von Newbie (Gast)


Lesenswert?

Ich verwende das AVR Studio 5, die Optimierungen sind deaktiviert.

die Liste includes steht umsonst da, schon klar, dass es die nicht 
braucht. Ich hab sie aber mal lieber mit reingeschrieben, nicht, dass es 
was damit zu tun hat.

Bei mir springt der Debugger nur bei Interrupts

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Schreib mal ein reales Stück Programm statt eines nutzlosen Beispiels.

von Newbie (Gast)


Lesenswert?

1
#include <avr/io.h>
2
#include <avr/iom644p.h>
3
#include <avr/interrupt.h>
4
#include <math.h>
5
#include <stdlib.h>
6
#include <avr/pgmspace.h>
7
#include <avr/wdt.h>
8
#include <avr/alloca.h>
9
#include <avr/inttypes.h>
10
#include <util/delay.h>
11
#include <avr/eeprom.h>
12
#include <avr/cpufunc.h>
13
#include <avr/common.h>
14
#include <avr/lcd.h>
15
16
#include <avr/twislave.h>
17
18
#ifndef F_CPU
19
#define F_CPU 16000000UL
20
#endif
21
22
// Slave-Adresse
23
#define SLAVE_ADRESSE 0x50               
24
25
// Macros
26
#define uniq(LOW,HEIGHT)  ((HEIGHT << 8)|LOW)      // 2x 8Bit   --> 16Bit
27
#define LOW_BYTE(x)          (x & 0xff)          // 16Bit   --> 8Bit
28
#define HIGH_BYTE(x)         ((x >> 8) & 0xff)      // 16Bit   --> 8Bit
29
30
31
32
33
34
#define sbi(ADDRESS,BIT)   ((ADDRESS) |= (1<<(BIT)))  // set Bit
35
#define cbi(ADDRESS,BIT)   ((ADDRESS) &= ~(1<<(BIT)))  // clear Bit
36
#define  toggle(ADDRESS,BIT)  ((ADDRESS) ^= (1<<BIT))    // Bit umschalten
37
38
#define  bis(ADDRESS,BIT)  (ADDRESS & (1<<BIT))    // bit is set?
39
#define  bic(ADDRESS,BIT)  (!(ADDRESS & (1<<BIT)))    // bit is clear?
40
41
42
//Zeit
43
44
volatile uint32_t millisekunden;
45
volatile uint32_t millisekunden_debug;
46
47
48
int init_I2C()
49
  {
50
  cli();
51
  //### PORTS  
52
  
53
  //### TWI 
54
  init_twi_slave(SLAVE_ADRESSE);      //TWI als Slave mit Adresse slaveadr starten 
55
  
56
  sei();
57
return 0;
58
  }
59
60
61
int init_timer()
62
{
63
  TCNT2   = 0;        //Timer auf 0 zurücksetzen
64
   TCCR2A |=(1<<WGM21);                  //1)Timer 2 mit CTC Modus aktivieren
65
   TCCR2B |= (1<<CS00) | (0<<CS01) | (1<<CS02);    //Prescaler 128
66
   //TCCR2B |= (1<<CS00) | (0<<CS01) | (0<<CS02);    //Prescaler 1
67
   TIMSK2|=(1<<OCIE2A);                   //3)Compare Interrupt aktivieren
68
   OCR2A=124;        //Compare Wert 124
69
   
70
   // I2C Interface einschalten
71
   
72
   Initialisierung();
73
   
74
   // Interrupts einschalten
75
   
76
  sei();
77
78
return 0;
79
  
80
}
81
82
int init_adc()
83
{
84
  ADCSRA |= (1 <<ADPS2) | (1 <<ADPS1) | (1 <<ADPS0);  // Setze ADC Prescaler auf 128 - 125KHz Abtastrate @ 16MHz
85
86
  ADMUX |= (1 <<REFS0); // Setze ADC Verweis auf AVCC
87
  ADMUX |= (1 <<ADLAR); // Links anpassen ADC Ergebnis leicht 8-Bit-Lesung ermöglichen
88
89
  // Keine MUX Werte erforderlich geändert werden, um ADC0 nutzen
90
91
  ADCSRA |= (1 <<ADATE); // Setze ADC Freilauf
92
  ADCSRA |= (1 <<ADEN); // Enable ADC
93
94
  ADCSRA |= (1 <<ADIE); // Enable ADC Interrupt
95
  sei ();    // aktiviere Global Interrupts      //wird schon oben gemacht
96
97
  ADCSRA |= (1 <<ADSC); // Start A2D Konvertierungen 
98
  
99
  return 0;
100
}
101
102
103
int main()
104
{
105
  wdt_disable();
106
  init_timer();
107
  init_adc();
108
  init_I2C();
109
  
110
  while(1)
111
  {
112
    
113
  }
114
}
115
116
117
ISR (TIMER2_COMPA_vect)              //5)Führe diese ISR aus wenn TCNT2==OCR2
118
{
119
   millisekunden++;
120
   millisekunden_debug=ceil(millisekunden/1000);
121
   DDRA = millisekunden_debug;
122
   PORTA = millisekunden_debug;
123
   
124
   
125
   //TCNT2   = 0;      //Timer2 auf 0 setzen, wichtig!!!!
126
   /*if(millisekunden==1000)
127
   {
128
  //DDRC = sekunde;
129
    //PORTC = sekunde;
130
131
   }*/
132
}
133
134
135
136
ISR (ADC_vect)
137
{
138
  PORTB= ADCH;
139
  DDRB = ~ADCH;
140
  if (ADCH < 21 && ADCH >= 0)
141
  {
142
    
143
  } 
144
  if (ADCH >=21 && ADCH <42)
145
  {
146
    
147
  } 
148
  if (ADCH >=42 && ADCH <63)
149
  {
150
    
151
  } 
152
  if (ADCH >=63 && ADCH <84)
153
  {
154
    
155
  } 
156
  if (ADCH >=84 && ADCH <105)
157
  {
158
    
159
  } 
160
  if (ADCH >=105 && ADCH <126)
161
  {
162
    
163
  } 
164
  if (ADCH >=126 && ADCH <147)
165
  {
166
    
167
  } 
168
  if (ADCH >=147 && ADCH <168)
169
  {
170
    
171
  } 
172
  if (ADCH >=168 && ADCH <189)
173
  {
174
    
175
  } 
176
  if (ADCH >=189 && ADCH <210)
177
  {
178
    
179
  } 
180
  if (ADCH >=210 && ADCH <231)
181
  {
182
    
183
  } 
184
  if (ADCH >=231 && ADCH <=255)
185
  {
186
    
187
  } 
188
}


bei mir überspringt der die Sachen einfach oder bleibt einfach stehen.

von Newbie (Gast)


Lesenswert?

keiner?

von Helfer (Gast)


Lesenswert?

> keiner?

Ich weiss nicht, wie du den Debugger bedienst und was du erwartest bzw. 
siehst.

>> Jetzt frage ich mich aber, wieso das Programm beim Debuggen nicht in die >> 
Funktion "Initialisierung" springen will.

und

>> Bei mir springt der Debugger nur bei Interrupts

sind mir zu dünne Problembeschreibungen.

von Newbie (Gast)


Lesenswert?

ich hab keine Ahnung worans lag, jetzt macht er das was er soll, 
villeicht hab ich ja auch nur die ganze Zeit die F10 Taste gedrückt, 
anstatt der F11 Taste

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.