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

Hier klicken um eine gezippte Version dieser Seite herunterzuladen (1.40 MB)

;
; ******************************************
; * 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