- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 2 von 2

Thema: Tiny 2313 Bibliothek

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    174

    Tiny 2313 Bibliothek

    Anzeige

    Powerstation Test
    Eine Bib mal für den Tiny2313 kompatible Includes sind GRÜN gekennzeichnet und können aus der ATMEGA8 Bibliothek übernommen werden.

    2313.asm
    Code:
    ;# Projekt: 								# 
    ;# 											#
    ;#											#
    ;# Taktfrequenz des AVR: 4 MHz	 			#
    ;# 											#
    ;# CS-SOFT 									#
    ;###########################################
    
    ;.include "2313def.inc"	;2313
    .include "tn2313def.inc"	;Tiny 2313
    ;.include "tn2313Adef.inc"	;Tiny 2313
    .def math1h 	= r8
    .def math1l 	= r9
    .def math2h 	= R10
    .def math2l 	= r11
    .def matherghh	= r12
    .def mathergh	= r13
    .def mathergl	= r14
    .def mathergll	= r15
    
    .def temp0 = r16 	; 
    .def temp1 = r17 	;
    .def temp2 = r18
    .def temp3 = r19 	;
    .def temp4 = r20
    .def cnt   = r21
    
    ;für UART KOM
    .equ cpu	= 4000000
    .equ Baud	= 9600
    .equ UBRRx	= cpu/(16*Baud)-1
    
    ;**********LCD Port mit 74HC164
    .equ port_lcd_x 	= 	portb		;gilt für 4/8bit modus	
    .equ ddrx_lcd_x 	= 	ddrb		;
    
    ;				Pinbelegungen
    ;                  STD
    .equ SClock		= 	0		;LCD	;;;
    .equ SRS		=	0
    .equ SData		= 	1		;74164	;;;;;so Kann die HW angeschlossen sein
    .equ SRW		=	1
    .equ Light		= 	2		;LCD	;;;;;
    .equ SEnable	= 	3		;74164	;;;
    
    /*
    ;********* parallel für LCD/Simulationssoftware*************
    .equ st_port_lcd_x = portd
    .equ st_ddrx_lcd_x = ddrd
    ;                  STD
    .equ RW			=	3	;
    .equ RS			=	4	;
    .equ Enable		= 	5	;
    */
    ;Entry Set
    .equ SH			=	0 ;1 = Display shift	0 = not shifted
    .equ ID			=	1 ;1 = increase 		0 = decrease
    .equ HES		=	2 ;immer 1 setzen Symbolisiert das Ende 
                          ;des Commandos
    ;DISPLAY on/off
    .equ B			=	0 ;1 = Blink 		0 = no Blink
    .equ C			=	1 ;1 = Cursor on 	0 = Cursor off
    .equ D			=	2 ;1 = Disp on		0 = Disp off
    .equ HD			=	3 ;immer 1 setzen Symbolisiert das Ende 
                          ;des Commandos
    ;Shift
    .equ RL			=	2 ;1 = right shift	0 = left shift
    .equ SC			=	3 ;1 = Disp shift	0 = Cursor move
    .equ HS			=	4 ;immer 1 setzen Symbolisiert das Ende 
                          ;des Commandos
    ;SET Function
    .equ F			=	2 ;1 = 5x10			0 = 5x7
    .equ N			=	3 ;1 = 2line(4line)	0 = 1line
    .equ DL			=	4 ;1 = 8bit int		0 = 4bit interface
    .equ HSF		=	5 ;immer 1 setzen Symbolisiert das Ende 
                          ;des Commandos
    /*
    ;**********Auslesen des LTC1286 externer ADC
    .equ	LTCPortX	=	PortB
    .equ 	LTCddrX		=	DDrB
    .equ	LTCpinX		=	PinB
    
    .equ	LTCCLK		=	0				;Takterzeugung
    .equ	LTCDat		=	1				;Daten von Leitung
    .equ	nCS			=	2				;chipselect/shutdown
    
    
    ;****DS18S20 Digitaler Temperatursensor
    .equ ddrx_ds		= ddrb	
    .equ portx_ds		= portb
    .equ pinx_ds		= pinb
    .equ pin_ds_x		= 0
    
    .equ dssvrng		= $00a0		;Speicherbereich für DS-ID's 
    .equ dstemphl		= $0090		;Speicherbereich für Temp mit Kommastelle 
    */
    
    ;**********SRAM
    .equ 	erg_k		=	$0060			;erg_k wird bis zu 5 weiteren bytes genutzt sprich erg_k+5
    .equ 	ocra0		=	$0065			;für T0
    .equ	ocrb0		=	$0066			;für T0		
    .equ 	ocra1h		=	$0067			;;;;;
    .equ 	ocra1l		=	$0068			;;;;;;;; für T1 A channel
    .equ 	ocrb1h		=	$0069			;;;;;
    .equ 	ocrb1l		=	$006a			;;;;;;;; für T1 B channel
    .equ 	icr1xh		=	$006b			;;;;;
    .equ 	icr1xl		=	$006c			;;;;;;;; für T1 ICR
    .equ	LTC_wertH	=	$006d			;adc extern
    .equ	LTC_wertL	=	$006e			;adc extern
    .equ	eep_adr		=	$006f			;eeprom
    
    ;***************************Einsprungadressen***********************
    .cseg
    .org $0000
    
    	rjmp		stack
    .org $0001		;1
    	reti;rjmp	INT_0
    .org $0002		;2
    	reti;rjmp	INT_1
    .org $0003		;3
    	reti;rjmp	INT_ICP1
    .org $0004		;4
    	reti;rjmp	INT_OC1A
    .org $0005		;5
    	reti;rjmp	INT_OVF1
    .org $0006		;6
    	reti;rjmp	INT_OVF0
    .org $0007		;7
    	reti;rjmp	INT_URXC
    .org $0008		;8
    	reti;rjmp	INT_UDRE	
    .org $0009		;9
    	reti;rjmp	INT_UTXC
    .org $000a		;a
    	reti;rjmp	ac_int
    .org $000b		;b
    	reti;rjmp	PCINT	
    .org $000c		;c
    	reti;rjmp	INT_OC1B	
    .org $000d		;d
    	reti;rjmp	INT_OC0A
    .org $000e		;e
    	reti;rjmp	INT_OC0B
    .org $000f		;f
    	reti;rjmp	INT_USI_Start
    .org $0010		;10
    	reti;rjmp	INT_USI_OVFL
    .org $0011		;11
    	reti;rjmp	eeprom_rdy
    .org $0012		;12
    	reti;rjmp	INT_WDT_OVFL
    ;***************************Init mit allem drumdran*****************
    stack:	ldi 		temp0,low(ramend)   ;Stackpointer festlegen
            out 		spl, temp0
    	;	rcall		sram
    
    	;	rcall		lcd_init
    	;	rcall		lcd_clear
    	;	rcall		werbe1
    	;	rcall		werbe2
    	;	rcall		wait1s		
    	;	rcall		leer_z
    
    	;	rcall		mode0_t0_init			;Timer 0 in MODE 0
    	;	rcall		prescaler_T0_on			;
    
    	;	rcall		mode8_T1_init			;Timer 1 in MODE 8
    	;	rcall		prescaler_T1_on
    
    	;	rcall		INIT_ext_Int01			;Externe INT aktivieren
    	;	rcall		deak_int01	
    
    	;	rcall		eeprom_init				;wenn ints bevorzugt werden	
    	;	rcall		adr_cnt
    	;	rcall		eeprom_write
    		
    	;	rcall		AC_init					;interner AnalogComparator aktvieren
    	;	rcall		ac_change
    	
    		rcall		usart_init				;wenn INT bevorzugt dann hier aktivieren und prog erweitern 
    	;	rcall		werbe_rs
    
    start:	;rcall		zahl_rs_load_out		;Zahlenausgabe über UART
    		;rcall		enter_rs232
    		
    		;rcall		zahl_out_lcd			;Zahleausgabe über LCD
    		
    		rcall		wait1s
    		
    		rjmp		start
    
    ;*************************weitere*includedata***********************
    .include "2313_analogcomparator.asm"	;bezogen auf "2313"
    .include "2313_eeprom.asm"				;bezogen auf "2313"
    .include "2313_ext_ints.asm"			;bezogen auf "2313"
    .include "2313_timercounter.asm"		;bezogen auf "2313"
    .include "2313_uart_std.asm"			;bezogen auf "2313"
    ;.include "2313_LCD_Txt_out.asm"
    .include "2313_RS_Txt_out.asm"
    
    ;Kompatible Includes
    ;.include "mathe.asm"
    ;.include "lcd_KS0066_KS0070_8bit.asm"
    .include "zeitschleifen.asm"
    .include "hex_dez_wandlung.asm" ;gebraucht für LCD oder nur umwandlung
    ;*************************ENDE**************************************
    2313_analogcomparator.asm
    Code:
    ;ACHTUNG man kann im simulator nicht mit PD6/7 simulieren geht nur
    ;wenn ACO händisch gesetzt wird ACO=1 wird auch ACI=1 um den int zu nutzen
    ;wenn man den int nicht nutzt ist die abfrage auf ACO 
    
    AC_init:
    		ldi			temp0,(0<<ACD|0<<ACBG|1<<ACIE|0<<ACIC|0<<ACIS1|0<<ACIS0)
    		out			ACSR,temp0	
    		sei						;
    		ret
    
    ac_change:
    		sbis		ACSR,ACO
    		rjmp		ac_change
    		ret
    
    ac_int:
    		;wird aufgerufen wenn pb1-/pb0+ pegelunterschiede feststellen
    		reti

    2313_eeprom.asm
    Code:
    ;*************************************
    eeprom_init:
    		ldi		temp0,(1<<EERIE)
    		out		EECR,temp0
    		sei
    		ret
    
    eeprom_rdy:
    		;siehe eeprom_write ;** man kann in der wartezeit andere sachen erledigen
    		;bis der int kommt, um dann weitere daten an den eeprom zum schreiben zu senden 
    		;nur bei eeprom schreiben möglich
    		reti
    
    ;Adreessierung im eeprom
    adr_cnt:lds		temp0,eep_adr
    		inc		temp0
    		cpi		temp0,$ff
    		breq	error_eeprom
    		sts		eep_adr,temp0
    		ret
    
    error_eeprom:
    		;voll
    		ret
    
    EEPROM_write:				
    		sbic 	EECR,EEWE		;** falls eewe im eecr noch gesetzt
    		rjmp 	EEPROM_write	;** spring zu zurück
    		lds		r17,eep_adr
    		out 	EEARL, r17		;lowbyte der adr
    		out 	EEDR,r16		;zu speichernder wert
    		sbi 	EECR,EEMWE		;sperrt eeprom master write enable
    		sbi 	EECR,EEWE		;setze EEWE um eeprom zu schreiben
    		ret
    
    EEPROM_read:				
    		sbic 	EECR,EEWE		;falls eewe im eecr noch gesetzt
    		rjmp 	EEPROM_read		;springe zurück
    		lds		r17,eep_adr
    		out 	EEARL, r17		;lowbyte der adr
    		sbi 	EECR,EERE		;sperrt lesen des eeproms
    		in 		r16,EEDR		;zu lesender wert
    		ret
    2313_ext_ints.asm
    Code:
    ;PD2/3 sind INT0/1
    INIT_EXT_INT01:
    		in			temp0,MCUCR
    		ori			temp0,(1<<ISC11|1<<ISC10|1<<ISC01|1<<ISC00) ;hier INT0/1 auf steigende flanke siehe PDF KAP.13
    		out			MCUCR,temp0
    
    		in			temp0,GIMSK
    		ori			temp0,(1<<PCIE|1<<INT1|1<<INT0)			;beide INTs aktiv
    		out			GIMSK,temp0
    
    		in			temp0,PCMSK
    		ori			temp0,(1<<PCINT0|0<<PCINT1|0<<PCINT2|0<<PCINT3|0<<PCINT4|0<<PCINT5|0<<PCINT6|1<<PCINT7)
    		out			PCMSK,temp0
    
    		sei			;global int
    		ret
    
    deak_INT01:
    		in			temp0,GIMSK
    		andi		temp0,(0<<INT1|0<<INT0)			;beide INTs aktiv
    		out			GIMSK,temp0
    		ret
    
    INT_0:	;hier steht das programm welches ausgeführt werden soll 
    		reti
    
    INT_1:	;hier steht das programm welches ausgeführt werden soll
    		reti
    2313_timercounter.asm
    Code:
    ;*****************************INIT-Mode 1 Timer0********************************************************************
    mode0_T0_init:;NORMAL_MODE  TOP = $FF, UpD OCR on IMMEDIATE, FLAG MAX
    		;rcall		A0_ch_en						;out aktivieren
    		;rcall		A0_ch_load					;Zeitwert laden
    		;rcall		B0_ch_en						;out aktivieren
    		;rcall		B0_ch_load					;Zeitwert laden
    		in			temp0,TCCR0B
    		ori			temp0,(0<<WGM02)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR0B,temp0
    		in			temp0,TCCR0A
    		ori			temp0,(0<<COM0A1|0<<COM0A0|0<<COM0B1|0<<COM0B0|0<<WGM01|0<<WGM00)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR0A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE0|0<<OCIE0A|0<<OCIE0B)	;INT für OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0
    		ret
    
    mode1_T0_init:;PWM PHASE CORRECT MODE  TOP = $FF, UpD OCR on TOP, FLAG BOTTOM
    		rcall		A0_ch_en					;out aktivieren
    		rcall		A0_ch_load					;Zeitwert laden
    		rcall		B0_ch_en					;out aktivieren
    		rcall		B0_ch_load					;Zeitwert laden
    		in			temp0,TCCR0B
    		ori			temp0,(0<<WGM02)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR0B,temp0
    		in			temp0,TCCR0A
    		ori			temp0,(0<<COM0A1|1<<COM0A0|0<<COM0B1|1<<COM0B0|0<<WGM01|1<<WGM00)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR0A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE0|0<<OCIE0A|0<<OCIE0B)	;INT für OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0
    		ret
    
    mode2_T0_init:;CTC MODE   TOP = OCR0A, UpD OCR on immediate, FLAG MAX
    	;	rcall		A0_ch_en					;out aktivieren
    		rcall		B0_ch_en					;out aktivieren
    		rcall		A0_ch_load					;Zeitwert laden
    		in			temp0,TCCR0B
    		ori			temp0,(0<<WGM02)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR0B,temp0
    		in			temp0,TCCR0A
    		ori			temp0,(0<<COM0A1|1<<COM0A0|0<<COM0B1|1<<COM0B0|1<<WGM01|0<<WGM00)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR0A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE0|0<<OCIE0A|1<<OCIE0B)	;INT für OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0
    		ret
    
    mode3_T0_init:;FAST PWM MODE  TOP = $FF, UpD OCR on TOP, FLAG MAX
    		rcall		A0_ch_en					;out aktivieren
    		rcall		A0_ch_load					;Zeitwert laden
    		rcall		B0_ch_en					;out aktivieren
    		rcall		B0_ch_load					;Zeitwert laden
    		in			temp0,TCCR0B
    		ori			temp0,(0<<WGM02)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR0B,temp0
    		in			temp0,TCCR0A
    		ori			temp0,(1<<COM0A1|0<<COM0A0|1<<COM0B1|0<<COM0B0|1<<WGM01|1<<WGM00)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR0A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE0|1<<OCIE0A|1<<OCIE0B)	;INT für OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0
    		ret
    
    ;mode4_T0_init: RESERVED
    
    mode5_T0_init:;PWM PHASE CORRECT MODE  TOP=OCR0A, UpD OCR on TOP, FLAG BOTTOM
    		rcall		A0_ch_en					;out aktivieren
    		;rcall		B0_ch_en					;out aktivieren
    		rcall		A0_ch_load					;Zeitwert laden
    		;rcall		B0_ch_load					;Zeitwert laden
    		in			temp0,TCCR0B
    		ori			temp0,(1<<WGM02)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR0B,temp0
    		in			temp0,TCCR0A
    		ori			temp0,(0<<COM0A1|1<<COM0A0|0<<COM0B1|0<<COM0B0|0<<WGM01|1<<WGM00)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR0A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE0|1<<OCIE0A|0<<OCIE0B)	;INT für OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0
    		ret
    
    ;mode6_T0_init: RESERVED
    
    mode7_T0_init:;FAST CORRECT MODE  TOP=OCR0A, UpD OCR on TOP, FLAG TOP
    		;rcall		A0_ch_en					;out aktivieren
    		rcall		B0_ch_en					;out aktivieren
    		rcall		A0_ch_load					;Zeitwert laden
    		in			temp0,TCCR0B
    		ori			temp0,(1<<WGM02)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR0B,temp0
    		in			temp0,TCCR0A
    		ori			temp0,(0<<COM0A1|0<<COM0A0|1<<COM0B1|1<<COM0B0|1<<WGM01|1<<WGM00)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR0A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE0|0<<OCIE0A|1<<OCIE0B)	;INT für OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0
    		ret
    
    ;**********Channel load 
    A0_ch_load:
    		ldi			temp0,$9d		;Toggeln oder Clr/Set aktiv muss OCR1Al-Register beachtet werden um
    		sts			OCRa0,temp0		;____--- oder _------ zu erreichen
    		out			OCR0A,temp0
    		ret
    
    A0_ch_en:
    		sbi			ddrb,2			;output aktivieren wenn Toggeln am PINB1=OCR1A erwünscht
    		ret
    
    A0_ch_dis:
    		cbi			ddrb,2			;output deaktivieren wenn Toggeln am PINB1=OCR1A erwünscht
    		ret
    
    B0_ch_load:
    		ldi			temp0,$80		;Toggeln oder Clr/Set aktiv muss OCR1Bl-Register beachtet werden um
    		sts			OCRb0,temp0		;____--- oder _------ zu erreichen
    		out			OCR0B,temp0
    		ret
    
    B0_ch_en:
    		sbi			ddrd,5			;output aktivieren wenn Toggeln am PINB1=OCR1A erwünscht
    		ret
    
    B0_ch_dis:
    		cbi			ddrd,5			;output deaktivieren wenn Toggeln am PINB1=OCR1A erwünscht
    		ret
    
    prescaler_T0_on:
    		in			temp0,TCCR0B
    		ori			temp0,(0<<CS02|0<<CS01|1<<CS00) ;schmeißt den counter an
    		out			TCCR0B,temp0
    		sei
    		ret
    
    prescaler_T0_off:
    		in			temp0,TCCR0B
    		andi		temp0,(0<<CS02|0<<CS01|0<<CS00) ;stoppt den counter an
    		out			TCCR0B,temp0
    		ret
    
    ;*******ISR
    INT_OVF0:
    		;$0006
    		;Achtung T0 muss hier neu geladen werden und dann die eigene IDEE
    		reti
    
    INT_OC0A: ;$000d Timer/Counter0 Compare Match A
    		reti
    
    INT_OC0B: ;$000e Timer/Counter0 Compare Match B
    		reti
    
    ;******************************Init-Modes des Timers1***************************************************************
    mode0_T1_init:;NORMAL_MODE  OCR1A h:l,OCR1B h:l TOP=$FFFF, UpD OCR on IMMEDIATE, FLAG MAX
    		rcall		A_ch_en						;out aktivieren
    		rcall		B_ch_en						;out aktivieren
    		rcall		A_ch_load					;Zeitwert laden
    		rcall		B_ch_load					;Zeitwert laden
    		ldi			temp0,(0<<ICNC1|0<<ICES1|0<<WGM13|0<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1B,temp0	
    		in			temp0,TCCR1A
    		ori			temp0,(0<<COM1A1|0<<COM1A0|0<<COM1B1|0<<COM1B0|0<<WGM11|0<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(1<<TOIE1|0<<OCIE1A|0<<OCIE1B|0<<ICIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0						
    		ret
    
    mode1_T1_init:;8bit phase correct mode OCR1A h:l,OCR1B h:l TOP=$00FF, UpDOCRx on TOP, FLAG BOTTOM
    		rcall		A_ch_en						;out aktivieren
    		rcall		B_ch_en						;out aktivieren
    		rcall		A_ch_load					;Zeitwert laden
    		rcall		B_ch_load					;Zeitwert laden
    		ldi			temp0,(0<<ICNC1|0<<ICES1|0<<WGM13|0<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1B,temp0	
    		in			temp0,TCCR1A
    		ori			temp0,(1<<COM1A1|1<<COM1A0|1<<COM1B1|1<<COM1B0|0<<WGM11|1<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE1|1<<OCIE1A|1<<OCIE1B|0<<ICIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0						
    		ret
    
    mode2_T1_init:;9bit phase correct mode OCR1A h:l,OCR1B h:l TOP=$01FF, UpDOCRx on TOP, FLAG BOTTOM
    		rcall		A_ch_en						;out aktivieren
    		rcall		B_ch_en						;out aktivieren
    		rcall		A_ch_load					;Zeitwert laden
    		rcall		B_ch_load					;Zeitwert laden
    		ldi			temp0,(0<<ICNC1|0<<ICES1|0<<WGM13|0<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1B,temp0	
    		in			temp0,TCCR1A
    		ori			temp0,(1<<COM1A1|1<<COM1A0|1<<COM1B1|1<<COM1B0|1<<WGM11|0<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE1|1<<OCIE1A|1<<OCIE1B|0<<ICIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0						
    		ret
    
    mode3_T1_init:;10bit phase correct mode OCR1A h:l,OCR1B h:l TOP=$03FF, UpDOCRx on TOP, FLAG BOTTOM
    		rcall		A_ch_en						;out aktivieren
    		rcall		B_ch_en						;out aktivieren
    		rcall		A_ch_load					;Zeitwert laden
    		rcall		B_ch_load					;Zeitwert laden
    		ldi			temp0,(0<<ICNC1|0<<ICES1|0<<WGM13|0<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1B,temp0	
    		in			temp0,TCCR1A
    		ori			temp0,(1<<COM1A1|1<<COM1A0|1<<COM1B1|1<<COM1B0|1<<WGM11|1<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE1|1<<OCIE1A|1<<OCIE1B|0<<ICIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0						
    		ret
    
    mode4_T1_init:;CTC mode OCR1A h:l,OCR1B h:l TOP=OCR1A, UpDOCRx on IMMEDIATE, FLAG MAX
    		rcall		A_ch_en						;out aktivieren
    		rcall		B_ch_en						;out aktivieren
    		rcall		A_ch_load					;Zeitwert laden
    		rcall		B_ch_load					;Zeitwert laden
    		ldi			temp0,(0<<ICNC1|0<<ICES1|0<<WGM13|1<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1B,temp0	
    		in			temp0,TCCR1A
    		ori			temp0,(0<<COM1A1|1<<COM1A0|0<<COM1B1|1<<COM1B0|0<<WGM11|0<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE1|1<<OCIE1A|1<<OCIE1B|0<<ICIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0						
    		ret
    
    mode5_T1_init:;FAST PWM 8bit OCR1A h:l,OCR1B h:l TOP=$00FF, UpDOCRx on TOP, FLAG TOP
    		rcall		A_ch_en						;out aktivieren
    		rcall		B_ch_en						;out aktivieren
    		rcall		A_ch_load					;Zeitwert laden
    		rcall		B_ch_load					;Zeitwert laden
    		ldi			temp0,(0<<ICNC1|0<<ICES1|0<<WGM13|1<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1B,temp0	
    		in			temp0,TCCR1A
    		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|0<<WGM11|1<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE1|1<<OCIE1A|1<<OCIE1B|0<<ICIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0						
    		ret
    
    mode6_T1_init:;FAST PWM 9bit OCR1A h:l,OCR1B h:l TOP=$01FF, UpDOCRx on TOP, FLAG TOP
    		rcall		A_ch_en						;out aktivieren
    		rcall		B_ch_en						;out aktivieren
    		rcall		A_ch_load					;Zeitwert laden
    		rcall		B_ch_load					;Zeitwert laden
    		ldi			temp0,(0<<ICNC1|0<<ICES1|0<<WGM13|1<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1B,temp0	
    		in			temp0,TCCR1A
    		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|1<<WGM11|0<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE1|1<<OCIE1A|1<<OCIE1B|0<<ICIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0						
    		ret
    
    mode7_T1_init:;FAST PWM 10bit OCR1A h:l,OCR1B h:l TOP=$01FF, UpDOCRx on TOP, FLAG TOP
    		rcall		A_ch_en						;out aktivieren
    		rcall		B_ch_en						;out aktivieren
    		rcall		A_ch_load					;Zeitwert laden
    		rcall		B_ch_load					;Zeitwert laden
    		ldi			temp0,(0<<ICNC1|0<<ICES1|0<<WGM13|1<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1B,temp0	
    		in			temp0,TCCR1A
    		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|1<<WGM11|1<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE1|1<<OCIE1A|1<<OCIE1B|0<<ICIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0						
    		ret
    
    ;hier mit SIMULATOR 2 arbeiten
    mode8_T1_init:;PWM,PhaseFrequenzyCorrect OCR1A h:l,OCR1B h:l TOP=ICR1/OCR1A, UpDOCRx on BOT, FLAG BOT
    		rcall		A_ch_en						;out aktivieren
    		rcall		B_ch_en						;out aktivieren
    	;	rcall		A_ch_load					;Zeitwert laden
    	;	rcall		B_ch_load					;Zeitwert laden
    		rcall		ICR_load
    		ldi			temp0,(0<<ICNC1|0<<ICES1|1<<WGM13|0<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1B,temp0	
    		in			temp0,TCCR1A
    		ori			temp0,(1<<COM1A1|1<<COM1A0|1<<COM1B1|1<<COM1B0|0<<WGM11|0<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE1|0<<OCIE1A|0<<OCIE1B|1<<ICIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0						
    		ret
    
    mode9_T1_init:;PWM,PhaseFrequenzyCorrect OCR1A h:l,OCR1B h:l TOP=OCR1A, UpDOCRx on BOT, FLAG BOT
    		rcall		A_ch_en						;out aktivieren
    		rcall		B_ch_en						;out aktivieren
    		rcall		A_ch_load					;Zeitwert laden
    		rcall		B_ch_load					;Zeitwert laden
    		ldi			temp0,(0<<ICNC1|1<<ICES1|1<<WGM13|0<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1B,temp0	
    		in			temp0,TCCR1A
    		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|0<<WGM11|1<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE1|1<<OCIE1A|1<<OCIE1B|0<<ICIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0						
    		ret
    
    mode10_T1_init:;PWM,PahseCorrect OCR1A h:l,OCR1B h:l TOP=ICR1, UpDOCRx on TOP, FLAG BOT
    		rcall		A_ch_en						;out aktivieren
    		rcall		B_ch_en						;out aktivieren
    		rcall		A_ch_load					;Zeitwert laden
    		rcall		B_ch_load					;Zeitwert laden
    		;rcall		ICR_load
    		ldi			temp0,(0<<ICNC1|0<<ICES1|1<<WGM13|0<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1B,temp0	
    		in			temp0,TCCR1A
    		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|1<<WGM11|0<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE1|1<<OCIE1A|1<<OCIE1B|0<<ICIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0						
    		ret
    
    mode11_T1_init:;PWM,PahseCorrect OCR1A h:l,OCR1B h:l TOP=OCR1A, UpDOCRx on TOP, FLAG BOT
    		rcall		A_ch_en						;out aktivieren
    		rcall		B_ch_en						;out aktivieren
    		rcall		A_ch_load					;Zeitwert laden
    		rcall		B_ch_load					;Zeitwert laden
    		ldi			temp0,(0<<ICNC1|0<<ICES1|1<<WGM13|0<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1B,temp0	
    		in			temp0,TCCR1A
    		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|1<<WGM11|1<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE1|1<<OCIE1A|1<<OCIE1B|0<<ICIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0						
    		ret
    
    ;hier mit SIMULATOR 2 arbeiten
    mode12_T1_init:;CTC OCR1A h:l,OCR1B h:l TOP=ICR1, UpDOCRx on Immediate, FLAG MAX
    		rcall		A_ch_en						;out aktivieren
    		rcall		B_ch_en						;out aktivieren
    		;rcall		A_ch_load					;Zeitwert laden
    		;rcall		B_ch_load					;Zeitwert laden
    		rcall		ICR_load
    		ldi			temp0,(0<<ICNC1|0<<ICES1|1<<WGM13|1<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1B,temp0	
    		in			temp0,TCCR1A
    		ori			temp0,(0<<COM1A1|1<<COM1A0|0<<COM1B1|1<<COM1B0|0<<WGM11|0<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE1|0<<OCIE1A|0<<OCIE1B|1<<ICIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0						
    		ret
    
    mode13_T1_init:;RESERVED not activated
    	/*	;rcall		A_ch_en						;out aktivieren
    		;rcall		B_ch_en						;out aktivieren
    		;rcall		A_ch_load					;Zeitwert laden
    		;rcall		B_ch_load					;Zeitwert laden
    		ldi			temp0,(1<<WGM13|1<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1B,temp0	
    		in			temp0,TCCR1A
    		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|0<<WGM11|1<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE1|0<<OCIE1A|0<<OCIE1B|0<<ICIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0						
    	*/	ret
    
    ;hier mit SIMULATOR 2 arbeiten
    mode14_T1_init:;FAST PWM OCR1A h:l,OCR1B h:l TOP=ICR1, UpDOCRx on TOP, FLAG TOP
    		rcall		A_ch_en						;out aktivieren
    		rcall		B_ch_en						;out aktivieren
    		;rcall		A_ch_load					;Zeitwert laden
    		;rcall		B_ch_load					;Zeitwert laden
    		rcall		ICR_load
    		ldi			temp0,(0<<ICNC1|0<<ICES1|1<<WGM13|1<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1B,temp0	
    		in			temp0,TCCR1A
    		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|1<<WGM11|0<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE1|0<<OCIE1A|0<<OCIE1B|1<<ICIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0						
    		ret
    
    mode15_T1_init:;FAST PWM OCR1A h:l,OCR1B h:l TOP=OCR1A, UpDOCRx on TOP, FLAG TOP
    		rcall		A_ch_en						;out aktivieren
    		rcall		B_ch_en						;out aktivieren
    		rcall		A_ch_load					;Zeitwert laden
    		;rcall		B_ch_load					;Zeitwert laden
    		ldi			temp0,(0<<ICNC1|0<<ICES1|1<<WGM13|1<<WGM12)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1B,temp0	
    		in			temp0,TCCR1A
    		ori			temp0,(1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|1<<WGM11|1<<WGM10)	;zum Toggeln COM1xA/B Einstellungen beachten!!!!!!!!!
    		out			TCCR1A,temp0
    		in			temp0,TIMSK
    		ori			temp0,(0<<TOIE1|0<<OCIE1A|1<<OCIE1B|0<<ICIE1)	;INT für ICP=off, OCIE1A=off, OCIE1B=off, OVFL=1
    		out			TIMSK,temp0						
    		ret
    
    prescaler_T1_on:
    		in			temp0,TCCR1B
    		ori			temp0,(0<<CS12|0<<CS11|1<<CS10) ;schmeißt den counter an
    		out			TCCR1B,temp0
    		sei
    		ret
    
    prescaler_T1_off:
    		in			temp0,TCCR1B
    		andi		temp0,(0<<CS12|0<<CS11|0<<CS10) ;stoppt den counter an
    		out			TCCR1B,temp0
    		ret
    
    ;**********Channel load 
    A_ch_load:
    		ldi			temp0,$00		;Toggeln oder Clr/Set aktiv muss OCR1Ah-Register beachtet werden um
    		sts			OCRa1h,temp0	;____--- oder _------ zu erreichen
    		out			OCR1ah,temp0
    		ldi			temp0,$1d		;Toggeln oder Clr/Set aktiv muss OCR1Al-Register beachtet werden um
    		sts			OCRa1l,temp0	;____--- oder _------ zu erreichen
    		out			OCR1al,temp0
    		ret
    
    A_ch_en:sbi			ddrb,3			;output aktivieren wenn Toggeln am PINB1=OCR1A erwünscht
    		ret
    
    A_ch_dis:
    		cbi			ddrb,3			;output deaktivieren wenn Toggeln am PINB1=OCR1A erwünscht
    		ret
    
    B_ch_load:
    		ldi			temp0,$00		;Toggeln oder Clr/Set aktiv muss OCR1Bh-Register beachtet werden um
    		sts			OCRb1h,temp0	;____--- oder _------ zu erreichen
    		out			OCR1bh,temp0
    		ldi			temp0,$80		;Toggeln oder Clr/Set aktiv muss OCR1Bl-Register beachtet werden um
    		sts			OCRb1l,temp0	;____--- oder _------ zu erreichen
    		out			OCR1bl,temp0
    		ret
    
    B_ch_en:sbi			ddrb,4			;output aktivieren wenn Toggeln am PINB1=OCR1A erwünscht
    		ret
    
    B_ch_dis:
    		cbi			ddrb,4			;output deaktivieren wenn Toggeln am PINB1=OCR1A erwünscht
    		ret
    
    ICR_load:
    		ldi			temp0,$00		;Toggeln oder Clr/Set aktiv muss OCR1Bh-Register beachtet werden um
    		sts			ICR1xh,temp0		;____--- oder _------ zu erreichen
    		out			ICR1h,temp0
    		ldi			temp0,$80		;Toggeln oder Clr/Set aktiv muss OCR1Bl-Register beachtet werden um
    		sts			ICR1xl,temp0	;____--- oder _------ zu erreichen
    		out			ICR1l,temp0
    		ret
    
    T1_clr:	
    		clr			temp0
    		out			TCNT1h,temp0
    		out			TCNT1l,temp0
    		ret
    
    ;**********ISR
    INT_ICP1: ;$0005 Timer/Counter1 Capture Event
    		;ICRH:L wird vom Counter TCNT1H:L bei Steigender/Fallender Flanke beschrieben
    		reti
    
    INT_OC1A: ;$0006 Timer/Counter1 Compare Match A
    		push		temp0
    		lds			temp0,OCRa1h		;Toggeln oder Clr/Set aktiv muss OCR1Ah-Register beachtet werden um
    		out			OCR1Ah,temp0	;____--- oder _------ zu erreichen
    		lds			temp0,OCRa1l		;Toggeln oder Clr/Set aktiv muss OCR1Al-Register beachtet werden um
    		out			OCR1Al,temp0	;____--- oder _------ zu erreichen
    		sts			OCRa1l,temp0
    		pop			temp0
    		reti
    
    INT_OC1B: ;$0007 Timer/Counter1 Compare Match B
    		push		temp0
    		lds			temp0,OCRb1h		;Toggeln oder Clr/Set aktiv muss OCR1Bh-Register beachtet werden um
    		out			OCR1Bh,temp0	;____--- oder _------ zu erreichen
    		lds			temp0,OCRb1l		;Toggeln oder Clr/Set aktiv muss OCR1Bl-Register beachtet werden um
    		out			OCR1Bl,temp0	;____--- oder _------ zu erreichen
    		pop			temp0
    		reti
    
    INT_OVF1:
     ;$0008 Timer/Counter1 Overflow
    		reti
    Geändert von avr_racer (18.08.2015 um 06:28 Uhr)

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    174
    2313_uart_std.asm
    Code:
    ;************************einfaches Testprogramm******************************
    rx:		rcall		data_received	;warte auf daten von PC
    		cpi			temp1,' '		;vergleich auf leerzeichen
    		brne		rx				;sonst wenn falsch warte weiter
    		ldi			temp1,'*'		;
    		rcall		data_transmit	;sende * als ack
    		ret
    
    tx:		rcall		wait150ms
    		ldi			temp1,'T'
    		rcall		data_transmit	;sende T
    		ldi			temp1,'S'
    		rcall		data_transmit	;sende S
    		ldi			temp1,'T'
    		rcall		data_transmit	;sende T
    		rcall		enter_rs232
    		ret
    
    
    
    ;***********************hier wird der Text aus der DB ausgegeben***********
    txt_out_rs_debug:
    		rcall		debug_pnt		;Pointer für Debug laden wird alles in SRAM ab Adresse $0060 geschrieben
    txt_out_rs:
    		lpm		    temp1,z+		;!!! muss in der .db *2 genommen werden
    		cpi			temp1,$ff
    		breq		txt_out_rs_end
    		;st			x+,temp1		;nur einschalten wenn debug angesprungen wird
    		rcall		data_transmit	;z.b.: ldi ZH,high(out0*2)
    		rjmp		txt_out_rs
    txt_out_rs_end:
    		ret
    
    debug_pnt:
    		ldi			xh,high($0060)
    		ldi			xl,low($0060)
    		ret
    
    ;***********This is an ENTER omg*******************************************
    enter_rs232:
    		ldi			temp1,$0d
    		rcall		data_transmit
    		ldi			temp1,$0a
    		rcall		data_transmit
    		ret
    
    leer_zeichen_rs232:
    		ldi			temp1,' '
    		rcall		data_transmit
    		ret
    
    ;***************************ZahlenAusgabe*************************
    zahl_rs_load_out:
    	;	ld			mathergll,y+	;alles in die Mathregs laden
    	;	clr			mathergl
    	;	clr			mathergh
    	;	clr			matherghh
    		rcall		hex_dez			;Zahlenwandlung
    		push		yh				;on stack anderer AdressBereich
    		push		yl				;on stack
    		rcall		load_Y_ergk		;maximale Ausgabe an Zahlen also 5Byte; load_Y_ergk1(4byte),2(3byte),3(2byte),4(1byte)
    zahl_rs_load_out2:
    		rcall		zahl_out_rsx	;Dez in ASCII + Ausgabe
    		cpi			yl,erg_k+5		;
    		brne		zahl_rs_load_out2
    		pop			yl				;from stack
    		pop			yh				;from stack
    		ret	
    
    zahl_out_rsx:						;RSX Ausgabe mit Variabler BYTEZAHL durch load_Y_ergk festgelegt
    		ld			temp1,y+
    		rjmp		zahl_out_rs
    zahl_out_rs1:						;rs Ausgabe 2er Zahlen = 1Byte
    		ld			temp1,y			;   nur um 1byte auszugeben 
    zahl_out_rs:						;wird nur rs1 angesprungen müssen die Daten vorher geladen werden  
    		mov			temp2,temp1
    		swap		temp1
    		andi		temp1,$0f
    		ori			temp1,$30
    		rcall		data_transmit	;Zehnerausgabe
    					;Ausgbabe 1er Zahl
    		mov			temp1,temp2
    		andi		temp1,$0f
    		ori			temp1,$30
    		rcall		data_transmit	;Einerausgabe
    		ret
    
    ;*****************Wandlung von 1A-hex in 1A-ASCII = 31 , 41 Anzeige ist 1 A 
    adr_hex_ASCII_rs:							;Daten vorher in Temp1 laden
    pc_ser2:mov			temp2,temp1				;byte sichern 
    
    		swap		temp1					;swapen
    		andi		temp1,$0f				;ausanden
    		cpi			temp1,$0a				;vergleich ob >= 10
    		brsh		pc_ser21				;wenn ja mach ein HexBuchstabe zu ASCII-Buschstabe
    		subi		temp1,-$30				;wenn nein mach HexZahl zu ASCII-Zahl
    		rjmp		pc_ser22
    pc_ser21:			
    		subi		temp1,-$37				;HexBuchstabe zu ASCII-Buschstabe
    pc_ser22:		
    		rcall		data_transmit			;und ab damit zum PC
    		mov			temp1,temp2				;gesichertes byte laden
    		andi		temp1,$0f				;ausanden
    		cpi			temp1,$0a				;vergleich ob >= 10
    		brsh		pc_ser31				;wenn ja mach ein HexBuchstabe zu ASCII-Buschstabe
    		subi		temp1,-$30				;wenn nein mach HexZahl zu ASCII-Zahl
    		rjmp		pc_ser32
    pc_ser31:
    		subi		temp1,-$37				;HexBuchstabe zu ASCII-Buschstabe
    pc_ser32:
    		rcall		data_transmit			;und ab damit zum PC
    		rcall		leer_zeichen_rs232		;leerzeichen
    		rcall		enter_rs232				;wenn ja mach noch ein ENTER
    		ret
    
    ;************************uart_init mit RX interrupt**********************
    usart_init:
    		ldi			temp1,High(UBRRx)
    		ldi			temp0,Low(UBRRx)					;9600 Baud einstellen PDF S.133 table52
    		out			UBRRH,temp1
    		out 		UBRRL,temp0
    
    		rcall		char_size8					;8 zeichen, 1 stoppbit
    		
    		ldi			temp0,(0<<U2X|0<<MPCM)		;no DoubleSpeed, no MultiProzComMode, alle anderen BITS sind FLAGS
    		out			UCSRA,temp0
    		
    		ret
    
    char_size5:
    		ldi 		temp0,(0<<UMSEL|0<<UPM1|0<<UPM0|0<<USBS|0<<UCSZ1|0<<UCSZ0|0<<UCPOL) ;URSEL=1 UCSRC1 or UBRRH0,USBS=1 stoppbits1,
    		out 		UCSRC,temp0	
    		ldi 		temp0,(0<<RXCIE|0<<TXCIE|0<<UDRIE|1<<RXEN|1<<TXEN|0<<UCSZ2|0<<RXB8|0<<TXB8)	;enable RX u TX  <=5bit(UCSZ2=0) 
    		out 		UCSRB,temp0	;
    		ret						
    		
    char_size6:
    		ldi 		temp0,(0<<UMSEL|0<<UPM1|0<<UPM0|0<<USBS|0<<UCSZ1|1<<UCSZ0|0<<UCPOL) ;URSEL=1 UCSRC1 or UBRRH0,USBS=1 stoppbits1,
    		out 		UCSRC,temp0	
    		ldi 		temp0,(0<<RXCIE|0<<TXCIE|0<<UDRIE|1<<RXEN|1<<TXEN|0<<UCSZ2|0<<RXB8|0<<TXB8)	;enable RX u TX  <=6bit(UCSZ2=0) 
    		out 		UCSRB,temp0	
    		ret												
    			
    char_size7:
    		ldi 		temp0,(0<<UMSEL|0<<UPM1|0<<UPM0|0<<USBS|1<<UCSZ1|0<<UCSZ0|0<<UCPOL) ;URSEL=1 UCSRC1 or UBRRH0,USBS=1 stoppbits1,
    		out 		UCSRC,temp0		
    		ldi 		temp0,(0<<RXCIE|0<<TXCIE|0<<UDRIE|1<<RXEN|1<<TXEN|0<<UCSZ2|0<<RXB8|0<<TXB8)	;enable RX u TX  <=7bit(UCSZ2=0) 
    		out 		UCSRB,temp0	;
    		ret											
    		
    char_size8:
    		ldi 		temp0,(0<<UMSEL|0<<UPM1|0<<UPM0|0<<USBS|1<<UCSZ1|1<<UCSZ0|0<<UCPOL) ;URSEL=1 UCSRC1 or UBRRH0,USBS=1 stoppbits1,
    		out 		UCSRC,temp0	
    		ldi 		temp0,(0<<RXCIE|0<<TXCIE|0<<UDRIE|1<<RXEN|1<<TXEN|0<<UCSZ2|0<<RXB8|0<<TXB8)	;enable RX u TX  <=7bit(UCSZ2=0) 
    		out 		UCSRB,temp0	
    		ret					
    
    char_size9:
    		ldi 		temp0,(0<<UMSEL|0<<UPM1|0<<UPM0|0<<USBS|1<<UCSZ1|1<<UCSZ0|0<<UCPOL) ;URSEL=1 UCSRC1 or UBRRH0,USBS=1 stoppbits1,
    		out 		UCSRC,temp0	
    		ldi 		temp0,(0<<RXCIE|0<<TXCIE|0<<UDRIE|1<<RXEN|1<<TXEN|1<<UCSZ2|0<<RXB8|0<<TXB8)	;enable RX u TX  <=9bit(UCSZ2=1) 
    		out 		UCSRB,temp0	
    		ret
    
    ;************************uart_deinit********************************
    usart_all_aus:
    		clr			temp0
    		out			UCSRB,temp0
    		out			UCSRC,temp0
    		out			UBRRL,temp0
    		out			UBRRH,temp0
    		ret
    
    usart_ofln:									;wenn unterprogramme nicht 
    		clr			temp0					;gestört werden dürfen
    		out			UCSRB,temp0				;nur usart offline
    		ret
    ;**********************daten_senden*********************************
    INT_UTXC:
    		;siehe data_transmit;** man kann in der wartezeit andere sachen erledigen
    		;bis der int kommt im INT selbst könnte man ne art daten-lese-schleife implementieren
    		;um weitere daten zu senden die dann an temp1>>>UDR weitergegeben werden
    		out 		UDR,temp1			; Put LSB data (r17) into buffer, tranceived data
    		reti
    ;(polling)
    data_transmit:
    		sbis		UCSRA,UDRE			;**
    		rjmp		data_transmit		;**
    		out 		UDR,temp1			; Put LSB data (r17) into buffer, tranceived data
    		ret
    
    ;**********************daten_empfangen **********************
    INT_URXC:
    		in 			temp1,UDR			; Put data from buffer into r17, received Data
    		;siehe data_received;** man kann in der wartezeit andere sachen erledigen
    		;bis der int kommt im INT selbst könnte man ne art daten-schreib-schleife implementieren
    		;um weitere daten zu empfangen die dann an UDR>>>temp1 weitergegeben werden
    		reti
    ;(polling)
    data_received:
    		sbis		UCSRA,RXC			;**
    		rjmp		data_received		;**
    		in 			temp1,UDR			; Put data from buffer into r17, received Data
    		ret
    
    ;********************DatenRegisterLeereInterrupt***********************
    INT_UDRE:
    		;SOLANGE dieses register leer ist wird diese routine aufgerufen
    		;also eigentlich immer wenn UDR=0
    		reti
    2313_LCD_Txt_out.asm
    Code:
    ;Hier her kommen alle Texte und Zahlausgaben  für das LCD die so anfallen
    ;********************TextAusgabeLCD*********************************
    werbe1:	ldi			temp1,0b10000000
    		rcall 		lcd_DDR_AdrX  		
    		ldi 		ZH,high(out0*2)
            ldi 		ZL,low(out0*2)
            rcall 		txt_out
    		ret
    
    ;************************Zahlenausgabe
    zahl_out_lcd:
    		ldi			temp1,0b11000000
    		rcall		lcd_DDR_AdrX   			;auf LCDadresse 00
    		;clr			matherghh			;hhbyte löschen
    		;clr			mathergh			;hbyte löschen
    		;clr			mathergl			;lbyte löschen
    		;lds			mathergll,			;Wert laden
    		rcall		hex_dez					;Wandlung von HEX in DEZ steht dierekt im RAM
    		rcall		lcd_zahlout_5			;wieviele Stellen ausgegeben werden sollen 1-5
    		ret
    
    ;************************direktwandlung*wort*in*ASCII***************
    ;						    *   +	*=16Stellen/+=20stellen
    ;   		"12345678901234567890"
    out0:	.db " AVR-ATiny2313  ",$ff
    ;**************************ende**************************************************
    2313_RS_Txt_out.asm
    Code:
    ;**************Textausgabe über UART **************************************
    werbe_rs:
    		ldi 		ZH,high(rs_out0*2)
            ldi 		ZL,low(rs_out0*2)
            rcall 		txt_out_rs
    		rcall		enter_rs232			;Enter neue Zeile
    		ret
    
    ;************************direktwandlung*wort*in*ASCII***************
    rs_out0: .db "TST Tiny2313 BIB",$ff

Ähnliche Themen

  1. Antworten: 13
    Letzter Beitrag: 07.06.2021, 14:38
  2. USI interface an tiny 2313
    Von Bluesmash im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 22
    Letzter Beitrag: 18.11.2013, 17:37
  3. Tiny 2313, tipps und kontrolle gesucht
    Von Ineedhelp im Forum C - Programmierung (GCC u.a.)
    Antworten: 33
    Letzter Beitrag: 20.03.2008, 21:32
  4. Tiny 2313 wie geht 4 x PWM
    Von vajk im Forum AVR Hardwarethemen
    Antworten: 13
    Letzter Beitrag: 07.03.2007, 17:10
  5. Tiny 2313 defekt?
    Von Elias! im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 16.08.2006, 15:56

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests