Hallo zusammen, ich möchte die RTC meines STM32L476 über den UART einstellen können. Die RTC arbeitet mit Hex Zahlen für die Uhr, so steht zum Beispiel 0x14 für 14 Uhr. Ich benutzte die HAL Bibliotheken. Für die Eingabe nutze ich die Funktion HAL_UART_Recieve. Ich weiß aber nicht wie ich der Funktion sage das die eingegebene Zahl eine Hex und keine Dec Zahl ist, und alles über switch cases zu machen ist sehr aufwändig. Habt ihr Erfahrungen, Tipps für mich? Danke schon mal im Voraus
ROWTAG schrieb: > Habt ihr Erfahrungen, Tipps für mich? es gibt bei der Übertragung keine Hex-Zahlen. Entweder wird ein String übertragen 4 Byte "0x14" oder es wird da Byte (8bit). Oder meinst du sogar Oktal zahlen 0x14?
ROWTAG schrieb: > Die Funktion schreibt in einen uint8_t Buffer also 1 Byte. dann musst du dir überlegen, wie du sich über UART übertragen will. Menschen lesbar (String) oder als Byte wert. Bei einen String kannst du sie mit atoi() in ein Byte umwandeln.
Ich will es so machen das der Benutzer die Zahl 14 für 14 Uhr eingeben kann.
ROWTAG schrieb: > Ich will es so machen das der Benutzer die Zahl 14 für 14 Uhr eingeben > kann. also String -> atoi() macht dann die Umwandlung. Geht auch mit fscanf().
ROWTAG schrieb: > Die RTC arbeitet mit Hex Zahlen für die Uhr, so steht zum Beispiel 0x14 > für 14 Uhr. Klingt für mich eher nach BCD Zahlen. Hex 0x14 wären m.E. nämlich 0d20. Und umgedreht wäre dann 0x0E eine dezimale 14.
:
Bearbeitet durch User
Sieht für die Einstellung der RTC so aus
1 | stimestructure.Hours = 0x14; |
2 | stimestructure.Minutes = 0x20; |
3 | stimestructure.Seconds = 0x00; |
ok wenn es bcd ist, dann kann man es auch ganz einfach machen
1 | char* Stunde = "14"; |
2 | |
3 | stimestructure.Hours = ( Stunde[0]-'0' ) << 4 | Stunde[1] - '0' |
Peter II schrieb: > ok wenn es bcd ist, dann kann man es auch ganz einfach machen Schreibt man vor BCD auch "0x"?
ROWTAG schrieb: > Schreibt man vor BCD auch "0x"? man kann zahlen schreiben wie man will. Es ist die Frage wie es interpretiert wird.
Peter II schrieb: >
1 | stimestructure.Hours = ( Stunde[0]-'0' ) << 4 | Stunde[1] - '0' |
Funktioniert nicht ganz, wenn ich Stunde=14 eingebe kommt 11 Uhr raus
ROWTAG schrieb: > Funktioniert nicht ganz, wenn ich Stunde=14 eingebe kommt 11 Uhr raus sicher? ( Stunde[0]-'0' ) << 4 Stunde[0] ist '1' - damit ist Stunde[0]-'0' = 1 und 1 << 4 = 16 also eine 11 kann nicht rauskommen.
ROWTAG schrieb: > Funktioniert nicht ganz, wenn ich Stunde=14 eingebe kommt 11 Uhr raus
1 | int main() |
2 | {
|
3 | char* Stunde = "14"; |
4 | |
5 | uint8_t x = ( Stunde[0]-'0' ) << 4 | Stunde[1] - '0'; |
6 | |
7 | printf("test = %d\n", x ); |
8 | |
9 | }
|
bei mir kommt 20 raus was ja 0x14 ist.
Hab es noch paar mal probiert. Es kommt immer 20Uhr raus.
1 | static void RecieveTime(void) |
2 | {
|
3 | RTC_TimeTypeDef stimestructureget; |
4 | RTC_TimeTypeDef help; |
5 | uint8_t* helpHours, helpMinutes; |
6 | |
7 | |
8 | HAL_UART_Transmit(&huart2,"\n\rHours:",10,100 ); |
9 | if(HAL_UART_Receive(&huart2,&helpHours,2,15000)!=HAL_OK) |
10 | {
|
11 | _Error_Handler(__FILE__, __LINE__); |
12 | }
|
13 | |
14 | //Minuten und Sekunden wurden der Anschaulichkeit entfernt
|
15 | |
16 | stimestructureget.Hours = ( helpHours[0]-'0' ) << 4 | helpHours[1] - '0'; |
17 | |
18 | |
19 | if(HAL_RTC_SetTime(&hrtc,&stimestructureget,RTC_FORMAT_BCD) != HAL_OK) |
20 | {
|
21 | uint8_t error[]="\n\r Fehler2 \n\r"; |
22 | HAL_UART_Transmit(&huart2, error, 20, 100); |
23 | }
|
24 | |
25 | }
|
ROWTAG schrieb: > Hab es noch paar mal probiert. Es kommt immer 20Uhr raus. du hast den Debugger - schau nach was wann wo drin steht.
Hab einen Breakpoint nach SetTime gesetzt. Allzu viel helfen mir die zahlen nicht weiter
ROWTAG schrieb: > Hab es noch paar mal probiert. Es kommt immer 20Uhr raus. Dann wird das auch durch häufigeres Probieren nicht besser. Die Uhr erwarte die Eingabe wohl doch nicht als BCD sondern als hex, i.e. du musst deine ASCII-Eingabe erst einmal in hex umwandeln, als "14" -> 0x0e
ROWTAG schrieb: > Allzu viel helfen mir die zahlen nicht weiter Schreib mal statt: if(HAL_UART_Receive(&huart2,&helpHours,2,15000)!=HAL_OK) das hier: if(HAL_UART_Receive(&huart2,helpHours,2,15000)!=HAL_OK) oder das hier: if(HAL_UART_Receive(&huart2,&helpHours[0],2,15000)!=HAL_OK) Ich habe den Verdacht, über die serielle Schnitte sind die Zeichen '4' und '0' gekommen und haben den Pointer überschrieben... EDIT: uint8_t* helpHours, helpMinutes; Du solltest natürlich für diesen Buffer nicht nur irgendeinen Pointer reservieren, sondern auch Speicherplatz.... uint8_t helpHours[5], helpMinutes[5];
:
Bearbeitet durch Moderator
In helpHours steht offenbar Müll. Wo hast du Speicher für den String reserviert? Warum übergibst du der Receive-Funktion die Adresse eines Zeigers? Sollte das nicht die Adresse eines Buffers sein? Ahoi, Martin
ROWTAG schrieb: > Sieht für die Einstellung der RTC so aus > stimestructure.Hours = 0x14; > stimestructure.Minutes = 0x20; > stimestructure.Seconds = 0x00; dann frag am besten den der so einen müll verzapft hat ... und wenn du einen uint8_t hast kann das als alles mögliche intepretiert werden. ( hex , dec , bin, ascii ... usw ) wichtig ist das du das weißt! Ich würde gerne dazu mal den kompletten code sehen ... Vermutung ist das du was falsch übergibst und das struct mit stunden in dezimal super klarkommt. was der teil dafür sprcht: Peter II schrieb: > ROWTAG schrieb: >> Hab es noch paar mal probiert. Es kommt immer 20Uhr raus. > > du hast den Debugger - schau nach was wann wo drin steht. denn bei übergabe der "14" zu -> 0x14 kommt 20uhr herraus
Lothar M. schrieb: > if(HAL_UART_Receive(&huart2,&helpHours[0],2,15000)!=HAL_OK) So und mit reserviertem Speicherplatz klappt es wenn ich die Stunde allein mache. Wenn ich aber Minuten und Sekunden nach gleichem Schema hinzufüge kommt wieder nur Käse raus: Eingabe war 14:14.13 Ausgabe: 13:14.01
ROWTAG schrieb: > So und mit reserviertem Speicherplatz klappt es wenn ich die Stunde > allein mache. Wenn ich aber Minuten und Sekunden nach gleichem Schema > hinzufüge kommt wieder nur Käse raus: Prosa hilft hier nicht. Zeig bitte den Code.
ROWTAG schrieb: > So und mit reserviertem Speicherplatz klappt es wenn ich die Stunde > allein mache. Wenn ich aber Minuten und Sekunden nach gleichem Schema > hinzufüge kommt wieder nur Käse raus: > > Eingabe war 14:14.13 > Ausgabe: 13:14.01 Fehler gefunden. Bin einfach zu blöd um Code richtig zu kopieren -.-
Für tag und Jahr funktioniert es auch super. Nur der Monat wir nicht als Zahl sonder als als Char nach dem Muster
1 | sdatestructure.Month = RTC_MONTH_JANUARY; |
abgespeichert. Hab es mal mit einem switch versucht, das klappt aber irgendwie auch nicht so wirklich.
1 | |
2 | static void RecieveDate(void) |
3 | {
|
4 | RTC_DateTypeDef sdatestructureget; |
5 | |
6 | uint8_t helpMonth, helpDate[5], helpYear[5]; |
7 | |
8 | |
9 | HAL_UART_Transmit(&huart2,"\n\rMonth:",10,100 ); |
10 | /*if(HAL_UART_Receive(&huart2,&helpMonth,2,20000)!=HAL_OK)
|
11 | {
|
12 | _Error_Handler(__FILE__, __LINE__);
|
13 | }*/
|
14 | |
15 | |
16 | |
17 | switch(helpMonth) |
18 | {
|
19 | case 1: sdatestructureget.Month = RTC_MONTH_JANUARY; break; |
20 | case 2: sdatestructureget.Month = RTC_MONTH_FEBRUARY; break; |
21 | case 3: sdatestructureget.Month = RTC_MONTH_MARCH; break; |
22 | case 4: sdatestructureget.Month = RTC_MONTH_APRIL; break; |
23 | case 5: sdatestructureget.Month = RTC_MONTH_MAY; break; |
24 | case 6: sdatestructureget.Month = RTC_MONTH_JUNE; break; |
25 | case 7: sdatestructureget.Month = RTC_MONTH_JULY; break; |
26 | case 8: sdatestructureget.Month = RTC_MONTH_AUGUST; break; |
27 | case 9: sdatestructureget.Month = RTC_MONTH_SEPTEMBER; break; |
28 | case 10: sdatestructureget.Month = RTC_MONTH_OCTOBER; break; |
29 | case 11: sdatestructureget.Month = RTC_MONTH_NOVEMBER; break; |
30 | case 12: sdatestructureget.Month = RTC_MONTH_DECEMBER; break; |
31 | default: HAL_UART_Transmit(&huart2, "ERROR Month",20,100); break; |
32 | }
|
33 | |
34 | sdatestructureget.Date = ( helpDate[0]-'0' ) << 4 | helpDate[1] - '0'; |
35 | sdatestructureget.Year = ( helpYear[0]-'0' ) << 4 | helpYear[1] - '0'; |
36 | |
37 | |
38 | if(HAL_RTC_SetDate(&hrtc,&sdatestructureget,RTC_FORMAT_BCD) != HAL_OK) |
39 | {
|
40 | /* Initialization Error */
|
41 | uint8_t error[]="\n\r Fehler1 \n\r"; |
42 | HAL_UART_Transmit(&huart2, error, 20, 100); |
43 | // Error_Handler();
|
44 | }
|
45 | |
46 | }
|
ROWTAG schrieb: > Eingabe war 14:14.13 > Ausgabe: 13:14.01 Du hast irgendwie Versatz da drin. Im Ernst: mit ein wenig "drüber nachdenken" kommt man da schon drauf. Und der angenehme Nebeneffekt ist: das "Lernen". ROWTAG schrieb: > Nur der Monat wir nicht als Zahl sonder als als Char nach dem Muster > sdatestructure.Month = RTC_MONTH_JANUARY; > abgespeichert. Und wie wird der Monat über die Schnittstelle übertragen? Warum probierst du es nicht ganz einfach genau so wie bei den restlichen Zahlen? Der Entwickler wird sich schon nicht bei jeder Stelle was Neues ausgedacht haben... Und tatsächlich, es ist wie bei den Stunden und den Minuten auch. Sieh dir mal die Definition dieser Konstanten an: http://www.disca.upv.es/aperles/arm_cortex_m3/curset/STM32F4xx_DSP_StdPeriph_Lib_V1.0.1/html/group___r_t_c___month___date___definitions.html
:
Bearbeitet durch Moderator
Lothar M. schrieb: > Im Ernst: mit ein wenig "drüber > nachdenken" kommt man da schon drauf. Und der angenehme Nebeneffekt ist: > das "Lernen". Das ist mir durchaus klar. Aber nach etlichen Stunden nachdenken und ausprobieren ist man echt gefrustet. Das mit den Monaten probier ich jetzt bisschen allein.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.