Untitled

 avatar
unknown
plain_text
5 months ago
4.4 kB
4
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