Ik heb een prog geschreven om 16 ingangen in te lezen met een 16-1 MUX. Als ik deze software simuleer in AVR Studio 4.12 SP4 build 498, dan gaat het allemaal goed.

Maar, als ik deze in de tiny stop, dan gaat het fout als portB1 hoog is (adres A1 van de MUX). Andere tiny en MUX verhielpen dit probleem niet.

Als 1 van de 16 knoppen wordt ingedrukt, dan wordt er 5 maal data verzonden met een delay van 100ms en daarna met een delay van 10ms. Ergens in deze delayroutine gaat het fout.
een stukje code:


;*****	Timer overflow				*****

TIM0_OVF:
	inc	temp
	cp	temp, dly
	breq	short_bit
	reti
short_bit:	lds	tempH, status
	cbr	tempH, (1<<timer_status)
	sts	status, tempH
	reti

Waarom gaat het goed zolang PB1 laag is? Op verzoek mail ik wel de hele code.
De MUX is een MAX306 met hier de datasheet.

Moet je die timer niet re-loaden als-ie overflowed?

Wat het niet-functioneren met die ene bit te maken heeft?? Linkje naar een schemaatje?

Overigens mis ik nog even het verband tussen mux, knop (die zal wel aan een mux input hangen) en data verzenden...

Op 12 december 2006 06:27:22 schreef Marco69:
Overigens mis ik nog even het verband tussen mux, knop (die zal wel aan een mux input hangen) en data verzenden...

Juist, het was al een beetje laat gisteren. Het is een remote device, vandaar de data verzenden.
De timer loopt gewoon tot max en begint dan opnieuw te tellen.

Nog wat anders... Loop je niet te rommelen met interrupts? Die pin is ook een interrupt ingang. Als die aan staat... level triggered... nou ja, je voelt 'm al aankomen...

Ik gebruik 2 interrupts, de "reset" en de TIM0_OVF, dus daar kan het niet aan liggen. initialisatie:

 ;***** initialise  Stack-Pointer
	ldi	Temp,low(RAMEND)
	out	SPL,Temp
;***** initialise port B
	ldi	tempL, 0b00101111 	;Set Port B 
	out	DDRB,TempL
	sbi	portB, TxD

;****************************************************************************
;***** CLEAR RAM TABLES					*****
;****************************************************************************
;=== clear all tables
	ldi	ZL,low(STATUS)	;Z-pointer in beginning of
	ldi	ZH,high(STATUS)	; STATUS table
	clr	Temp		;Clear register Temp
CL_TBL:	st	Z+,Temp		;write $00 in every byte and inc Z-pointer
	cpi	ZH,high(T_END)	;check for end of table, HIGH byte
	brne	CL_TBL		;if end not reached, clear next byte
	cpi	ZL,low(T_END)	;check for end of table, LOW byte
	brne	CL_TBL		;if end not reached, clear next byte

;***** INITIALISE TIMER0 & ENABLE ITS INTERRUPT			
	ldi	Temp,$02
	out	TIMSK0,Temp	;enable timer0 interrupt
	sei			;enable global interrupt

een schema:

  ATTINY13                MUX 
 _____________        ___________ 
|          PB0|-------|A0        |-
|          PB1|-------|A1        |-
|          PB2|-------|A2        |-
|          PB3|-------|A3        |- Data Inputs (de drukknoppen)
|             |       |          |-
|          PB4|-------|MUX-OUT   |-
|             |       |__________|-
|             |
|          PB5|---->TX
|_____________|

Er zijn ook nog de nodige weerstanden voorzien!!

Ook nog een aardige... In je interrupt handler bewaar je geen SREG, terwijl je wel aan flags loopt te trekken in die handler. Dat kan hele onvoorspelbare resultaten tot gevolg hebben.

(post anders de hele code of een link ernaar.. praat wat makkelijker).

Ik zal straks een linkje posten, en dat van die SREG had ik bewust niet gedaan omdat er (in de simulatie) geen veranderingen optreden in dat register en dat in de eerste versie mijn TINY voor 94% volzat met code (nu nog maar een goede 60%).

Maar toch een tip om straks eens uit te proberen.

Hun? Geen veranderingen? Je staat nondeju een cp in de ISR te doen. En ja, als die flag al de status heeft die de cp ook creert, maakt het voor die flag dus niet uit. Duh. En als de ISR een keer tussen een paar instructies elders aangeroepen wordt... weet je het niet...

Als ik een collega dergelijke code zie bakken en het dan met een dergelijk excuus hoorde verdedigen, mag-ie wat mij betreft gaan bloemschikken ofzo... Maar geen byte code meer van die man!

|:(|:(|:(|:(|:(|:(|:(|:(
Natuurlijk moet dat erbij, ik "zag" cpi, maar daarmee is het probleem niet verholpen. Ik heb je de asm file gemaild omdat uploaden even niet gaat.

Marco69, bedankt voor je uitleg in de mail, een paar aanpassingen later werkte het.
Natuurlijk vraag ik me stiekem toch nog af waar het eigenlijk mis ging ;).