Untitled
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