Quelltext /~heha/basteln/m/Kram/dccrail-avrgcc.zip/binärgleich/init_m8wagdec.S

/********************************************************************************
 * DCC Wagen Decoder Software V1.0						*
 * Copyright 2011 Toralf Wilhelm						*
 *										*
 * private Nutzung erwünscht, gewerbliche Nutzung erfordert zwingend meine Zustimmung! *
 * Datei:	init_m8wagdec.inc						*
 * Kontakt:	toralfwilhelm@web.de						*
 * Webseite:	www.toralfwilhelm.de						*
 * Version:	01/2011 Version 1 Start						*
 * Beschreibung: Initialisiert die mega8 Hardware				*
 ********************************************************************************/

#include "definitionen.h"

/***************
 * Timer1 init *
 ***************/
// Timer1 initialisieren:
init_timer1_m8:
// Timer/Counter1 Control Register TCCR1A -> 10bit fast pwm mode7 Ausgang noch getrennt für StepDown Wandler

	ldi	w,0b00000011
	out	TCCR1A,w
	ldi	w,0b00001001
	out	TCCR1B,w
	clr	w
	out	TCNT1H,w
	out	TCNT1L,w
	clr	w
	out	OCR1AH,w
	out	OCR1AL,w
	clr	w
	out	OCR1BH,w
	out	OCR1BL,w
	clr	w
	out	ICR1H,w
	out	ICR1L,w
	in	w,TIMSK              ; holen da beim m8 für alle 3 Timer zuständig
	cbr	w,(1<<OCIE1A)+(1<<OCIE1B)+(1<<TOIE1)+(1<<TICIE1)
	out	TIMSK,w
; Timer/Counter Interrupt Flag Register TIFR: Falsche Verwendung!
	in	w,TIFR               ; holen da beim m8 für alle 3 Timer zuständig
	sbr	w,(1<<OCF1B)+(1<<OCF1A)+(1<<ICF1)+(1<<TOV1)
	out	TIFR,w
        ret

/******************
 * m8 Timer2 init *
 ******************/
// Timer2 macht alle 10us ein interrupt zum DCC Pin einlesen
// dazu Timer mit ck im CTC mode bis 80 zählen lassen
init_timer2_m8:
	clr	w
	out	TCNT2,w
	ldi	w,80	// mit 80 Tackten laden (falsch! Nach 81 Takten!!)
	out	OCR2,w
// timer mit Teiler auf ck/1 starten, CTC Mode, OC2 nicht verbunden
	ldi	w,0b00001001
	out	TCCR2,w
// Asynchronous Status Register ASSR nur für Takt über externen keramikschwinger wichtig
// Falsch! Da hängt allenfalls ein 32-KHz-Uhrenquarz dran! Hier nichts.
	ldi	w,0
	out	ASSR,w
	in	w,TIMSK
	sbr	w,(1<<OCIE2)
	out	TIMSK,w
// Timer/Counter Interrupt Flag Register TIFR: lösche Timer2 OCF Interuptflag
// Übelrichender Kode: Falsche Verwendung!
	in	w,TIFR
	cbr	w,(1<<OCF2)
	out	TIFR,w
	clr	w
	out	SFIOR,w		// unnötig, ist bereits 0
	ret

/************
 * ADC init *
 ************/
// ADC initialisieren: free running, Vorteiler 64, interrupt, Vref=AVCC, linksbündig, PC6
 
init_adc_m8:
	ldi	w,0b11100110
	out	ADMUX, w
	ldi	w,0b10101110
	out	ADCSRA, w
	ret
Vorgefundene Kodierung: UTF-80