пишу на bascom avr - некое подобие basic'а )
вообще мне надо сделать эмулятор сигнала датчика, без какой либо синхронизации и обратной связи, похоже на 1-wire - тупо передает сигнал на линию
вот как сделал сейчас, в эмуляторе в принципе работает, но пока не загонишь в МК не поймешь на сколько точно выдает импульсы... и все же меня терзают сомнения - написано как то через....
смысл такой - каждые 50мс срабатывает таймер0 и увеличивает счетчик, по счетчику мы получаем нужный бит из строки и загоняем его в порт, при срабатывании таймера1 проверяем состояние входящих сигналов, изменяем сигнал только при 2-м повторении, для исключения кратковременных переключений
Код
$regfile = "m8def.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Portb.1 = Output
Config Portd.2 = Input
Config Portd.3 = Input
Config Timer0 = Timer , Prescale = 1024
Config Timer1 = Timer , Prescale = 256
Dim Timercnt As Byte
Dim Timerstart As Byte
Dim Signal As String * 48
Dim Status_check_bit As Bit
Enable Interrupts
Enable Timer0
Enable Timer1
On Timer0 Pulse
On Timer1 Status_check
Reset Portb
Timercnt = 1
Status_check_bit = 0
Timerstart = 60
Signal = "000000111111111111111000000000011111111111111001"
Do
If Mid(signal , Timercnt , 1) = "1" Then
Set Portb.1
Else
Reset Portb.1
End If
Loop
Pulse:
Stop Timer0
Timer0 = Timerstart
If Timercnt < 48 Then
Timercnt = Timercnt + 1
Else
Timercnt = 1
End If
Start Timer0
Return
Status_check:
If Portd.3 = 0 Then
If Status_check_bit = 1 Then
Signal = "000111111111111110000000101111111111111110010001"
Status_check_bit = 0
Else
Status_check_bit = 1
End If
Elseif Portd.2 = 0 Then
If Status_check_bit = 1 Then
Signal = "000001111111111111100000000001111111111111100101"
Status_check_bit = 0
Else
Status_check_bit = 1
End If
Else
If Status_check_bit = 1 Then
Signal = "000000111111111111111000000000011111111111111001"
Status_check_bit = 0
Else
Status_check_bit = 1
End If
End If
Return
End