Forum: Mikrocontroller und Digitale Elektronik Atmega16 Taster an Port C einlesen und Display-Ausgabe.


von Matze (Gast)


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

von H.Joachim S. (crazyhorse)


Lesenswert?

JTAG-fuse.

von Frickelfritze (Gast)


Lesenswert?

Matze schrieb:
> Vielen Dank für eure Kommenrate...

Prozessor-Angabe und Schaltplan fehlt.

von Frickelfritze (Gast)


Lesenswert?

Matze schrieb:
> DDRC = 0xC2;  //Port B Ausgang für RS+E, eingang für SW0..3 und
> LB-Detektiert, Ausgang für USER-LED

- Bit Belegung unklar
- Widerspruch:  Port B  vs  DDRC

Matze schrieb:
> DDRD = 0xF2;  // Relais, Schütz, Sig, Lüfter, Kontakt, Notaus, TXD, RXD

- Bit Belegung unklar

von Frickelfritze (Gast)


Lesenswert?

Frickelfritze schrieb:
> Prozessor-Angabe und Schaltplan fehlt.

Ok, Prozessor hab ich gefunden.

von Matze (Gast)


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?

von Karl M. (Gast)


Lesenswert?

Wurde schon beantwortet von
H.Joachim S. schrieb:
> JTAG-fuse.

Die müssen passend gesetzt sein.

von spess53 (Gast)


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

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.