Forum: Mikrocontroller und Digitale Elektronik Probleme mit Code für DS1302


von Sebastian M. (noobuntu)


Lesenswert?

Hallo @all,

ich bin gerade dabei eine Routine für den DS1302 zu schreiben. Leider 
komme ich nicht weiter.

Mein Compiler bringt mir immer folgende Fehler Meldung:

../ds1302.c:253: error: conflicting types for 'RTC_Read'
../ds1302.c:183: error: previous implicit declaration of 'RTC_Read' was 
here


Für diesen Code
1
unsigned char data;
2
3
data = RTC_Read(0x81);
4
5
//Die dazu gehörende Methode
6
7
unsigned char RTC_Read(unsigned char cmd){
8
9
  unsigned char file;
10
  
11
  RTC_CE_High();
12
  RTC_Write_Byte(cmd);
13
  file = RTC_Read_Byte();
14
  RTC_CE_Low();
15
16
  return file;
17
}

Woran liegts? Hat jmd ne Idee? Für Hilfe wäre ich sehr dankbar!

mfg sebastian

von ... (Gast)


Lesenswert?

Du benutzt die Funktion bevor Du sie deklariert hast!

von Sebastian M. (noobuntu)


Lesenswert?

... schrieb:
> Du benutzt die Funktion bevor Du sie deklariert hast!


Vielen Dank! Du hattes natürlich recht! Blöder Fehler!

Das Empfangen und Sende klappt jetzt einwandfrei. Jetzt geht es an die 
Auswertung der Zeit.

Ich bekomme vom DS1302 ein Char. Die Bits 0 bis 3 stehen für die 
Einerstelle, die Bits 4 bis 6 für die Zehner. Ich benutze folgenden Code 
um das ganze dann auf einem 160x80 Display darzustellen. Zuerst einmal 
nur die Sekunden!

Der Code funktioniert zwar, aber mich stört das ich 2 verschiedene 
Buffer benutzen muss. Da wenn ich immer den gleichen benutze, ich 2 mal 
das selbe auf dem Display sehe.

Habt ihr Verbesserungsvorschläge oder Tipps für mich?

1
void touch_paintClock(unsigned char xC, unsigned char yC){
2
  
3
  unsigned char data;
4
  unsigned char temp;
5
6
  data = RTC_Read(0x81);
7
  
8
  temp = data;
9
  temp = temp >>4;  //10ner Sekunden  
10
11
  itoa(temp, BufferSec,10);
12
  g_draw_string(xC, yC, BufferSec);
13
  
14
  temp = data;
15
  temp &= ~0xF0;  //1ner Sekunden
16
  
17
  itoa(temp, BufferSec2,10);
18
  g_draw_string(xC, yC + 10, BufferSec2);
19
20
21
}

von ... (Gast)


Lesenswert?

Wenn Du 2 Buffer brauchst, dann machst Du irgendwo anders was verkehrt.
Wie sind denn BufferSec/BufferSec2 deklariert?
1
void touch_paintClock(unsigned char xC, unsigned char yC)
2
{
3
  uint8_t data;
4
  char buffer[2];
5
6
  data = RTC_Read(0x81);
7
8
  itoa(data >> 4, buffer, 10);
9
  g_draw_string(xC, yC, buffer);
10
11
  itoa(data & 0x0f, buffer, 10);
12
  g_draw_string(xC, yC + 10, buffer);
13
}
oder
1
void touch_paintClock(unsigned char xC, unsigned char yC)
2
{
3
  uint8_t data;
4
  char buffer[3];
5
6
  data = RTC_Read(0x81);
7
8
  buffer[0] = (data >> 4) + '0';
9
  buffer[1] = (data & 0x0f) + '0';
10
  buffer[2] = '\0';
11
  g_draw_string(xC, yC, buffer);
12
}
oder
1
void touch_paintClock(unsigned char xC, unsigned char yC)
2
{
3
  uint8_t data;
4
  char buffer[3];
5
6
  data = RTC_Read(0x81);
7
8
  itoa(((data >> 4) * 10) + (data & 0x0f), buffer, 10);
9
  g_draw_string(xC, yC, buffer);
10
}
oder
1
void touch_paintClock(unsigned char xC, unsigned char yC)
2
{
3
  uint8_t seconds, minutes;
4
  char buffer[6];
5
6
  seconds = RTC_Read(0x81);
7
  minutes = RTC_Read(0x83);
8
9
  sprintf(buffer, "%01d%01d:%01d%01d", minutes >> 4, minutes & 0x0f, seconds >> 4, seconds & 0x0f);
10
  g_draw_string(xC, yC, buffer);
11
}

von Sebastian M. (noobuntu)


Lesenswert?

Nochmals vielen Dank für die ausführliche Antwort! Werds morgen gleich 
ausprobieren.

Mit dem BufferSec war das schon ein bisschen komisch. Nach ein paar mal 
Compilieren gings dann!

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.