Forum: Mikrocontroller und Digitale Elektronik Serielle Schnittstelle von HC12 Card liefer nur Müll


von Nikolai S. (koljan777)


Lesenswert?

Hallo allerseits.

Ich und ein Kommilitone müssen als Projekt für die Hochschule einen 
Microcontroller an einen CAN-Netzwerk anschließen und die Daten 
"mitlauschen" und über die serielle Schnittstelle an einen PC schicken. 
Mein Problem dabei ist, dass das mit der seriellen Schnittstelle nicht 
ordentlich funktioniert. Ich denke es hat etwas mit der Baudrate zutun, 
weil wenn ich 26 (war in einem Beispielprojekt vom Herrsteller 
angegeben) nehme bekomme ich 0xFE auf die Console. Wenn ich 19200 oder 
19200 & 0x1fff nehme (wiederum in anderem Beispielprojekt) bekomme ich 
00 00 00 auf die Console. Dabei spielt es keine Rolle was für Zeichen 
oder Zahl ich auf die Leitung der seriellen Schnittstelle lege. Baudrate 
ist auf der Console auf 19200 Baud gestellt.

Mein Controllermodule: MC9S12DP512 (CardS12.DP512)

Unser Code bis jetzt:
1
#ifndef __CARDS12_LED_H
2
#define __CARDS12_LED_H
3
4
#include <mc9s12dp512.h>
5
#include "s12_crg.h"
6
7
/* Macros */
8
#define initLED()  DDRH |= 0x80
9
#define offLED()  DDRH |= 0x80
10
#define onLED()    DDRH &= ~0x80
11
#define toggleLED()     DDRH ^= 0x80
12
13
/* Functions */
14
15
/* this func is called by the Startup Code: */
16
void _HC12Setup(void) {
17
}
18
19
20
/* redirect all output by declaring a custom putchar() func
21
 (the following function declaration takes precedence over the
22
 same function name in the standard library)
23
*/
24
void putSCI0(int c) {
25
  while((SCI0SR1 & 0x80) == 0) ;  // loop until TDRE set
26
  SCI0DRL = c;
27
}  
28
29
30
/* redirect (as above) receive channel */
31
int getSCI0(void) {
32
  while((SCI0SR1 & 0x20) == 0) ;  // loop until RDRF set
33
  return SCI0DRL;
34
}  
35
//-----------------------------------------------------------------------------
36
37
/*
38
void delay(void) {
39
  unsigned n = 0;
40
  do {
41
    n--;
42
  } while(n);
43
}*/
44
45
//-----------------------------------------------------------------------------
46
47
// program entry is here:
48
void main(void) {
49
   int i = 5;
50
  initPLL();
51
  SCI0BD  = 26;  // 19200Bd at 8MHz ECLK
52
//  SCI0BD = 19200 & 0x1fff;
53
  SCI0CR1 = 0;  // mode = 8N1
54
  SCI0CR2 = 0x0c;  // Transmitter + Receiver enable
55
  DDRH |= 0x80;
56
  while(1) {
57
    //printf("e");
58
    putSCI0(i);
59
    i = getSCI0();
60
  }
61
62
  /*while(1) {
63
    toggleLED();  
64
    delay();
65
    
66
  }*/
67
}

Liegt es wirklich an der Baudrate? Was müsste ich eintragen damit es 
funktioniert?

von Otto (Gast)


Lesenswert?

Was für einen Quarz verwendest Du ?

von Nikolai S. (koljan777)


Lesenswert?

Ehrlich gesagt weiß ich nicht was Du mit Quarz meinst. Bin blutiger 
Anfänger.

Aus diesem Dokument 
http://elmicro.com/files/elmicro/cards12v110_manual_de.pdf konnte ich 
entnehmen dass der Quarztakt 16 MHz beträgt und einmal steht da noch Q1. 
Ich denke diese Q1 ist das was Du meinst, sicher bin ich mir aber 
nicht...

Hier ist die Webseite, die Informationen über den Controller enthält: 
http://elmicro.com/de/cards12.html
Der CardS12.DP512 ist meiner.

von Otto (Gast)


Lesenswert?

so wie ich das sehe, wird hier von einem 8MHz-Quarz ausgegangen:

> SCI0BD  = 26;  // 19200Bd at 8MHz ECLK

von Nikolai S. (koljan777)


Lesenswert?

Ich kann in Starprog(Programm zum rüberladen auf 
µController)-Einstellungen zwischen default, 8, 4, 2 und 1 MHz wählen. 
Würde es was bringen wenn ich da auf 8 MHz begrenze?

Weißt Du zufällig wie diese 26 zustande kommt?

von Otto (Gast)


Lesenswert?

Im Starprog kannst du NICHT den Takt einstellen, mit welchem der 
Controller laufen soll. Dieser wird alleine durch den angeschlossenen 
Quarz (bzw. Resonator) bestimmt. Die einstellung der PLL ist übrigens 
bedeutungslos, da der Takt des CAN-Moduls aus dem Bustakt gewonnen wird.

Finde zuerst heraus, mit welchem Takt dein Board läuft.

von Otto (Gast)


Lesenswert?

Im Handbuch steht, dass der Controller ein Monitorprogramm enthält, der 
über RS232 (19200 BAUD) bedienbar sein sollte. Funktioniert dieser ?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was steht auf dem oval-länglichen silbernen (blankes Metallgehäuse) 
Bauteil direkt neben dem Taster?

von Nikolai S. (koljan777)


Lesenswert?

Ich wüsste jetzt nicht wie ich auf das Monitorprogramm direkt zugreifen 
sollte, aber auf der mitgelieferten CD gibt es das Monitorprogramm zum 
reinladen in den Flash. Das habe ich eben reingeladen und bekomme 
Version und Copyright-Text raus etc.

Von dem CAN-Modul bin ich noch weit entfernt, ich versuche gerade die 
serielle Schnittstelle zum laufen zu bringen. CAN-Netzwerk hat ne 
Baudrate von 115200

Bis jetzt habe ich also nur versucht irgendwelche Zeichen 
(Buchstaben/Zahlen) auf der Console zu zeigen, was mit misslingt...


@rufus
16.000M

also sind es 16 MHz

von Karl M. (movex)


Lesenswert?

Es wäre interessant, was initPLL(); macht, da die SCI Clock
von der Busclock =(Core oder PLL/2) abgeleitet ist:

> SCI BR register = BusFreq/16/baudrate

Die CardS12 hat normal eine 16Mhz Quarz, wie es im Schaltplan steht.

von Nikolai S. (koljan777)


Lesenswert?

s12_crg.c
1
#include "mc9s12dp512.h"
2
#include "s12_crg.h"
3
4
//-- Code ---------------------------------------------------------------------
5
6
void initPLL(void) {
7
  CLKSEL &= ~BM_PLLSEL;        // make sure PLL is *not* in use
8
  PLLCTL |= BM_PLLON+BM_AUTO;      // enable PLL module, Auto Mode
9
  REFDV = S12_REFDV;          // set up Reference Divider
10
  SYNR = S12_SYNR;          // set up Synthesizer Multiplier
11
  // the following dummy write has no effect except consuming some cycles,
12
  // this is a workaround for erratum MUCTS00174 (mask set 0K36N only)
13
  // CRGFLG = 0;
14
  while((CRGFLG & BM_LOCK) == 0) ;  // wait until PLL is locked
15
  CLKSEL |= BM_PLLSEL;        // switch over to PLL clock
16
}

s12_crg.h
1
//=============================================================================
2
// File: S12_CRG.H - V1.00
3
// Rem.: The ACPRD Project Page on the Web -> http://hc12web.de/acprd
4
//=============================================================================
5
6
#ifndef __S12_CRG_H
7
#define __S12_CRG_H
8
9
//-- CRG Bit Mask Definitions -------------------------------------------------
10
11
// Bits in CRGFLG:
12
#define BM_RTIF    0x80
13
#define BM_PORF    0x40
14
//#define reserved  0x20
15
#define BM_LOCKIF  0x10
16
#define BM_LOCK    0x08
17
#define BM_TRACK  0x04
18
#define BM_SCMIF  0x02
19
#define BM_SCM    0x01
20
21
// Bits in CRGINT:
22
#define BM_RTIE    0x80
23
//#define reserved  0x40
24
//#define reserved  0x20
25
#define BM_LOCKIE  0x10
26
//#define reserved  0x08
27
//#define reserved  0x04
28
#define BM_SCMIE  0x02
29
//#define reserved  0x01
30
31
// Bits in CLKSEL:
32
#define BM_PLLSEL  0x80
33
#define BM_PSTP    0x40
34
#define BM_SYSWAI  0x20
35
#define BM_ROAWAI  0x10
36
#define BM_PLLWAI  0x08
37
#define BM_CWAI    0x04
38
#define BM_RTIWAI  0x02
39
#define BM_COPWAI  0x01
40
41
// Bits in PLLCTL:
42
#define BM_CME    0x80
43
#define BM_PLLON  0x40
44
#define BM_AUTO    0x20
45
#define BM_ACQ    0x10
46
//#define reserved  0x08
47
#define BM_PRE    0x04
48
#define BM_PCE    0x02
49
#define BM_SCME    0x01
50
51
//-- Defines ------------------------------------------------------------------
52
53
// set the following values according to system requirements:
54
//
55
#define S12_OSCCLK  16000000    // input frequency from Xtal/Osc
56
#define S12_REFCLK   8000000    // PLL internal reference clock
57
#define S12_PLLCLK  48000000    // desired output frequency of PLL
58
59
// PLL clock generation formula, according to CRG Block User Guide:
60
// PLLCLK = OSCCLK * 2(SYNR+1) / (REFDV+1)
61
//
62
#define S12_REFDV  ((S12_OSCCLK/S12_REFCLK)-1)
63
#define S12_SYNR  ((S12_PLLCLK/(2*S12_REFCLK))-1)
64
65
#define S12_ECLK  (S12_PLLCLK/2)  // final bus clock frequency (ECLK)
66
//#define S12_ECLK  (S12_OSCCLK/2)  // bus clock if PLL not in use / off
67
68
//-- Function Prototypes ------------------------------------------------------
69
70
void initPLL(void);
71
72
#endif //__S12_CRG_H ==========================================================

von Nikolai S. (koljan777)


Lesenswert?

Ich habe jetzt laut der Tabelle 
http://alt.kreatives-chaos.com/index.php?seite=baud den UBRR Wert 51 für 
meine Baudrate und Taktfrequenz entnommen. Das Ergebnis:

die vorinitialisierte Variable i wird falsch übertragen. Wenn ich dann 
über die Console Zeichen einspeise - bekomme ich diese zurück, was mich 
durchaus freut! Allerdings bekomme ich recht häufig fehler...

Write data: 62      b
Read data:  62      b
Write data: 63      c
Read data:  63      c
Write data: 64      d
Read data:  64      d
Write data: 65      e
Read data:  65      e
Write data: 66      f
Read data:  e6      æ
Write data: 67      g
Read data:  67      g
Write data: 66      f
Read data:  66      f
Write data: 67      g
Read data:  67      g
Write data: 68      h
Read data:  e8      è
Write data: 68      h
Read data:  e8      è
Write data: 68      h
Read data:  e8      è
Write data: 69      i
Read data:  69      i
Write data: 68      h

Kleiner Ausschnitt aus meiner Disskussion mit dem µController.

Verursacht diese 0,2%ige Abweichung die Fehler?

von Karl M. (movex)


Lesenswert?

Für SCI0BD:
115200 baud -> 13
19200 baud -> 78

von Atmi (Gast)


Lesenswert?

Nikolai Sch. schrieb:
> Ich und ein Kommilitone müssen als Projekt für die Hochschule einen
> Microcontroller an einen CAN-Netzwerk anschließen und die Daten
> "mitlauschen" und über die serielle Schnittstelle an einen PC schicken.

Lass mich raten, Hochschule Esslingen? Nur die verwenden dieses... aehm, 
Monster ;-)

Gruß,
Atmi

von Nikolai S. (koljan777)


Lesenswert?

Danke an alle!

@Karl
mit 78 läuft alles TipTop! Wo hast du die Werte her? Kann man die 
irgendwie berechnen? Warum passten die aus dem oberen Link nicht?

@Atmi
ne, gut 500km nördlicher :)

von Karl M. (movex)


Lesenswert?

> ...
> #define S12_PLLCLK  48000000    // desired output frequency of PLL

Wir haben laut deinem Code 48 MHz PLL clock, daraus folgt 24 MHz 
Bustakt.
Eingesetzt in die Formel:

24000000/16/19200 = 78

Steht übrigens alles im Reference Manual der MCU, Sektionen CRG & SCI. 
;-)

von Olaf (Gast)


Lesenswert?

> mit 78 läuft alles TipTop! Wo hast du die Werte her? Kann man die
> irgendwie berechnen?

Im Datenblatt deines Prozessors gibt es sicher irgendwo eine Seite die 
dir zeigt wie man das genau berechnet.

Was mich aber immer wieder fasziniert, wie kann man auf die Idee kommen 
eine Aufgaben fuer einem einen noch unbekannten Prozessor loesen zu 
wollen ohne das man sich zuallerst mal das Datenblatt besorgt und 
liesst?

Olaf

von Nikolai S. (koljan777)


Lesenswert?

Danke nochmal Karl!

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.