Reset-pin v. ATtiny misbruiken.

Bij verschillende ATtiny's is het mogelijk, de reset-pin als I/O-pin te configureren. Dat kan handig zijn, als er net 1 pin te weinig is om een werkend geheel te krijgen.
Helaas heeft dat tot gevolg, dat die handige ISP-connector niet meer bruikbaar is. Voeg daarbij, dat niet iedereen over een HVSP- of een paralelle programmer beschikt.

Toch bestaat de mogelijkheid om de reset-pin als ingang te gebruiken, zonder de oorspronkele reset-functie op te geven. Met de ATtiny13 en de ATtiny45 (en mogelijk met andere 'tiny's) kan de ADC0-ingang gebruikt worden, zolang de spanning niet te laag wordt - dan grijpt de reset-functie immers in.

Even een schema om te tonen wat ik bedoel:
http://home.scarlet.be/prosje/RstPinTst.png
C1 is hierbij overbodig, maar die zit nu eenmaal standaard op mijn experimenteerprint. Vandaar ook de delay's in het testprogramma.

Daarbij hoort een testprogramma:

code:


#define F_CPU         9600000UL

#include <avr/io.h>
#include <compat/deprecated.h>
#include <util/delay.h>

int main(void)
{
    unsigned char vlag;

    DDRB = _BV(PB0) | _BV(PB4);			// PB0 en PB4 = uitgang
    PORTB &= ~(_BV(PB0) | _BV(PB4));		// Let op! "PORTB = 0;" = RESET!
    ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1);  // Init ADC
    ADMUX = 0;					// ADC0 = analoge ingang; ref = 5V
    sbi(ADCSRA, ADSC);				// Start 1st (dummy) conversion
    vlag = 0;

    while (1) {
	vlag++;
	vlag &= 0x01;				// vlag = 0 of 1
	if (vlag == 0) {
	    PORTB &= ~(_BV(PB4));		// PB4 laag maken
	    _delay_ms(2);				// Effe wachten
	    sbi(ADCSRA, ADSC);			// Start ADC
	    while (bit_is_set(ADCSRA, ADSC)) {	// Wachten tot
	    }					// de ADC-conversie voltooid is
	    if (ADC > 800) {			// Pin hoog?
		PORTB |= _BV(PB0);		// Dat is fout. Melden.
	    }
	} else {
	    PORTB |= _BV(PB4);			// PB4 hoog maken
	    _delay_ms(2);				// Effe wachten
	    sbi(ADCSRA, ADSC);			// Start ADC
	    while (bit_is_set(ADCSRA, ADSC)) {	// Wachten tot
	    }					// de ADC-conversie voltooid is
	    if (ADC < 800) {			// Pin "laag"?
		PORTB |= _BV(PB0);		// Dat is fout. Melden.
	    }
	}
	_delay_ms(2);
    }
}

Het programma wisselt om de haverklap het spanningsniveau op PB4. De spanning op de reset-pin varieert hierbij tussen 3V en 5V. Via een ADC-meting gaat het programma na, of dat klopt, en laat een LED oplichten bij een fout. Die LED wordt daarna niet meer gedoofd, zodat ook 1 fout op duizenden metingen niet aan de aandacht ontsnapt.

Zowel de ATtiny13 als de ATtiny24 deden het prima tot hiertoe: geen enkele foutmelding en geen enkele spontane reset. R1 vervangen door een exemplaar van 22k levert onmiddelijk een foutmelding. En bij een 5k6-weerstand grijpt het reset-mechanisme in.

Uiteraard kunnen er ook analoge spanningen gemeten worden, zolang die maar hoger zijn dan 3V.

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

Haha! Gave truuk! Thanks! Typisch iets voor een Appnote.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
If you want to succeed, double your failure rate.