Atmega16 Taster an Port C einlesen und Display-Ausgabe.

Gast #5239489
Lesenswert?

Hallo,

Ich möchte 4 Taster an Port 4[2..5] einlesen und per Display deren 
Zustände anzeigen... die Taster verwenden die internen Pull-Up's.

Jedoch gibt's 2 Probleme:
1. entgegen allen anderen Pins ist Port C4 nicht auf 1 sonder auf 0.

2. Es kommt immer 0x00 zurück... obwohl standardmäßig alle Pins (außer 
C4) auf 1 sind...

Könnt ihr es nachvollizehen?
1
#include <avr/io.h>
2
#define F_CPU 8000000UL
3
#include <util/delay.h>
4

5
uint8_t LeseTaster()
6
{
7
  uint8_t eing=PINC;
8
  eing = eing&0x3C;
9
  eing = eing<<2;
10
  return eing;
11
}
12

13
void ResetRS()
14
{
15
  PORTC &=0x7F;
16
}
17

18
void SetRS()
19
{
20
  PORTC |=0x80;
21
}
22

23
void SetE()
24
{
25
  PORTC |=0x40;
26
}
27

28
void ResetE()
29
{
30
  PORTC &=0xBF;
31
}
32

33
void SchreibeReg(uint8_t reg)
34
{
35
  ResetRS();
36
  _delay_ms(1);
37
  PORTA = reg;
38
  _delay_ms(1);
39
  SetE();
40
  _delay_ms(1);
41
  ResetE();
42
}
43

44
void SchreibeDat(uint8_t dat)
45
{
46
  SetRS();
47
  _delay_ms(1);
48
  PORTA = dat;
49
  _delay_ms(1);
50
  SetE();
51
  _delay_ms(1);
52
  ResetE();  
53
}
54

55
void InitDisplay()
56
{
57
  SchreibeReg(0x30);
58
  _delay_ms(15);
59
  SchreibeReg(0x30);
60
  _delay_ms(5);
61
  SchreibeReg(0x30);
62
  SchreibeReg(0x38);
63
  SchreibeReg(0x0F);
64
  SchreibeReg(0x01);
65
  SchreibeReg(0x07);
66
}
67

68
int main(void)
69
{
70
    /* Replace with your application code */
71
    int a=0;
72
  DDRA = 0xFF;  //Port A aus Ausgang für Displaydaten
73
  DDRB = DDRB|0x1C;  //Ausgang für Mot-En
74
  DDRB = DDRB&0xFC;  //Eingang für 
75
  DDRC = 0xC2;  //Port B Ausgang für RS+E, eingang für SW0..3 und LB-Detektiert, Ausgang für USER-LED
76
  DDRD = 0xF2;  // Relais, Schütz, Sig, Lüfter, Kontakt, Notaus, TXD, RXD
77
  
78
  InitDisplay();
79

80
  while (1) 
81
    {
82
    a += 1;
83
    _delay_ms(500);
84
    SchreibeDat(0x30+LeseTaster());
85
    _delay_ms(100);
86
    _delay_ms(100);
87
    SchreibeDat('H');
88
    }
89
}

Vielen Dank für eure Kommenrate...
Gast #5239750
Lesenswert?

Atmega 16, 4 Taster an den Portpins C2, C3,C4, C5.
Die Taster schalten 5V von internen Pull-Up's gegen GND.

Direkt an den Pins (DIL40) können die Pegelwechsel gemessen werden.

Frage ist nun warum PortC.4 scheinbar keinen Pull-Up hat.

Weiterhin sollten durch:
1
uint8_t LeseTaster()
2
{
3
  uint8_t eing=PINC;
4
  eing = eing&0x3C;
5
  eing = eing<<2;
6
  return eing;
7
}

Die Zustände eingelesen werden.
Also erst einlesen, dann maskieren, da die anderen Pin's ja nicht 
interessieren.
Danach um 2 Bit Links-Schieben damit PortC.2 = Bit 0 wird.
Abschließend zur Ausgabe 30 addieren damit 0 zur ASCII-0 wird.

Auf dem Display läuft ein String mit 0H0H0H0H... durch.
Jedoch bleibt der gelesene Zustand scheibar immer bei 0.

Ist es nun klarer?
Gast #5239760
Lesenswert?

Hi

>Atmega 16, 4 Taster an den Portpins C2, C3,C4, C5.

Das sind, wie  H.Joachim Seifert (crazyhorse) schon schrieb, die Pins 
vom JTAG-Interface. Das ist bei einen ATMega16 werksseitig 
eingeschaltet, also die PINs nicht als Portpins verwendbar. Dazu muss 
das JTAG-Interface per Fuse abgeschaltete werden.

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren