Pfad: Home => AVR-Übersicht => Anwendungen => LED-Leiste => Software
LED-Leiste

Software für das Ledleiste mit ATtiny13



;
; ********************************************
; * Ledleiste Helligkeitsregelung ATtiny13   *
; * Version 1 vom 24.03.2012                 *
; * (C)2012 by Gerhard Schmidt, avr-asm-tut  *
; ********************************************
;
; Include-Datei fuer den betreffenden AVR-Typ
.NOLIST
.INCLUDE "tn13def.inc" ; Headerdatei fuer ATTINY13
.LIST
;
; ============================================
;   H A R D W A R E I N F O R M A T I O N E N 
; ============================================
;
; Regelt die Helligkeit von zwei 12V-LED-Leisten
;
;               ____________
;              /  ATtiny13  |
;             |             |
;    RESET o--|RES       VCC|--o +5V VCC
;             |             |
; PotiA In o--|PB3       PB2|--o SCK
;             |             |
; PotiB In o--|PB4       PB1|--o MISO/OC0B
;             |             |
;      0 V o--|GND       PB0|--o MOSI/OC0A
;             |_____________|
;
; ============================================
;      P O R T S   U N D   P I N S 
; ============================================
;
.equ pba = PortB0
.equ pbb = PortB1
;
; ================================================
; K O N S T A N T E N   Z U M  E I N S T E L L E N
; ================================================
;
;
; =======================================================
;  F E S T E + A B G E L E I T E T E  K O N S T A N T E N 
; =======================================================
;
; Konstante zum Starten des ADC
.equ cAdcStart = (1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)
;
; ============================================
;   R E G I S T E R D E F I N I T I O N E N
; ============================================
;
; R0..R15 frei
.def rmp = R16 ; Vielzweckregister
.def rcnt = R17 ; Zaehler fuer AD-Wandler
.def radal = R18 ; LSB AD-Wandler-Resultate ADC3
.def radah = R19 ; dto., MSB
.def radbl = R20 ; LSB AD-Wandler-Resultate ADC4
.def radbh = R21 ; dto., MSB
; R22..R31 frei
;
; ============================================
;       S R A M   D E F I N I T I O N E N
; ============================================
;
.DSEG
.ORG  0X0060
;
; ==============================================
;   R E S E T   U N D   I N T   V E K T O R E N
; ==============================================
;
.CSEG
.ORG $0000
	rjmp Main ; Reset-Vektor
	reti ; Int0
	reti ; PcInt0
	reti ; TIM0_OVF
	reti ; EE_RDY
	reti ; ANA_COMP
	reti ; TIM0_COMPA
	reti ; TIM0_COMPB
	reti ; WDT
	rjmp IntAdc ; ADC
;
; ==========================================
;    I N T E R R U P T   S E R V I C E
; ==========================================
;
; ADC ready interrupt
IntAdc:
	brts IntAdcB ; T-flag gesetzt, B-Kanal
	in rmp,ADCL ; read LSB result
	add radal,rmp ; add to result
	in rmp,ADCH ; read MSB result
	adc radah,rmp ; add to result
	dec rcnt ; dec number of read cycles
	brne IntAdcRet ; not zero, go on
	ldi rcnt,64 ; restart cycle counter
	out OCR0B,radah ; set compare value B
	clr radal ; clear result value
	clr radah
	ldi rmp,1<<MUX1 ; anderen Kanal waehlen
	out ADMUX,rmp
	set ; setze flag fuer Kanal B
	rjmp IntAdcRet
IntAdcB:
	in rmp,ADCL ; read LSB result
	add radbl,rmp ; add to result
	in rmp,ADCH ; read MSB result
	adc radbh,rmp ; add to result
	dec rcnt ; dec number of read cycles
	brne IntAdcRet ; not zero, go on
	ldi rcnt,64 ; restart cycle counter
	out OCR0A,radbh ; set compare value A
	clr radbl ; clear result value
	clr radbh
	ldi rmp,(1<<MUX1)|(1<<MUX0) ; anderen Kanal waehlen
	out ADMUX,rmp
	clt ; setze flag fuer Kanal B
IntAdcRet:
	ldi rmp,cAdcStart
	out ADCSRA,rmp ; restart AD converter
	reti
;
; ============================================
;    H A U P T P R O G R A M M    I N I T
; ============================================
;
Main:
; Initiire Stapel
	ldi rmp, LOW(RAMEND) ; Initiiere LSB Stapel
	out SPL,rmp
; Init Port B
	ldi rmp,(1<<pba)|(1<<pbb) ; Richtung Port B
	out DDRB,rmp
; Init Timer
	ldi rmp,(1<<COM0A1)|(1<<COM0B1)|(1<<WGM01)|(1<<WGM00) ; Fast PWM
	out TCCR0A,rmp
	ldi rmp,(1<<CS01)|(1<<CS00) ; prescale by 64
	out TCCR0B,rmp
; Init ADC
	ldi rmp,(1<<ADC3D) ; disable digital input
	out DIDR0,rmp
	ldi rmp,(1<<MUX1)|(1<<MUX0) ; MUX to PB3
	out ADMUX,rmp
	ldi rmp,cAdcStart ; start ADC
	out ADCSRA,rmp
; Init sleep mode and ints
	ldi rmp,1<<SE ; Enable sleep
	out MCUCR,rmp
	sei
;
; ============================================
;     P R O G R A M M - S C H L E I F E
; ============================================
;
Loop:
	sleep ; Schlafen legen
	nop ; Dummy fuer Aufwecken
	rjmp loop ; Zurueck nach Loop
;
; Ende Quellcode
; Copyright
.db "(C)2012 by Gerhard Schmidt  " ; menschenlesbar
.db "C(2)10 2ybG reahdrS hcimtd  " ; wortgerecht
;



An den Seitenanfang

©2011 by http://www.avr-asm-tutorial.net