[Atmega48..328] Ein Pin zu wenig, Taste einlesen?

OP #3831921
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.