Pfad:AVR-DE => Anwendungen => Laufschrift => Quellcode
ATmega16 Anwendungen von
AVR-Einchip-Prozessoren AT90S, ATtiny, ATmega und ATxmega
Laufschrift mit ATmega16A und LEDs
Assembler Quellcode
Logo

Assembler code für Laufschrift mit ATmega16


;
; ******************************************
; * Laufschrift 24*8 LEDs mit ATmega16     *
; * Version 1 fuer Stefan Alt, 50          *
; * (C)2017 by http://avr-asm-tutorial.net *
; ******************************************
;
; Include-Datei fuer den betreffenden AVR-Typ
.NOLIST
.INCLUDE "m16Adef.inc" ; Headerdatei fuer ATmega16
.LIST
;
; ============================================
;   H A R D W A R E I N F O R M A T I O N E N 
; ============================================
;
; Device = ATmega16A
;             ____________
;          1 /            |40
;     K0 o--|pb0       pa0|--o A0
;          2|             |39
;     K1 o--|pb1       pa1|--o A1
;          3|             |38
;     K2 o--|pb2       pa2|--o A2
;          4|             |37
;     K3 o--|pb3       pa3|--o A3
;          5|             |36
;     K4 o--|pb4       pa4|--o A4
;          6|             |35
;     K5 o--|pb5       pa5|--o A5
;          7|             |34
;     K6 o--|pb6       pa6|--o A6
;          8|             |33
;     K7 o--|pb7       pa7|--o A7
;          9|             |32
;  RESET o--|reset    AREF|--o
;         10|             |31
;   +5 V o--|vcc       gnd|--o 0 V
;         11|             |30
;    0 V o--|gnd      AVCC|--o +5 V
;         12|             |29
;        o--|XTAL2     pc7|--o K15
;         13|             |28
;        o--|XTAL1     pc6|--o K14
;         14|             |27
;    K16 o--|pd0       pc5|--o K13
;         15|             |26
;    K17 o--|pd1       pc4|--o K12
;         16|             |25
;    K18 o--|pd2       pc3|--o K11
;         17|             |24
;    K19 o--|pd3       pc2|--o K10
;         18|             |23
;    K20 o--|pd4       pc1|--o K9
;         19|             |22
;    K21 o--|pd5       pc0|--o K8
;         20|             |21
;    K22 o--|pd6       pd7|--o K23
;           |_____________|
;
; ============================================
;      P O R T S   U N D   P I N S 
; ============================================
;
.equ pAO = PORTA
.equ pAD = DDRA
.equ p0O = PORTB
.equ p0D = DDRB
.equ p1O = PORTC
.equ p1D = DDRC
.equ p2O = PORTD
.equ p2D = DDRD
;
; ================================================
;                 T I M I N G
; ================================================
;
;   Prozessortakt       = 1.000.000 Hz
;   TC0-Vorteiler       =         8
;   TC0-Int-Frequenz    =       488,28 Hz
;   Anzahl MUX-Durchl.  =         8
;   MUX-Frequenz        =        61,04 Hz
;   Durchlaufteiler     =        32
;   Anzeigewechselfreq. =         1,91 Hz
;
; ================================================
; K O N S T A N T E N   Z U M  E I N S T E L L E N
; ================================================
;
; Einstellung der Ablaufgeschwindigkeit
.equ cCount = 32 ; ca. 2 Hz Ablaufgeschwindigkeit
;
; =======================================================
;  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 
; =======================================================
;
; Taktfrequenz bei Default-Einstellung
.equ Clock = 1000000 ; Standard-Voreinstellung ATmega16A
.equ Tc0Presc = 8 ; Vorteiler TC0
.equ MuxFrequ = Clock / Tc0Presc ; Sich ergebende MUX-Frequenz
.equ MuxDurch = MuxFrequ / 8 ; Sich ergebende Durchlauf-Frequenz
;
; ============================================
;   R E G I S T E R D E F I N I T I O N E N
; ============================================
;
; Frei: R0..R15
.DEF rmp = R16 ; Vielzweckregister
.DEF rAnode = R17 ; Anodentreiber
.DEF rAnd = R18 ; Einsenzaehler
.DEF rCount = R19 ; MUX-Durchlaufzaehler
; frei: R20..R25
; Verwendet: X = XH:XL = R27:R26
; frei: Y = YH:YL = R29:R28
; Verwendet: Z = ZH:ZL = R31:R30
;
; ============================================
;       S R A M   D E F I N I T I O N E N
; ============================================
;
; (nicht benutzt, nur fuer Stapel)
;;
; ==============================================
;   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
	nop
	reti ; INT0 External Interrupt Request 0
	nop
	reti ; INT1 External Interrupt Request 1
	nop
	reti ; TIMER2 COMP Timer/Counter2 Compare Match
	nop
	reti ; TIMER2 OVF Timer/Counter2 Overflow
	nop
	reti ; TIMER1 CAPT Timer/Counter1 Capture Event
	nop
	reti ; TIMER1 COMPA Timer/Counter1 Compare Match A
	nop
	reti ; TIMER1 COMPB Timer/Counter1 Compare Match B
	nop
	reti ; TIMER1 OVF Timer/Counter1 Overflow
	nop
	rjmp Tc0Ovf ; TIMER0 OVF Timer/Counter0 Overflow
	nop
	reti ; SPI, STC Serial Transfer Complete
	nop
	reti ; USART, RXC USART, Rx Complete
	nop
	reti ; USART, UDRE USART Data Register Empty
	nop
	reti ; USART, TXC USART, Tx Complete
	nop
	reti ; ADC ADC Conversion Complete
	nop
	reti ; EE_RDY EEPROM Ready
	nop
	reti ; ANA_COMP Analog Comparator
	nop
	reti ; TWI Two-wire Serial Interface
	nop
	reti ; INT2 External Interrupt Request 2
	nop
	reti ; TIMER0 COMP Timer/Counter0 Compare Match
	nop
	reti ; SPM_RDY Store Program Memory Ready
	nop
;
; ==========================================
;    I N T E R R U P T   S E R V I C E
; ==========================================
;
; TC0 Overflow Interrupt Service Routine
Tc0Ovf:
	ldi rmp,0 ; Anodentreiber ausschalten
	out pAO,rmp 
	lpm rmp,Z+ ; Lese Byte 0
	out p0O,rmp
	and rAnd,rmp ; alles Einsen?
	lpm rmp,Z+ ; Lese Byte 1
	out p1O,rmp
	and rAnd,rmp ; Alles Einsen?
	lpm rmp,Z+ ; Lese Byte 2
	out p2O,rmp
	and rAnd,rmp ; Alles Einsen?
	out pAO,rAnode ; Anodentreiber einschalten
	lsl rAnode ; Naechste MUX-Stellung
	brcc Tc0OvfRet
	dec rCount ; Zaehler abwaerts
	breq Tc0OvfEnd ; Bei Null neu starten
	mov ZH,XH ; Starte MUX-Ablauf von vorne
	mov ZL,XL
	ldi rAnode,1 ; mit niedrigster Anode neu beginnen
	ldi rAnd,0xFF
	reti
Tc0OvfEnd:
	cpi rAnd,0xFF ; Alles Einsen?
	brne Tc0OvfRst
	ldi ZH,HIGH(2*Table) ; Neu am Anfang der Tabelle starten
	ldi ZL,LOW(2*Table)
Tc0OvfRst:
	mov XH,ZH ; Erreichte Position in X kopieren
	mov XL,ZL
	ldi rAnode,1 ; mit niedrigster Anode neu beginnen
	ldi rAnd,0xFF ; Alles Einsen
	ldi rCount,cCount ; Anzahl MUX-Durchlaeufe
Tc0OvfRet:
	reti
;
; ============================================
;    H A U P T P R O G R A M M    I N I T
; ============================================
;
Main:
	; Init Stapel
	ldi rmp,HIGH(RamEnd) ; Stapelzeiger MSB
	out SPH,rmp
	ldi rmp,LOW(RamEnd) ; dto., LSB
	out SPL,rmp
	; Init Ports
	clr rmp ; Alle Anoden aus
	out pAO,rmp
	ldi rmp,0xFF ; alle Kathoden High
	out p0O,rmp
	out p1O,rmp
	out p2O,rmp
	out pAD,rmp ; Anodentreiber auf Ausgang
	out p0D,rmp ; Alle Kathoden auf Ausgang
	out p1D,rmp
	out p2D,rmp
	; Init Ausgabemechanismus
	ldi ZH,High(2*Table) ; Z zeigt auf Tabelle
	ldi ZL,Low(2*Table)
	mov XH,ZH ; X zeigt auf diese Tabellenadresse
	mov XL,ZL
	ldi rAnd,0xFF ; alles Einsen
	ldi rAnode,1 ; Mit erster Anode beginnen
	ldi rCount,cCount ; Zaehler Geschwindigkeit
	; Init Timer TC0
	ldi rmp,1<<CS01 ; Vorteiler durch 8
	out TCCR0,rmp
	ldi rmp,1<<TOIE0 ; TC0-Overflow-Interrupt
	out TIMSK,rmp
	; Sleep und Interrupts
	ldi rmp,1<<SE ; Enable sleep mode idle
	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
;
;
.include "tabelle.inc"
;
; Ende Quellcode
; Copyright
.db "(C)2017 by Gerhard Schmidt  " ; menschenlesbar
.db "C(2)10 7ybG reahdrS hcimtd  " ; wortgerecht
;



Seitenanfang




Lob, Tadel, Fehlermeldungen, Genöle und Geschimpfe oder Spam bitte über das Kommentarformular an mich.

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