Forum: Compiler & IDEs #define in Main ändern


von sebastian xxlxx (Gast)


Lesenswert?

Hallo am Sonntagabend :)

ich habe oben im code :
1
#define OW_PORT D
2
#define OW_PIN  7

stehen.

wie kann ich weiter unten im code die Werte D & 7 in B & 0 ändern?

noch ein  #define OW_PORT D im code geht nicht bzw. wird nicht 
umgesetzt.

ein OW_PORT=B; geht auch nicht
ein OW_PORT="B"; geht auch nicht.

im GCC tutorial gibt es aber für mich da keine hilfe.

ich möchte einfach einen Port ändern wenn das programm läuft.

danke für die hilfe

von ogg (Gast)


Lesenswert?


von Klaus W. (mfgkw)


Lesenswert?

Oder in Kurzform:
1. mit #undef ... das alte Makro löschen (kein Problem, falls nicht 
definiert)
2. mit #define... neu definieren
3. Wozu? Wenn man schon generell mit Makros sich eher zurückhalten 
sollte, ist ein Umdefinieren meistens Blödsinn.

von sebastian xxlxx (Gast)


Lesenswert?

hmmmm vieleicht bin ich da noch zu viel Anfänger.

mein Code nach eurer info :
1
#define OW_PORT B
2
#define OW_PIN  0
3
4
5
6
// Main
7
8
void main(void) {
9
10
lcd_init();
11
while (1)
12
{
13
14
#undef OW_PORT
15
#undef OW-PIN
16
#define OW_PORT D
17
#define OW_PIN  7
18
19
     set_cursor(0,1);
20
     Read_Temperature(); // messen + Ausgabe
21
22
#undef OW_PORT
23
#undef OW-PIN
24
#define OW_PORT B
25
#define OW_PIN  0
26
27
28
     set_cursor(0,2);
29
     Read_Temperature(); // messen + Ausgabe
30
31
}

das geht aber nicht so recht ...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Erstens heisst es OW_PIN und nicht OW-PIN.

Zweitens werden die Macros überhaupt nicht verwendet, wozu also ändern?

Makros machen nur Textersatz mehr nicht.

von Klaus W. (mfgkw)


Lesenswert?

@ sebastian:
Falls du glaubst, daß sich das Definieren von OW_... in main() auf 
set_cursor() oder Read_Temperature() auswirken würde:
Nein.

Für so etwas müsstest du stattdessen entweder die Werte als Parameter 
übergeben (und in den Funktionen auch entsprechend verwenden), oder 
globale Variablen nehmen (ziemlich sicher kein schöner Weg).

von sebastian xxlxx (Gast)


Lesenswert?

hallo

ich bin lernfähig und lese mich ein aber es will nicht klappen.
das macros nur da sind um im compiler text durch text zu ersetzen habe 
ich verstanden.

jetzt nöchte ich aber globale variablen definieren.
1
#define OW_PORT D
2
#define OW_PIN  7
3
4
#define concat(a, b) a##b
5
#define indir(a, b) concat(a, b)
6
#define ow_port indir(PORT, OW_PORT)
7
#define ow_pin  indir(PIN, OW_PORT)
8
#define ow_ddr  indir(DDR, OW_PORT)

so sah das bisher aus und möchte es jetzt so setzen
1
char ow_pin=PIND;     //könnte Hex C0 sein
2
char ow_port=PORTD;   //könnte Hex 00 sein
3
char ow_ddr=DDRD;     //könnte Hex 3F sein
4
char OW_PIN=7;

mit OW_PIN=7; geht das auch. aber PIND geht nicht da kein char denke ich 
mal.  Wie kann ich PIND,PORTD,DDRD in eine Variable übergeben?
da meckert der compiler :(
gibt es dafür adressen (hexwerte)?

danke
Sebastian

von Michael (Gast)


Lesenswert?

PIND, PORTD und DDRD sind Pointer auf 8bit Register im Speicher:

volatile char* ow_pin = PIND;
volatile char* ow_port = PORTD;
volatile char* ow_ddr = DDRD;
char OW_PIN = 7;

Viele Grüße!
Michael

von Michael (Gast)


Lesenswert?

Ach ich erzähle Schwachsinn!

volatile char* ow_pin = &PIND;
volatile char* ow_port = &PORTD;
volatile char* ow_ddr = &DDRD;
char OW_PIN = 7;

Zum setzen des Pins könnte man dann soetwas tun:

*ow_port |= (1 << OW_PIN);

Viele Grüße!
Michael

von sebastian xxlxx (Gast)


Lesenswert?

Hallo

danke für die schnelle hilfe.
aber so einfach wie ich dachte ist das nicht :(
ich dachte ich ersetze die #define durch variablen.
jetzt kommen aber noch mehr fehler.

schade das der 1Wire code so viel define nutzt.

gibt es eine einfach art so eine Funktion
1
static inline void clear_dq(void)
2
        {
3
          ow_port &= ~(1 << OW_PIN);
4
          ow_ddr  |= (1 << OW_PIN);
5
        }

wo OW_PIN, ow_port , ow_ddr  steht die parameter zu übergeben ?

der ganze code ist voll davon und das define setzt dort werte beim 
comperlieren ein. ich möchte aber diese ports in der laufzeit ändern.
wo muss ich bei dieser funktion ansetzen ?

von sebastian xxlxx (Gast)


Lesenswert?

ich poste mal den code komplett
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include "delay.h"
4
#include <util/delay.h>
5
#include <string.h>
6
#include <stdlib.h>
7
#include <util/crc16.h>
8
#include <stdio.h>
9
10
11
#ifndef F_CPU
12
#define F_CPU 8000000
13
#endif
14
15
16
//1wire port
17
//#define OW_PORT D
18
//#define OW_PIN  7
19
20
extern bool ow_reset(void);
21
#define concat(a, b) a##b
22
#define indir(a, b) concat(a, b)
23
//#define ow_port indir(PORT, OW_PORT)
24
//#define ow_pin  indir(PIN, OW_PORT)
25
//#define ow_ddr  indir(DDR, OW_PORT)
26
#define uchar unsigned char
27
 
28
//char ow_pin=PIND;
29
//char ow_port=PORTD;
30
//char ow_ddr=DDRD;
31
char OW_PIN=7;
32
33
volatile char* ow_pin = &PIND;
34
volatile char* ow_port = &PORTD;
35
volatile char* ow_ddr = &DDRD;
36
37
38
39
static void hw_init(void) 
40
        {
41
          //DDRB = 0x2F;
42
          //PORTB = 0xFE;
43
          //DDRD = 0x12;  // Input-Port, außer TxD
44
          //PORTD = 0xEF;  // Pull-Ups aktivieren
45
46
          //TIMSK1 = 2;
47
        }
48
49
50
static inline void clear_dq(void)
51
        {
52
          ow_port &= ~(1 << OW_PIN);
53
          ow_ddr  |= (1 << OW_PIN);
54
        }
55
56
57
static inline void set_dq(void)
58
        {
59
          ow_port &= ~(1 << OW_PIN);
60
          ow_ddr  &= ~(1 << OW_PIN);
61
        }
62
63
64
static inline uint8_t get_dq(void)
65
        {
66
          return (ow_pin & (1 << OW_PIN)) == 0;
67
        }
68
69
70
bool ow_reset(void)
71
        {
72
          bool presence;
73
74
          cli();
75
          clear_dq();
76
          _delay_ms(0.48);
77
          set_dq();
78
          _delay_ms(0.07);
79
          presence = get_dq();
80
          sei();
81
          _delay_ms(0.24);
82
83
          return presence;
84
        }
85
86
static uint8_t ow_read_bit(void)
87
        {
88
          bool res;
89
90
          cli();
91
          clear_dq();
92
          set_dq();
93
          _delay_us(15);
94
95
          res = get_dq();
96
          sei();
97
          _delay_us(60);
98
99
          return res? 0: 1;
100
        }
101
102
103
static void ow_write_bit(bool bit)
104
        {
105
          cli();
106
          clear_dq();
107
          if (bit)
108
            set_dq();
109
          _delay_ms(0.1);
110
          set_dq();
111
          sei();
112
        }
113
114
115
uint8_t ow_read_byte(void)
116
        {
117
          uint8_t i;
118
          uint8_t val = 0, mask;
119
120
          for (i = 0, mask = 1; i < 8; i++, mask <<= 1)
121
            {
122
              if (ow_read_bit())
123
                val |= mask;
124
              _delay_ms(0.1);
125
            }
126
127
          return val;
128
        }
129
130
131
void ow_write_byte(uint8_t val)
132
        {
133
          uint8_t i;
134
          uint8_t mask;
135
136
          for (i = 0, mask = 1; i < 8; i++, mask <<= 1)
137
            {
138
              ow_write_bit(val & mask);
139
            }
140
          _delay_ms(0.1);
141
        }
142
143
144
uint8_t ow_checkcrc(uint8_t *data, uint8_t nbytes)
145
        {
146
          uint8_t crc = 0, i;
147
148
          for (i = 0; i < nbytes; i++)
149
            crc = _crc_ibutton_update(crc, data[i]);
150
151
          return crc; // must be 0
152
        }
153
154
155
156
static void Read_Temperature(void)
157
        {
158
          uint8_t get[9];
159
          uint8_t k;
160
          uchar s[30];
161
      
162
163
164
165
          ow_reset();
166
          ow_write_byte(0xCC); //Skip ROM
167
          ow_write_byte(0x44); // Start Conversion
168
           //for (i = 0; i < 750; i++)
169
          //  _delay_ms(1);
170
          _delay_ms(1000);
171
          ow_reset();
172
          ow_write_byte(0xCC); // Skip ROM
173
          ow_write_byte(0xBE); // Read Scratch Pad
174
  
175
          for (k = 0; k < 9; k++){
176
            get[k] = ow_read_byte();
177
          //lcd_data(get[k]);
178
179
          }
180
          k = ow_checkcrc(get, 9);
181
182
  
183
184
      
185
          
186
        
187
188
          if (get[1] == 0x00)   // + vorzeichen
189
              {lcd_string("+");} 
190
191
            if (get[1] == 0xFF)    // - vorzeichen 
192
            {lcd_string("-");
193
            get[0]=255-get[0];    // minuswerte invertieren 
194
            }
195
     
196
          get[0]=get[0]/2;
197
          
198
          //sprintf( (char*)s, "%04Xh", get[0] );  // hex value
199
          sprintf( (char*)s, "%3d Grad", get[0]  ); // 1 Grad Dez
200
         
201
                    lcd_string( (char*)s );
202
 
203
        }
204
205
206
207
// Main
208
209
210
void main(void) {
211
    
212
  uchar s[30];
213
214
  hw_init();
215
  lcd_init();
216
217
while (1)
218
{
219
220
 
221
    set_cursor(0,1);
222
     Read_Temperature(); // messen + Ausgabe
223
224
}
225
  
226
}

von Michael (Gast)


Lesenswert?

Halbwegs elegant könntest du dir ein Port struct definieren:

struct port
{
  volatile char*  port;
  volatile char*  pin;
  volatile char*  ddr;
  uint8_t  bit;
};

Deine Funktionen abändern, dass sie so ein Port struct annehmen, z.B.:

static inline void clear_dq(const struct port* port)
{
    *port->port &= ~(1 << port->bit);
    *port->ddr  |= (1 << port->bit);
}

Und dann diese Funktion mit einer Instanz des Port structs aufrufen:

static const struct port toller_port = { &PORTD, &PIND, &DDRD, PD6 };

clear_dq(&toller_port);

von Klaus W. (mfgkw)


Lesenswert?

Nicht vielleicht besser uint8_t statt char?

von sebastian xxlxx (Gast)


Lesenswert?

hallo

danke - wusste gar nicht das es sowas gibt... werde ich heute nacht 
testen ...

von sebastian xxlxx (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Nicht vielleicht besser uint8_t statt char?


hat er recht ?

von Karl H. (kbuchegg)


Lesenswert?

sebastian xxlxx schrieb:
> Klaus Wachtler schrieb:
>> Nicht vielleicht besser uint8_t statt char?
>
>
> hat er recht ?

hat er.

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.