Startproblem mit ATtiny45

stinakovits

Mitglied
22. Apr. 2013
90
6
8
Kottingbrunn
Sprachen
  1. Assembler
Hallo zusammen,

seit vorgestern habe ich ein seltsames Problem. Mein ATtiny45 startet den Programmablauf beim Anlagen der Versorgungsspannung manchmal nicht (dann aber ziemlich hartnäckig). Gestern lief das Ding den ganzen Tag. Am Abend schalte ich die Versorgungsspannung ab. Heute in der Früh schalte ich ein - nichts geht mehr. :smile:

Das habe ich bisher versucht wenn's mal so weit war.
1.) Versorgungsspannung direkt am IC gemessen - 5VDC waren vorhanden
2.) GND auf den Resetpin gelegt - kein Erfolg (Der Resetpin ist mit 10K gegen VCC geschalten)
3.) Versorgungsspannung weggenommen und wieder angelegt - kein Erfolg
4.) Den IC aus der Fassung genommen und wieder reingesteckt - kein Erfolg
5.) Neu programmiert - kein Erfolg
6.) Mit einer kleinen Programmänderung neu programmiert (1 Programmzeile eingefügt oder weggenommen oder blos einen Variablenwert geändert) - manchmal lief er dann plötzlich. Aber nicht immer. Nicht reproduzierbar.
7.) Ich spiele mit der Versorungsspannung rum. Prelle ein wenig in dem ich eine Strippe an und ausstecke - ganz selten dann ein Erfolg.
8.) ich heble den IC aus seiner Fassung. Bevor er ganz raus ist schalten plötzlich Ausgänge durch - denke das ist eher ein undefinierter Zustand.

Hat jemand so was schon erlebt und kann einen Hinweis geben?

Grüße
Manfred
 
Generell klingt das alles entweder nach einem Kontaktproblem, oder nach einer unsauberen Spannungsversorgung.
Abblockkondensator(en) vorhanden? (Dinos erste Lieblingsfrage)

Ansonsten gib mal weitere Angaben zum Schaltplan/Layout.

P.S.: gibts beim Flashen irgendwelche Fehlermeldungen?
(vorher ging das mal? Was ist das für eine Schaltung/Platine?)
 
Naja, da gibt es keine großartige Schaltung! Das ist ein reiner Testaufbau auf Lochraster zum experimentieren. An den Ports hängen über 1K Widerständen Leds drann. Der Reset ist mit 10K gegen VCC geschalten und an VCC - GND hängen 100nF Keramik. Die Spannungsversorung selbst ist bei 5,1VDC stabil. Soweit man das mit dem Oszi sehen kann.
Beim Flashen gibt es keine Fehlermeldungen.
Hatte bis Vorgestern mit einem ATtiny13 experimentiert. Da trat das Problem nicht auf. Vielleicht nur Zufall? Werde eventuell den IC-Sockel mal tauschen.............
 
Hi,

Hatte bis Vorgestern mit einem ATtiny13 experimentiert. Da trat das Problem nicht auf. Vielleicht nur Zufall? Werde eventuell den IC-Sockel mal tauschen.............
was hast du für nen Programm drin? Evtl läuft er ja aber du siehst es nur nicht weil er im Programm Amok läuft (Stack, Variablenbereiche, ...)

Gruß
Dino
 
Hallo Dino,

Das es am Programm liegt würde ich vorsichtig eher ausschließen. Denn das Programm an sich läuft ja. Natürlich hatte ich diesen Verdacht am Anfang. Dann hab ich einfach ins Hauptprogramm eine Zeile eingefügt, welche eine Led einschaltet um zu sehen ob das Programm läuft. Was soll ich sagen. Die Led wurde eingeschalten und das Programm lief wie es sollte. Nahm ich die Zeile wieder raus, lief wieder nichts. Zufall? Das Hauptprogramm bestand nur aus dieser einen Zeile. Alles andere wird über Interrupts gesteuert.

Das es mit dem Programm selber nichts zu tun hat, sieht man auch darann, dass es gestern am Abend lief. Trotz Spannung mal wegnehmen und wieder drauf schalten. Am MOrgen lief er aber ums verrecken nicht mehr! Dazwischen lag nur die Nacht. Hmmmm, vielleicht war er noch nicht aufgewacht - war noch in Nachtruhe :confused: Scherz beiseite - ist schon komisch.

Auf Wunsch kann ich das Programm mal posten. Ist etwa 1K groß

Gruß
Manfred
 
Wenn Du uns schreibst, daß von der Schaltung her alles i.O. ist, überall saubere, korrekte Pegel anliegen, und Dein Programm fehlerfrei ist, können wir Dir wohl auch nicht mehr helfen...
Also entweder Du zeigst uns das Programm/den Schaltplan etc, oder wir schauen weiter in die Kristallkugel (auch wenn Dinos Stab noch nicht fertig ist...).

P.S.: Du hattest angedeutet, daß Du den Controller "im Betrieb" (unter Spannung) entfernt hast?! (Ich hab zwar noch nie was von Defekten wegen falscher Handhabung gehört, aber eigentlich sollte man mit den Dingern ESD-sicher arbeiten...)
 
Tja, bis jetzt bin ich noch nicht dahinter gekommen wie ich das zeigen soll. Datei kann ich nicht hochladen. Die Erweiterung wird nicht akzeptiert. Das Programm ist mit Workpad geschrieben und hat die Erweiterung ".s". Hier rein kopieren will ich auch nicht. Wird endlos lang. Muss jetzt aber weg. Bin am Abend wieder da und werde das lösen.

Schaltplan gibt es nicht. Für eine handvoll Bauteile löten wäre das wohl etwas übertrieben :)
Beschrieben hab ich das in meinem vorigen Beitrag. Sonst gibt es da nichts an der Print.

Trotz den Kristallkugenschwierigkeiten - danke, dass ihr mir helfen wollt!

PS: Die Andeutung (unter Spannung) stimmt. War ein Versehen heute früh! Nicht geplant!
 
Hallo,

Datei kann ich nicht hochladen. Die Erweiterung wird nicht akzeptiert. Das Programm ist mit Workpad geschrieben und hat die Erweiterung ".s". Hier rein kopieren will ich auch nicht. Wird endlos lang.
Dateien zippen. ZIP-Endung wird akzeptiert. Statt Schaltplan notfalls mal nen Foto von der Platine. Evtl sieht man da ja was. Es kommt schon recht oft vor das man den Wald vor Bäumen nicht sieht (Wo ist denn dieser verdammte Autoschlüssel? ... Vor dir auf dem Tisch :p)

Gruß
Dino
 
Du kannst doch den Code in [ code ] Tags setzen, denn bleibts übersichtlich ;)

Das ist das # Symbol im Editor. Oder du lädst den hoch, aber als zip Archiv :)
Und zur Not gibt es immer noch Dienste wie http://nopaste.dk/.


p.s.: Man könnte die Liste der erlaubten Dateierweiterungen wirklich mal erweitern. .7z ist auch nicht erlaubt.


p.p.s: hihi, war schneller @LotadaC :p
 
Du klickst im Editor hier oben auf die "#"-Taste, und kopierst Deinen Quellcode dazwischen (als Text).
 
Danke. Das "#" war das was ich suchte. Habs ja im Forum schon gesehen, wie es ausschaut. Aber auf die Schnelle nicht gefunden.

Leider sieht man auf der Print nicht wirklich was. Hab auf die Schnelle auch mal einen Schaltplan gezeichnet.

Code:
;--------------------------------------------------------------------------
; Titel		: Beleuchtungsplatine BEL5
;--------------------------------------------------------------------------
; Funktion		: Steuert 5 LED mit unterschiedlichen Ein- und Auszyklen an
;		: Der Kanal 4 flackert und soll einen Fernseher darstellen.
;		: Die Daten fürs Flackern sind im EEPROM abgelegt und füllen dieses zur Gänze aus.
; Schaltung	: Port B.0 bis Port B.4=LED
;--------------------------------------------------------------------------
; Prozessor     	: ATtiny45
; Takt          	: 1 Mhz
; Sprache       	: Assembler
; Datum		: 09.05.2013
; Version		: 0.1
; Autor		: Manfred Stinakovits
; Programmer    	: mySmartUSB MK2
; Port	    	: com3
; EEPROM		: test.eep
;---------------------------------------------------------------------------
.equ	SPL,0x3D	; Stack Pointer Register Low
.equ	SPH,0x3E	; Stack Pointer Register High
.equ	TimeLowByte,24	; Abgelaufene Zeit, Lowbyte, vom SRAM ins Register r24
.equ	TimeHighByte,25	; Abgelaufene Zeit, Highbyte, vom SRAM ins Register r25
.equ	ZregLow,30	; Z-Register Lowbyte
.equ	ZregHigh,31	; Z-Register Highbyte
.equ	ConfigReg,23	; Das Configurationsbyte wird ausgelesen und in r23 zur weiteren Verwendung gespeichert
;.equ	DDRB,0x17	; PORT B Data Direction Register
;.equ	PORTB,0x18	; PORT B
;.equ	TCCR0B,0x33	; Timer/Counter 0 Control Register B
;.equ	TIMSK0,0x39	; Timer/Counter 0 Interrupt Mask Register
;.equ	OCR0A,0x36	; Timer/Counter 0 Output Compare Register A
;.equ	EEARL,0x1E	; EEPROM Adress Register
;.equ	EEDR,0x1D	; EEPROM Data Register
;.equ	EECR,0x1C	; EEPROM Controlregister
;.equ	MCUCR,0x35	; MCU Control Register (Einstellung für sleep)
.equ	F_CPU,	1000000
.include	"AVR.H"
;---------------------------------------------------------------------------
; Reset and Interrupt vector             Beschreibung
begin:	rjmp	main	;1	 POWER ON RESET
	reti		;2	 External Interrupt 0
	reti		;3	 Pin Change Interrupt Request 0
	reti		;4	 Timer/Counter1 Compare Match A
	rjmp	onTC1	;5	 Timer/Counter1 Overflow
	rjmp	onTC0	;6   Timer/Counter0 Overflow
	reti		;7	 EEPROM Ready
	reti		;8	 Analog Comperator
	reti		;9	 ADC Conversion Complete
	reti		;10	 Timer/Counter1 Compare Match B
	reti		;11  Timer/Counter0 Compare Match A
	reti		;12	 Timer/Counter0 Compare Match B
	reti		;13	 Watchdog Time-out
	reti		;14	 USI START
	reti		;15	 USI_OVF
;---------------------------------------------------------------------------
; Start, Power ON, Reset
main:
	ldi	r16,lo8(RAMEND)
	out	SPL,r16	;Init Stackpointer LO
	ldi	r16,hi8(RAMEND)
	out	SPH,r16	;Init Stackpointer HI
	ldi	r16,0b00011111
	out	DDRB,r16	;Alle 5 Ports auf Ausgang geschalten
	ldi	r16,0b00000011
	out	TCCR0B,r16	; Timer0, Takt: 15625Hz (1.000.000/64(Vorteiler)) = 0,064ms
	ldi	r16,0b00001101
	out	TCCR1,r16	; Timer1, Takt: 244,140625Hz (1.000.000/4096(Vorteiler)) = 4,096ms
	ldi	r16,0b00000100
	out	TIMSK,r16	; Interrupt Timer0 bei overflow (Bit1)[Beim Programmstart ausgeschalten] + Interrupt Timer1 bei overflow (Bit2)
;
	ldi	ZregLow,lo8(CONFIG-begin)
	ldi	ZregHigh,hi8(CONFIG-begin)
	lpm
	mov	ConfigReg,r0
;
	cbi	EECR,4
	cbi	EECR,5
	ldi	r16,0	; EEPROM Adresse 0,  Einschalten
	ldi	r18,5	; Ein Wert von 61 entspricht etwa 1 Sekunde
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,15
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,5
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,30
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,9
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,6
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,6
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,12
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,9
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,22
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,25
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,9
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,4
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,18
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,7
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,40
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,18
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,55
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,4
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,60
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,7
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,11
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,12
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,6
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,5
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,11
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,1
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,17
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,3
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,20
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,2
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,33
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,19
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,120
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,10
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,55
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,22
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,5
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,10
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,6
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,5
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,18
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,5
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,12
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,10
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,16
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,2
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,155
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,5
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,39
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,8
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,16
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,11
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,10
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,5
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,138
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,4
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,5
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,2
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,2
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,5
	rcall	eeWrite
	inc	r16	; Ausschalten
	ldi	r18,88
	rcall	eeWrite
	inc	r16	; Einschalten
	ldi	r18,88
	rcall	eeWrite
	inc	r16	; EEPROM Adresse 0x3F, Ausschalten
	ldi	r18,80
	rcall	eeWrite
;
	rcall	KonstAdressenLaden
	sei
;------------------------------------------------------------------------
; Hauptprogramm
;------------------------------------------------------------------------
mainloop:	wdr
	rjmp	mainloop
;------------------------------------------------------------------------
; Interrupt: Timer 1
; Interruptprogramm: onTC1
; Timerüberlauf 4,096ms(Takt) x 256(Timerüberlauf) = 1,048576s
;------------------------------------------------------------------------
onTC1:	cli
	lds	TimeLowByte,0x60	; Sekunden Lowbyte aus SRAM Adresse 0x60 holen
	inc	TimeLowByte	; Um 1 erhöhen
	brne	onTC11
	lds	TimeHighByte,0x61	; Sekunden Highbyte aus SRAM Adresse 0x61 holen
	inc	TimeHighByte	; Um 1 erhöhen
	sts	0x61,TimeHighByte	; Und wieder abspeichern. Sekunden Highbyte
onTC11:	sts	0x60,TimeLowByte	; Und wieder abspeichern. Sekunden Lowbyte
	lds	ZregLow,0x62	; Ab hier werden die Daten für Kanal 0 voreingestellt.
	lds	ZregHigh,0x63
	mov	r28,ZregLow
	mov	r29,ZregHigh
	ldi	r18,0
	rcall	LED
	sts	0x62,ZregLow
	sts	0x63,ZregHigh
	lds	ZregLow,0x64	; Ab hier werden die Daten für Kanal 1 voreingestellt.
	lds	ZregHigh,0x65
	mov	r28,ZregLow
	mov	r29,ZregHigh
	ldi	r18,1
	rcall	LED
	sts	0x64,ZregLow
	sts	0x65,ZregHigh
	lds	ZregLow,0x66	; Ab hier werden die Daten für Kanal 2 voreingestellt.
	lds	ZregHigh,0x67
	mov	r28,ZregLow
	mov	r29,ZregHigh
	ldi	r18,2
	rcall	LED
	sts	0x66,ZregLow
	sts	0x67,ZregHigh
	lds	ZregLow,0x68	; Ab hier werden die Daten für Kanal 3 voreingestellt.
	lds	ZregHigh,0x69
	mov	r28,ZregLow
	mov	r29,ZregHigh
	ldi	r18,3
	rcall	LED
	sts	0x68,ZregLow
	sts	0x69,ZregHigh
	ldi	r18,4	; Ab hier werden die Daten für Kanal 4 voreingestellt.
	sbrc	ConfigReg,1	; Überspringe den nächsten Befehl wenn das Bit 1 im Configurationsregister(r23) gelöscht ist.
	ldi	r18,5	; 5 im r18 = Fernseher oder Schweißlicht aktiv
	lds	ZregLow,0x6A
	lds	ZregHigh,0x6B
	mov	r28,ZregLow
	mov	r29,ZregHigh
	rcall	LED
	sts	0x6A,ZregLow
	sts	0x6B,ZregHigh
;
	ldi	ZregLow,lo8(Timerlfzt-begin)	; Die Lowadresse von der Timer Laufzeit (Highbyte) ins Z-Register laden
	ldi	ZregHigh,hi8(Timerlfzt-begin)	; Die Highadresse von der Timer Laufzeit (Highbyte) ins Z-Register laden
	lpm
	mov	r16,r0
	cp	r16,TimeHighByte
	brne	onTC1end
	adiw	ZregLow,1	; Die Adresse im Z-Register um 1 erhöhen, um Das Lowbyte von der Timer Laufzeit zu laden.
	lpm
	mov	r16,r0
	cp	r16,TimeLowByte
	brne	onTC1end
	sbrc	ConfigReg,0	; Überspringe den nächsten Befehl wenn das Bit 0 im Configurationsregister(r23) gesetzt ist.
	rjmp	onTC1noSleep
	in	r16,MCUCR
	ldi	r17,0b00110000
	or	r16,r17
	out	MCUCR,r17
	sleep
onTC1noSleep:
	rcall	KonstAdressenLaden

onTC1end:	sei
	reti
;------------------------------------------------------------------------
; Interrupt: Timer 0
; Interruptprogramm: onTC0
; Timerüberlauf 0,064ms(Takt) x 256(Timerüberlauf) = 16,384ms
;------------------------------------------------------------------------
onTC0:
	cli
	lds	ZregLow,0x6C	; Die aktuelle EEPROM Adresse (es gibt nur ein Lowbyte) holen
	rcall	eeRead	; EEPROM lesen
	lds	r17,0x6D	; Die vergangene Anzahl von 16,384ms holen
	cp	r16,r17	; Vergleiche die bereits vergangene Anzahl der 16,384ms (r17) mit der zu vergehenden Anzahl (r16)
	breq	onTC0LEDschalten	; Wenn beide gleich sind, weiter zum schalten der LED
	inc	r17	; Die vergangene Anzahl von 16,384ms inkrementieren
	sts	0x6D,r17	; Und speichern
	rjmp	onTC0end
onTC0LEDschalten:
	in	r16,PORTB	; Lese PORTB
	sbrs	r16,4	; Überspringe nächste Befehl wenn das Bit im PORTB gesetzt ist
	sbi	PORTB,4	; Setze das Bit im PORTB
	sbrc	r16,4	; Überspringe nächste Befehl wenn das Bit im PORTB gelöscht ist
	cbi	PORTB,4	; Lösche das Bit im PORTB
	ldi	r16,0
	sts	0x6D,r16	; Die vergangene Anzahl von 16,384ms auf 0 zurücksetzen
	inc	ZregLow	; Die aktuelle EEPROM Adresse (es gibt nur ein Lowbyte) inkrementieren
	sts	0x6C,ZregLow	; Die inkrementierte EEPROM Adresse (es gibt nur ein Lowbyte) speichern
	cpi	ZregLow,0x40	; Die inkrementierte EEPROM Adresse (es gibt nur ein Lowbyte) mit 0x40 vergleichen (Ende der Daten im EEPROM + 1)
	brne	onTC0end	; Springe wenn das Ende der eingegebenen Daten noch nicht erreicht ist.
	sts	0x6C,r16	; Die Speicherstelle für den Start der Daten im EEPROM zurücksetzen (In der Regel immer 0)
onTC0end:	sei
	reti
;----------------------------------------------------------------------
; Unterprogramm: eeWrite
; Daten in EEPROM schreiben, r16 = Adresse, r18 = Wert für EEPROM
;----------------------------------------------------------------------
eeWrite:	out	EEARL,r16	;Adresse
	out	EEDR,r18	;Daten
	sbi	EECR,2	;set EEPROM Write Enabled
	sbi	EECR,1	;set EEPROM Write Enabled
waitEEW:	sbic	EECR,1	;wait for Handshake
	rjmp	waitEEW
	ret		;zurück zum Hauptprogramm
;----------------------------------------------------------------------
; Unterprogramm: eeRead
; Daten aus EEPROM lesen, ZregLow = Adresse, r16 = Wert aus EEPROM
;----------------------------------------------------------------------
eeRead:	out	EEARL,ZregLow	;Adresse
	sbi	EECR,0	;Leseaufforderung
waitEER:	sbic	EECR,0	;warte auf Fertigmeldung
	rjmp	waitEER
	in	r16,EEDR	;Daten übernehmen
	ret		;zurück zum Hauptprogramm
;----------------------------------------------------------------------
; Unterprogramm: KonstAdressenLaden
; Hier wird alles neu initialisiert, was notwendig ist, wenn der Programmzyklus sich wiederholen soll.
; Die Beginn-Adressen der Konstanten über das Z-Register in den SRAM laden
; 0x60 + 0x61 = Sekunden. Wird vom Timer1 jede Sekunde inkrementiert.
; 0x62 + 0x63 = Adresse der Ein- Auszeiten von LED 0
; 0x64 + 0x65 = Adresse der Ein- Auszeiten von LED 1
; 0x66 + 0x67 = Adresse der Ein- Auszeiten von LED 2
; 0x68 + 0x69 = Adresse der Ein- Auszeiten von LED 3
; 0x6A + 0x6B = Adresse der Ein- Auszeiten von LED 4
; 0x6C = Adresse der Ein- Auszeiten für Fernseher oder Schweißlicht im EEPROM (In der Regel ist das 0)
; 0x6D = 16,384 Millisekunden. Wird vom Timer0 jede 13,384ms inkrementiert.
; Verwendete Register:	ZregLow(r30),ZregHigh(r31)		Z Register
;			r16								Allgemeines Register
; Übernommene Register:
; Zurück gegebene Register:
;----------------------------------------------------------------------
KonstAdressenLaden:
	cbr	r16,0xFF	; Lösche alle Bits im Register
	sts	0x61,r16	; Sekunden Highbyte auf 0 setzen
	sts	0x60,r16	; Sekunden Lowbyte auf 0 setzen. Wird vom Timer1 jede Sekunde inkrementiert.
	ldi	ZregLow,lo8(LED0cyc-begin)
	ldi	ZregHigh,hi8(LED0cyc-begin)
	sts	0x62,ZregLow
	sts	0x63,ZregHigh
	ldi	ZregLow,lo8(LED1cyc-begin)
	ldi	ZregHigh,hi8(LED1cyc-begin)
	sts	0x64,ZregLow
	sts	0x65,ZregHigh
	ldi	ZregLow,lo8(LED2cyc-begin)
	ldi	ZregHigh,hi8(LED2cyc-begin)
	sts	0x66,ZregLow
	sts	0x67,ZregHigh
	ldi	ZregLow,lo8(LED3cyc-begin)
	ldi	ZregHigh,hi8(LED3cyc-begin)
	sts	0x68,ZregLow
	sts	0x69,ZregHigh
	ldi	ZregLow,lo8(LED4cyc-begin)
	ldi	ZregHigh,hi8(LED4cyc-begin)
	sts	0x6A,ZregLow
	sts	0x6B,ZregHigh
	sts	0x6C,r16
	sts	0x6D,r16	; 16,384 Millisekunden Lowbyte auf 0 setzen. Wird vom Timer0 jede 13,384ms inkrementiert.
	ret
;----------------------------------------------------------------------
; Unterprogramm: LED
; LED ein- und ausschalten für Kanal 1, 2 und 3
; Im Kanal 4 flackert die LED dauernd wenn die Konstante FSon auf 1 steht. Es wird der Timer0 Interrupt statt der LED ein- und ausgeschalten.
; Verwendete Register:	r16,r17						Zur allgemeinen Verwendung
;			r18							Kanalnummer [darf hier nicht verändert werden]
;			TimeLowByte(r24)			Timer Lowbyte [darf hier nicht verändert werden]
;			TimeHighByte(r25)			Timer Highbyte [darf hier nicht verändert werden]
;			r22							PORTB oder TIMSK0 wird da reinkopiert
;			ZregLow(r30), ZregHigh(r31)	Z-Register
;			r28,r29						Y-Register als Kopie des Z-Registers um das Z-Register wieder her zu stellen
; Übernommene Register:	r18, TimeHighByte(r25), TimeLowByte(r24), r28, r29, ZregLow(r30), ZregHigh(r31)
; Zurück gegebene Register:	ZregLow(r30), ZregHigh(r31)
;----------------------------------------------------------------------
LED:	lpm		; Daten aus Flash auslesen (wird im r0 gespeichert)
	mov	r17,r0
	cpi	r17,0xFF	; Die aus dem Flash gelesenen Daten auf 255 prüfen (255 = Ende der Ein/Aus Cyclen)
	breq	LED255	; Springe wenn das Datenende erreicht ist.
	adiw	ZregLow,1	; Erhöhe das Z-Register (Indirekte Adresse in r30 und r31) um 1.
	lpm		; Daten aus Flash auslesen (wird im r0 gespeichert)
	mov	r16,r0
	cp	TimeLowByte,r16	; Vergleiche die ausgelesenen Daten in r16(Lowbyte) mit den vergangenen Sekunden in r24(Lowbyte)
	brne	LEDvorend	; Springe wenn die beiden Register ungleich sind ans Ende
	cp	TimeHighByte,r17	; Vergleiche die ausgelesenen Daten in r17(Highbyte) mit den vergangenen Sekunden in r25(Highbyte)
	brne	LEDvorend	; Springe wenn die beiden Register ungleich sind ans Ende
	in	r22,PORTB	; Hole den PortB ins R22
	cpi	r18,0	; Kanal 0 voreinstellen
	breq	LED0sch	; Springe um Kanal 0 zu behandeln
	cpi	r18,1	; Kanal 1 voreinstellen
	breq	LED1sch	; Springe um Kanal 1 zu behandeln
	cpi	r18,2	; Kanal 2 voreinstellen
	breq	LED2sch	; Springe um Kanal 2 zu behandeln
	cpi	r18,3	; Kanal 3 voreinstellen
	breq	LED3sch	; Springe um Kanal 3 zu behandeln
	cpi	r18,4	; Kanal 4 voreinstellen
	breq	LED4sch	; Springe um Kanal 4 zu behandeln
	cpi	r18,5	; Kanal 4 als Fernseher voreinstellen
	breq	LED4schFS	; Springe um Kanal 4 zu behandeln
LED0sch:	sbrc	r22,0	; Skip wenn Bit in Register gelöscht
	cbi	PORTB,0	; Lösche das Bit im PortB
	sbrs	r22,0	; Skip wenn Bit in Register gesetzt
	sbi	PORTB,0	; Setze das Bit im PortB
	rjmp	LEDweiter
LED1sch:	sbrc	r22,1	; Skip wenn Bit in Register gelöscht
	cbi	PORTB,1	; Lösche das Bit im PortB
	sbrs	r22,1	; Skip wenn Bit in Register gesetzt
	sbi	PORTB,1	; Setze das Bit im PortB
	rjmp	LEDweiter
LED2sch:	sbrc	r22,2	; Skip wenn Bit in Register gelöscht
	cbi	PORTB,2	; Lösche das Bit im PortB
	sbrs	r22,2	; Skip wenn Bit in Register gesetzt
	sbi	PORTB,2	; Setze das Bit im PortB
	rjmp	LEDweiter
LED3sch:	sbrc	r22,3	; Skip wenn Bit in Register gelöscht
	cbi	PORTB,3	; Lösche das Bit im PortB
	sbrs	r22,3	; Skip wenn Bit in Register gesetzt
	sbi	PORTB,3	; Setze das Bit im PortB
	rjmp	LEDweiter
LED4sch:	sbrc	r22,4	; Skip wenn Bit in Register gelöscht
	cbi	PORTB,4	; Lösche das Bit im PortB
	sbrs	r22,4	; Skip wenn Bit in Register gesetzt
	sbi	PORTB,4	; Setze das Bit im PortB
	rjmp	LEDweiter
LED4schFS:	in	r22,TIMSK	; Interrupt Timer0 (Bit1) nachschauen
	ldi	r16,0b00000100
	sbrc	r22,1	; Skip wenn Bit 1 in Register gelöscht
	rjmp	LED4LEDaus
	ldi	r16,0b00000110
	sbrs	r22,1	; Skip wenn Bit 1 in Register gesetzt
	out	TIMSK,r16
	rjmp	LEDweiter
LED4LEDaus:	out	TIMSK,r16
	cbi	PORTB,4	; Die LED extra ausschalten, denn sie könnte gerade eingeschalten sein wenn der Interrupt still gelegt wird.
	rjmp	LEDweiter
LEDweiter:	adiw	ZregLow,1
	rjmp	LEDend	; Springe
LED255:	mov	ZregLow,r28
	mov	ZregHigh,r29
	rjmp	LEDend	; Springe
LEDvorend:	sbiw	ZregLow,1
LEDend:	ret
;-----------------------------------------------------------------------------------
; Konstanten
;-----------------------------------------------------------------------------------
CONFIG:	.byte	0b00000111
; 			Bit 0 ... Programm-Ablaufzyclus
;						0=Programmablauf nicht wiederholen
;						1=Programmablauf wiederholen
; 			Bit 1 ... Fernseher/Schweißlicht
;						0=LED flackern aus (LED arbeitet wie alle anderen)
;						1=LED flackert wenn Kanal 4 eingeschalten ist
; 			Bit 2 ... Kanal 2, Ein- Ausgang
;						0=Kanal 2 (PORTB2) arbeitet als Ausgang
;						1=Kanal 2 (PORTB2) arbeitet als Steuereingang
Ablaufcyc:	.byte	1	; 0 = Keine Wiederholung/Schleife des Ablaufes. 1 = Ablauf wiederholen
Timerlfzt:	.byte	0x00,123	; Timer Laufzeit bis Wiederholung oder Abbruch. (2x256 + 5x16 + 8 = 600 Sekunden)
FSon:	.byte	1	; Fernseher auf Kanal 4 ein- oder ausschalten. (Wenn 0 müsste das EEPROM nicht beladen sein!)
LED0cyc:	.byte	0,1,0,30,0,36,0,60,0,100,0,121,255
LED1cyc:	.byte	0,25,0,28,0,30,0,54,0,110,0,119,255
LED2cyc:	.byte	0,27,0,55,0,58,0,61,0,98,0,105,255
LED3cyc:	.byte	0,12,0,35,255
LED4cyc:	.byte	0,2,0,68,255
 

Anhänge

  • bel5oben.jpg
    bel5oben.jpg
    111,2 KB · Aufrufe: 13
  • bel5unten.jpg
    bel5unten.jpg
    162,5 KB · Aufrufe: 14
  • bel5sch.jpg
    bel5sch.jpg
    45,2 KB · Aufrufe: 10
Hallo,

also der Schaltplan ist ja "übersichtlich" ;) (wenig Bauteile).

Die Platine ist allerdings aufschlußreicher. Vor allem die Unterseite.
Du speißt das alles über eine 1N4148 und hast nen 100nF als Pufferkondensator.

1. Auf was steht deine Fuse für BrownOutDetection? Die würde ich auf 2,5V (oder was in der Nähe ist) runterdrehen. Könnte sein das er gerne auf Reset geht weil die Spannung zu weit zusammenbricht (siehe Punkt 3)

2. Den 100nF hätte ich zwischen die Pinreihen des Tinys gepackt. Das gibt kürzere Verbindungen. (nicht ganz so kritisch)

3. Die Diode gibt einen (je nach Strom) variablen Widerstand der bei sagen wir mal 20-30mA Gesamtstrom nicht zu unterschätzen ist. Vor allem wenn nur der 100nF am Tiny hängt. Ich hätte da wenigstens noch nen kleinen 4,7µF Elko drangesetzt. (den jetzt evtl als SMD-Tantal zwischen die Beine)

Programmiert haben wirst du den wohl nicht in der Schaltung sondern in einem Adapter am Progger. Der Zustand in der Schaltung ist also nicht vergleichbar mit dem Zustand beim proggen.

Gruß
Dino
 
andererseits stellt er aber auch 5,7V vor die Diode. Und mit dem Oszi schien ja auch alles iO zu sein.

Im Progger ist der IC unauffällig? (Signatur lesen etc...)
Ich würde erstmal Dinos Elko/Tantal dazusetzen, und dann ein ganz simples Programm testen (alle LEDs an und Endlosschleife) - wenn das nicht geht, erstmal einzelne LEDs.

Danach kann man sich dann mal um das Programm kümmern.

Was mir bei da aufgefallen ist ist, daß Du bei jedem Start den Eeprom zu beschreiben scheinst (komplett). Der kann nur begrenzt oft beschrieben werden. Wehe, wenn der jetzt wirklich ständig resettet...

Edit: einen Teil der IO-Register benamst Du selbst - bietet Deine Programmierumgebung nicht die entsprechenden Prozessordefinitionsdateien an?
Du inkludierst eine Datei "AVR.H" - kannst Du den Inhalt zeigen?
Ramend wird wo festgelegt (AVR.H?)
(abgesehen davon, daß der Stackpointer default bereits RAMEND ist, aber...)
 
Hallo Dino,

also der Schaltplan ist ja "übersichtlich" ;) (wenig Bauteile).
Ja, ist ja nur eine kleine PLatine um das Programm zu testen und zu entwickeln. Die endgültige fertige Platine enthält noch Treibertransistoren für die Ausgänge und einen eigenen Spannungsstabi mit 5VDC. Wobei die Speisespannung um die 15VDC sein wird.

Die Platine ist allerdings aufschlußreicher. Vor allem die Unterseite.
Du speißt das alles über eine 1N4148 und hast nen 100nF als Pufferkondensator.
Die Diode war als Verpolungsschutz angedacht. Im Endausbau kommt die Platine in einen Schrumpfschlauch. Da schauen vorne und hinten nur Anschlussdrähte raus. Das ganze kommt in Modellbauhäuser rein und wird direkt dort drinnen verkabelt. Der Kondensator gehört dann direkt an den IC.

1. Auf was steht deine Fuse für BrownOutDetection? Die würde ich auf 2,5V (oder was in der Nähe ist) runterdrehen. Könnte sein das er gerne auf Reset geht weil die Spannung zu weit zusammenbricht (siehe Punkt 3)
Da hab ich nichts verändert. Muss ich im Datenblatt nachschauen was default ist. Den Punkt werde ich mir noch näher anschauen.

2. Den 100nF hätte ich zwischen die Pinreihen des Tinys gepackt. Das gibt kürzere Verbindungen. (nicht ganz so kritisch)
Werde ich auf der endgültigen Platine noch berücksichtigen.

3. Die Diode gibt einen (je nach Strom) variablen Widerstand der bei sagen wir mal 20-30mA Gesamtstrom nicht zu unterschätzen ist. Vor allem wenn nur der 100nF am Tiny hängt. Ich hätte da wenigstens noch nen kleinen 4,7µF Elko drangesetzt. (den jetzt evtl als SMD-Tantal zwischen die Beine)
Das Diodenverhalten ist mir bekannt. Die Nachmessung mit dem Oszi hat da aber keine signifikanten Spannungsunterschiede zwischen Standby und Volllast ergeben. Aber wie gesagt. Im Endausbau kommt die Diode raus und wird durch einen 5V Stabi ersetzt.

Programmiert haben wirst du den wohl nicht in der Schaltung sondern in einem Adapter am Progger. Der Zustand in der Schaltung ist also nicht vergleichbar mit dem Zustand beim proggen.
Exakt!


Hallo LotadaC,

andererseits stellt er aber auch 5,7V vor die Diode. Und mit dem Oszi schien ja auch alles iO zu sein.
Genau.

Im Progger ist der IC unauffällig? (Signatur lesen etc...)
Da hatte ich noch keinerlei Probleme. Lief immer alles glatt.

Ich würde erstmal Dinos Elko/Tantal dazusetzen, und dann ein ganz simples Programm testen (alle LEDs an und Endlosschleife) - wenn das nicht geht, erstmal einzelne LEDs.
Das werde ich als Versuch mal machen.
Das mit dem Testen geht so leider nicht - leider. Das Problem ist nicht reproduzierbar!
Beispielsweise heute in der Früh: Gestern lief er den ganzen Abend einwandfrei. Mal die Spannung weg. Dann wieder drann. Programm startete einwandfrei. Heute legte ich die Spannung an - und nicht passierte. Nicht ums verrecken war er zum Programmstart zu bewegen. Ich wollte ihn eigentlich schon entsorgen. Ich nahm einen anderen frischen Controller, flashte ihn und setzte ihn in die Schaltung. Lief sofort an. Ok, IC raus, ursprünglichen IC wieder rein - nichts. Den wieder raus und als letzten Versuch einfach das Programm von gestern noch mal drübergeflasht - in die Schaltung rein - lief als wenn nichts wäre. Das verstehe ich nicht mehr. Es sei denn er ist hardwaremäßig irgendwie nicht in Ordnung. Keine Ahnung.
Ok, hab jetzt einen zweiten mit dem Programm. Werde beide immer parallel flashen und testen. Mal schauen ob sich da Unterschiede zeigen?

Danach kann man sich dann mal um das Programm kümmern.
Siehe oberhalb.

Was mir bei da aufgefallen ist ist, daß Du bei jedem Start den Eeprom zu beschreiben scheinst (komplett). Der kann nur begrenzt oft beschrieben werden. Wehe, wenn der jetzt wirklich ständig resettet...
Ist mir bewusst.
Das mit dem EEPROM haben wir an anderer Stelle schon diskutiert weil ich danach fragte. Wie es aussieht ist das leider anders mit meiner Entwicklungsumgebung nicht machbar. Zumindest kann mir da keiner helfen. Nicht mal der Support des Herstellers antwortet mir. Ich habe die Nase schon gestrichen voll. Zumal kaum Direktiven verwendbar sind. Die meisten kennt die Entwicklungsumgebeng einfach nicht!
Mitte der Woche habe ich mir direkt von Atmels Site das Atmel-Studio-6.1 runtergeladen und installiert. Den original MKII von Atmel habe ich mir ebenfalls geordert. Sobald das alles da ist, steige ich um. Dann wird das EEPROM nur beim flashen beschrieben. Gibt dann auch mehr Platz im Programmflash.

Edit: einen Teil der IO-Register benamst Du selbst - bietet Deine Programmierumgebung nicht die entsprechenden Prozessordefinitionsdateien an?
Miese Entwicklungsumgebung! Siehe oberhalb.

Du inkludierst eine Datei "AVR.H" - kannst Du den Inhalt zeigen?
Nein. Finde sie auf meiner Festplatte nicht. Ist im Grundgerüst, wenn man eine neue Datei anlegt, enthalten.

Ramend wird wo festgelegt (AVR.H?)
Gute Frage. Wahrscheinlich, oder auch nicht. Ich habe mich vor 1 Woche mal durch die ganze Installation gewühlt weil ich wissen wollte was es mit dieser AVR.H auf sich hat. Irgendwo bin ich dann über eine Datei gestolpert wo ich die Definition für das RamEnd gefunden hatte. Weiß jetzt aber nicht mehr wo das genau stand. Wird aber in einigen Tagen nicht mehr wichtig sein (AVR Studio 6.1).

(abgesehen davon, daß der Stackpointer default bereits RAMEND ist, aber
Jo

Grüße
Manfred
 
Was ist jetzt nicht reproduzierbar? Das Verhalten Deines Programmes da oben, oder bereits ein simples "Schalte LEDs an und tu nichts weiter"-Programm?

Und natürlich kann man "von hinten durch die Brust ins Auge" Daten über den Flash ins Eeprom laden, aber es reicht, wenn man das einmal tut, also ein Programm mit den Eeprom Daten im Flash, und diese dann ins Eeprom schaufeln lassen, und ein Programm, welches die Daten dann nutzt. Ersteres sollte dann einmal ausgeführt werden, danach kann man das andere Programm flashen.

Sicherheitshalber würde ich das Transferprogramm so aufbauen:
-init, dann eine LED an
-warten auf Taster etc... ann 2te LED an
-Daten vom Flash ins Eeprom schaufeln
-dritte LED an
(-ggf Flash und Eeprom-Daten verifizieren, dann 4te LED an)

Dann kann der Controller beliebig oft resetten, es wird nur einmal geschrieben - leuchten alle LEDs, kannst Du das andere Programm flashen - oder wird in Deiner Programmierumgebung jedesmal ein kompletter Chip-erase inklusive Eeprom durchgeführt?

Ggf könnte man analog dazu nach ein Programm dazwischen setzen, welches überprüf, ob die Daten korrekt im Eeprom geblieben sind.

P.S.:hast Du mal versucht, Deinen Programmer in das AVRstudio einzubinden?

P.P.S.: Hmm... Du bist ja nicht der einzige, der hier Probleme mit diesem Programmer etc hat/dem wir hier irgendwie nicht so recht helfen konnten. Ob das jetzt an der Hardware liegt, oder an was anderem, kann ICH nicht sagen. Für mich sieht das jetzt langsam so aus, daß wir entweder das falsche Forum für diese Hardware sind, oder zuwenig Leute mit dieser Hardware hierher kommen/hier bleiben/bei dieser Hardware bleiben...
Ich meine... irgendwer verkauft den Krempel ja (erfolgreich) - so schlecht kann das Zeug also eigentlich gar nicht sein - vielleicht liegts ja an uns, vielleicht sehen wir den Wald vor lauter Bäumen nicht...
Hat eigentlich schon mal wer nach einem "myAVR-Forum" gesucht?

Edit: FAQ42 und FAQ44 schinen in die Richtung zu gehen...
 
Zuerst mal möchte ich mich für deine Ideen und der Beschäftigung mit meinem Problem bei dir bedanken!


Was ist jetzt nicht reproduzierbar? Das Verhalten Deines Programmes da oben, oder bereits ein simples "Schalte LEDs an und tu nichts weiter"-Programm?...
Damit meinte ich den Programmstart meines Programmes. Wie weiter oben beschrieben habe ich bereits auf ähnliche Weise versucht zu ermitteln wo es hakt. Die von dir erwähnte Methode setze ich standardmäßig ein um bei nicht funktionierendem Code den Fehler zu finden. Macht wohl eh jeder so oder ähnlich ...............
Um die Verwirrung noch zu erhöhen möchte ich dir noch einen meiner zahlreichen Versuche schildern:
Programm startete auch nach mehrmaligem Startversuch nicht.
Im Hauptprogramm eine Zeile eingefügt um eine Led einzuschalten.
Neuer Startversuch
Die Led leuchtet und das Programm läuft ebenfalls
Mist - Pech gehabt.
Zeile wieder entfernt.
Programm startet nicht
Hmmm........
Die Zeile mit der Led in ein beliebiges Unterprogramm oder Interruptprogramm gesetzt.
Die Led leuchtet UND das Programm läuft.
Wieder Mist.
Zeile wieder entfernt.
Jetzt läuft das Programm auch ohne dieser Zeile wieder.
Aussage des Versuches: Keine logische Erklärung.............

Und natürlich kann man "von hinten durch die Brust ins Auge" Daten über den Flash ins Eeprom laden, aber es reicht, wenn man das einmal tut, also ein Programm mit den Eeprom Daten im Flash, und diese dann ins Eeprom schaufeln lassen, und ein Programm, welches die Daten dann nutzt. Ersteres sollte dann einmal ausgeführt werden, danach kann man das andere Programm flashen.
Das habe ich auch schon hinter mir. Funktioniert nicht. Beim Flashen wird das EEPROM gelöscht. Kann das nicht beeinflussen.

Sicherheitshalber würde ich das Transferprogramm so aufbauen:
-init, dann eine LED an
-warten auf Taster etc... ann 2te LED an
-Daten vom Flash ins Eeprom schaufeln
-dritte LED an
(-ggf Flash und Eeprom-Daten verifizieren, dann 4te LED an).
So ähnlich hatte ich das versucht. Es gibt bei myAVR ein Tool mit dem man den EEPROM Inhalt anschauen kann. Ich hatte Daten ins EEPROM geschaufelt. Die waren dann auch wirklich drinnen. Danach das programm ganz normal geflasht. Die Daten im EEPROM waren weg.

- oder wird in Deiner Programmierumgebung jedesmal ein kompletter Chip-erase inklusive Eeprom durchgeführt?
Du sagst es.

P.S.:hast Du mal versucht, Deinen Programmer in das AVRstudio einzubinden?
Ja, das war meine erste Intention nach der Installation vom Studio. Findet den Programmer nicht. Ich sehe zwar an einer Statusled, dass ganz kurz eine Kommunikation statt findet. Jedoch das Studio meldet nichts zu finden.

P.P.S.: Hmm... Du bist ja nicht der einzige, der hier Probleme mit diesem Programmer etc hat/dem wir hier irgendwie nicht so recht helfen konnten. Ob das jetzt an der Hardware liegt, oder an was anderem, kann ICH nicht sagen. Für mich sieht das jetzt langsam so aus, daß wir entweder das falsche Forum für diese Hardware sind, oder zuwenig Leute mit dieser Hardware hierher kommen/hier bleiben/bei dieser Hardware bleiben...
Ich meine... irgendwer verkauft den Krempel ja (erfolgreich) - so schlecht kann das Zeug also eigentlich gar nicht sein - vielleicht liegts ja an uns, vielleicht sehen wir den Wald vor lauter Bäumen nicht...
Das ist auch mein Eindruck nach vielen Stunden googeln.

Hat eigentlich schon mal wer nach einem "myAVR-Forum" gesucht?
Ja. Bin dort angemeldet. Jedoch bekommt man da keine Antworten. Hab auch schon dem Support geschrieben - keine Antwort.

Edit: FAQ42 und FAQ44 schinen in die Richtung zu gehen...
Kenne ich. Hat nichts gebracht weil mein Programmer ja grundsätzlich funktioniert. Was mit dem dort angeführten Tool auch zu beweisen war. Ändert aber nichts daran, dass das Studio ihn nicht erkennt - auch wenn das dort in den FAQ behauptet wird.
 
Ohne jetzt andere schlechtmachen zu wollen: warte auf den AVRisp (MKII), zumindest da und im AVRstudio können wir unterstützen (wenns dann noch nötig ist)

Ich hatte sowas ähnliches mal, als ich ein ausgemustertes Handynetzteil (Schaltnetzteil) verwendet hatte - das hat sich dann immer irgendwie wegen fehlender Grundlast abgeschaltet. Hilft Dir jetzt aber auch nicht weiter, die Spannungsversorgung hast Du ja geprüft.

Kannst Du mit Deiner Software den Flashinhalt eines Kontrollers mit einer vorgegebenen Hex-Datei vergleichen lassen? Also verifizieren ohne vorheriges flashen? Ich meine mich zu erinnern, daß das mit dem Studio ging.

Während des Betriebes einen Reset auslösen (Pin gegen den Pullup auf Gnd legen, und dann loslassen) hattest Du schon versucht, oder?

Was mir grad aufgefallen ist: hinten bei den Errata steht irgendwas mit Eeprom und niedriger Spannung und/oder geringer Taktfrequenz (insbesondere scheint die Temperatur mit reinzuspielen) - lies Dir das mal durch. Mit welchem effektivem Takt läuft der Controller? Default scheint ein interner Oscillator @8MHz zu sein, dann gibt es noch einen Clock Prescaler (Register CLKPSR wird beim Reset auf 8 oder 1eingestellt, je nach CKDIV8 Fuse). Vielleicht hast Du effektiv 1MHz, und das ist vielleicht zuwenig?
(Datenblatt so um Seite 33)
 
Ohne jetzt andere schlechtmachen zu wollen: warte auf den AVRisp (MKII), zumindest da und im AVRstudio können wir unterstützen (wenns dann noch nötig ist)

Naja, die Hoffnung stirbt zuletzt. Mein Problemchen scheint nicht allgemein bekannt zu sein. Daher habe ich Hoffnung, dass das doch noch was wird. Woran immer es auch jetzt liegen mag.

Kannst Du mit Deiner Software den Flashinhalt eines Kontrollers mit einer vorgegebenen Hex-Datei vergleichen lassen? Also verifizieren ohne vorheriges flashen? Ich meine mich zu erinnern, daß das mit dem Studio ging.
Ich kenne das aus meinen Tagen von füher als ich 8051 in Assembler programmiert hatte. Scheint es hier aber in Workpad nicht zu geben. Im Studio hab ich noch nicht nachgeschaut. Habe mal probeweise mein Programm ins Studio kopiert. Waren dann einige Anpassungen im Code notwendig. Dann konnte ich aber simulieren usw. Gefiel mir. Das Studio spielt in einer ganz anderen Klasse als meine Software. Es ist zwar nicht berauschend schnell - aber egal. Hauptsache es macht das was ich erwarte :)

Während des Betriebes einen Reset auslösen (Pin gegen den Pullup auf Gnd legen, und dann loslassen) hattest Du schon versucht, oder?
Ja. Der Controller reagierte nicht. War ihm egal! Wenn er dann mal lief funktionierte auch der Reset.


Was mir grad aufgefallen ist: hinten bei den Errata steht irgendwas mit Eeprom und niedriger Spannung und/oder geringer Taktfrequenz (insbesondere scheint die Temperatur mit reinzuspielen) - lies Dir das mal durch. Mit welchem effektivem Takt läuft der Controller? Default scheint ein interner Oscillator @8MHz zu sein, dann gibt es noch einen Clock Prescaler (Register CLKPSR wird beim Reset auf 8 oder 1eingestellt, je nach CKDIV8 Fuse). Vielleicht hast Du effektiv 1MHz, und das ist vielleicht zuwenig?
(Datenblatt so um Seite 33)
Habs gelesen. Bezieht sich auf die Frequenh von < 1MHz und < 2V. Da gab es mit dem EEPROM Probleme. MIt der Revision F und G: "no known errata" Wenn ich richtig gesehen habe, sind meine ICs aus "G"
Per default laufen sie mit 1MHz.
Ich warte jetzt mal auf die Lieferung des original MKII. Dann verwende ich immer 2 ICs parallel zum entwickeln. Schaun ma mal.

Besten Dank für die bisherige Unterstützung und Diskussion. Melde mich in einigen Tagen wenn ich dann mehr weiß.

Grüße
Manfred
 
Hi
Ich hab nun nicht alles gelesen und daher bin ich mir nicht sicher, ob es bereits bekannt ist,, aber schau dir das mal an:
Code:
onTC11:
             lds	TimeLowByte,0x60	; Sekunden Lowbyte aus SRAM Adresse 0x60 holen
	inc	TimeLowByte	; Um 1 erhöhen
	brne	onTC11
Na, fällt dir da was auf? Du lädst einen Wert und springst, wenn nicht 0 ( not eqal) nach onTC11 zurück. Obwohl du Incrementiert hast ( warum nicht decrement ?:confused:) änderst du nichts, denn du lädst ja wieder den Wert aus TimeLowByte. Das Spielchen wird vermutlich 100 Jahre laufen.....
Es ist vermutlich auch eine Art Zufall, das er sich hier in die Falle begibt. Möglicherweise gibt es noch weitere Sackgassen. Übrigends, Lo8 und Hi8 kenn ich so nicht. Ist das nicht einfach nur Low und High ? Ich weiß, das der Compiler nicht alles erfasst und dann so richtig spaßiges Programm auflegt. Aber ich kann mich hier ja auch irren. Nebenbei, ich bin kein Freund von ISR, die den Programmablauf steuern. ISR sollten klein und übersichtlich sein. Allein deine (nicht funktionierende) Zählschleife blockiert mehr als es nutzt. Setz dir in der ISR ein Flag und bearbeite dieses in der Programmschleife. Dann wird auch die zweite ISR eine Chance haben.
Grußß oldmax
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)