Forum: Mikrocontroller und Digitale Elektronik [Atmega48..328] Ein Pin zu wenig, Taste einlesen?


von Thomas E. (thomase)


Lesenswert?

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.

: Bearbeitet durch User
von Krill (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Code-in-der-Luft-Zerreisser und sonstige Stinkstiefel: "Ihr mich auch!"

Warum ist das nicht im Forum "Projekte & Code" gepostet? Hast du noch 
'ne Frage? Abgesehen davon schöne Idee!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.