-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: AAtiny15 macht was er will

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    109

    AAtiny15 macht was er will

    Anzeige

    Ich habe wie schon geschrieben ein Programm erstellt, daß eine Spannung misst und auf 4 LED's ausgeben soll.
    Im AVR Simulator läuft das Ganze allerbest. Nun habe ich das Programm in den ATtiny15 geschrieben mit den passenden EEprom-Werten.
    Nach dem Einschalten wird auf den LED's zufällig was angezeigt. Wenn man dann von Hand einen RESET macht dann leuchtet die richtige LED. Leider ändert sich aber an den LED's nichts wenn man die Analogspannung variiert. Es wird aber jeweils nach dem RESET die passende LED angezeigt.
    Warum wird anscheinend die AD-Wandlung nicht vom Timer aufgerufen???
    Auch sollten nach einem RESET die LED's so ca. 1/2 Sekunde lang leuchten. Diese blitzen aber nur kaum merklich auf. Daran ändert sich auch nichts wenn man den Prescaler Wert des Timers ändert.
    Ich bin jetzt ziemlich ratlos denn eigentlich sollte das Ganze funktionieren.
    Hier das Programm:
    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 0x5555			; Wert für Temperatur bis 60°C
    TempWarm:	.dw 0x7777			; Wert für Temperatur 60°C - 100°C
    TempHoch:	.dw 0x9999			; Wert für Temperatur 100°C-115°C
    TempKrit:	.dw 0xBBBB			; 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,0x02				; Teilerfaktor 8
    	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,0x8F				; AD-Wandler einschalten und
    	out ADCSR,TMP1				; Interrupt für AD freigeben.
    	ldi TMP1,0x00				; Schleifendurchläufe festlegen	
    	mov SCount,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	
    
    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
    	in ADHigh,ADCH				; High-Byte AD speichern
    	in ADLow,ADCL				; Low-Byte AD speichern
    	reti
    
    
    ; >>>>>>>>>> UNTERPROGRAMME <<<<<<<<<<
    
    
    ; ****************************************
    ; *         EEprom Werte Lesen           *
    ; ****************************************
    
    LeseEEprom:
    	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 
    	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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    wie ich sehe hast Du sehr utopisch Werte für die Grenzwerte der einzelnen Temperaturen im EEprom hinterlegt.
    Du weisst schon, das der maximale Wert 1023 (10Bit) ist, den der ADC ausgibt ?

    Im Simultaor ist es einfach, solche Werte im Register einzutragen.

    Edit:
    der Prescaler ist auch etwas hoch mit 128, denn der T15 taktet nur mit 1.6MHz, da reicht ein Teiler von 8 damit man auf 200kHz kommt.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    109
    Da habe ich versehentlich nicht den letzten Stand gepostet. Aber die Werte wurden angepasst und trotzdem läuft es nicht so wie es eigentlich soll.
    Ich habe den Prescaler des AD-Wandlers umgestellt auf Teiler 8. Es bleibt aber dabei, daß nur nach einem Reset die LED's passend zur Eingangsspannung entsprechend angeschaltet werden. Später werden die LED's nicht mehr entsprechend der Eingangsspannung umgeschaltet!!!
    Es scheint so, daß der Wert einmalig ermittelt wird und das wars dann!
    Auch beim Einschalten leuchtet irgendeine LED nur nicht die die eigentlich der Analogspannung entspricht. Erst wenn man einen RESET nochmals durchführt dann leuchtet die passende LED.
    Auch müssten die LED's direkt nach dem Einschalten so etwas über eine 1/2 Sekunde lang leuchten. Tun diese aber auch nicht!! Die blitzen nur ganz kurz auf. Da kann man den Prescaler des Timer0 einstellen wie man will es ändert sich nichts daran!
    Ich kapiers nicht woran das liegt?? Vor allem im AVR-Studio funktioniert das so wie ich will nur auf dem ATTiny nacher nicht mehr.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    109
    Nachdem ich nun Alles und Sämtliches ausprobiert habe ohne Erfolg zu haben habe ich jetzt den ganzen Mist in die Ecke gefeuert!! Es kann doch nicht sein, daß wenn man den Teiler des Timer0 auf 64 stellt und diesen ganz von Vorne loszählen lässt (laut AVR braucht das dann ca. 4 Sekunden bis die LED's ausgehen) das dann in der Praxis gerade mal 1/4 Sekunde braucht oder????
    Hoffentlich hat da Jemand noch eine Idee bevor ich ganz gefrustet das Assembler-Programmieren gleich wieder aufgebe.
    Denn ich probiere jetzt schon seit 2 Tagen herum und meine Geduld ist auch irgendwann mal am Ende besonders wenn man nicht weis woher und warum das so ist. Ich betone nochmals in AVR funktioniert das im Simulator absolut perfekt!!
    Letzte Idee: hat das womöglich was damit zu tun, daß die Library TN15.def heißt ich aber einen ATtiny15L einsetze???
    Wenn ja wie werden dann Programme für den ATtiny15L erstellt?

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    46
    Beiträge
    2.236
    AAtiny15 macht was er will
    [-X Nein, er macht, das was Du Ihm sagst...


    in ADHigh,ADCH ; High-Byte AD speichern
    in ADLow,ADCL ; Low-Byte AD speichern
    Lese, überlege und schaue ins Dattenblatt, was sie so schön dazuschreiben
    Software is like s e x: its better when its free.
    Linus Torvald

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    109
    Ich habe doch noch mal das Zeug hervorgekramt und habe mein Programm gekürzt auf den Teil der die LED's anschaltet und dann nach, angeblich 4Sekunden, wieder ausschaltet. Außer einem sehr kurzen Aufblitzen ist da nichts zu sehen!!!!
    Warum!?!?!?! In AVR geht es doch richtig???????
    Wenn der Timer0 anscheinend schon nicht richtig funktioniert was soll denn dann sonst richtig funktionieren???

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Ich finde du gibst zu schnell auf

    Poste doch einfach mal dein gekürztes Programm, vielleicht kann dir geholfen werden.

    Grüße,
    Hanni
    Grundregeln des Forenpostings:
    1. Nutze niemals die Suchfunktion!
    2. Überprüfe niemals die Topics nach Ähnlichkeiten!
    3. Schreibe alles in hellgelb!

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    109
    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

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    109
    Was soll das um Himmelswillen?????
    Code:
    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
    	out PORTB,Vergleich			; ***TEST
    	rol Vergleich				; ***TEST
    	reti
    Ich habe nun mal im AD Interrupt irgend eine LED Ausgabe mit eingebaut nur um zu sehen, ob der AD-Interrupt auch kommt.
    Ich war platt. Er kommt nur ca. 4-5mal (immer seltener werdend) und dann kommt da nichts mehr!!! Warum!?!?!?!?!?!
    Ich rufe doch regelmäßig über den Timer0 auch die AD-Wandlung auf. Also warum kommt da nichts mehr?????????
    Eine LED Ausgabe im Timer0 Interrupt hat mir bestätigt, daß dieser auch schön regelmäßig kommt!!

    Im AVR-Studio funktioniert das alles.
    Taugen die ATtiny15 überhaupt was???? Bis auf Weiteres schmeiße ich den ganzen Krempel ins Eck und nütze meine Zeit für was besseres.
    So ein Müll ist mir mit meinen anderen Controllern noch nicht untergekommen. Da hat nach der Simulation das Ganze auch in der Praxis funktioniert.
    Das soll mir mal einer erklären! Zumal ich auch schon einen anderen ATtiny15 ausprobiert habe und da ist das Gleiche.

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Die Werte im EEprom sind noch zu gross, der max. Wert ist 10Bit breit, was in Hex so ausschaut: 0x03FF

    Dann hast du den Tipp von izaseba noch nicht beachtet, hier ein weiterer dazu
    http://www.atmel.com/dyn/resources/p...ts/doc1493.pdf


    Das ist zwar vielleicht noch nicht die Lösung, aber schon mal ein weiterer Schritt.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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