Det här blev en riktigt intressant tråd - kanske något att lägga i FAQ'n.
Kanske är jag en klåpare på att söka men innan jag frågade här på forumet sökte jag bland annat på AVR Freaks efter kodexempel men hittade inget (i ASM). Så jag tror att många (nybörjare) kan ha nytta av det som babbage mfl. skrev!
Postar den kod jag använt:
Kod: Markera allt
; ===============================================================================
; = FREKVENSRÄKNARE (inte klar, enbart en LED-blinkare just nu)
; = version 0.00.
; ===============================================================================
;
; Pin Port
; 1 Reset -
; 5 XTAL1
; 4 XTAL2
; 20 VCC
; 10 GND
;
; ===============================================================================
; = KONSTANTER I KOD
; ===============================================================================
;
; ===============================================================================
; = INITIERING
; ===============================================================================
.include "2313def.inc" ; Includera variabelnamn och definitioner
.org $0000 ; Börja skriva på första positionen
rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp EXT_INT1 ; IRQ1 Handler
rjmp TIM_CAPT1 ; Timer1 Capture Handler
rjmp TIM_COMP1 ; Timer1 Compare Handler
rjmp TIMER1 ; Timer1 Overflow Handler
rjmp TIMER0 ; Timer0 Overflow Handler
rjmp UART_RXC ; UART RX Complete Handler
rjmp UART_DRE ; UDR Empty Handler
rjmp UART_TXC ; UART TX Complete Handler
rjmp ANA_COMP ; Analog Comparator Handler
.def Temp = r16 ; Temporärregister
.def Tmr1 = r17 ; Nedklockning1 (36)
.def Tmr2 = r18 ; Nedklockning2 (Base)
.def Base = r19 ; Tidbas, 1 = 100Hz, 10 = 10 Hz, 100 = 1 Hz
.def Flag = r20 ; Tidbas, 1 = 100Hz, 10 = 10 Hz, 100 = 1 Hz
; ===============================================================================
; = RESETVEKTOR - körs efter Power Off och Reset
; ===============================================================================
RESET:
; Initiera stacken:
ldi Temp, low(RAMEND) ; Initiera stacken med den sista SRAM adressen på chipet
out SPL, Temp ; SPL är stackpointer som pekar på returnvärdet från sub eller int
; Ställ in Timerfrekvens
ldi Temp,$02 ; xxxx x001 - CS02, CS01, CS00 (000 - stop, 001 - CK, 010 - CK/8, 011 - CK/64, 100 - CK/256, 101 - CK/1024, 110 - External Pin T0 Falling Edge, 111 - External Pin T0 Rising Edge)
out TCCR0,Temp ; TCCR0 Timer/Counter0 Control Register
; Nollställ variabler
ldi Tmr1,$00
; Konfigurera PortB för Output
ldi Temp,$FF ; xxx1 1111 - DDBn (4<= n <= 0)
out DDRB,Temp ; DDRB Data Direction Register port B, alla pins till output
out PORTB,Temp ; PORTB Port B, alla pins till logisk 1 = alla LED släckta
; Enabla sleep-kommando
ldi Temp,$20 ; xx10 xx00 - SE Sleep Enabled, SM SleepMode, ISC01, ISC00
out MCUCR, Temp ; MCU Control Register
; Starta timer:
ldi Temp,$02 ; xxxx xx1x - TOIE, Timer/counterOverflowInterruptEnabled
out TIMSK,Temp ; Timer/counterInterruptMaskRegister
ldi Base,100
; Aktivera interrupter:
sei ; Set global interrupt flag (Bit 7) i SREG, samma sak som bset 7
; ===============================================================================
; = MAIN - Huvudloop, systemets väntefunktion
; ===============================================================================
MAIN:
;cp Flag,1
;brne MAIN
; Om Flag = 1 Läs av ingången.
;ldi Flag,0
out PORTB,Flag
rjmp MAIN
; ===============================================================================
; = TIMER/COUNTER OVERFLOW - Anropas vid varje overflow på Timer/Counter
; ===============================================================================
TIMER0:
inc Tmr1 ; Öka Time
cpi Tmr1,36 ; Jämför Time med 36
brne NOCHANGE ; Om Time < 36 hoppa till NOCHANGE
; Tmr1 = 36
ldi Tmr1,0 ; Nollställ Tmr1
inc Tmr2 ; Öka Tmr2
cp Tmr2,Base ; Jämför Time med Base
brne NOCHANGE ; Om Time < Base hoppa till NOCHANGE
ldi Tmr2,0 ; Nollställ Tmr2
cpi Flag,$FF
brne OFF
ldi Flag,$00
rjmp NOCHANGE
OFF:
ldi Flag,$FF
NOCHANGE:
reti
EXT_INT0: ; IRQ0 Handler
EXT_INT1: ; IRQ1 Handler
TIM_CAPT1: ; Timer1 Capture Handler
TIM_COMP1: ; Timer1 Compare Handler
TIMER1: ; Timer0 Overflow Handler
UART_RXC: ; UART RX Complete Handler
UART_DRE: ; UDR Empty Handler
UART_TXC: ; UART TX Complete Handler
ANA_COMP: ; Analog