; Bernhard.Erfurt@gmx.de ; 01/2021 ; ; ; 128 x 64 Pixel=8.192 Pixel :8=1024 ; ATmega328P ; 8MHz ;.include "m328pdef.inc" .include "MACROS.asm" .equ TAKT = 8000000 ; 8 MHz ; ERROR CODES .equ ERROR_TWI_MT_START =0x20 .equ ERROR_TWI_MT_SLA =0x21 .equ ERROR_TWI_MT_DATA =0x22 .equ ERROR_TWI_MR_START =0x23 .equ ERROR_TWI_MR_SLA =0x24 .equ ERROR_TWI_MR_DATA =0x25 .equ ERROR_TWI_MR_DATAEND =0x26 ; LED-GRUEN .equ LED_GRUEN_PIN_NR = 0 .equ LED_GRUEN_DDR = DDRD .equ LED_GRUEN_PORT = PORTD ; LED-GELB .equ LED_GELB_PIN_NR = 1 .equ LED_GELB_DDR = DDRD .equ LED_GELB_PORT = PORTD ; LED-ROT .equ LED_ROT_PIN_NR = 2 .equ LED_ROT_DDR = DDRD .equ LED_ROT_PORT = PORTD ; REGISTER .def TIMERWERT2 = R5 .def UHR_COUNTER_L = R6 .def UHR_COUNTER_H = R7 .def KOPIE_SREG = R8 .def KOPIE_TEMP = R9 .def OLED_X = R10 .def OLED_Y = R11 .def ERROR = R12 .def NULL = R13 .def EINS = R14 .def VOLL = R15 .def temp = R16 .def temp1 = R17 .def temp2 = R18 .def temp3 = R19 .def temp4 = R20 .def temp5 = R21 .def temp6 = R22 .def temp7 = R23 .def temp8 = R24 .def temp9 = R25 ; SRAM-BELEGUNG .dseg .org SRAM_START adr_DATEN: .BYTE 20 ;= SRAM_START ; 0x0060 START Adresse ; UHR adr_ss: .BYTE 1 ;= SRAM_START+20 ; Sekunden adr_mm: .BYTE 1 ;= SRAM_START+21 ; Minuten adr_hh: .BYTE 1 ;= SRAM_START+22 ; Stunden ; STOP UHR adr_STOP_UHR_L: .BYTE 1 ;=SRAM_START+30 adr_STOP_UHR_H: .BYTE 1 ;=SRAM_START+31 adr_STOP_UHR_ERGEBNIS_L: .BYTE 1 ;=SRAM_START+32 adr_STOP_UHR_ERGEBNIS_H: .BYTE 1 ;=SRAM_START+33 ; FREQUENCY adr_FREQ_i: .BYTE 1 ;=SRAM_START+34 adr_FREQ0: .BYTE 1 ;=SRAM_START+35 adr_FREQ1: .BYTE 1 ;=SRAM_START+36 adr_FREQ2: .BYTE 1 ;=SRAM_START+37 ; ADC .org (SRAM_START + 40) adr_ADC_BETRIEBSSPANNUNG: .BYTE 10 ;=SRAM_START+40 ; ASCII adr_ASCII_FONT: .BYTE 1 ;= SRAM_START+50 adr_ASCII_BEREICH_OZ: .BYTE 19 ;= SRAM_START+51 ; obere Zeile adr_ASCII_BEREICH_UZ: .BYTE 30 ;= SRAM_START+70 ; untere Zeile ; TWI .org (SRAM_START + 100) adr_TWI_ADR: .BYTE 1 ;= SRAM_START+100 adr_TWI_BEREICH: .BYTE 799 ;= SRAM_START+101 ; BEREICH für Master TWI/I2C .org (SRAM_START + 900) adr_SRAM_CHECK: .BYTE 123 ;= SRAM_START+900 ; Programm-Check .org (SRAM_START + 1023) adr_SRAM_ENDE: .BYTE 1 ;= SRAM_START + SRAM_SIZE - 200 .cseg ;Beginn eines Code-Segmentes .org 0 ;Startadresse=0 ; ***** INTERRUPT VECTORS ************************************************ rjmp RESET ; Reset Handler .org INT0addr rjmp INTERRUPT_ERROR ;rjmp EXT_INT0 ; External Interrupt Request 0 .org INT1addr rjmp INTERRUPT_ERROR ;rjmp EXT_INT1 ; External Interrupt Request 1 .org PCI0addr rjmp INTERRUPT_ERROR ;rjmp PC0_INT ; Pin Change Interrupt Request 0 .org PCI1addr rjmp INTERRUPT_ERROR ;rjmp PC1_INT ; Pin Change Interrupt Request 1 .org PCI2addr rjmp INTERRUPT_ERROR ;rjmp PC2_INT ; Pin Change Interrupt Request 2 .org WDTaddr rjmp INTERRUPT_ERROR ;rjmp WDT_INT ; Watchdog Time-out Interrupt .org OC2Aaddr rjmp INTERRUPT_ERROR ;rjmp TIM2_COMPA ; Timer/Counter2 Compare Match A .org OC2Baddr rjmp INTERRUPT_ERROR ;rjmp TIM2_COMPB ; Timer/Counter2 Compare Match A .org OVF2addr rjmp TIM2_OVF ; Timer/Counter2 Overflow .org ICP1addr rjmp INTERRUPT_ERROR ;rjmp TIM1_CAPT ; Timer/Counter1 Capture Event .org OC1Aaddr rjmp INTERRUPT_ERROR ;rjmp TIM1_COMPA ; Timer/Counter1 Compare Match A .org OC1Baddr rjmp INTERRUPT_ERROR ;rjmp TIM1_COMPB ; Timer/Counter1 Compare Match B .org OVF1addr rjmp TIM1_OVF ; Timer/Counter1 Overflow .org OC0Aaddr rjmp INTERRUPT_ERROR ;rjmp TIM0_COMPA ; TimerCounter0 Compare Match A .org OC0Baddr rjmp INTERRUPT_ERROR ;rjmp TIM0_COMPB ; TimerCounter0 Compare Match B .org OVF0addr rjmp INTERRUPT_ERROR ;rjmp TIM0_OVF ; Timer/Couner0 Overflow .org SPIaddr rjmp INTERRUPT_ERROR ;rjmp SPI_STC ; SPI Serial Transfer Complete .org URXCaddr rjmp INTERRUPT_ERROR ;rjmp USART_RXC ; USART Rx Complete .org UDREaddr rjmp INTERRUPT_ERROR ;rjmp USART_UDRE ; USART, Data Register Empty .org UTXCaddr rjmp INTERRUPT_ERROR ;rjmp USART_TXC ; USART Tx Complete .org ADCCaddr rjmp INTERRUPT_ERROR ;rjmp ADC ; ADC Conversion Complete .org ERDYaddr rjmp INTERRUPT_ERROR ;rjmp EE_RDY ; EEPROM Ready .org ACIaddr rjmp INTERRUPT_ERROR ;rjmp ANA_COMP ; Analog Comparator .org TWIaddr rjmp INTERRUPT_ERROR ;rjmp TWSI ; Two-wire Serial Interface .org SPMRaddr rjmp INTERRUPT_ERROR ;rjmp SPM_RDY ; Store Program Memory Read ; Interrupt-ERROR INTERRUPT_ERROR: LED_ROT_ON LED_GELB_ON LED_GRUEN_ON rcall WAIT_100ms LED_ROT_OFF LED_GELB_OFF LED_GRUEN_OFF rcall WAIT_100ms rjmp INTERRUPT_ERROR RESET: ldi temp, LOW(RAMEND) ; STACK initialisieren out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp rcall Watchdog_aktivieren rcall SRAM_CLEAR rcall STARTWERTE rcall PORT_CLEAR rcall PORT_INITIALISIERUNG rcall TWI_INI rcall ADC_INITIALISIERUNG rcall TIMER1_FREQUENZZAEHLER_INITIALISIERUNG rcall TIMER2_100us_INITIALISIERUNG rcall TIMER_AKTIVIEREN rcall PROGRAMM_CHECK sei ; interrupts freigeben LED_GRUEN_ON ;------------------------------------------------------------------------------- rcall TWI_OLED_INITIALISIERUNG rcall OLED_VOLL rcall WAIT_100ms rcall OLED_CLEAR rcall WAIT_100ms rcall ANZEIGE_BEGRUESSUNG rcall WAIT_1s rcall OLED_CLEAR rcall OLED_TEST1 rcall WAIT_1s rcall OLED_CLEAR rcall TWI_SCAN rcall WAIT_1s rcall OLED_CLEAR rcall OLED_TEST2 rcall WAIT_1s rcall OLED_CLEAR ; ############################################################################## ; ############################################################################## ; ############################################################################## LOOP: wdr rcall PROGRAMM_CHECK rcall ADC_BETRIEBSSPANNUNG_TEMP1 rcall ANZEIGE_HAUPT rcall WAIT_100ms rjmp LOOP ; ############################################################################## ; ############################################################################## ; ############################################################################## .include "ADC.asm" .include "ASCII.asm" .include "ANZEIGE.asm" .include "TIMER.asm" .include "TWI.asm" .include "TWI_OLED.asm" .include "SONSTIGES.inc" .include "WAIT.asm" .include "ZAHLEN.asm" TEXT_BEGRUESSUNG_1: .db "OLED ATmega328p",0 TEXT_BEGRUESSUNG_2: .db "01/2021 V6 ",0 TEXT_BEGRUESSUNG_3: .db "128x64 Pixel ",0 TEXT_BEGRUESSUNG_4: .db "8 MHz",0 TEXT_SCAN: .db "SCAN...",0 TEXT_CLEAR: .db "CLEAR",0 TEXT_FERTIG: .db "fertsch",0