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:
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.