;************************************************************************************ ;* * ;* 320 x 240 Pixel LCD Controller * ;* mit RTC DS1307 und TWI-Bus * ;* Aufbau jeweils einer Pixelreihe (40 Bytes) im SRAM und Übertragung zum Display * ;* * ;************************************************************************************ ; ; ATMega16 ; +--+-+--+ ; (XCK/TO)PB0 | |_| | PA0(ADC0) ; (T1)PB1 | | PA1(ADC1) ; (INT2/AIN0)PB2 | | PA2(ADC2) ; (OC0/AIN1)PB3 | | PA3(ADC3) ; (SS)PB4 | | PA4(ADC4) ; (MOSI)PB5 | | PA5(ADC5) ; (MISO)PB6 | | PA6(ADC6) ; (SCK)PB7 | | PA7(ADC7) ; RESET | | AREF ; VCC | | GND ; GND | | AVcc ; XTAL2 | | PC7(TOSC2) ; XTAL1 | | PC6(TOSC1) ; (RXD)PD0 | | PC5(TDI) ; (TXD)PD1 | | PC4(TDO) ; (INT0)PD2 | | PC3(TMS) ; (INT1)PD3 | | PC2(TCK) ; (OC1B)PD4 | | PC1(SDA) ; (OC1A)PD5 | | PC0(SCL) ; (ICP1)PD6 | | PD7(OC2) ; +-------+ ; ; PA0 O LCD_D0 ; PA1 O LCD_D1 ; PA2 O LCD_D2 ; PA3 O LCD_D3 ; PA4 O nc ; PA5 O nc ; PA6 O nc ; PA7 O nc ; PB0 I nc(pullup) ; PB1 I nc(pullup) ; PB2 I nc(pullup) ; PB3 I nc(pullup) ; PB4 I nc(pullup) ; PB5 I MOSI ; PB6 I MISO ; PB7 I SCK ; PC0 I SCL ; PC1 I SDA ; PC2 I nc(pullup) ; PC3 I nc(pullup) ; PC4 I nc(pullup) ; PC5 I nc(pullup) ; PC6 I nc(pullup) ; PD0 O PCLK ; PD1 O Load ; PD2 O Frame ; PD3 O AC ; PD4 O ONOFF ; PD5 O Kontrast ; PD6 O nc ; PD7 O nc .include "m16def.inc" ;Register: .def regsave =r7 .def clockL =r8 .def clockH =r9 .def X_Cnt =r10 .def temp =r16 .def Y_Cnt =r17 .def C_Cnt =r18 .def tempdat =r19 ;I2C data transfer register .def Cnt =r20 .def RTCCnt =r21 .def Wert_akt =r22 ;aktueller Wert von der RTC und I2C address and direction register .def X_lang =r23 ;Länge des Datenblocks und Zeichen (RTC) .def X_off =r24 ;X Offset des Datenblocks ;zusätzlich: X, Y, Z ;*************************************************************************************** ;LCD Konstanten ;PORTD .equ CLOCK =0 ;Pixelclock .equ LP =1 ;Latch Puls (HSync) .equ FRAME =2 ;First Line Marker (VSync) .equ ONOFF =4 ;LCD (VLCD) Enable .equ PWM =5 ;PWM für Contrast ;Werte .equ Framerate =50 ;Refreshrate .equ F_CPU =16000000 ;CPU Freq .equ RX_Buffer =32 ; Interne Konstanten .equ HFREQ =Framerate*240 .equ TDIV =((F_CPU/8+(HFREQ)/2)/HFREQ) .equ CSize =24 ;Zeilenhöhe 24 Pixel .equ XSize =40 ;Zeilenbreite 40 Byte .equ YSize =240/CSize ;Anzahl Zeilen ;************************************************************************************ ;Timerkonstanten ;Vorgaben für die RTC (!!!!!Uhr stellen!!!!!!!) ;------------------------------------------------------------------------- .equ Sekunden = 0x30 ;Sekunden=30 .equ Minuten = 0x23 ;Minuten=58 .equ Stunden = 0x16 ;Stunden=18 (24-Hour Mode) .equ Wochentag = 0x05 ;Wochentag (1=Sonntag,2=Montag...) .equ Datum = 0x28 ;Tag .equ Monat = 0x05 ;März .equ Jahr = 0x10 ;2010 ;------------------------------------------------------------------------- ;Offsets ;Offsets der Daten im Flash .equ Font_St =0x600*2 .set WTag_St =0+Font_St .equ den =2400+Font_St .equ Jahr_St =2544+Font_St .equ Dat_St =4464+Font_St .equ Punkt =5044+Font_St .set Mon_St =5092+Font_St .equ Zeit_St =8452+Font_St .equ Sek_St =4464+Font_St .equ Doppelpunkt =12772+Font_St .equ Jahr_ =192 ;Länge der einzelnen Datenblöcke .equ Dat_ =58 .equ Zeit_ =432 .equ Sek_ =58 ;TWI - Konstanten .equ TWIrd = 1 .equ TWIwr = 0 .equ I2CDispAdr = 0b11010000 ;Timer Adresse .equ I2CPORT = PORTC .equ I2CDDR = DDRC .equ C_Start = 0x00 ;Start Clock .equ Sek_Register = 0x00 .equ Min_Register = 0x01 .equ Std_Register = 0x02 .equ Tag_Register = 0x03 .equ Dat_Register = 0x04 .equ Mon_Register = 0x05 .equ Jahr_Register = 0x06 .MACRO offset ;Makro zur Berechnung des Null-offsets mit aktuellem Wert clr r0 clr r1 mul ZL, Wert_akt movw r3:r2, r1:r0 mul ZH, Wert_akt add r2, r1 adc r3, r0 mul temp, C_Cnt add r2, r0 adc r3, r1 .ENDM .dseg Inhalt: .byte 40 ;eine Pixelreile, 40 byte Länge und 24 Pixel Höhe ;Bytes vom DS1307 werden hier gespeichert: _Sek: .byte 1 _Min: .byte 1 _Std: .byte 1 _WTag: .byte 1 _Dat: .byte 1 _Mon: .byte 1 _Jahr: .byte 1 ;umgerechnete (BCD-binär) Werte werden hier gespeichert: Sek_Z: .byte 1 Sek_E: .byte 1 Min_Z: .byte 1 Min_E: .byte 1 Std_Z: .byte 1 Std_E: .byte 1 WTag_dummy: .byte 1 WTag_akt: .byte 1 Dat_Z: .byte 1 Dat_E: .byte 1 Mon_dummy: .byte 1 Mon_akt: .byte 1 Jahr_Z: .byte 1 Jahr_E: .byte 1 ;Hunderter und Tausender mit Software ; Interrupt Vektoren ;**************************************************************************** .cseg .org 0 rjmp Reset .org OC2addr rjmp LCD_Line ;**************************************************************************** ; CPU Register Initialisierung ;**************************************************************************** Reset: ldi temp, low(RAMEND) out SPL, temp ;setup stack pointer ldi temp, high(RAMEND) out SPH, temp ;setup stack pointer ;LCD einrichten und starten ser temp ;set Register -> 0xFF out DDRD, temp ;PCLK, LOAD, FLM, M, ONOFF out DDRA, temp ;D0 - D3 ;Timer 1 (16 bit) zur Kontrastregelung ldi temp, (1< 62,5kHz PWM out TCCR1B, temp ;Timer Counter Control Register 1B (Timer 1) ldi temp, 128 ;low byte des 16 bit Vergleichswertes out OCR1AL, temp ;Output Compare Register Timer 1A Low ;Timer 2 (8 bit) zur Interruptsteuerung für LCD ldi temp, (1<