Forum: Projekte & Code XC888/866 Timer modus 2


von Sharon F. (wissenshunger)


Lesenswert?

guten Tag zusammen
ich versuche ein Port zum blinken zu bringen, mit timer 0 modus 2 als
verzögerungsgeber.das port soll invertieren, nach jedem überlauf (TF0)
wer weiß wie der timer interrupt aussieht.

vielen dank

von Matthias (Gast)


Lesenswert?

[Oberlehrer]
Davon abgesehen das Du im falschem Forum postest, solltest Du erstmal 
selber einen Programm-Ansatz bringen, als hier nach einer kompletten
Lösung zu fragen. Wie willst Du es sonst lernen.
[/Oberlehrer]

Ich gebe Dir trotzdem mal ein Beispiel, zwar nicht für XC866 aber 
anderer 8051.
1
// Testprogramm TIMER
2
// Beispiel: LED blinkt im o.5s Takt bei f=11.0592 MHz
3
4
#include "reg51.h"   // Register des 8051MCs
5
#define LED P0_7
6
7
// Timer 0 - Zeitbasis
8
// Timer0: Reload Wert für T0 T=1/(fosz/12)*(65536-(TH0*256+TL0))
9
// RELOAD (16bit) = -(0.01 * FREQ_OSC / 12 - 65536);
10
// RELOAD-Wert für 10ms = 0xDC00 (56320) bei FOSZ 11.059200 MHz
11
#define TH0Reload 0xDC
12
#define TL0Reload 0x00
13
14
static unsigned char int_delay = 0;
15
16
// ********************************************************************
17
// Timer 0 Interrupt
18
// Routine wird alle 10ms aufgerufen
19
// ********************************************************************
20
void TIMER0ISR (void) interrupt 1 {
21
  TH0  = TH0Reload; // Update MSB
22
  TL0  = TL0Reload; // Update LSB
23
  int_delay++;
24
  if (int_delay == 50) {
25
    // LED blinkt im Sekundentakt (500ms an, 500ms aus)
26
    // nur Bsp., anpassen!
27
    LED = !LED;
28
    int_delay = 0;
29
  }
30
}
31
32
// ********************************************************************
33
// Grund-Initialisierung
34
// ********************************************************************
35
void init (void) {
36
  // Timer 0 initialisieren
37
  TMOD = 0x01;          // 0000 0001B    Timer 0: Mode 1 (16-Bit Zähler)
38
  TH0  = TH0Reload;   // Reloadwert Timer 0
39
  TL0  = TL0Reload;
40
  TR0  = 1;             // Timer 0 starten
41
  // Interruptsystem
42
  ET0  = 1;             // Timer 0, Interruptfreigabe
43
  EA   = 1;             // generelle Interruptfreigabe
44
}
45
46
// ********************************************************************
47
// Hauptprogramm
48
// ********************************************************************
49
void main (void) {
50
  init();
51
  while(1);
52
}

von Sharon F. (wissenshunger)


Lesenswert?

dies habe ich gemancht aber P1 geht ein uns aus und dann nix

# include <XC888CLM.h>



  void T01_vInit(void)

{
  TMOD   =  0x02;         //  TMOD für Timer 0 Modus 2
  TL0    =  0x00;
  TH0    =  0x11;       //  Reloadwert
  ET0    =  1;         //  Enable Timer 0 interrupt
  EA    =  1;
  TR0    =  1;       //  Start Timer 0
  TF0     =  0;
}
  void T01_viTmr0(void) interrupt 1 using 0    // Timer 0 Interrupt
{
   unsigned int ueberl;
  for (ueberl=0; ueberl<500; ueberl=ueberl+50)
    {
      while (TF0==0);
      TR0    =  0;
     P1_DATA=!(P1_DATA);

}

}


 int main ()

{
  SFR_PAGE(_pp0, noSST);   // Change to page 0
  P1_DIR  =  0xFF;     //  Festlegen von P1 als Ausgang
  P1_DATA =  0xFF;     //  Initialisieren des Aungangs auf High

  CMCON  =  0x12;         //  load Clock Control Register (12Mhz)

 T01_vInit();

 while(1);

}

was mache ich da falsch?

von Matthias (Gast)


Lesenswert?

> TR0    =  0;

Du hälst den Timer an. Da kommt er 1x und dann nie wieder in die 
Interrupt-Routine.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.