;.include "m8def.inc" .include "m168def.inc" .equ F_CPU = 18432000 .equ Takt = 18432000 .equ BAUD = 115200 ; Bitrate und Prescaler müssen berechnet werden. .equ TWI_BIT_RATE =27 ;Bitratenfaktor ca 20Khz .equ TWI_PRESCALER =2 ;Prescaler für ca 20Khz ;Formel für TWI-Bitrate ; FCPU ;------------------ ;16+2*Bitrate*4^Prescaler ; .equ TWI_BIT_RATE =21 ;Bitratenfaktor ca 40Khz ; .equ TWI_PRESCALER =1 ;Prescaler für ca 40Khz ; .equ TWI_PRESCALER =2 ;################################### ; Berechnungen .equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever runden .equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; Reale Baudrate .equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille .if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; max. +/-10 Promille Fehler .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!" .endif .org 0x00 rjmp start ;.org INT0addr ; rjmp int_int0 ; Interruptvektor für Int0== $002 ; External Interrupt Request 0 .org 0x0002 jmp int_int0 ;.org URXCaddr ; Interruptvektor für UART-Empfang ; rjmp int_rxc .org 0x0024 jmp int_rxc ;############################# ; MAIN ;############################# start: ;################################### ; Stackpointer initialisieren ldi temp, LOW(RAMEND) ;Stack initalisieren out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ;################################### ; Baudrate einstellen 115200 ldi temp, HIGH(UBRR_VAL) ; UART initialisieren sts UBRR0H, temp ;atmega 168 ldi temp, LOW(UBRR_VAL) sts UBRR0L, temp ;atmega 168 ; Frame-Format: 8 Bit ldi temp, (1< akku_2 low --> temp ; call bin_to_ascii ; mov zeichen,akku_2 ; rcall serout ; mov zeichen,temp ; rcall serout ;#ä### call DS1307_to_sram ; auslesen vom DS1307 ( Jahr - minute ) speichern im SRAM ;############################### ;############################### MAIN: rjmp main ;############################## ; MAIN ENDE ;############################## int_rxc: cli ; alle Interrupts sperren push temp ; temp auf dem Stack sichern in temp,sreg push temp lds temp, UDR0 ; empfangenes Byte lesen, mov zeichen,temp ; empfangenes Zeichen in "zeichen" speichern rcall serout ende_int_rxc: pop temp ; temp wiederherstellen out sreg,temp pop temp sei ; alle Interrupts wieder freigeben reti ; ENDE UART-Unterbrechungsroutine ; #################################### ;############################################### ;#### INT0 Interruptroutine fallende Flanke! int_int0: cli ; alle Interrupts sperren push temp ; temp auf dem Stack sichern in temp,sreg push temp push zeichen rcall return rcall lese_DS1307 ldi zeichen,'.' rcall serout rcall test_sek_null ; rcall return ; rcall lese_DS1307 ; ldi zeichen,'.' ; rcall serout pop zeichen pop temp ; temp wiederherstellen out sreg,temp pop temp sei ; alle Interrupts wieder freigeben reti ;######## ENDE INT0 Interuptroutine ;############################################################################