;=====================================================
;======== 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.