Man hat eine schöne Schaltung, alles ist fertig und läuft. Dann fällt
einem ein, dass man gerne noch eine Taste für Weiss-der-Teufel haben
möchte. Natürlich sind alle Pins belegt.
Grösserer Controller? Die Schaltung ist fertig, Mann!
Mit einer anderen Taste zuammenlegen und über Spannungsteiler mit ADC
einlesen? An PORTC ist leider das Display angeschlossen!
Einfache Lösung:
Reset wegfusen >> Taste an PC6 >> Programm läuft nicht wie gewünscht >>
kein HV-Programmer >> Arschkarte
Auch eine Lösung: Taste über Aref einlesen:
1 | //Thomas Eckmann Informationstechnik
|
2 |
|
3 | //G:\Softwareprojekte\AVR\areftaste\areftaste.c
|
4 |
|
5 | //Created: 07.10.2014, 16:55:20
|
6 |
|
7 |
|
8 |
|
9 | //Version 1.0.0
|
10 |
|
11 | //Build 5
|
12 |
|
13 | //Last Change: 07.10.2014, 17:27:49
|
14 |
|
15 | #define VERSIONSTRING "1.0.0.5"
|
16 | #define FILESTRING "G:\\Softwareprojekte\\AVR\\areftaste\\areftaste.c"
|
17 |
|
18 |
|
19 |
|
20 | #ifndef F_CPU
|
21 | #error F_CPU not defined.
|
22 | #endif
|
23 |
|
24 | #include <avr/io.h>
|
25 | #include <avr/interrupt.h>
|
26 |
|
27 | #define SYSTICK 100
|
28 |
|
29 | #define KEYREGA0
|
30 | #include "key3.h"
|
31 |
|
32 | volatile unsigned char bTimer0 = 0;
|
33 |
|
34 | int main(void)
|
35 | {
|
36 | TCCR0A = (1 << WGM01); //CTC
|
37 | TCCR0B = (1 << CS01) | (1 << CS00); //Prescaler 64
|
38 | OCR0A = 155; //10ms
|
39 | TIMSK0 = (1 << OCIE0A);
|
40 |
|
41 | ADMUX = (1 << MUX3) | (1 << MUX2) | (1 << MUX1); //Ref. = extern, Bandgap
|
42 | ADCSRA = (1 << ADEN) | (1 << ADATE) | (1 << ADPS1) | (1 << ADPS0); //Auto Trigger, Prescaler 8
|
43 | ADCSRB = (1 << ADTS1) | (1 << ADTS0); //Trigger Timer0 Compare Match
|
44 |
|
45 | DDRC |= (1 << 0);
|
46 |
|
47 | InitKeys();
|
48 |
|
49 | sei();
|
50 |
|
51 | while(1)
|
52 | {
|
53 | if(bTimer0)
|
54 | {
|
55 | bTimer0 = 0;
|
56 | ReadKeys();
|
57 |
|
58 | if(KeyPress(KEYREGA0)) PINC |= (1 << 0); //Toggle PC0
|
59 | }
|
60 | }
|
61 | }
|
62 |
|
63 | ISR(TIMER0_COMPA_vect)
|
64 | {
|
65 | if(ADC > 1000) KEYREGA &= ~(1 << 0); else KEYREGA |= (1 << 0);
|
66 | bTimer0 = 1;
|
67 | }
|
KEYREGA ist eine 8-Bit Variable, mit der das Ergebnis der Messung an die
Entprellung übergeben wird. Statt PORT einlesen, übergibt man die
Variable. Den Rest macht eine handelsübliche Entprellung dann wie
gehabt.
Man muss die Taste nicht mehr entprellen, der Vorteil ist aber, dass man
die gewohnten Funktionen wie GetKey() oder in diesem Falle KeyPress()
benutzen kann. Somit wird diese Taste wie jede andere behandelt.
Die Timer- und ADC-Einstellungen sind für Atmega48...328. Der ADC wird
mit Timer0 getriggert. Für einen Atmega8 wären ein paar Anpassungen
nötig, da der sowas natürlich nicht kann.
Pullup an Aref, Taster gegen GND. Einstellungen für 1MHz.
Wer es gebrauchen kann, dem wünsche ich viel Spass damit.
Code-in-der-Luft-Zerreisser und sonstige Stinkstiefel: "Ihr mich auch!"
mfg.