Forum: Mikrocontroller und Digitale Elektronik Wie verbindet man STM32 über I2C und HAL mit AD7746?


von Michael R. (hellm)


Lesenswert?

Hallo.

Wie verbindet man STM32 über I2C und HAL mit AD7746?

Ich schicke ein Signal an AD7746 und erwarte eine Antwort (s.Datenblatt 
S.12). Wenn sie vorhanden ist, blinke ich mit der 
Diode(STM32F303RE-Nucleo). I2C3 ist initialisiert. Die Interrupts sind 
eingeschaltet. Unten ist der Code, der einen Fehler ausgibt.

Code:
1
uint8_t aTxBuffer[] = " ****I2C_TwoBoards communication based on IT****  ****I2C_TwoBoards communication based on IT****  ****I2C_TwoBoards communication based on IT**** ";
2
void HAL_I2C_Master_Transmit_IT(&hi2c3, 0x91, &aTxBuffer, 32)
3
{
4
}
5
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *I2cHandle)
6
{
7
  if (HAL_I2C_Master_Receive_IT(&hi2c3, 0x90, &aTxBuffer, 32) == HAL_OK)
8
  {
9
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
10
    //HAL_Delay(100);
11
  }
12
}

Fehler:
1
..\Src\main.c:97:40: error: expected ')' before numeric constant
2
 void HAL_I2C_Master_Transmit_IT(hi2c3, 0x91, aTxBuffer, 1);

Wie soll ich letztendlich vorgehen, um den Fehler zu beheben?

Danke im Voraus.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Michael R. schrieb:
> Ich schicke ein "Hallo" an AD7746 und erwarte eine Antwort

Das ist ein A/D Wandler, kein Mensch. Erwartest du wirklich, dass er auf 
diesen Text reagiert und irgend etwas Menschen-lesbares antwortet?
1
void HAL_I2C_Master_Transmit_IT(&hi2c3, 0x91, &aTxBuffer, 32)
2
{
3
}

Falls du da eine Funktion aufrufen wolltest, dann geht das sicher so:
1
HAL_I2C_Master_Transmit_IT(&hi2c3, 0x91, &aTxBuffer, 32);

Ich würde Dir empfehlen, zuerst die Programmiersprache C auf einem PC zu 
lernen, bevor du die HAL benutzt. Dazu empfehle ich Dir die QT Creator 
IDE weil da alles drin ist, was du brauchst. Damit erstellst du Projekte 
vom Typ  "Projekt ohne Qt", "Reine C-Anwendung". Besorge Dir ein 
Einsteiger-Buch für C oder nimm das: 
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/

von Michael R. (hellm)


Lesenswert?

Stefan F. schrieb:

> Das ist ein A/D Wandler, kein Mensch.

Umgangssprachlich. Ich würde sonst schreiben nach dem Motto: ...einen 
Text "Hallo". Lass dich dadurch nicht irritieren.

Stefan F. schrieb:
> Ich würde Dir empfehlen,...

Dafür danke. Mit C komme ich klar, Perepherie-Programmierung gelingt mir 
schwieriger.

Stefan F. schrieb:
> Falls du da eine Funktion...

Danke für deine Antwort. Ich bekomme dann diese Fehler:

1
..\Src\main.c:97:28: error: expected declaration specifiers or '...' before '&' token
2
 HAL_I2C_Master_Transmit_IT(&hi2c3, 0x91, &aTxBuffer, 32);
3
                            ^
4
..\Src\main.c:97:36: error: expected declaration specifiers or '...' before numeric constant
5
 HAL_I2C_Master_Transmit_IT(&hi2c3, 0x91, &aTxBuffer, 32);
6
                                    ^~~~
7
..\Src\main.c:97:42: error: expected declaration specifiers or '...' before '&' token
8
 HAL_I2C_Master_Transmit_IT(&hi2c3, 0x91, &aTxBuffer, 32);
9
                                          ^
10
..\Src\main.c:97:54: error: expected declaration specifiers or '...' before numeric constant
11
 HAL_I2C_Master_Transmit_IT(&hi2c3, 0x91, &aTxBuffer, 32);
12
                                                      ^~

von Sebastian R. (sebastian_r569)


Lesenswert?

Michael R. schrieb:
> Wie soll ich letztendlich vorgehen, um den Fehler zu beheben?

- Lernen, wie Funktionsaufrufe in C aussehen
- Lernen, wie die I2C-Kommunikation aussieht und welche Befehle dein 
AD-Wandler erwartet und verstehen kann und wie er darauf antwortet

von Michael R. (hellm)


Lesenswert?

Sebastian R. schrieb:
> - Lernen, wie Funktionsaufrufe...

Du hast meine Frage nicht verstanden. Ich wollte wissen, wie man mit 
HAL-Funktionen mittels interrupt den I2C-Übertragung realisiert. Wie das 
Protokoll von I2C funktioniert, weiß ich Bescheid.

Sebastian R. schrieb:
> - Lernen, wie die I2C-Kommunikation...

Schon genug gelernt, jetzt bitte ich um außerstehende (menschliche) 
Hilfe.

AD7746 erwartet eine Anfrage mit seiner Adresse je nach Bedürftigkeit 
schreiben/lesen (S.12 des Datenblattes). Wenn ich aber meinen Code 
kompiliere auch in der Form:
1
HAL_I2C_Master_Transmit_IT(&hi2c3, 0x91, &aTxBuffer, 32);

bekomme ich einen Fehler, den ich schon beschrieben habe.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Michael R. schrieb:
>> Das ist ein A/D Wandler, kein Mensch.
> Umgangssprachlich.

Aber dein Quelltext sendet die ersten 32 Zeichen von " ****I2C_TwoBoards 
communication based on IT****  ****I2C_TwoBoards communication based on 
IT****  ****I2C_TwoBoards communication based on IT**** " and den ADC. 
Ist das dein Ernst? Das ist doch noch Sinnloser, als "Hallo"!

Michael R. schrieb:
> Mit C komme ich klar

Nein, offenbar nicht. Sonst hättest du nicht gefragt. Deine aktuellen 
Probleme sind völlig unabhängig von der HAL. Es geht hier rein um die 
Programmiersprache C. Deswegen meine Empfehlung, zuerst C zu lernen. 
Sonst hast du zwei offene Baustellen mit zu vielen Unbekannten 
gleichzeitig. Mache Dir das leben nicht unnötig schwer!

Dein neues Problem ist offenbar, dass die Funktion 
HAL_I2C_Master_Transmit_IT nicht existiert bzw. in einer Header Datei 
definiert ist, die du nicht inkludiert hast.

Zeigt deine IDE das nicht bereits unmissverständlich mit einer roten 
Schlängel-Linie an?

Noch eine Unstimmigkeit: Es sollte aTxBuffer nicht &aTxBuffer heißen. 
Denn die Namen von Arrays zerfallen automatisch zu "Adresse vom Array", 
wenn man sie als Parameter beim Funktionsaufruf verwendet.

Das sind wirklich die grundlegendsten C Grundlagen.

von Johannes S. (Gast)


Lesenswert?

Michael R. schrieb:
> &aTxBuffer

ist auf jeden Fall auch falsch, entweder
1
TxBuffer
oder
1
&TxBuffer[0]

&hi2c3 für Adresse von Handle ist richtig.

Wenn fehlende Deklarationen angemeckert werden ist jetzt noch was 
anderes kaputt gemacht worden, wie Stefan schon schrieb.

von Michael R. (hellm)


Lesenswert?

Stefan F. schrieb:
> Aber dein Quelltext sendet die ersten 32 Zeichen von...

Hab' aus dem Beispieldatei von ST übernommen. Ich dachte, es auch später 
für EEPROM zu benutzen, deswegen so gelassen (zum Testen im EEPROM). 
Außerdem dachte ich mir, es wäre zum Test von I2C nicht so wichtig, 
oder.

Stefan F. schrieb:
> Deswegen meine Empfehlung, zuerst C zu lernen.

Danke. Es scheint, dass du dich um mich Sorgen machst. Es ist sehr 
wertvoll in meinen Augen.

Stefan F. schrieb:
> Dein neues Problem ist offenbar, dass die Funktion...

Sie existiert. Und inkludiert. Ich habe deinem Rat gefolgt und direkt in 
main.h eingeschlossen. Ohne Effekt leider.

Stefan F. schrieb:
> Zeigt deine IDE das nicht bereits unmissverständlich mit einer roten
> Schlängel-Linie an?

Ja, tut es.((

Stefan F. schrieb:
> Das sind wirklich die grundlegendsten C Grundlagen.

Danke für den Link auf das Buch.

von Johannes S. (Gast)


Lesenswert?

dann können dem Compiler immer noch die Suchpfade für die includes 
fehlen.

von Joachim B. (jar)


Lesenswert?

Michael R. schrieb:
> Schon genug gelernt

wie passt das zu:

Michael R. schrieb:
> void HAL_I2C_Master_Transmit_IT(&hi2c3, 0x91, &aTxBuffer, 32)

aTxBuffer ist die Adresse, alternativ wurde ja schon genannt
&aTxBuffer[0]

Johannes S. schrieb:
> ist auf jeden Fall auch falsch, entwederTxBuffer
> oder&TxBuffer[0]

fast, er hat es aber aTxBuffer[] genannt.

von Stefan F. (Gast)


Lesenswert?

Michael R. schrieb:
> Außerdem dachte ich mir, es wäre zum Test von I2C nicht so wichtig

Also hast du doch keine Ahnung von I²C. Aber egal, lerne erst einmal C, 
das brauchst du als Grundlage.

von Stefan F. (Gast)


Lesenswert?

Michael R. schrieb:
>> Dein neues Problem ist offenbar, dass die Funktion...
>
> Sie existiert. Und inkludiert. Ich habe deinem Rat gefolgt und direkt in
> main.h eingeschlossen. Ohne Effekt leider.

Kann nicht sein. Eine Header Datei, die man einbindet, hat immer einen 
Effekt. Vielleicht hast du die falsche Datei eingebunden. Leider reicht 
meine Hellseher-Kraft nicht bis zu deinem Bildschirm, und auf noch mehr 
Raten habe ich gerade keine Lust.

von Joachim B. (jar)


Lesenswert?

dann braucht man den ganzen Code um den Fehler zu sehen

Michael R. schrieb:
> Fehler:..\Src\main.c:97:40: error: expected ')' before numeric constant
>  void HAL_I2C_Master_Transmit_IT(hi2c3, 0x91, aTxBuffer, 1);

zumal wir Line 97 nur raten können main.c:97:40:

Klammer falsch sage ich mal :) oder davor ; vergessen!

: Bearbeitet durch User
von Michael R. (hellm)


Angehängte Dateien:

Lesenswert?

Johannes S. schrieb:
> dann können dem Compiler immer noch die Suchpfade für die includes
> fehlen.

Danke. Wo finde ich sie?

Stefan F. schrieb:
> Also hast du doch keine Ahnung von I²C. Aber egal, lerne erst einmal C,
> das brauchst du als Grundlage.

Du meinst, ich soll den Array auf acht Bits beschränken und den Text 
komplett löschen?

Was fehlt mir an dem Verständnis von C? Welche Bereiche würdest du mir 
empfehlen?

Stefan F. schrieb:
> Leider reicht
> meine Hellseher-Kraft nicht...

Aha, so klingt heutzutage die Frage: Welche Dateien hast du angebunden?
Gerne! Ich habe einen Sreenshot für dich gemacht. Wie weiß ich, dass die 
Datei angebunden ist?

von Stefan F. (Gast)


Lesenswert?

Michael R. schrieb:
> Du meinst, ich soll den Array auf acht Bits beschränken und den Text
> komplett löschen?

Du musst das Senden, was der ADC benötigt. Ein Text wird es jedenfalls 
nicht sein. Lies das Datenblatt, nachdem du C gelernt hast.

von Michael R. (hellm)


Lesenswert?

1
/* USER CODE BEGIN Header */
2
/**
3
  ******************************************************************************
4
  * @file           : main.c
5
  * @brief          : Main program body
6
  ******************************************************************************
7
  ** This notice applies to any and all portions of this file
8
  * that are not between comment pairs USER CODE BEGIN and
9
  * USER CODE END. Other portions of this file, whether 
10
  * inserted by the user or by software development tools
11
  * are owned by their respective copyright owners.
12
  *
13
  * COPYRIGHT(c) 2019 STMicroelectronics
14
  *
15
  * Redistribution and use in source and binary forms, with or without modification,
16
  * are permitted provided that the following conditions are met:
17
  *   1. Redistributions of source code must retain the above copyright notice,
18
  *      this list of conditions and the following disclaimer.
19
  *   2. Redistributions in binary form must reproduce the above copyright notice,
20
  *      this list of conditions and the following disclaimer in the documentation
21
  *      and/or other materials provided with the distribution.
22
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
23
  *      may be used to endorse or promote products derived from this software
24
  *      without specific prior written permission.
25
  *
26
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
30
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
34
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
  *
37
  ******************************************************************************
38
  */
39
/* USER CODE END Header */
40
41
/* Includes ------------------------------------------------------------------*/
42
#include "main.h"
43
44
/* Private includes ----------------------------------------------------------*/
45
/* USER CODE BEGIN Includes */
46
47
/* USER CODE END Includes */
48
49
/* Private typedef -----------------------------------------------------------*/
50
/* USER CODE BEGIN PTD */
51
52
/* USER CODE END PTD */
53
54
/* Private define ------------------------------------------------------------*/
55
/* USER CODE BEGIN PD */
56
57
/* USER CODE END PD */
58
59
/* Private macro -------------------------------------------------------------*/
60
/* USER CODE BEGIN PM */
61
62
/* USER CODE END PM */
63
64
/* Private variables ---------------------------------------------------------*/
65
I2C_HandleTypeDef hi2c1;
66
I2C_HandleTypeDef hi2c3;
67
68
UART_HandleTypeDef huart2;
69
70
/* USER CODE BEGIN PV */
71
72
/* USER CODE END PV */
73
74
/* Private function prototypes -----------------------------------------------*/
75
void SystemClock_Config(void);
76
static void MX_GPIO_Init(void);
77
static void MX_USART2_UART_Init(void);
78
static void MX_I2C3_Init(void);
79
static void MX_I2C1_Init(void);
80
/* USER CODE BEGIN PFP */
81
82
/* USER CODE END PFP */
83
84
/* Private user code ---------------------------------------------------------*/
85
/* USER CODE BEGIN 0 */
86
/*#define MASTER_BOARD
87
#define COUNTOF(__BUFFER__)   (sizeof(__BUFFER__) / sizeof(*(__BUFFER__)))*/
88
uint8_t aTxBuffer[] = " ****I2C_TwoBoards communication based on IT****  ****I2C_TwoBoards communication based on IT****  ****I2C_TwoBoards communication based on IT**** ";
89
90
91
92
HAL_I2C_Master_Transmit_IT(&hi2c3, 0x91, aTxBuffer, 32);
93
94
95
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *I2cHandle)
96
{
97
  
98
  HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
99
    
100
  
101
}
102
103
104
/* USER CODE END 0 */
105
106
/**
107
  * @brief  The application entry point.
108
  * @retval int
109
  */
110
int main(void)
111
{
112
  /* USER CODE BEGIN 1 */
113
114
  /* USER CODE END 1 */
115
116
  /* MCU Configuration--------------------------------------------------------*/
117
118
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
119
  HAL_Init();
120
121
  /* USER CODE BEGIN Init */
122
123
  /* USER CODE END Init */
124
125
  /* Configure the system clock */
126
  SystemClock_Config();
127
128
  /* USER CODE BEGIN SysInit */
129
130
  /* USER CODE END SysInit */
131
132
  /* Initialize all configured peripherals */
133
  MX_GPIO_Init();
134
  MX_USART2_UART_Init();
135
  MX_I2C3_Init();
136
  MX_I2C1_Init();
137
  /* USER CODE BEGIN 2 */
138
139
  /* USER CODE END 2 */
140
141
  /* Infinite loop */
142
  /* USER CODE BEGIN WHILE */
143
  while (1)
144
  {
145
    /* USER CODE END WHILE */
146
147
    /* USER CODE BEGIN 3 */
148
  }
149
  /* USER CODE END 3 */
150
}
151
152
/**
153
  * @brief System Clock Configuration
154
  * @retval None
155
  */
156
void SystemClock_Config(void)
157
{
158
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
159
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
160
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
161
162
  /**Initializes the CPU, AHB and APB busses clocks 
163
  */
164
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
165
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
166
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
167
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
168
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
169
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
170
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
171
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
172
  {
173
    Error_Handler();
174
  }
175
  /**Initializes the CPU, AHB and APB busses clocks 
176
  */
177
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
178
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
179
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
180
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
181
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
182
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
183
184
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
185
  {
186
    Error_Handler();
187
  }
188
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_I2C1
189
                              |RCC_PERIPHCLK_I2C3;
190
  PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
191
  PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI;
192
  PeriphClkInit.I2c3ClockSelection = RCC_I2C3CLKSOURCE_HSI;
193
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
194
  {
195
    Error_Handler();
196
  }
197
}
198
199
/**
200
  * @brief I2C1 Initialization Function
201
  * @param None
202
  * @retval None
203
  */
204
static void MX_I2C1_Init(void)
205
{
206
207
  /* USER CODE BEGIN I2C1_Init 0 */
208
209
  /* USER CODE END I2C1_Init 0 */
210
211
  /* USER CODE BEGIN I2C1_Init 1 */
212
213
  /* USER CODE END I2C1_Init 1 */
214
  hi2c1.Instance = I2C1;
215
  hi2c1.Init.Timing = 0x2000090E;
216
  hi2c1.Init.OwnAddress1 = 0;
217
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
218
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
219
  hi2c1.Init.OwnAddress2 = 0;
220
  hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
221
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
222
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
223
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
224
  {
225
    Error_Handler();
226
  }
227
  /**Configure Analogue filter 
228
  */
229
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
230
  {
231
    Error_Handler();
232
  }
233
  /**Configure Digital filter 
234
  */
235
  if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
236
  {
237
    Error_Handler();
238
  }
239
  /* USER CODE BEGIN I2C1_Init 2 */
240
241
  /* USER CODE END I2C1_Init 2 */
242
243
}
244
245
/**
246
  * @brief I2C3 Initialization Function
247
  * @param None
248
  * @retval None
249
  */
250
static void MX_I2C3_Init(void)
251
{
252
253
  /* USER CODE BEGIN I2C3_Init 0 */
254
255
  /* USER CODE END I2C3_Init 0 */
256
257
  /* USER CODE BEGIN I2C3_Init 1 */
258
259
  /* USER CODE END I2C3_Init 1 */
260
  hi2c3.Instance = I2C3;
261
  hi2c3.Init.Timing = 0x2000090E;
262
  hi2c3.Init.OwnAddress1 = 0;
263
  hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
264
  hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
265
  hi2c3.Init.OwnAddress2 = 0;
266
  hi2c3.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
267
  hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
268
  hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
269
  if (HAL_I2C_Init(&hi2c3) != HAL_OK)
270
  {
271
    Error_Handler();
272
  }
273
  /**Configure Analogue filter 
274
  */
275
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c3, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
276
  {
277
    Error_Handler();
278
  }
279
  /**Configure Digital filter 
280
  */
281
  if (HAL_I2CEx_ConfigDigitalFilter(&hi2c3, 0) != HAL_OK)
282
  {
283
    Error_Handler();
284
  }
285
  /* USER CODE BEGIN I2C3_Init 2 */
286
287
  /* USER CODE END I2C3_Init 2 */
288
289
}
290
291
/**
292
  * @brief USART2 Initialization Function
293
  * @param None
294
  * @retval None
295
  */
296
static void MX_USART2_UART_Init(void)
297
{
298
299
  /* USER CODE BEGIN USART2_Init 0 */
300
301
  /* USER CODE END USART2_Init 0 */
302
303
  /* USER CODE BEGIN USART2_Init 1 */
304
305
  /* USER CODE END USART2_Init 1 */
306
  huart2.Instance = USART2;
307
  huart2.Init.BaudRate = 38400;
308
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
309
  huart2.Init.StopBits = UART_STOPBITS_1;
310
  huart2.Init.Parity = UART_PARITY_NONE;
311
  huart2.Init.Mode = UART_MODE_TX_RX;
312
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
313
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
314
  huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
315
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
316
  if (HAL_UART_Init(&huart2) != HAL_OK)
317
  {
318
    Error_Handler();
319
  }
320
  /* USER CODE BEGIN USART2_Init 2 */
321
322
  /* USER CODE END USART2_Init 2 */
323
324
}
325
326
/**
327
  * @brief GPIO Initialization Function
328
  * @param None
329
  * @retval None
330
  */
331
static void MX_GPIO_Init(void)
332
{
333
  GPIO_InitTypeDef GPIO_InitStruct = {0};
334
335
  /* GPIO Ports Clock Enable */
336
  __HAL_RCC_GPIOC_CLK_ENABLE();
337
  __HAL_RCC_GPIOF_CLK_ENABLE();
338
  __HAL_RCC_GPIOA_CLK_ENABLE();
339
  __HAL_RCC_GPIOB_CLK_ENABLE();
340
341
  /*Configure GPIO pin Output Level */
342
  HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
343
344
  /*Configure GPIO pin : B1_Pin */
345
  GPIO_InitStruct.Pin = B1_Pin;
346
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
347
  GPIO_InitStruct.Pull = GPIO_NOPULL;
348
  HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
349
350
  /*Configure GPIO pin : LD2_Pin */
351
  GPIO_InitStruct.Pin = LD2_Pin;
352
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
353
  GPIO_InitStruct.Pull = GPIO_NOPULL;
354
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
355
  HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);
356
357
}
358
359
/* USER CODE BEGIN 4 */
360
361
/* USER CODE END 4 */
362
363
/**
364
  * @brief  This function is executed in case of error occurrence.
365
  * @retval None
366
  */
367
void Error_Handler(void)
368
{
369
  /* USER CODE BEGIN Error_Handler_Debug */
370
  /* User can add his own implementation to report the HAL error return state */
371
372
  /* USER CODE END Error_Handler_Debug */
373
}
374
375
#ifdef  USE_FULL_ASSERT
376
/**
377
  * @brief  Reports the name of the source file and the source line number
378
  *         where the assert_param error has occurred.
379
  * @param  file: pointer to the source file name
380
  * @param  line: assert_param error line source number
381
  * @retval None
382
  */
383
void assert_failed(char *file, uint32_t line)
384
{ 
385
  /* USER CODE BEGIN 6 */
386
  /* User can add his own implementation to report the file name and line number,
387
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
388
  /* USER CODE END 6 */
389
}
390
#endif /* USE_FULL_ASSERT */
391
392
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

: Bearbeitet durch User
von Michael R. (hellm)


Lesenswert?

Stefan F. schrieb:
> Du musst das Senden, was der ADC benötigt. Ein Text wird es jedenfalls
> nicht sein. Lies das Datenblatt, nachdem du C gelernt hast.

Was fehlt mir deiner Meinung nach an C? "Alles" wäre keine Antwort. 
Nenne bitte Themen.

von Stefan F. (Gast)


Lesenswert?

> Was fehlt mir an dem Verständnis von C?
> Welche Bereiche würdest du mir empfehlen?

Wie man Funktionen deklariert, wie man sie aufruft, und wie man Arrays 
verwendet. Vermutlich fehlen Dir noch mehr Sachen.

> Ich habe einen Screenshot für dich gemacht.

Es wäre erheblich effizienter gewesen, das ganze Projekt irgendwo zum 
Download bereit zu stellen.

von Mitlesa (Gast)


Lesenswert?

Michael R. schrieb:
> HAL_I2C_Master_Transmit_IT(&hi2c3, 0x91, aTxBuffer, 32);

Du rufst hier eine Funktion auf, befindest dich aber (noch)
im Deklaration-Teil deiner Source.

Der Funktionsaufruf muss irgendwo in main(..) stehen.

von Joachim B. (jar)


Lesenswert?

Stefan F. schrieb:
>> Ich habe einen Screenshot für dich gemacht.
>
> Es wäre erheblich effizienter gewesen, das ganze Projekt irgendwo zum
> Download bereit zu stellen.

als Anhang hochladen dann gäbe es eine Codeansicht!

Er muss auch noch das Forum bedienen lernen!

Michael R. schrieb:
> Was fehlt mir deiner Meinung nach an C?

der Unterschied von
aTxBuffer zur &aTxBuffer bei Arrays

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Mitlesa schrieb:
> Der Funktionsaufruf muss irgendwo in main(..) stehen.

Sinnvollerweise beachtet man die Kommentare, die CubeMX generiert hat. 
Sonst geht das alles bei der nächsten Konfigurationsänderung wieder 
kaputt.

von Mitlesa (Gast)


Lesenswert?

Stefan F. schrieb:
> Vermutlich fehlen Dir noch mehr Sachen.

Ja da fehlt es offensichtlich noch an vielen Sachen.

Copy&Paste geht so einigermassen.

Aber wir sehen das alles ganz falsch, denn:

Michael R. schrieb:
> Mit C komme ich klar,

.... wenn man solch kapitale Böcke schiesst ....

von Joachim B. (jar)


Lesenswert?

Mitlesa schrieb:
> Ja da fehlt es offensichtlich noch an vielen Sachen.

absolut, langsam wirds frech

ich kopiere den Code in einen Editor und bleibe hängen an

#include "main.h"
welchen er nicht mitgeliefert hat, so kann man keine Fehler finden oder 
nur als Hellseher!

von Theor (Gast)


Lesenswert?

Tja. Das muss man leider so sagen, Michael:

Zwischen:

Michael R. schrieb:
> Mit C komme ich klar,

und Deinem Quellcode klafft eine enorme Lücke.
Da fehlt es m.M.m. nicht an einem Detail, sondern an Grundlagen.

Ausserdem solltest Du, wenn schon nicht auf Anhieb und vollständig 
korrekt, die Fehlermeldungen deuten können. Zumindest solltest Du eine 
begründete und plausible Vermutung haben und darstellen können, was Du 
versucht hast und warum es nicht geklappt hat. Ich rede hier 
wohlgemerkt, nur von den syntaktischen Fehlern.
Ist doch ganz einfach: Wenn da steht "unexpected" dann wird da wohl was 
anderes erwartet. Was, steht in dem C-Buch.


Und da kommen wir dann zu Deinen zwei Formfehlern.

Erstmal lautet die Frage nicht, wie Du mit HAL die I2C-Schnittstelle 
bedienst um einen AD-Wandler anzusteuern, sondern vielmehr: Was bedeutet 
die Fehlermeldung?
Ein eher böser Lapsus, denn Deine Postings lesen sich wie eine 
Verarschung à la: Ich sag Euch mein wirkliches Problem nicht, dass ist 
viel zu primitiv und umfangreich und ich schäme mich soviel von Euch zu 
verlagen, sondern ich stelle das Problem als ein komplexes da und rechne 
damit, dass sich jemand herausgefordert fühlt und meine 
Grundlagenprobleme so nebenbei löst, weil ich ja den Code nur noch 
kopieren brauche.

Zweitens hast Du die Benutzerhinweise nicht beachtet. Langen Code als 
Anhang. Nicht schlimm, aber das I-Tüpfelchen zu der Reaktion: "Oh 
heiliges Spaghetti-Monster. Bloss weg hier".

Ach. Und da klingt sowas heraus, wie: Nun stellt Euch mal nicht so an 
und reißt Euch am Riemen.
Aber denk mal dran: Nicht wir haben das Problem sondern Du. Wir können 
das. Offen gesagt ist das mit den Fehlermeldungen schlichte Krümelkacke.

Da musst Du nun durch oder such Dir ein anderes Hobby.
In diesem Sinne: Nichts für ungut, ein schönes Leben noch und frohe 
Weihnachten.

von Michael R. (hellm)


Angehängte Dateien:

Lesenswert?

Mitlesa schrieb:
> Der Funktionsaufruf muss irgendwo in main(..) stehen.

Nicht unbedingt.

Mitlesa schrieb:
> Stefan F. schrieb:
>> Vermutlich fehlen Dir noch mehr Sachen.
>
> Ja da fehlt es offensichtlich noch an vielen Sachen.
>
> Copy&Paste geht so einigermassen.
>
> Aber wir sehen das alles ganz falsch, denn:
>
> Michael R. schrieb:
>> Mit C komme ich klar,
>
> .... wenn man solch kapitale Böcke schiesst ....

Derjenige, der so was schreibt, unterschreibt in seiner sozialen 
Unkompetenz.


Joachim B. schrieb:
> als Anhang hochladen dann gäbe es eine Codeansicht!

Mache ich.

Joachim B. schrieb:
> Er muss auch noch das Forum bedienen lernen!

Wozu, du liest meine Posts auch so. )))

Theor schrieb:
> Ausserdem solltest Du, wenn schon nicht auf Anhieb und vollständig
> korrekt, die Fehlermeldungen deuten können. Zumindest solltest Du eine
> begründete und plausible Vermutung haben und darstellen können, ...

Soll ich eine Vermutung liefern? Plausibel? Wozu bin ich denn hier? Um 
eine Antwort zu bekommen, wie "gut" ich in C bin?

> ... was Du
> versucht hast und warum es nicht geklappt hat. Ich rede hier
> wohlgemerkt, nur von den syntaktischen Fehlern.
> Ist doch ganz einfach: Wenn da steht "unexpected" dann wird da wohl was
> anderes erwartet. Was, steht in dem C-Buch.

Wenn man ein Buch zitiert, schreibt man normalerweise den Autor, das 
Titel und Jahr, die Seitennummer würden auch nicht schaden. ))

Theor schrieb:
> Ein eher böser Lapsus,...

Ich zittere wie ein Herbstblatt vor deinen Worten, die ganze Welt 
erfährt über meine Unkompetenz in der Programmierung und Elektronik! 
"böser Lapsus"! Hast du mir damit meine Frage beantwortet? )))

Theor schrieb:
> Ach. Und da klingt sowas heraus, wie: Nun stellt Euch mal nicht so an
> und reißt Euch am Riemen.
> Aber denk mal dran: Nicht wir haben das Problem sondern Du. Wir können
> das.

Ich habe meine Frage gestellt, weil ich etwas nicht kann/weiß. Sogar 
eine Antwort bekommen: "Wir können das", kann man resümieren. Dazwischen 
steht alles mögliche #include "Beleidigungen.h" außer einer 
vollständigen (oder auch nicht unbedingt) Antwort, nicht von Mitlesa, 
Stefan F. oder von dir.

> Offen gesagt ist das mit den Fehlermeldungen schlichte Krümelkacke.

Hast du mir diese "schlichte Krümelkacke" erklärt? Hast du andere Posts 
von mir gelesen? (außer "Spaghetti-Monster") )) Auch die, wo ich 
nachgefragt habe, was ich genau nachlesen soll? Und verstanden, das ich 
Hilfe im Fach brauche, in dem ich weniger verstehe als du?

Theor schrieb:
> ... weil ich ja den Code nur noch
> kopieren brauche.

Warum ist es ein Problem, einen Code von jemanden zu kopieren?




Wenn jemand nicht schreiben möchte oder eine Antwort/aufklärende Frage 
hat, kann einfach das Thema ignorieren. Ich werde mich nicht beleidigt 
fühlen. Es ist lieber, als durch eure unschöne Posts beleidigt "gefüllt" 
zu sein.

: Bearbeitet durch User
von W.S. (Gast)


Angehängte Dateien:

Lesenswert?

Michael R. schrieb:
> /* USER CODE BEGIN Header */......

Jetzt hast du nun eine ganze Quellcode-Wüste gepostet. Hör auf damit! - 
ich meine konkret: Hör auf mit dem Benutzen solchen von ST-Utilities 
erzeugtem Quellcodes und stelle dich endlich auf deine eigenen Beine. 
So wie dieser Thread bislang aussieht, hast du die ganze Zeit gegen HAL 
und Cube gekämpft und jedesmal verloren.

Ich häng dir mal was zum Lesen hier dran: Eine simple 
Soft-Implementation für den I2C. Damit du erstmal ein Gefühl dafür 
kriegst, wie so im Prinzip der I2C funktioniert.

Nix mit Callback-Funktionen und so.

Stattdessen die ganz einfache Leier:

mit Do_I2C_Start startet man einen Transfer auf dem I2C
mit Do_I2C_Write oder Do_I2C_Read transferiert man jeweils ein Byte
mit Do_I2C_Stop beendet man den Transfer (und gibt den Bus frei)

Der ganze Kram stammt von einem steinalten Projekt mit einem Kinetis 
MK02FN128. Für den alleruntersten Datenverkehr (SCL bzw. SDA hi oder lo 
und SDA lesen) mußt du dir für deinen µC deshalb diese 
Primitivfunktionen selber schreiben - ebenso das Einrichten deiner zwei 
Pins auf GPIO mit Open Drain.

W.S.

von Michael R. (hellm)


Lesenswert?

Lieber W.S., danke für den Code. Ich habe aber einige Fragen dazu.

Warum werden hier 1 und 2 zugewiesen?
1
void SCL_low (void)
2
{ GPIOB_PCOR = 1; }    /* Bit auf low */
3
4
void SCL_high (void)
5
{ GPIOB_PSOR = 1; }    /* Bit auf high */
6
7
void SDA_low (void)
8
{ GPIOB_PCOR = 2; }
9
10
void SDA_high (void)
11
{ GPIOB_PSOR = 2; }


Wie funktioniert diese Funktion?
1
bool Get_SDA (void)
2
{ return (GPIOB_PDIR & 2) != 0; }


Wofür steht diese Zeile?
1
GPIOB_PDDR |= (1+2);         // PTB0 und PTB1 auf Output, Opendrain


Was passiert, wenn "maske" letztendlich gleich Null wird? Ich brauche 
auch eine Erläuterung zur Zeile mit Get_SDA. Was bedeutet sie?
1
while (maske)
2
  { if (sende & maske) SDA_high(); else SDA_low();// Если sende != 0x00, тогда включается SDA_high, в противном случае SDA_low
3
    delay(60);
4
    SCL_high();
5
    delay(160);
6
    if (Get_SDA()) lese = lese | maske;
7
    SCL_low();
8
    delay(60);
9
    maske = maske>>1;
10
  }

: Bearbeitet durch User
von Bernd (Gast)


Lesenswert?

Michael R. schrieb:
> Warum werden hier 1 und 2 zugewiesen?

Such mal in der Dokumentation, wofür diese Register da sind:
> GPIOB_PCOR
> GPIOB_PSOR

von Stefan F. (Gast)


Lesenswert?

Michael R. schrieb:
> Wie funktioniert diese Funktion?
> bool Get_SDA (void)
> { return (GPIOB_PDIR & 2) != 0; }


Das ist kurze Form von:
1
bool Get_SDA (void)
2
{ 
3
    if ((GPIOB_PDIR & 2) != 0) // Wenn Bit 1 in GPIOB_PDIR HIGH ist, ...
4
        return true;
5
    else
6
        return false;
7
}

Michael R. schrieb:
> Wofür steht diese Zeile?
> GPIOB_PDDR |= (1+2);

1 ist der Wert von Bit 0.
2 ist der Wert von Bit 1.

Also ergibt die Addition binär 00000011

> Was passiert, wenn "maske" letztendlich gleich Null wird?
> if (sende & maske) SDA_high(); else SDA_low();

Wenn die maske=0 ist, dann ist der if-Ausdruck immer false, so daß der 
else-Teil ausgeführt wird.

> if (Get_SDA()) lese = lese | maske;

Wenn get_SDA() true ist, dann wird die Variable "lese" auf den Wert von 
"lese | maske" gesetzt. Oder anders gesagt: In der Variable "lese" 
bleiben nur noch die Bits HIGH, die durch die Maske vorgegeben sind.

von Michael R. (hellm)


Lesenswert?

Danke.

Wozu multipliziere ich die Adresse mit 2 und füge 1 im Falle R_W = 1 
hinzu?
1
b = Adresse * 2;
2
if (R_W) ++b;

von W.S. (Gast)


Lesenswert?

Ach herrje - wieso verstehst du selbst jetzt noch immer nicht die 
grundlegenden Dinge ds I2C ?

Michael R. schrieb:
> Warum werden hier 1 und 2 zugewiesen?
> void SCL_low (void)
> void SCL_high (void)
> void SDA_low (void)
> void SDA_high (void)

Also hör mal, das sind die Lowest-Level-Primitiv-Funktionen, die wie ihr 
Name sagt, SCL und SDA anzusteuern haben. Wie du die bei deinem µC 
schreibst, ist deine Aufgabe. Es sollte ja wohl keine unüberwindliche 
Schwierigkeit sein, jeweils ein Pin des µC auf low oder high zu setzen. 
Ebenfalls sollte es kein Ding sein, die betreffenden Ports auf Opendrain 
zu initialisieren.

> Wie funktioniert diese Funktion?
> bool Get_SDA (void)

Diese Funktion soll den momentanen Zustand der SDA Leitung liefern, das 
ist entweder low oder high. Hier gilt das Gleiche wie oben: selber 
machen.

> Wofür steht diese Zeile?
> GPIOB_PDDR |= (1+2);         // PTB0 und PTB1 auf Output, Opendrain

Das lies im Manual zum betreffenden Kinetis-µC nach, falls du genau 
diesen Chip zu benutzen gedenkst und den Kommentar nicht verstehst. 
Andernfalls richte dir die Peripherie deines µC gemäß dessen 
tatsächlichen Gegebenheiten ein.


> Was passiert, wenn "maske" letztendlich gleich Null wird? Ich brauche
> auch eine Erläuterung zur Zeile mit Get_SDA. Was bedeutet sie?
> while (maske)

Wenn "maske" letztendlich 0 wird, ist die Schleife zu ende. Das ist 
alles. Immerhin ist das schlußendlich sparsamer als einen 
Schleifenzähler zu benutzen, dann eine Maske per (1<<zähler) zu erzeugen 
und obendrein auch noch den Zähler zu inkrementieren und auf 
Endebedingung zu testen.

Michael R. schrieb:
> Wozu multipliziere ich die Adresse mit 2 und füge 1 im Falle R_W = 1
> hinzu?

Weil die I2C-Adresse genau 7 Bit umfaßt und ab Bit 1 auszugeben ist. Bit 
0 hingegen entscheidet, ob das Nachfolgende eine Lese- oder 
Schreib-Operation sein soll.

Lies einfach zuerst eine einführende Erklärung, wie der I2C überhaupt 
funktioniert, bevor du dich daran machst, sowas wie AD7746 und so weiter 
verbasteln zu wollen. Was ich hier habe lesen müssen, riecht mir derart 
nach Maker-Mentalität, daß es mich ausgesprochen grimmig macht. Immer 
wieder wollen Leute irgend welche hochtrabenden Projekte realisieren, 
von denen sie nicht einmal ansatzweise die blutigen Grundlagen kennen, 
geschweige selbige tatsächlich verstehen.

W.S.

von Michael R. (hellm)


Lesenswert?

Danke für deinen Beitrag.

W.S. schrieb:
> Lies einfach zuerst eine einführende Erklärung, wie der I2C überhaupt
> funktioniert, bevor du dich daran machst, sowas wie AD7746 und so weiter
> verbasteln zu wollen. Was ich hier habe lesen müssen, riecht mir derart
> nach Maker-Mentalität, daß es mich ausgesprochen grimmig macht. Immer
> wieder wollen Leute irgend welche hochtrabenden Projekte realisieren,
> von denen sie nicht einmal ansatzweise die blutigen Grundlagen kennen,
> geschweige selbige tatsächlich verstehen.

Ich habe um die Erklärung für mich unklarer Stellen gebeten. Für dich 
sind die leicht zu verstehen, für mich nicht. Schade, dass man erstmal 
ein Niveau erreichen muss, um die nächste Frage zu stellen.

von PittyJ (Gast)


Lesenswert?

Hm, ich bin etwas verwirrt. Jemand behauptet, er habe keine Probleme mit 
C. Und dann stellt er Fragen zu den einfachsten Dingen wie Schleife oder 
| Operator.
Da würde ich erst einmal ein gutes C Buch empfehlen. Nur ein 
Web-Totorial mit einem bisschen Copy&Paste erzeugen noch keinen guten 
Programmierer.

Und um die Ablauf von Programmen zu verstehen, hat man früher printf's 
eingebaut und ist das noch mal von Hand und den Ausgaben durchgegangen.
Selbst diese simple Technik wird schon nicht mehr angewendet.
Früher war irgendwie mehr Eigeninitiative. Heute braucht man für jede 
Zeile einen Fragethread in einem Forum.

von Michael R. (hellm)


Lesenswert?

PittyJ schrieb:
> er habe keine Probleme mit C

Wozu hast du dein Offtopic-Post hier geschrieben?

von Michael R. (hellm)


Lesenswert?

W.S. schrieb:
> Weil die I2C-Adresse genau 7 Bit umfaßt und ab Bit 1 auszugeben ist. Bit
> 0 hingegen entscheidet, ob das Nachfolgende eine Lese- oder
> Schreib-Operation sein soll.

Was hat 7-Bit der Adresse mit der Multiplikation mit 2 zusammen(es ist 
eine Verschiebung nach links, richtig)?

Wenn 1 Bit zu 'b' hinzugefügt wird, werden die 7 Bit zu 8?

Oder sind das 8 Bit und das achte Bit wird geändert?

von Stefan F. (Gast)


Lesenswert?

Michael R. schrieb:
> Wozu multipliziere ich die Adresse mit 2 und füge 1 im Falle R_W = 1
> hinzu?

Weil die Adresse in den Bits 1 bis 7 liegt. Das Bit 0 ist das R/W Flag.

Die Multiplikation mit 2 verschiebt die Adresse um ein Bit.

Adresse: 1001011

·2 = 10010110

+ r/w Flag HIGH = 10010111

von PittyJ (Gast)


Lesenswert?

Michael R. schrieb:
> PittyJ schrieb:
>> er habe keine Probleme mit C
>
> Wozu hast du dein Offtopic-Post hier geschrieben?

Damit du erkennst, dass du von dem Krams hier überfordert bist, und dich 
erst einmal der Basis-Kenntnis von C zuwendest.

von W.S. (Gast)


Lesenswert?

Michael R. schrieb:
> Was hat 7-Bit der Adresse mit der Multiplikation mit 2 zusammen(es ist
> eine Verschiebung nach links, richtig)?

ernst gemeinter Rat: wende dich einem anderen Hobby zu. Aerobics, Malen, 
Politikwissenschaften.. auf alle Fälle etwas, das keinerlei logisches 
Denken erfordert.

Schluß jetzt.

W.S.

von Stefan F. (Gast)


Lesenswert?

Für den Anfang ist die I²C Schnittstelle vielleicht ein bisschen zu 
komplex.

Youtube und Arduino verleiten leider dazu, nicht mit zu komplexen Dingen 
zu übernehmen.

von Michael R. (hellm)


Lesenswert?

Stefan ⛄ F. schrieb:
> Für den Anfang ist die I²C Schnittstelle vielleicht ein bisschen zu
> komplex.
>
> Youtube und Arduino verleiten leider dazu, nicht mit zu komplexen Dingen
> zu übernehmen.

Von der Logik der Schnittstelle geht noch. Hier soll ich mir den Weg 
bahnen können. Ich habe schon mehrmals die Protokolbeschreibung gelesen 
und es klingt nicht mehr so kompliziert und verwirrend. Was die 
Übertragung dieser Logik in eine Sprache (C meine ich) ist, fällt mir 
etwas schwerer.

von Michael R. (hellm)


Lesenswert?

W.S. schrieb:
> Schluß jetzt.

Noch eine Offtopic-Antwort.(#2 als ich angefangen zu zählen habe)

: Bearbeitet durch User
von W.S. (Gast)


Lesenswert?

Michael R. schrieb:
> Noch eine Offtopic-Antwort

Junge, wenn jemand wie du sich etwas vornimmt, wofür er sachlich noch 
garnicht in der Lage ist, und dann hier in diesem Forum nach Hilfe ruft, 
diese auch bekommt - und trotzdem noch nicht weiter kommt, weil er 
selbst das Verstehen dieser Hilfe noch nicht hinkriegt, dann ist dreiste 
Frechheit und überhebliches Auftreten eine denkbar ungeeignete Reaktion 
deinerseits. Du solltest dir das merken.

W.S.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

W.S. schrieb:
> dann ist dreiste
> Frechheit und überhebliches Auftreten eine denkbar ungeeignete Reaktion
> deinerseits. Du solltest dir das merken.

Jetz red doch nicht immer von dir selbst.

von Mitlesa (Gast)


Lesenswert?

Mw E. schrieb:
> Jetz red doch nicht immer von dir selbst.

Ich kann W.S. nur zustimmen. Der TO versteht die kleinsten
Schritte nicht die man ihm vorkaut, daher ist er bei seinem
Projekt voll überfordert und sollte sich was anderes suchen.

Ich zitiere hier nochmals die Selbsteinschätzung des TO
die Bände spricht.

Michael R. schrieb:
> Mit C komme ich klar

Nein, ganz wirklich gar nicht.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

@Mitlesa:
Im prinzip hast du da recht, nur sollte so ein W.S. sehr leise sein und 
andere nicht als überheblich auftretend betiteln.
Denn so ist er es, der im Projekte Forum die Projekte durch den Dreck 
zieht wenn diese nicht so aufgebaut sind wie er sich das vorstellt. 
(Also wie bei seiner komischen Lernbetty)
Als wär er der Nabel der Welt.
Das geht inzwischen schon so weit, dass manche einen "W.S. Disclaimer" 
unter den Beitrag packen.

von Michael R. (hellm)


Lesenswert?

W.S. schrieb:
> Junge, wenn jemand wie du sich etwas

Und noch eine...

Ich habe hier freundlicherweise Antworten auf meine Fragen bekommen. Von 
Stefan ⛄ F.z.B. Und mehrere anderen.


Du belernst mich, was ich in meinem Leben unternehmen soll? Kennst du 
mich? Reichen dir wenige Posts, um einen Menschen zu identifizieren(mich 
in dem Falle)? Verzweifelnd. Baue bitte deinen Stress wo anders ab. 
Danke

von Michael R. (hellm)


Lesenswert?

Mitlesa schrieb:
> Michael R. schrieb:
>> Mit C komme ich klar
>
> Nein, ganz wirklich gar nicht.

Es ist so schön, dass mir diese Zitat schon 1000 mal in diesem Topic 
vorgeworfen wurde. Was hast du damit erreicht?

von Mitlesa (Gast)


Lesenswert?

Michael R. schrieb:
> Es ist so schön, dass mir diese Zitat schon 1000 mal in diesem Topic
> vorgeworfen wurde. Was hast du damit erreicht?

Dir vor Augen zu halten dass du an erheblichen
Wahrnehmungsstörungen leidest.

Die Wahrnehmungsstörungen erkennt man auch daran dass man hier
in diesem Thread keine 1000 Vorwürfe bezüglich deines Kenntnis-
standes über C-Programmierung findet.

von Michael R. (hellm)


Lesenswert?

Mitlesa schrieb:
> dass du an erheblichen
> Wahrnehmungsstörungen leidest

Soll ich daran nicht leiden, wenn ich zehn unangenehme Sachen neben 
einem nützlichen Beitrag finde?

Warum muss ich aus diesem Müll sachliche Vorschläge und echte Hilfe 
rauskratzen?

von kein gast (Gast)


Lesenswert?

das ist leider in diesem Forum normal:-) Ein Trauerespiel..habe auch 
lange vor der Hälfte aufgehört weiter zu lesen.
Sozialer Umgang hier 6

von Sebastian R. (sebastian_r569)


Lesenswert?

Michael R. schrieb:
> Warum muss ich aus diesem Müll sachliche Vorschläge und echte Hilfe
> rauskratzen?

"Ich möchte mit meinem Kampfjet gerne einen Looping fliegen. Ich habe 
das Flugzeug mit Diesel getankt, habe also Ahnung von der Technik. Wie 
fliege ich einen Looping?"

- "Da gehört kein Diesel rein, anscheinend fehlen dir doch die 
Grundlagen. Wenn du die drauf hast, können wir über Flugmanöver 
sprechen."

"Darum geht es nicht. Warum sagt mir niemand, wie ich jetzt mit meinem 
mit Diesel vollgetankten Kampfjet einen Looping fliegen kann?"

von fghghjr56zrthftrrrzrtrtzrtzrtzrtzrtzrtzr (Gast)


Lesenswert?

Michael R. schrieb:
> Warum muss ich aus diesem Müll sachliche Vorschläge und echte Hilfe
> rauskratzen?

du meckerst über sozialen umgang aber bist selber keinen deut besser
du erwartest von leuten  Hilfe , und lässt dir nichts sagen.

du sagst das du mit C kein Problem hast .
OK ..
Ich unterstelle dir daher einfach nur unwissenheit mit dem umgang der 
Programmiersprache C.

Wo funktionen hingehören und wie ein µC funktioniert  sollte man hier 
zumindest mal halbwegs wissen... VORHER


Wie der AD Wandler funktioniert steht im Datenblatt.
Wenn du dennoch solch einen quark wie oben gezeigt versuchst, hast du so 
einiges nicht verstanden.
Dann mecker nicht rum und frag vernünftig nach.

Im normalfall mit brauchbaren Kentnissen ist das eine sache von maximal 
einer stunde.

weiß man was man tut und kennt den bus und das Bauteil an einem Bus ist 
nach 5min das ding gegessen.


Der obere ansatz mit der HAL war definitiv nicht falsch!
Manche meinen man muss beim urschleim anfangen ...

nur muss man gewisse dinge auch beachten und vieleicht auch sinnvolle 
informationen liefern.
( schaltplan,  welche pins werden genutzt )

HAL funktioniert schon ... wenn man es richtig nutzt.
ebenso der AD ...  der tut was er soll , wenn man ihn richtig ansteuert.



Einen Baustein der nur binär ( 0 und 1 ) versteht mit text zu belasten 
bringt hier nichts. ( was du oben getan hast )

solange der AD kein gültiges kommando bekommt tut er nichts und wird 
auch nicht antworten ( warum auch ... )
Welche dinge er versteht , steht im Datenblatt


hierzu vorher die seiten mit I²C read  und write  lesen und so due 
lese/schreibe funktionen dazu anpassen

von Johnny B. (johnnyb)


Lesenswert?

fghghjr56zrthftrrrzrtrtzrtzrtzrtzrtzrtzr schrieb:
> HAL funktioniert schon ... wenn man es richtig nutzt.
> ebenso der AD ...  der tut was er soll , wenn man ihn richtig ansteuert.

So ist es.
Solange man nichts spezielles macht, benötigt man nur zwei Funktionen 
aus der HAL und I2C funktioniert einwandfrei:

Zum was lesen:
1
HAL_I2C_Mem_Read

Zum was schreiben:
1
HAL_I2C_Mem_Write

Oder wenn man DMA nutzen möchte:
1
HAL_I2C_Mem_Read_DMA bzw. HAL_I2C_Mem_Write_DMA

Beispiel:
1
HAL_I2C_Mem_Read_DMA(&hi2c1, I2CADDRESS_AS5601, ReadAddress, I2C_MEMADD_SIZE_8BIT, data, size);

I2CADDRESS_AS5601 = I2C Slave Adresse
ReadAddress = Registeradresse von der man was auslesen will
I2C_MEMADD_SIZE_8BIT = In diesem Beispiel ist die länge der 
Registeradresse 1 Byte
data = In dieses Array bzw. Pointer werden die gelesenen Daten 
reinkopiert
size = Anzahl zu lesender Bytes

Dann muss man nur noch eine Callbackfunktion implementieren, welche 
automatisch aufgerufen wird, sobald der DMA die Daten fertig ausgelesen 
hat:
1
HAL_I2C_MemRxCpltCallback

von Michael R. (hellm)


Lesenswert?

Sebastian R. schrieb:
> "Ich möchte mit meinem Kampfjet gerne einen Looping fliegen. Ich habe
> das Flugzeug mit Diesel getankt, habe also Ahnung von der Technik. Wie
> fliege ich einen Looping?"

Du hast Recht. Die Formulierung in deinem Beispiel ähnelt meiner. Ich 
bin aber weiter gegangen und habe weitere Fragen gestellt. Ich gebe zu, 
ich verstehe nicht alles bezüglich meines Themas. Dafür bin ich aber auf 
diesem Forum gelandet, um von den erfahreneren Mitglieder Hilfe zu 
bekommen und das Material besser zu verstehen.

fghghjr56zrthftrrrzrtrtzrtzrtzrtzrtzrtzr schrieb:

Danke für deine Hinweise. Ich hoffe, mein C inzwischen zu verbessern. 
Und nicht nur. ))


Johnny B. schrieb:
> Johnny B.

Klasse!

Danke!

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.