Ich habe das mit dem kurzen Aufblitzen in den Griff bekommen. Es fehlte ein reti an einer Stelle.
Was mich noch richtig nervt ist, daß im Simulator die AD-Wandlung funktioniert und nachher im ATtiny15 scheint diese genau 1mal zu funktionieren! Es funktioniert erst wieder nach einem RESET. Ich muß es einfach nicht kapieren oder?? Ich kann doch nicht mehr machen als eine AD-Wandlung erneut durch Setzen des ADSC-Bits im ADCSR-Register zu starten wenn ich einen Timer0 Interrupt bekomme!!
Im Simulator wird auch bei der ersten Wandlung der korrekte Wert angezeigt wenn ich die entsprechenden Werte vorgebe. Im ATtiny15 halt mal wieder nicht!! Da geht es erst wieder beim 2.mal richtig nachdem man ja wieder einen RESET machen muß!!
Hier nun der letzte Programmstand:
Code:
; **********************************************************
; *                    Prozessor Attiny15                  *
; **********************************************************
; *         Temperaturüberwachung über einen NTC           *
; **********************************************************
; * Dazu wird ein Analogsignal über einen AD-Wandler in    *
; * einen Digitalen Zahlenwert übersetzt.                  *
; * Die Abfrage findet in etwa im Sekundentakt statt. Dazu *
; * wird über den Timer0 ein Interrupt generiert.          *
; * Die Vergleichswerte für die einzelnen Temperaturberei- *
; * che werden in der EEprom Sektion des ATtiny15 hinter-  *
; * legt. Dadurch sind Anpassungen einfach an den jeweili- *
; * gen Meßfühler möglich.                                 *
; * Das Ergebnis wird mit 4 LED's verschiedener Farben an- *
; * gezeigt:                                               *
; *                                                        *
; * LED1 (blau) = Temperatur ist niedriger als 60°C        *
; * LED2 (grün) = Temperatur befindet sich 60°C - 100°C    *
; * LED3 (gelb) = Temperatur befindet sich 100°C - 115°C   *
; * LED4 (rot)  = Temperatur ist höher als 115°C           *
; **********************************************************
; * (RESET/ADC0) PB5 = Pin1  Pin8 = Vcc                    *
; *       (ADC3) PB4 = Pin2  Pin7 = PB2 (ADC1/SCK/T0/INT0) *
; *       (ADC2) PB3 = Pin3  Pin6 = PB1 (AIN1/ MISO/OC1A)  *
; *              GND = Pin4  Pin5 = PB0 (AIN0/AREF/MOSI)   *
; **********************************************************

.include "TN15def.inc"			; Prozessor ATtiny15

.eseg							; Kennung für EEprom

; **********************************************************
; *     Temperaturvergleichswerte noch anpassen !!!        *
; **********************************************************

TempKalt:	.dw 0xE001			; Wert für Temperatur bis 60°C
TempWarm:	.dw 0xCF02			; Wert für Temperatur 60°C - 100°C
TempHoch:	.dw 0x9703			; Wert für Temperatur 100°C-115°C
TempKrit:	.dw 0xD303			; Wert für Temperatur über 115°C

.cseg							; Kennung für Programmcode

.def TMP1      = R16 			; Allgemeine Variable
.def LEDStat   = R17			; LED-Register
.def Prescaler = R18			; Timer0 Startwert
.def ADHigh    = R19			; High-Byte Analogwandler
.def ADLow     = R20			; Low-Byte Analogwandler
.def EEprom    = R21			; EEprom Adresse
.def EEData    = R22			; EEprom Daten
.def TPHigh	   = R23			; Temperaturvergleich High-Byte
.def TPLow     = R24			; Temperaturvergleich Low-Byte	
.def SCount    = R25			; Schleifenzähler
.def Vergleich = R26			; Vergleichsergebnis
.def LEDWert   = R27			; Übergabevariable (Unterprogramm)		  

.org 0x0000						; Programm Startadresse $0000
	
	rjmp Init					; Einsprung ins Hauptprogramm

.org 0x0005						; Interrupt Timer0

	rjmp Led					; Led im Sekundentakt blinken

.org 0x0008						; Interrupt AD-Wandler

	rjmp ADFertig				; Ergebnis von AD holen

.org 0x0009						; Programmstart bei $0009

Init:

	ldi TMP1,0b00010111			; Pin 2,5,6 und 7 auf Ausgabe
	out DDRB,TMP1				; schalten und alle LED's 
	ldi TMP1,0x00
	mov Vergleich,TMP1			; Vergleichsregister löschen
	out PORTB,TMP1				; einschalten.
	sbr LEDStat,0b11000000		; LED-Status (alle an) speichern
	ldi TMP1,0x01	
	rol TMP1
	out TIMSK,TMP1				; Timer0 Interrupt freigeben
	ldi TMP1,0x05				; Teilerfaktor 1024
	out TCCR0,TMP1				; für Timer0 einstellen.
	ldi TMP1,0x0				; Timer0 mit Startwert
	out TCNT0,TMP1				; vorladen und Startwert
	mov Prescaler,TMP1			; speichern.
	ldi TMP1,0x82				; Interne Referenzspannung
	out ADMUX,TMP1				; einschalten und Pin3 Analogeingang
	ldi TMP1,0b10001011			; AD-Wandler einschalten und
	out ADCSR,TMP1				; Interrupt für AD freigeben.
	ldi TMP1,0x00				; Schleifendurchläufe festlegen	
	mov ADHigh,TMP1				; AD-Wertespeicher löschen
	mov ADLow,TMP1
	sei							; Interrupts freigeben	

Start:

; **********************************************
; *   Hauptprogramm für Temperaturauswertung   *
; **********************************************

Schleife:	
 	
	sbrc LEDStat,7
	rjmp Schleife	

LED1:
	ldi EEprom,0x00				; Vergleichswertadresse vorgeben
	rcall LeseEEprom			; und Wert aus EEprom holen.
	cp ADLow,TPLow				; 16-Bit Vergleich vornehmen.
	cpc ADHigh,TPHigh			; Meßwert > Vorgabewert?
	brcc LED2    				; Ja, dann zur nächsten LED
	ldi LEDStat,0b00010110		; sonst LED1 einschalten.	
	rcall LEDAkt
	rjmp LEDEnde

LED2:
	ldi EEprom,0x01				; Vergleichswertadresse vorgeben
	rcall LeseEEprom			; und Wert aus EEprom holen.
	cp ADLow,TPLow				; 16-Bit Vergleich vornehmen.
	cpc ADHigh,TPHigh			; Meßwert > Vorgabewert?
	brcc LED3   				; Ja, dann zur nächsten LED
	ldi LEDStat,0b00010101		; sonst LED2 einschalten.
	rcall LEDAkt
	rjmp LEDEnde

LED3:
	ldi EEprom,0x02				; Vergleichswertadresse vorgeben
	rcall LeseEEprom			; und Wert aus EEprom holen.
	cp ADLow,TPLow				; 16-Bit Vergleich vornehmen.
	cpc ADHigh,TPHigh			; Meßwert > Vergleichswert?
	brcc LED4					; Ja, dann zur nächsten LED
	ldi LEDStat,0b00010011		; sonst LED3 einschalten.
	rcall LEDAkt
	rjmp LEDEnde

LED4:
	ldi EEprom,0x03				; Vergleichswertadresse vorgeben
	rcall LeseEEprom			; und Wert aus EEprom holen.
	cp ADLow,TPLow				; 16-Bit Vergleich vornehmen.
	cpc ADHigh,TPHigh			; Meßwert > Vergleichswert
	;brcc LED4					; Ja, dann LED4 eingeschaltet lassen
	;sbr LEDStat,0b00010111		; sonst alle LED's ausschalten
	;out	PORTB,LEDStat			; und LED4
	;cbr LEDStat,0b00010000		; einschalten
	;out PORTB,LEDStat
	ldi LEDStat,0b00000111
	rcall LEDAkt	


LEDEnde:	
	sbr LEDStat,0b10000000	
	rjmp start					; Hauptprogrammende


; >>>>>>>>>> INTERRUPTPROGRAMME <<<<<<<<<<

; ****************************************
; *     Interrupt LED An/Aus Timer0      *
; ****************************************
 
Led:
	out TCNT0,Prescaler 		; Timer mit Startwert laden
	sbrs LEDStat,6				; Startbit LED löschen gesetzt?
	rjmp Tim0
	cbr LEDStat,6
	andi LEDStat,0b10111111
	ori LEDStat,0b00010111
	out PORTB,LEDStat	
	reti

Tim0:
	sbi ADCSR,ADSC				; AD-Wandlung starten.
	reti						; Rücksprung zum Hauptprogramm

; ****************************************
; *        Interrupt AD-Wandler          *
; ****************************************

ADFertig:
	cbr LEDStat,0b10000000		; Kennung (alle Led an) löschen
	ldi TMP1,0x00
	mov ADHigh,TMP1
	mov ADLow,TMP1
	in ADHigh,ADCH				; High-Byte AD speichern
	in ADLow,ADCL				; Low-Byte AD speichern
	reti


; >>>>>>>>>> UNTERPROGRAMME <<<<<<<<<<


; ****************************************
; *         EEprom Werte Lesen           *
; ****************************************

LeseEEprom:
	ldi SCount,0x20
	lsl EEprom					; Adresse *2 für 2-Byte Sprung
	out EEAR,EEprom				; Adresse in EEprom schreiben.
	ldi TMP1,0x01				; Dazu Lesefreigabe ins
	out EECR,TMP1				; EEprom-Steuerregister schreiben.
	in TPHigh,EEDR				; EEprom-Daten in High-Byte.
	inc EEprom					; Low-Byte des Vergleichswert 
Warte:
	dec SCount
	cpi SCount,0
	brne Warte
	
	out EEAR,EEprom				; aus dem EEprom holen.
	out EECR,TMP1				; Lesefreigabe schreiben und
	in TPLow,EEDR				; EEprom-Daten holen.
	ret

; *****************************************
; *         LED's aktualisieren           *
; *****************************************

LEDAkt:
	mov LEDWert,LEDStat			; Wert übergeben und
	out PORTB,LEDStat			; auf Port ausgeben.
	ret
Mit folgenden Meldungen kann ich auch nicht so richtig was anfangen. Ich kann auch nur Register defninieren und diese beiden sind nirgends weiter verwendet.

warning: Register r26 already defined by the .DEF directive
warning: Register r27 already defined by the .DEF directive