timer 80C186???



  • 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


Anmelden zum Antworten