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
