Untitled
unknown
plain_text
a year ago
4.0 kB
4
Indexable
;
; Steckbrett.asm
;
; Created: 30.09.2014 14:20:30
; Author: akreienkamp
;
.NOLIST
; .INCLUDE "m328pdef.inc" ; Include-Datei für ATmega328P
.LIST
; Definitions
.DEF temp = R16 ; Temporäres Register
.DEF counter = R17 ; Zähler für das 7-Segment-Display
.DEF eeprom_value = R18 ; EEPROM-Wert
.DEF delay_timer = R19 ; Verzögerungstimer
.EQU SEG_PORT = PORTD ; 7-Segment-Display Port
.EQU LED_PORT = PORTB ; LED Port
.EQU BUTTON_PORT = PINC ; Taster Port
.EQU BUTTON_UP = PC0 ; Hochzählen-Taster
.EQU BUTTON_DOWN = PC1 ; Runterzählen-Taster
; Segmentcodes
.EQU DIGIT_0 = 0b00111111
.EQU DIGIT_1 = 0b00000110
.EQU DIGIT_2 = 0b01011011
.EQU DIGIT_3 = 0b01001111
.EQU DIGIT_4 = 0b01100110
.EQU DIGIT_5 = 0b01101101
.EQU DIGIT_6 = 0b01111101
.EQU DIGIT_7 = 0b00000111
; Interruptvektoren
.ORG 0x0000
RJMP INIT ; Reset-Handler
.ORG 0x0002
RJMP BUTTON_ISR ; External Interrupt
; Initialisierung
INIT:
; Ports konfigurieren
LDI temp, 0xFF
OUT DDRD, temp ; 7-Segment als Ausgang
LDI temp, 0x00
OUT DDRC, temp ; Taster als Eingang
LDI temp, 0x01
OUT DDRB, temp ; LED als Ausgang
; EEPROM-Wert laden
RCALL EEPROM_READ
MOV counter, eeprom_value
; Timer konfigurieren (CTC-Modus)
LDI temp, 0x0A ; Prescaler = 64
OUT TCCR0B, temp
LDI temp, 0xF9 ; Vergleichswert für ~1 Hz
OUT OCR0A, temp
LDI temp, 0x02 ; CTC-Modus aktivieren
OUT TCCR0A, temp
; Aktivierung von Output Compare Interrupt (TIMSK)
LDI temp, (1 << OCIE0A) ; Aktiviert den Compare Match Interrupt
OUT TIMSK, temp ; Use TIMSK instead of TIMSK0
; Interrupts aktivieren
SEI
; Hauptprogramm starten
MAIN:
RCALL DISPLAY_UPDATE
RJMP MAIN
; Taster-Interrupt-Service-Routine
BUTTON_ISR:
IN temp, BUTTON_PORT
SBIC temp, BUTTON_UP
RCALL INCREMENT_COUNTER
SBIC temp, BUTTON_DOWN
RCALL DECREMENT_COUNTER
RETI
; Timer-Interrupt-Service-Routine
.ORG 0x0012
TIMER_ISR:
IN temp, LED_PORT
EOR temp, 0x01 ; LED umschalten
OUT LED_PORT, temp
RETI
; Unterprogramme
; Zähler hochzählen
INCREMENT_COUNTER:
INC counter
CPI counter, 8 ; Begrenzen auf 7
BRLO NO_RESET
LDI counter, 0
NO_RESET:
RCALL EEPROM_WRITE ; Zählerstand speichern
RET
; Zähler runterzählen
DECREMENT_COUNTER:
DEC counter
BRMI NO_RESET_DOWN ; Nicht unter 0 gehen
LDI counter, 7
NO_RESET_DOWN:
RCALL EEPROM_WRITE ; Zählerstand speichern
RET
; 7-Segment-Display aktualisieren
DISPLAY_UPDATE:
MOV temp, counter
CPI temp, 0
BREQ LOAD_DIGIT_0
CPI temp, 1
BREQ LOAD_DIGIT_1
CPI temp, 2
BREQ LOAD_DIGIT_2
CPI temp, 3
BREQ LOAD_DIGIT_3
CPI temp, 4
BREQ LOAD_DIGIT_4
CPI temp, 5
BREQ LOAD_DIGIT_5
CPI temp, 6
BREQ LOAD_DIGIT_6
CPI temp, 7
BREQ LOAD_DIGIT_7
RET
LOAD_DIGIT_0:
LDI temp, DIGIT_0
RJMP OUTPUT_SEGMENT
LOAD_DIGIT_1:
LDI temp, DIGIT_1
RJMP OUTPUT_SEGMENT
LOAD_DIGIT_2:
LDI temp, DIGIT_2
RJMP OUTPUT_SEGMENT
LOAD_DIGIT_3:
LDI temp, DIGIT_3
RJMP OUTPUT_SEGMENT
LOAD_DIGIT_4:
LDI temp, DIGIT_4
RJMP OUTPUT_SEGMENT
LOAD_DIGIT_5:
LDI temp, DIGIT_5
RJMP OUTPUT_SEGMENT
LOAD_DIGIT_6:
LDI temp, DIGIT_6
RJMP OUTPUT_SEGMENT
LOAD_DIGIT_7:
LDI temp, DIGIT_7
OUTPUT_SEGMENT:
OUT SEG_PORT, temp
RET
; EEPROM-Wert lesen
EEPROM_READ:
LDI temp, 0x00
OUT EEARL, temp ; Adresse 0
SBI EECR, EERE ; Lesen auslösen
IN eeprom_value, EEDR
RET
; EEPROM-Wert schreiben
EEPROM_WRITE:
OUT EEARL, temp ; Adresse 0
OUT EEDR, counter ; Wert schreiben
SBI EECR, EEMPE ; Schreibbefehl vorbereiten
SBI EECR, EEPE ; Schreiben auslösen
RETEditor is loading...
Leave a Comment