PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AAtiny15 macht was er will



rogerberglen
20.08.2007, 11:57
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:

; ************************************************** ********
; * 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

linux_80
20.08.2007, 14:45
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.

rogerberglen
20.08.2007, 14:53
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.

rogerberglen
20.08.2007, 17:20
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?

izaseba
20.08.2007, 17:21
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

rogerberglen
20.08.2007, 18:21
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???

Hanni
20.08.2007, 19:52
Ich finde du gibst zu schnell auf ;)

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

Grüße,
Hanni

rogerberglen
21.08.2007, 10:35
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:

; ************************************************** ********
; * 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

rogerberglen
21.08.2007, 12:45
Was soll das um Himmelswillen?????

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.

linux_80
21.08.2007, 12:48
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 http://tbn0.google.com/images?q=tbn:FYptoE9XYhdWaM:http://www.giaskandl.de/out/oxbaseshop/html/0/dyn_images/1/pfahl_p1.jpg (http://www.zaunpfahl.de/)dazu ;-)
http://www.atmel.com/dyn/resources/prod_documents/doc1493.pdf


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

rogerberglen
21.08.2007, 12:54
Ich habe Low und High-Byte vertauscht! Deshalb sehen die Werte so groß aus. Diese müssen herumgedreht werden: 01 E0; 02 CF; 03 97; 03D3. Ich lese diese in der falschen Reihenfolge aus dem EEprom. Bei der Auswertung passt das Ganze dann wieder.
Aber was ist mit dem ausbleibenden ADC-Interrupt????

rogerberglen
21.08.2007, 15:43
So kanns einem auch den Spaß verderben! Die beiden getesteten ATtiny15 waren beide so halbherzig defekt. Ich habe mir nun neue besorgt und Programmiert. Der Interrupt des ADC-Wandlers kommt nun auch schön regelmäßig. Einziges Problem nur noch, warum werden die LED's nicht aktualisiert???????
Es wird immer nur direkt nach einem RESET die passende LED angezeigt! Danach tut sich nichts mehr an den LED's wenn man die Analogspannung variiert.
Es muß doch nach jeder ADC-Wandlung der aktuell gewandelte Wert in den Registern des AD-Wandlers zu finden sein. Ich wandle im Single-Modus und das nur alle 0,5sekunden!

rogerberglen
21.08.2007, 16:16
So jetzt habe ich es geschafft! Ich habe vor lauter Frust noch übersehen, daß ich ja zuerst das Low-Register und dann das High-Register des ADC's auslesen muss und nicht umgekehrt.
Jetzt funktionierts! Ich muß nur noch mein Programm fertig machen damit es noch eine weitere Funktion ausführt.
Vielen Dank für die Geduld mit mir. Meine wurde auch reichlich strapaziert.