www.mikrocontroller.net

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


Autor: Nikolai Sch. (koljan777)
Datum:

Bewertung
0 lesenswert
nicht 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:
#ifndef __CARDS12_LED_H
#define __CARDS12_LED_H

#include <mc9s12dp512.h>
#include "s12_crg.h"

/* Macros */
#define initLED()  DDRH |= 0x80
#define offLED()  DDRH |= 0x80
#define onLED()    DDRH &= ~0x80
#define toggleLED()     DDRH ^= 0x80

/* Functions */

/* this func is called by the Startup Code: */
void _HC12Setup(void) {
}


/* redirect all output by declaring a custom putchar() func
 (the following function declaration takes precedence over the
 same function name in the standard library)
*/
void putSCI0(int c) {
  while((SCI0SR1 & 0x80) == 0) ;  // loop until TDRE set
  SCI0DRL = c;
}  


/* redirect (as above) receive channel */
int getSCI0(void) {
  while((SCI0SR1 & 0x20) == 0) ;  // loop until RDRF set
  return SCI0DRL;
}  
//-----------------------------------------------------------------------------

/*
void delay(void) {
  unsigned n = 0;
  do {
    n--;
  } while(n);
}*/

//-----------------------------------------------------------------------------

// program entry is here:
void main(void) {
   int i = 5;
  initPLL();
  SCI0BD  = 26;  // 19200Bd at 8MHz ECLK
//  SCI0BD = 19200 & 0x1fff;
  SCI0CR1 = 0;  // mode = 8N1
  SCI0CR2 = 0x0c;  // Transmitter + Receiver enable
  DDRH |= 0x80;
  while(1) {
    //printf("e");
    putSCI0(i);
    i = getSCI0();
  }

  /*while(1) {
    toggleLED();  
    delay();
    
  }*/
}

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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für einen Quarz verwendest Du ?

Autor: Nikolai Sch. (koljan777)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Otto (Gast)
Datum:

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

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

Autor: Nikolai Sch. (koljan777)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Otto (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Nikolai Sch. (koljan777)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl M. (movex)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Nikolai Sch. (koljan777)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
s12_crg.c
#include "mc9s12dp512.h"
#include "s12_crg.h"

//-- Code ---------------------------------------------------------------------

void initPLL(void) {
  CLKSEL &= ~BM_PLLSEL;        // make sure PLL is *not* in use
  PLLCTL |= BM_PLLON+BM_AUTO;      // enable PLL module, Auto Mode
  REFDV = S12_REFDV;          // set up Reference Divider
  SYNR = S12_SYNR;          // set up Synthesizer Multiplier
  // the following dummy write has no effect except consuming some cycles,
  // this is a workaround for erratum MUCTS00174 (mask set 0K36N only)
  // CRGFLG = 0;
  while((CRGFLG & BM_LOCK) == 0) ;  // wait until PLL is locked
  CLKSEL |= BM_PLLSEL;        // switch over to PLL clock
}

s12_crg.h
//=============================================================================
// File: S12_CRG.H - V1.00
// Rem.: The ACPRD Project Page on the Web -> http://hc12web.de/acprd
//=============================================================================

#ifndef __S12_CRG_H
#define __S12_CRG_H

//-- CRG Bit Mask Definitions -------------------------------------------------

// Bits in CRGFLG:
#define BM_RTIF    0x80
#define BM_PORF    0x40
//#define reserved  0x20
#define BM_LOCKIF  0x10
#define BM_LOCK    0x08
#define BM_TRACK  0x04
#define BM_SCMIF  0x02
#define BM_SCM    0x01

// Bits in CRGINT:
#define BM_RTIE    0x80
//#define reserved  0x40
//#define reserved  0x20
#define BM_LOCKIE  0x10
//#define reserved  0x08
//#define reserved  0x04
#define BM_SCMIE  0x02
//#define reserved  0x01

// Bits in CLKSEL:
#define BM_PLLSEL  0x80
#define BM_PSTP    0x40
#define BM_SYSWAI  0x20
#define BM_ROAWAI  0x10
#define BM_PLLWAI  0x08
#define BM_CWAI    0x04
#define BM_RTIWAI  0x02
#define BM_COPWAI  0x01

// Bits in PLLCTL:
#define BM_CME    0x80
#define BM_PLLON  0x40
#define BM_AUTO    0x20
#define BM_ACQ    0x10
//#define reserved  0x08
#define BM_PRE    0x04
#define BM_PCE    0x02
#define BM_SCME    0x01

//-- Defines ------------------------------------------------------------------

// set the following values according to system requirements:
//
#define S12_OSCCLK  16000000    // input frequency from Xtal/Osc
#define S12_REFCLK   8000000    // PLL internal reference clock
#define S12_PLLCLK  48000000    // desired output frequency of PLL

// PLL clock generation formula, according to CRG Block User Guide:
// PLLCLK = OSCCLK * 2(SYNR+1) / (REFDV+1)
//
#define S12_REFDV  ((S12_OSCCLK/S12_REFCLK)-1)
#define S12_SYNR  ((S12_PLLCLK/(2*S12_REFCLK))-1)

#define S12_ECLK  (S12_PLLCLK/2)  // final bus clock frequency (ECLK)
//#define S12_ECLK  (S12_OSCCLK/2)  // bus clock if PLL not in use / off

//-- Function Prototypes ------------------------------------------------------

void initPLL(void);

#endif //__S12_CRG_H ==========================================================

Autor: Nikolai Sch. (koljan777)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl M. (movex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für SCI0BD:
115200 baud -> 13
19200 baud -> 78

Autor: Atmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nikolai Sch. (koljan777)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Karl M. (movex)
Datum:

Bewertung
0 lesenswert
nicht 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. 
;-)

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nikolai Sch. (koljan777)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke nochmal Karl!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.