?
Hallo zusammen,
ich versuche einen timer eines 80C186 zustarten, doch irgendwie will das nicht funktionieren!?!
Mein C-Code:
#include <i86.h>
#include <i186eb.def>
unsigned short i = 0;
int z = 0;
main()
{
outword(_zaehlregister_timer_0,0); /* Startwert Timer_0 */
outword(_max_zahl_A_timer_0,1000 /* Endwert Timer_0 */
outword(_zaehlregister_timer_2,0); /* Startwert Timer_0 */
outword(_max_zahl_timer_2,2000); /* Endwert Timer_0 */
outword(_stw_timer_0,0xC005); /* Timer_0 initialisieren */
outword(_stw_timer_2,0xC000); /* Timer_2 initialisieren */
while (1)
{ /* warten bis MAX COUNT erreicht ist(MC = 1); mc_bit = 0x20 */
while ((inword(_stw_timer_0) & mc_bit) == 0); /* an dieser Stelle bleibt mein Programm stehen ???? */
/* i => 7-Seg.Anzeige */
outword(_port_A+1,i);
/* mc_bit von 1 => 0 rücksetzen */
outword(_stw_timer_0,inword(_stw_timer_0) & ~mc_bit & 0x3fff);
/* warten bis MAX COUNT erreicht ist(MC = 1); mc_bit = 0x20 */
while ((inword(_stw_timer_2) & mc_bit) == 0);
/* i => 7-Seg.Anzeige */
outword(_port_A,i);
/* mc_bit von 1 => 0 rücksetzen */
outword(_stw_timer_2,inword(_stw_timer_2) & ~mc_bit & 0x3fff);
/* 7-Seg.An. hat nur zwei Stellen */
if (i < 255)
i++;
else
i = 0;
outword(_port_A,i);
}
}
Meine Def-Datei
/*---------------------------------------------*/
/* */
/* Vordefinition von */
/* Prozessor- und Peripherie-Konstanten */
/* */
/* Zielsystem: MCT-Trainer (80C186EB) */
/* Einfuegen mit: #include<i186eb.def> */
/* (c) K.-H.Krauss Juni 2000 Version 1.5 */
/*---------------------------------------------*/
/* Definition von Kanaladressen */
/* (Kanaladressen beginnen mit _xx...x) */
/*---------------------------------------------*/
#define _port_A 0xf2f8
#define _port_B 0xf2fa
#define _port_C 0xf2fc
#define _stw_8255 0xf2fe
#define _stw_timer_0 0xff36
#define _stw_timer_1 0xff3e
#define _stw_timer_2 0xff46
#define _zaehlregister_timer_0 0xff30
#define _zaehlregister_timer_1 0xff38
#define _zaehlregister_timer_2 0xff40
#define _max_zahl_A_timer_0 0xff32
#define _max_zahl_B_timer_0 0xff34
#define _max_zahl_A_timer_1 0xff3a
#define _max_zahl_B_timer_1 0xff3c
#define _max_zahl_timer_2 0xff42
#define _int_timer 0xff12
#define _int_0 0xff18
#define _int_1 0xff1a
#define _int_2 0xff1c
#define _int_3 0xff1e
#define _eoi 0xff02
/*----------------------------------------------*/
/* Definition von Steuerwoertern sowie */
/* Vorbelegungen von Registern (ggf. aendern */
/* je nach Aufgabenstellung */
/*----------------------------------------------*/
#define stw_8255 0x8b89
#define stw_timer_0_start 0xc005
#define stw_timer_0_stop 0x4005
#define stw_timer_1_start 0xc009
#define stw_timer_1_stop 0x4009
#define stw_timer_2_start 0xc001
#define stw_timer_2_stop 0x4001
#define stw_maske (stw_timer_1_start & 0x001f)
#define mc_bit 0x0020
#define max_zahl_A_timer_1 1000
#define max_zahl_B_timer_1 0
#define max_zahl_timer_2 1000
#define stw_int_timer 7
#define stw_int_1 0x17
#define motor_rechtslauf 3
#define motor_linkslauf 0x0b
#define motor_stop 0
#define tastatur_code_rechts 0xae00
#define tastatur_code_links 0xbc00
#define overflow 0xbbbb
#define eoi 0x8000
Mein Programm bleibt an der ersten Schleife stehen????
while ((inword(_stw_timer_0) & mc_bit) == 0); /* an dieser Stelle bleibt mein Programm stehen ???? */
Aber eigentlich sollte das Prog. weiterlaufen sobald MC = 1, also der MAX Count vom Vergleichsreg.A erreicht ist!?!
Vielleicht hat ja jemand von euch eine Idee...
Gruß && Danke
lucifer