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
[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 | }
|
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?
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.