Untitled
unknown
plain_text
a year ago
4.4 kB
8
Indexable
; Steckbrett.asm
;
; Created: 30.09.2014 14:20:30
; Author: akreienkamp
;
.NOLIST
; .INCLUDE "m328pdef.inc" ; Include-Datei für ATmega328P
.LIST
; Registerdefinitionen
.DEF temp = R16 ; Temporäres Register
.DEF counter = R17 ; Zählerstand
; EEPROM-Adressen
.EQU EEPROM_COUNTER = 0x00 ; Adresse im EEPROM für Zählerstand
; Setup für Timer
.EQU TIMER_DELAY = 0xF9 ; Timer-Startwert (für 1 ms bei 16 MHz)
.CSEG ; Code-Segment
.ORG 0x0000 ; Reset-Vektor
RJMP RESET ; Springe zur Reset-Routine
.ORG 0x002A ; Timer1 Compare Interrupt-Vektor
RJMP TIMER_ISR ; Interrupt-Service-Routine
RESET:
LDI temp, LOW(RAMEND) ; Stackpointer initialisieren
OUT SPL, temp
LDI temp, HIGH(RAMEND)
OUT SPH, temp
; I/O-Konfiguration
LDI temp, 0xFF ; Setze PORTD als Ausgang für 7-Segment
OUT DDRD, temp
LDI temp, 0x00 ; Setze PORTB als Eingang für Taster
OUT DDRB, temp
LDI temp, 0x03 ; Aktiviert Pull-Ups für PB0 und PB1
OUT PORTB, temp
; Timer konfigurieren
LDI temp, TIMER_DELAY ; Timer-Startwert
STS TCNT1L, temp ; Lade den Wert in das Low-Byte des Timers
LDI temp, 0x00
STS TCNT1H, temp ; Lade das High-Byte des Timers
LDI temp, (1<<CS12) ; Timer mit Prescaler 256 starten
STS TCCR1B, temp ; Lade den Wert in das TCCR1B-Register
LDI temp, (1<<TOIE1) ; Aktiviert Overflow-Interrupt
STS TIMSK1, temp ; Schreibe den Wert in TIMSK1
; EEPROM-Lesevorgang
RCALL READ_EEPROM ; Lade letzten Zählerstand aus EEPROM
SEI ; Interrupts aktivieren
MAIN_LOOP:
; Warte, bis Taster gedrückt wird
SBIC PINB, 0 ; Prüfen, ob Taster 1 gedrückt ist (PB0)
RJMP START_COUNT
SBIC PINB, 1 ; Prüfen, ob Taster 2 gedrückt ist (PB1)
RJMP INCREMENT_COUNT
RJMP MAIN_LOOP ; Zurück zur Hauptschleife
START_COUNT:
RJMP MAIN_LOOP ; Zurück, da kein laufender Zähler implementiert ist
INCREMENT_COUNT:
INC counter ; Zähler erhöhen
CPI counter, 10 ; Begrenze Zähler auf 9
BRNE UPDATE_DISPLAY
LDI counter, 0 ; Bei Überlauf auf 0 zurücksetzen
UPDATE_DISPLAY:
RCALL DISPLAY_NUMBER ; Zählerstand anzeigen
RCALL WRITE_EEPROM ; Speichere Zähler im EEPROM
RJMP MAIN_LOOP
; Unterprogramme
DISPLAY_NUMBER:
; 7-Segment-Daten definieren (an PORTD senden)
; Hier werden die Ziffern von 0 bis 9 für das 7-Segment-Display definiert.
LDI temp, 0b00111111 ; Ziffer 0 (Segmente a,b,c,d,e,f)
CPI counter, 0
BREQ DISPLAY_DONE
LDI temp, 0b00000110 ; Ziffer 1 (Segmente b,c)
CPI counter, 1
BREQ DISPLAY_DONE
LDI temp, 0b01011011 ; Ziffer 2 (Segmente a,b,d,e,f)
CPI counter, 2
BREQ DISPLAY_DONE
LDI temp, 0b01001111 ; Ziffer 3 (Segmente a,b,c,e,f)
CPI counter, 3
BREQ DISPLAY_DONE
LDI temp, 0b01100110 ; Ziffer 4 (Segmente b,c,d,e)
CPI counter, 4
BREQ DISPLAY_DONE
LDI temp, 0b01101101 ; Ziffer 5 (Segmente a,c,d,e,f)
CPI counter, 5
BREQ DISPLAY_DONE
LDI temp, 0b01111101 ; Ziffer 6 (Segmente a,c,d,e,f)
CPI counter, 6
BREQ DISPLAY_DONE
LDI temp, 0b00000111 ; Ziffer 7 (Segmente a,b,c)
CPI counter, 7
BREQ DISPLAY_DONE
LDI temp, 0b01111111 ; Ziffer 8 (Segmente a,b,c,d,e,f)
CPI counter, 8
BREQ DISPLAY_DONE
LDI temp, 0b01101111 ; Ziffer 9 (Segmente a,b,c,d,e,f)
DISPLAY_DONE:
OUT PORTD, temp
RET
WRITE_EEPROM:
LDI temp, EEPROM_COUNTER ; EEPROM-Adresse
OUT EEARL, temp
MOV temp, counter ; Zählerstand speichern
OUT EEDR, temp
SBI EECR, EEMPE ; Schreibvorgang aktivieren
SBI EECR, EEPE
RET
READ_EEPROM:
LDI temp, EEPROM_COUNTER ; EEPROM-Adresse
OUT EEARL, temp
SBI EECR, EERE ; Lesevorgang starten
IN counter, EEDR ; Zählerstand einlesen
RET
TIMER_ISR:
; Timer-Interrupt-Routine
; Dies könnte z.B. für eine Verzögerung oder Animation genutzt werden
RETI ; Rückkehr aus Interrupt
Editor is loading...
Leave a Comment