Παρασκευή 25 Δεκεμβρίου 2015

PPM encoder









;=====================================================
;======== HARDWARE ===================================
;=====================================================
;MPU is AVR ATMEGA328P AT 8MHz internal clock.
;2KB Data_Ram, 1KB EEPROM, 32KB Flash_program_memory.
;
;
;
;=====================================================
.include "m328pdef.inc"
;
;================================================================
;
.def AL=R16
.def AH=R17
.def temp=R18
.def char=R19
.def BL=R20
.def BH=R21
.def CL=R22
.def CH=R23
;
;--------------------------
;------ MACROS ------------
;--------------------------
.macro cpiw
 cpi @0L,low(@1)
 ldi r16,high(@1)
 cpc @0H,r16
.endm
;
;----------------
.macro ldiw
 ldi @0L,low(@1)
 ldi @0H,high(@1)
.endm
;
;----------------
.macro outi
 ldi r16,@1
 out @0,r16
.endm
;
;============================================
;==== CODE START   ==========================
;
.cseg
.org $0000
;
;============================================
;=====  INTERRUPT VECTORS ATMEGA328   =========
;
 jmp RESET   ;Reset Handler
 jmp NOTUSEDHERE ;EXT_INT0 ;IRQ0 Handler
 jmp NOTUSEDHERE ;EXT_INT1 ;IRQ1 Handler
 jmp PCINT0i   ;PCINT0 Handler for portB
 jmp NOTUSEDHERE ;PCINT1i ;PCINT1 Handler for portC
 jmp NOTUSEDHERE ;PCINT2i ;PCINT2 Handler for port D
 jmp NOTUSEDHERE ;WDT ; Watchdog Timer Handler
 jmp NOTUSEDHERE ;TIM2_COMPA ; Timer2 Compare A Handler
 jmp NOTUSEDHERE ;TIM2_COMPB ; Timer2 Compare B Handler
 jmp TIM2_OVF  ; Timer2 Overflow Handler
 jmp NOTUSEDHERE ;TIM1_CAPT ; Timer1 Capture Handler
 jmp NOTUSEDHERE ;TIM1_COMPA ; Timer1 Compare A Handler
 jmp NOTUSEDHERE ;TIM1_COMPB ; Timer1 Compare B Handler
 jmp NOTUSEDHERE ;TIM1_OVF ; Timer1 Overflow Handler
 jmp NOTUSEDHERE ;TIM0_COMPA ; Timer0 Compare A Handler
 jmp NOTUSEDHERE ;TIM0_COMPB ; Timer0 Compare B Handler
 jmp NOTUSEDHERE ;TIM0_OVF ; Timer0 Overflow Handler
 jmp NOTUSEDHERE ;SPI_STC ; SPI Transfer Complete Handler
 jmp NOTUSEDHERE  ; USART, RX Complete Handler
 jmp NOTUSEDHERE ;USART_UDRE ; USART, UDR Empty Handler
 jmp NOTUSEDHERE ;USART_TXC ; USART, TX Complete Handler
 jmp NOTUSEDHERE ;ADC ; ADC Conversion Complete Handler
 jmp NOTUSEDHERE ;EE_RDY ; EEPROM Ready Handler
 jmp NOTUSEDHERE ;ANA_COMP ; Analog Comparator Handler
 jmp NOTUSEDHERE ;TWI ; 2-wire Serial Interface Handler
 jmp NOTUSEDHERE ;SPM_RDY ; Store Program Memory Ready Handler
;
NOTUSEDHERE: reti
;
;============================================================
;=== MAIN PROGRAM STARTS HERE ===============================
;============================================================
RESET:
;initialize Stack_Pointer
 ldi  temp,low(RAMEND)
 out  SPL,temp
 ldi  temp,high(RAMEND)
 out  SPH,temp
;
;============================================================
;================== Clear RAM ===============================
;============================================================
 ldiw Z, RAMEND+1
 clr temp
loop_clr_RAM:   
 st -Z, temp  
 cpiw Z, SRAM_START   
 brne loop_clr_RAM
;
;============================================================
;================= Ports setup ==============================
;============================================================
 outi PORTB,0b00000000 ;Initialize Port B as input
 outi DDRB, 0b00000000 ;      
 outi PORTD, 0b00000000 ;Initialize Port D as output=0    
     ;Pind,7=PPM_OUTPUT   
     ;Pind,5=Led output
 outi DDRD,  0b11111111 

;
;============================================================
;============ Pin change interrupt setup ====================
;============================================================
 ;               76543210
 ldi temp, 0b00000001 ;All pins of portB active for Pin-Change-Interrupt function.
 sts  pcicr,temp
 ;               76543210
 ldi  temp, 0b11111111 ;All PortB pins will react at Pin-Change-Interrupt.
 sts  pcmsk0,temp
;
;============================================================
;===================== Timer2 init ==========================
;============================================================
 ; Set prescale and start Timer/Counter1
 ldi r16,(1<<CS12)|(1<<CS10) ;Set prscaler=128 (8MHz/128)
 sts TCCR2B,r16  ;Cycle_period=16us (0,000016)
 ldi r16,(1<<TOIE1) 
 sts TIMSK2, R16

;      
;----------------------------------------------
;-----------------Init vars -------------------
;
 cbi portd,7   ;PPM_OUTPUT
 cbi portd,5   ;Led
 set     ;t bit used as flag

 ser AH
 clr BL
 sbi Portd,5   ;Turn LED ON. (I am alive!)
 sei     ;Enable interrupts

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@ MAIN LOOP @@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;
main:   ;loop forever.
rjmp main
;
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@ END OF MAIN LOOP @@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@ Interrupt service routines @@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;
PCINT0i:  ; PCINT0 Handler. Got an interrupt from PortB, start the channel pulse.
 push  AL
 in  AL,SREG
 push  AL

 brtc tisnotone
 in AL,PINB
 andi AL, 0b00111111
 breq startpulse
 clt
startpulse:
 sbi portd,7
 ldi temp, 0b00000101 ;Enable timer2
 sts TCCR2B,temp
 ldi AL,-25   ;TCNT=255-25=230 for 400usec pulse
 sts TCNT2,AL
 rjmp finishinterrupt
tisnotone:
 in AL,PINB
 andi AL, 0b00111111
 breq startpulse
finishinterrupt:
 pop  AL
 out  SREG,AL
 pop  AL
 reti
;
;================================= TIMER2 OVF
;
TIM2_OVF:    ;Finish the channel pulse
 push  AL
 in  AL,SREG
 push AL
 ldi temp, 0b00000000 ;Disable timer2
 sts TCCR2B,temp
 cbi portd,7
 pop  AL
 out  SREG,AL
 pop  AL
 reti
; -------------------------------------------------------



























HEX  file of above listing.

:020000020000FC
:100000000C9435000C9434000C9434000C945D0076
:100010000C9434000C9434000C9434000C94340090
:100020000C9434000C9474000C9434000C94340040
:100030000C9434000C9434000C9434000C94340070
:100040000C9434000C9434000C9434000C94340060
:100050000C9434000C9434000C9434000C94340050
:100060000C9434000C94340018952FEF2DBF28E029
:100070002EBFE0E0F9E022272293E03001E0F00714
:10008000D9F700E005B900E004B900E00BB90FEFC3
:100090000AB921E0209368002FEF20936B0005E060
:1000A0000093B10001E0009370005F985D98689440
:1000B0001FEF44275D9A7894FFCF0F930FB70F93EC
:1000C00066F403B10F7309F0E8945F9A25E020937A
:1000D000B10007EE0093B20003C003B10F73A9F3A0
:1000E0000F910FBF0F9118950F930FB70F9320E04B
:0E00F0002093B1005F980F910FBF0F911895EC
:00000001FF

Use an AVR programmer to write the above hex-file and enjoy an absolutely reliable
PPM-Encoder.

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου