Das Elektor-Forum schließt seine Pforten (siehe auch http://www.elektormagazine.de/forum). Ab Freitag, den 01. März, ist es nicht mehr möglich, sich im Forum einzuloggen. Alle Inhalte des Forums bleiben jedoch bis Ende März noch sichtbar. Am 01. April wird das Forum schließlich komplett geschlossen.

r8C13 TimerY als "Ereigniszähler"

Postby befu » Fri Jun 26, 2009 12:00 am

Hallo,

in einem größeren Projekt möchte ich den R8C13 als quarzgenauen Taktgeber für das Triggersignal einsetzen, über das ein A/D-Wandler-Modul eines Drittherstellers angesteuert wird.

Das heißt das Rechtecksignal (Triggersignal) generiert TimerX in der gewünschten Frequenz und gibt es an PIN CNTR0 (P1_7, P0_3) aus.

Über einen Taster möchte ich PIN CNTR1 von LOW an HIGH legen und die HIGH-Pegel mittels TimerY des R8C13 zählen. Den jeweiligen Zählerstand von TimerY möchte ich über die von Port1 angesteuerten LED anzeigen und das Rechtecksignal an PIN CNTR0 mit der entsprechenden Frequenz ausgeben.

Für diesen Zweck habe ich folgendes programmiert:

#include "sfr_r813.h"

void onChipClock2MainClock(void)
{
prc0= 1; /* Protect off */
cm13= 1; /* Xin Xout */
cm15= 1;/* XCIN-XCOUT drive capacity select bit */
cm05= 0;/* Xin on */
cm16= 0;/* Main clock = No division mode */
cm17= 0;
cm06= 0;/* CM16 and CM17 enable */
asm("nop");
asm("nop");
asm("nop");
asm("nop");
ocd2= 0;/* Main clock change */
prc0= 0;/* Protect on */
}

void InitTimerX_PulseOut(char pre_x, char t_x)
{/* TimerX als Zeitgeber with CNTR0 Output */
/* R8C13 HW manual page 74f */
txmr= 0x01;/* Pulse Output mode for Timer X */
r0edg= 1;/* CNTR0 (P1_7) starts with L */
txocnt= 1;/* CNTR0 Output */
txck0= 1;/* Timer Count source= f8 */
txck1= 0;/* 20MHz / 8= 250kHz */
prex= pre_x-1;/* Set Prescaler X register: pscx */
tx= t_x-1;/* Set Timer X register: 250 */
txs= 1;/* Timer X start */
}

char InitTimerY_CountCNTR1( void)
{ /*TimerY counts HIGH pulses on CNTR1 */
/* R8C13 HW manual page 82f */

tymod0= 1;/* Set TimerY to timer mode */
r1edg= 0;/* Count on rising edge*/
tyck0= 1;/* Select input from CNTR1 pin */
tyck1= 1;/* Select input from CNTR1 pin */
tys= 1;/* Count starts*/
return typr; /* give back actual count of TimerY */
}

void main(void)
{
char pre_x;/* prescaler of TimerX */
char t_x;/* TimerX register */

/* change to external 20MHz clock */
onChipClock2MainClock();

pd1= 0xFF;/* Port p1 all outputs */

pre_x= 250-1;/* Setting TimerX: Swicht CNTR0: 400Hz */
t_x= 25-1;

InitTimerX_PulseOut(pre_x, t_x); /* SquareWave on CNTR0 (P1_7) */

switch( InitTimerY_CountCNTR1())
{
case 0:
p1_0= 0;
p1_1= 0;
p1_2= 0;
p1_3= 0;
InitTimerX_PulseOut(249, 4); /* SquareWave on CNTR0: 2kHz */
case 1:
p1_0= 1;
p1_1= 0;
p1_2= 0;
p1_3= 0;
InitTimerX_PulseOut(249, 9); /* SquareWave on CNTR0: 1KHz */
/* .
.
. */
default:
/* Reset Counter of TimerY to 4
Wie geht das ??*/
;
}
}

Kann mir jemand posten, wie ich TimerY des R8C13 programmierun muss, um damit "primitiv" steigende Flanken an PIN CNTR1 (bis 7) zu zählen, und danach TimerY wieder auf "0" zu setzen?

Vielen Dank für Eure Hilfe.

Schöne Grüße,

BeFu
befu
 
Posts: 17
Joined: Fri Jan 03, 2014 1:51 pm
Location: Coburg, Germany

Postby frankl » Mon Jun 29, 2009 12:00 am

Hallo,
wenn Du schreibst
tymod0= 1; /* Set TimerY to timer mode */
läuft der Timer Y NICHT im Timer Mode, sondern im Waveform Generation Mode. Er versucht also ein Signal auszugeben, und nicht eins zu lesen.
frankl
 
Posts: 125
Joined: Thu Jan 02, 2014 10:42 am


Return to Das R8C-Projekt

Who is online

Users browsing this forum: No registered users and 1 guest