#define in Main ändern

Gast #2287369
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
Gast #2287390
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 ...
#2287451
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).
Gast #2292666
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
Gast #2292682
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
Gast #2292697
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
Gast #2292701
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 ?
Gast #2292707
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
}
Gast #2292713
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);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren