Mit INT0 und Timer0 habe ich mal für einen Mega8 so ein Testprogramm gemacht:
Code:
$crystal = 8000000
$regfile = "m16def.dat"
$hwstack = 64 ' default use 32 for the hardware stack
$swstack = 64 'default use 10 for the SW stack
$framesize = 128 'default use 40 for the frame space
$baud = 38400
Dim Impuls_laenge As Word , Flanken_index As Byte , Flanken_anzahl As Byte , Bit_count As Byte
Dim Timer0_startwert As Byte
Config Timer0 = Timer , Prescale = 8 'hier den Timer eintragen (8-bit)
On Ovf0 Tim0_isr
Enable Timer0
Timer0_startwert = 156 'bei mir 8000000/8/(256-156) entspricht 10Khz
Timer0 = Timer0_startwert 'Auflösung reicht und gefundene Werte entsprechen immer 100µs
Config Int0 = Change 'externer interrupt, bei mir Int0 auf portd.2
On Int0 Get_rc_isr
Enable Int0
Ddrd.2 = 0 'ausgang des RC-empfängers
Portd.2 = 1
Config Serialout = Buffered , Size = 100
Print ""
Enable Interrupts
Do
Loop
End
Tim0_isr:
Timer0 = Timer0_startwert
Incr Impuls_laenge 'bei jedem Überlauf um 1 erhöhen
If Impuls_laenge > 1000 Then 'nach 0.1 ohne Signal Stop Timer0
Stop Timer0
Timer0 = Timer0_startwert
Impuls_laenge = 0
Print ""
End If
Return
Get_rc_isr: 'RC Impuls erkannt
If Impuls_laenge > 0 Then
Print Impuls_laenge ; " ";
Impuls_laenge = 0
Else
Start Timer0
End If
Return
Es sollte die High- und Low-Zeiten zum PC schicken.
Probier es mal aus. Musst du aber auf deinen 8051 umändern.
Lesezeichen