Forum: Mikrocontroller und Digitale Elektronik Mega8 Port.Pin Zustand abfragen wenn gegen GND vs.VCC


von Kostas V. (kostas)


Lesenswert?

Hallo Zusammen,

ich habe noch nicht viel Erfahrung mit µC, deshalb möglicherweise
die seltsame Frage:

Wie erkennt der µC den Zustand eines Tasters high oder low:
a)wenn der PortPin im offenen Zustand in der Luft hängt und im
  geschlossen Zustand gegen GND geschaltet ist?
b)wenn der PortPin im offenen Zustand gegen 100R hängt und im
  geschlossen Zustand gegen GND geschaltet ist?
c)wenn der PortPin im offenen Zustand gegen 10K hängt und im
  geschlossen Zustand gegen VCC geschaltet ist?

Ich habe Schaltungen gesehen mit allen drei Varianten und sogar gemischt 
auf ein Board.

Hat des was mit der Initialisierung der Ports zu tun?
Wenn ja, was sind bitte jeweils die unterschiede für Port Maske
und DDR Maske.

Gruß Kostas

von Karl H. (kbuchegg)


Lesenswert?

Kostas Victor schrieb:
> Hallo Zusammen,
>
> ich habe noch nicht viel Erfahrung mit µC, deshalb möglicherweise
> die seltsame Frage:

AVR-GCC-Tutorial
AVR-Tutorial: IO-Grundlagen

> Wie erkennt der µC den Zustand eines Tasters high oder low:
> a)wenn der PortPin im offenen Zustand in der Luft hängt und im
>   geschlossen Zustand gegen GND geschaltet ist?

im offenen Zustand: alles ist möglich. Je nachdem welche 
elektromagnetischen Felder so in der gegend rumhängen
geschlossen: 0

> b)wenn der PortPin im offenen Zustand gegen 100R hängt und im
>   geschlossen Zustand gegen GND geschaltet ist?

gegen 100R?
Was soll das sein? Wo führen die 100R hin?

wenn nirgendwohin, dann:
offen: alles ist möglich
geschlossen: 0


> c)wenn der PortPin im offenen Zustand gegen 10K hängt und im
>   geschlossen Zustand gegen VCC geschaltet ist?

wieder: wo führen die 10k hin?
wenn nirgendwohin:
offen: alles ist möglich
geschlossen: 1

> Ich habe Schaltungen gesehen mit allen drei Varianten und sogar gemischt
> auf ein Board.

Ja, durchaus möglich.

> Hat des was mit der Initialisierung der Ports zu tun?

Nö. Hat damit zu tun, was man als Default möchte, wenn der Taster nicht 
geschlossen ist.
Da aber ein Mega8 Pullup-Widerstände eingebaut hat, aktiviert man die 
ganz einfach und lässt den Schalter nach GND schliessen. Dann hat man

nicht geschlossen: 1
geschlossen: 0

> Wenn ja, was sind bitte jeweils die unterschiede für Port Maske
> und DDR Maske.


DDR: Auswahl ob ein Pin Eingang oder Ausgang sein soll.

Wenn Ausgang: Port-Register schaltet den Ausgang auf 0 oder 1

Wenn Eingang:
    Port Register schaltet den Pullup zu oder weg
    Pegel am Eingangspin kann dann über PINx abgefragt werden.


Siehe die Tutorien
AVR-GCC-Tutorial
AVR-Tutorial: IO-Grundlagen

von Kostas V. (kostas)


Lesenswert?

Vielen Dank Karl Heinz für deine sehr ausführliche Info.

Das reicht mir schon für die Fehlersuche.

Nur der Vollständigkeitshalber, sorry für die nicht vollständige Infos.
-die 100R sind zwischen PortPin und dem Taster. Der Taster schaltet 
gegen
 GND.
-die 10K die am PortPin hängen sind externe Pullup-Widerstände gegen 
VCC.
 Der Taster ist am PortPin und schaltet gegen GND.


Gruß Kostas

von Karl H. (kbuchegg)


Lesenswert?

Kostas Victor schrieb:
> Vielen Dank Karl Heinz für deine sehr ausführliche Info.
>
> Das reicht mir schon für die Fehlersuche.
>
> Nur der Vollständigkeitshalber, sorry für die nicht vollständige Infos.
> -die 100R sind zwischen PortPin und dem Taster. Der Taster schaltet
> gegen
>  GND.

dann kannst du sie dir auch sparen. Die 100R beeinflussen nichts am 
Pegel. Er macht einen gewissen Schutz am Pin gegen Programmfehler, indem 
er den Strom begrenzt, wenn der Pin irrtümlich auf Ausgang geschaltet 
wird und der Taster gedrückt wird. Das wars dann aber auch schon.

> -die 10K die am PortPin hängen sind externe Pullup-Widerstände gegen
> VCC.
>  Der Taster ist am PortPin und schaltet gegen GND.

Da siehts anders aus. Dieser Pullup sorgst dafür, dass der Eingang bei 
nicht gedrücktem Taster eine 1 sieht, weil es ja eine (wenn auch über 
die 10k) Verbindung zu Vcc gibt.
Aber: Dasselbe erreichst du auch mit dem internen Pullup.

von Kostas V. (kostas)


Lesenswert?

!!! Das war jetzt ein sehr interessanter Hinweis mit dem Schutz des 
PortPins!!!

Ich habe aktuell das Problem dass ich den Zustand der Ausgang-Pins 
abfragen
kann, jedoch die Eingänge nicht. Ich bekomme immer 0 zurück, egal wie
der Eingang ist. Möglicherweise sind die Pins am Mega8 defekt.

Das muss ich mit einem anderen Mega8 mal testen.

Herzlichen Dank und eine schöne Zeit.

Gruß Kostas

von Peter R. (pnu)


Lesenswert?

Kostas Victor schrieb:
> Möglicherweise sind die Pins am Mega8 defekt.

glaub ich kaum:

Nach meiner Erfahrung ist ein einzelner Pin des atmega8 gegen 0V oder 
+5V kurzschlussfest, nur wenn viele pins gleichzeitig Kurzschluss haben, 
kanns zur Zerstörung des Kontrollers kommen, aber dann geht auch der 
ganze Kontroller nicht mehr.

Beim Basteln geh ich mit den mega8 recht rabiat um. So gelegentlich hab 
ich schon einen ganzen atmega8 gekillt (meist falschrum an 5V-Quelle)- 
aber teilweise, dh.einzelne Pins zu vernichten, hab ich noch nicht 
geschafft.

Dann mach dich mal schlau über den Unterschied zwischen lesen von pin 
und lesen von port (Tutorial, Datenblatt usw.) In falsch gegebenen 
Befehlen dürfte der Fehler liegen, z.B. zwar in ein Register hineinlesen 
aber dann den gelesenen Wert nicht mehr an eine Anzeige ausgeben. Oder 
Reihenfolge: ausgeben-lesen anstatt lesen-ausgeben.

Das mit den Nullen passiert auch, wenn man nach reset ddrn oder portn 
liest, (die werden bei reset auf Null gestellt).

von Karl H. (kbuchegg)


Lesenswert?

Beliebter Fehler ist zb, dass man in der Abfrage des Pins das PORTx 
Register benutzt und nicht das PINx Register.

von Kostas V. (kostas)


Lesenswert?

Danke sehr für die Hilfestellung.
Ich verwende den AVRCo Compiler von E-Lab, es ist ein Pascal Compiler.
Daran liegt es sicherlich nicht. Es liegt definitiv an mir. Es liegt 
auch nicht am Board. Das Bord wurde bis jetzt betrieben mit dem Mega8 
dessen
Software in Bascom geschrieben war. Die Ports auslesen hat mit Bascom
einwandfrei funktioniert. Unter AVRCo schaffe ich es nur Ausgänge zu 
lesen.
Die Eingänge werden nicht eingelesen. Egal wie sie stehen, bekomme ich 
immer eine 0.
Es gibt kein spezielles Kommando zum Lesen von Eingängen. Deshalb 
wundert mich das so sehr. Vermutlich ist es nur eine Kleinigkeit die ich 
falsch mache. Ich werde schon noch draufkommen.

Dankeschön nochmals.

Gruß Kostas

von Spess53 (Gast)


Lesenswert?

Hi

>Die Eingänge werden nicht eingelesen. Egal wie sie stehen, bekomme ich
>immer eine 0.

Wie hast du es denn gemacht? Aus dem Bauch heraus:

x: Byte;
...

x := PinX;

MfG spess

von Kostas V. (kostas)


Lesenswert?

Hi Spess,

So sind die Pins angelegt.

  //Definition der Port Aliase
  Relais1[@PortD,5] : Bit;
  Relais2[@PortD,6] : Bit;
  Relais3[@PortD,7] : Bit;
  Relais4[@PortB,0] : Bit;

  //ACHTUNG RelaisStatus muß negiert werden
  RelaisStatus1[@PortB,4] : Bit;
  RelaisStatus2[@PortB,3] : Bit;
  RelaisStatus3[@PortB,2] : Bit;
  RelaisStatus4[@PortB,1] : Bit;


So werden die Port.Pins initialisiert.
  PortB:= %00111110; 
//Pullupwiderstände aktivieren/deaktivieren
  DDRB:=  %00000001; 
//Ein-/Ausgänge definieren

  PortC:= %01000000; 
//Pullupwiderstände aktivieren/deaktivieren
  DDRC:=  %00000000; 
//Ein-/Ausgänge definieren

  PortD:= %00001100; 
//Pullupwiderstände aktivieren/deaktivieren
  DDRD:=  %11110010; 
//Ein-/Ausgänge definieren


Die Abfrage ist da so:
IntToStr(Ord(Relais1));
Die Antwort ist dann 0 oder 255
Relais1 bis Relais4 sind die Pins um Relais zu schalten.
Dessen Zustand kann auch ohne Probleme richtig gelesen werden.

Versuche ich jedoch ein Relaisstatus abzufragen, kommt immer als 
Ergebnis 0.
IntToStr(Ord(RelaisStatus1));

Die Relais habe zwei getrennte Schaltkreise.
Der erste Schaltkreis ist der Nutzkreis für die Schaltung
und über den zweiten wird der Zustand des Relais abgefragt.
Port PortB.1 wird als gegen GND geschaltet oder hängt an 100R
im nicht geschalteten Zustand.

Ich kann wenn notwendig auch den kompletten Plan veröffentlichen
und das Programm.

Mit AVRCo wird hier vermutlich sich niemand auskennen.

Gruß Kostas

von Spess53 (Gast)


Lesenswert?

Hi

>Ich kann wenn notwendig auch den kompletten Plan veröffentlichen
>und das Programm.

Wäre sinnvoll.

>Mit AVRCo wird hier vermutlich sich niemand auskennen.

AVRCo nicht. Aber etwas Erfahrung mit Turbo Pascal und Delphi.

MfG Spess

von Kostas V. (kostas)


Angehängte Dateien:

Lesenswert?

Anbei der Plan und das Programm.

Es geht hauptsächlich um die Procedure GetPumpStatus;
1
program Test1;
2
3
{ $BOOTRST $00C00}         {Reset Jump to $00C00}
4
{ $NOSHADOW}
5
{ $WG}                      {global Warnings on}
6
7
Device = mega8, VCC = 5;
8
9
Define_Fuses
10
  Override_Fuses;
11
  NoteBook   = A;
12
  Supply     = 4.7, 100;
13
  LockBits0 = [];  //Nie setzen!
14
  FuseBits0  = [];
15
  FuseBits1  = [CKOPT,BOOTSZ0,BOOTSZ1];
16
  ProgMode   = SPI;
17
18
Import SysTick, SerPort, ADCPort, SwitchPort1, SysLEDblink, TickTimer;
19
20
From System Import LongWord;
21
22
23
Define
24
  ProcClock      = 14745600;       {Hertz}
25
  SysTick        = 10;             {msec}
26
  StackSize      = $0064, iData;
27
  FrameSize      = $0064, iData;
28
  SerPort        = 57600, Stop1;    {Baud, StopBits|Parity}
29
  RxBuffer       = 20, iData;   //Es werden maximal 8 Zeichen erwartet.
30
  TxBuffer       = 20, iData;
31
  ADCchans       = 6, iData, Int2;
32
  ADCpresc       = 128;
33
  SysLedBlink    = 30;              {SysTicks}
34
  SysLedBlink0   = PortD, 4, high;
35
  SwitchPort1    = PinD, $0C;  //D2+D3
36
  PolarityP1     = $00;            // polarity
37
  TickTimer      = Timer1, pinout;  // use Timer.COMPA and its PortPin
38
39
40
Implementation
41
42
{$IDATA}
43
{--------------------------------------------------------------}
44
{ Const Declarations }
45
46
const
47
  MaxRXCount     : byte      = 7;
48
  Enable         : Boolean   = true;
49
  Dissable       : Boolean   = false;
50
  
51
  {Commandos}
52
  cmdTemperature    :String  = '10';
53
  cmdPumpStatus     :String  = '11';
54
  cmdPumpOn         :String  = '12';
55
  cmdPumpOff        :String  = '13';
56
  cmdGetADC         :String  = '14';
57
  cmdTemperatureRef :String  = '15';
58
  
59
  Key_Switch        : byte   = $02;         // switchport1    ~ Key_Switch
60
  Key_Button        : byte   = $03;         // switchport1    ~ Key_Button
61
  
62
63
{ Var Declarations }
64
var
65
  RXTelegramArrayLength      : byte;
66
67
  //Definition der Port Aliase
68
  Relais1[@PortD,5] : Bit;
69
  Relais2[@PortD,6] : Bit;
70
  Relais3[@PortD,7] : Bit;
71
  Relais4[@PortB,0] : Bit;
72
73
  //ACHTUNG RelaisStatus muß negiert werden
74
  RelaisStatus1[@PortB,4] : Bit;
75
  RelaisStatus2[@PortB,3] : Bit;
76
  RelaisStatus3[@PortB,2] : Bit;
77
  RelaisStatus4[@PortB,1] : Bit;
78
79
  Taster[@PortD,3] : Bit;
80
  Schalter[@PortD,2] : Bit;
81
  
82
83
84
{--------------------------------------------------------------}
85
{ Type Declarations }
86
87
type
88
89
  TRXTelegramArray = array[0..MaxRXCount-1] of char;
90
91
{$IDATA}
92
{ Var Declarations }
93
var
94
 RXTelegramArray : TRXTelegramArray;
95
 
96
 //Temporäre Variablen für die abgerufenen ADC Werte der PT100
97
 ADC1 : integer;
98
 ADC2 : integer;
99
 ADC3 : integer;
100
 ADC4 : integer;
101
 ADC5 : integer;
102
 ADC6 : integer;
103
104
105
{ EEPROM Declarations }
106
{$EEPROM}
107
108
109
{--------------------------------------------------------------}
110
{ functions }
111
112
113
{------------------------------------------------------------------------------}
114
procedure onTickTimer(SaveAllRegs);  // optional Callback
115
{------------------------------------------------------------------------------}
116
begin
117
end;
118
119
120
{------------------------------------------------------------------------------}
121
procedure InitPorts;
122
{------------------------------------------------------------------------------}
123
begin
124
  PortB:= %00111110;                                          //Pullupwiderstände aktivieren/deaktivieren
125
  DDRB:=  %00000001;                                           //Ein-/Ausgänge definieren
126
127
  PortC:= %01000000;                                          //Pullupwiderstände aktivieren/deaktivieren
128
  DDRC:=  %00000000;                                           //Ein-/Ausgänge definieren
129
130
  PortD:= %00001100;                                          //Pullupwiderstände aktivieren/deaktivieren
131
  DDRD:=  %11110010;                                           //Ein-/Ausgänge definieren
132
133
  
134
end InitPorts;
135
136
{------------------------------------------------------------------------------}
137
procedure InitPins;
138
{------------------------------------------------------------------------------}
139
begin
140
141
  SetBit(Relais1,false);
142
  SetBit(Relais2,false);
143
  SetBit(Relais3,false);
144
  SetBit(Relais4,false);
145
  
146
//  SetBit(RelaisStatus1,false);
147
//  SetBit(RelaisStatus2,false);
148
//  SetBit(RelaisStatus3,false);
149
//  SetBit(RelaisStatus4,false);
150
151
  SetBit(Taster,false);
152
  SetBit(Schalter,false);
153
154
end InitPins;
155
156
157
{------------------------------------------------------------------------------}
158
procedure InitRXTelegramArray;
159
{------------------------------------------------------------------------------}
160
var i:byte;
161
begin
162
  for i := 0 to MaxRXCount-1 do
163
    RXTelegramArray[i] := #0;
164
  endfor;
165
  RXTelegramArrayLength := 0;
166
end InitRXTelegramArray;
167
168
169
{------------------------------------------------------------------------------}
170
function BitToChar(b:boolean):char;
171
{------------------------------------------------------------------------------}
172
begin
173
 return(char((Byte(b) and 1)+$30));
174
end BitToChar;
175
176
{------------------------------------------------------------------------------}
177
function CharToByte(c:char):byte;
178
{------------------------------------------------------------------------------}
179
begin
180
 return(Ord(c)-$30);
181
end CharToByte;
182
183
{------------------------------------------------------------------------------}
184
procedure GetPumpStatus;
185
{------------------------------------------------------------------------------}
186
begin
187
  case RXTelegramArray[2] of
188
    '1':Write(SerOut, cmdPumpStatus + RXTelegramArray[2] + '-' + IntToStr(Ord(Relais1) ));|   //<<<<<< funktioniert off=0 on=255
189
    '2':Write(SerOut, cmdPumpStatus + RXTelegramArray[2] + '-' + IntToStr(Ord(RelaisStatus2)) );|  //<<<<<< das funktioniert nicht off=0 on=0
190
    '3':Write(SerOut, cmdPumpStatus + RXTelegramArray[2] + '-' + BitToChar(RelaisStatus3) );| //<<<<<< funktioniert nicht off=0 on=0
191
    '4':Write(SerOut, cmdPumpStatus + RXTelegramArray[2] + '-' + BitToChar(RelaisStatus4) );| //<<<<<< funktioniert nicht off=0 on=0
192
  endcase;
193
194
end GetPumpStatus;
195
196
{------------------------------------------------------------------------------}
197
procedure GetTemperature;
198
{------------------------------------------------------------------------------}
199
var AdcID:byte;
200
    AdcValue, temp:word;
201
    sTemp:String[5];
202
begin
203
  AdcID := CharToByte(RXTelegramArray[2]);
204
  AdcValue := GetAdc(AdcID);
205
  if (AdcValue > 0)then
206
    temp := (1000 - AdcValue);
207
    sTemp := IntToStr(temp DIV 10)+','+IntToStr(temp MOD 10)+'°C';
208
    Write(SerOut, cmdTemperature + RXTelegramArray[2] + '-' + sTemp);
209
210
  else
211
    Write(SerOut, cmdTemperature + RXTelegramArray[2] + '-' + IntToStr(0));
212
  endif;
213
  //....
214
end GetTemperature;
215
216
{------------------------------------------------------------------------------}
217
procedure SetPump(state:Boolean);
218
{------------------------------------------------------------------------------}
219
begin
220
  case RXTelegramArray[2] of
221
    '1':SetBit(Relais1,state);|
222
    '2':SetBit(Relais2,state);|
223
    '3':SetBit(Relais3,state);|
224
    '4':SetBit(Relais4,state);|
225
  endcase;
226
end SetPump;
227
228
229
{------------------------------------------------------------------------------}
230
procedure GetADCValue;
231
{------------------------------------------------------------------------------}
232
var AdcID:byte;
233
    s:String[2];
234
begin
235
  AdcID := CharToByte(RXTelegramArray[2]);
236
  Write(SerOut, cmdGetADC + RXTelegramArray[2] + '-' + IntToStr(GetAdc(AdcID)));
237
end GetADCValue;
238
239
procedure SetTemperatureReference;
240
begin
241
  //...
242
end SetTemperatureReference;
243
244
{------------------------------------------------------------------------------}
245
function DoWorkComand:boolean;
246
{------------------------------------------------------------------------------}
247
var cmd:string[2];
248
    bcmd:byte;
249
begin
250
  cmd := RXTelegramArray[0] + RXTelegramArray[1];
251
252
  bcmd := StrToInt(cmd);
253
    case bcmd of
254
      10: GetTemperature;|
255
      11: GetPumpStatus;|
256
      12: SetPump(Enable);|
257
      13: SetPump(Dissable);|
258
      14: GetADCValue;|
259
      15: SetTemperatureReference;|
260
    else
261
      InitRXTelegramArray;
262
      Write(SerOut, 'InitRX');
263
      return(false);
264
    endcase;
265
    return(true);
266
end DoWorkComand;
267
268
269
{------------------------------------------------------------------------------}
270
procedure ReadComPort;
271
{------------------------------------------------------------------------------}
272
{"1510235<13>" längster RX String = 7+<#13> Zeichen}
273
var RXChar : char;
274
275
begin
276
  if SerStat then
277
    RXChar := SerInp;
278
    //Write(SerOut, IntToStr(Ord(RXChar)));
279
    if (RXChar = #10)then
280
    elsif (RXChar = #13)then
281
      {Command komplett jetzt verarbeiten}
282
      DoWorkComand;
283
      InitRXTelegramArray;
284
      return;
285
    elsif (RXTelegramArrayLength <= MaxRXCount)then
286
      inc(RXTelegramArrayLength);
287
      RXTelegramArray[RXTelegramArrayLength - 1] := RXChar;
288
      return;
289
    endif;
290
  endif;
291
end ReadComPort;
292
293
294
295
{--------------------------------------------------------------}
296
{ Main Program }
297
{$IDATA}
298
299
      begin
300
        InitPorts;
301
302
303
        EnableInts;
304
        InitPins;
305
        InitRXTelegramArray;
306
        SWITCHPORT1_CLEAR;
307
        Write(SerOut, 'Start V3');
308
309
        loop
310
311
312
          ReadComPort;
313
314
(*          if Inp_Raise1(Key_Button)    Funtioniert auch nicht
315
          then
316
            SysLedFlashOn(0);
317
            Write(SerOut, '-KB');
318
319
          endif;
320
321
          if INP_RAISE1(Key_Switch)
322
          then
323
            Write(SerOut, '-KS');
324
          endif;
325
  *)
326
327
        endloop;
328
      end Test1.

von Spess53 (Gast)


Lesenswert?

HI

>  RelaisStatus1[@PortB,4] : Bit;

Das Eingangsregister eines Ports heißt PinX und nicht PortX.

MfG Spess

von Kostas V. (kostas)


Lesenswert?

Spess, du hast dir einen Orden verdient.
Genau das war der Fehler. Ich wusste es einfach nicht und somit ist mir 
das
auch nicht aufgefallen. In dem Thread wurde das schon mehrfach erwähnt.
Jetzt funktionieren plötzlich auch die Tasten, so was aber auch.

Tausend Dank für die großartige Hilfe.
Gruß Kostas

von Spess53 (Gast)


Lesenswert?

Hi

>Ich wusste es einfach nicht und somit ist mir das auch nicht aufgefallen.

Auch Hochsprachen entbinden dich nicht vom Lesen des Datenblatts.

MfG Spess

von Kostas V. (kostas)


Lesenswert?

Du hast vollkommen Recht.
Wahrscheinlich hätte ich das nicht herausgelesen da ich nicht damit 
gerechnet habe dass die Zugriffsmethode von einem Port.Pin sich 
unterscheidet in Abhängigkeit ob es als Eingang oder Ausgang 
initialisiert wurde. Sachlich sehe ich immer noch den gleichen Pin. 
Eigentlich wäre das
die Aufgabe der Hochsprache das zu portieren.
Sicherlich hat das irgendwelche Hintergründe warum das nicht gemacht 
wurde.
Es ist schon völlig in Ordnung so wie es ist. Ich verbuche das sehr 
gerne auf "Nach drei Tagen grübeln, doch noch etwas dazugelernt ;-)"

Dir noch eine schöne Zeit.

Gruß Kostas

von Spess53 (Gast)


Lesenswert?

Hi

>Eigentlich wäre das die Aufgabe der Hochsprache das zu portieren.

Wie sollte das machbar sein? Wenn du das Port-Register liest kann für 
einen Pin eine 1 bedeuten das das Pin H ist wenn der Pin Ausgang ist, 
oder das der interne Pull-Up-Widerstand eingeschaltet ist, wenn der Pin 
Ausgang ist.

Ich kenne keine Hochsprache, in der eine Glaskugel integriert ist.

MfG Spess

von Kostas V. (kostas)


Lesenswert?

Wir haben uns Missverstanden.
Ich meinte das lesen und schreibe sollte über die gleiche Methode gehen
z.B.: A.1 soll ein Zeiger auf den Pin selbst sein. Je nach dem wie der
Port.Pin initialisiert ist sollte die Hochsprache das trennen:

Ich schreibe also:
LED[@A,1] : Bit;
Taster[@A,2] : Bit;

Die Hochsprache macht intern:
LED[@PortA,1] : Bit;
Taster[@PinA,2] : Bit;

Dafür muss er nur vorher überprüfen ob der Port.Pin als Eingang oder 
Ausgang definiert wurde.

Gruß Kostas

von Spess53 (Gast)


Lesenswert?

Hi

>Dafür muss er nur vorher überprüfen ob der Port.Pin als Eingang oder
>Ausgang definiert wurde.

So etwas kostet aber Code und Zeit. Und beides kann auf µCs knapp sein. 
Das sind keine PCs.

MfG Spess

von ich (Gast)


Lesenswert?

Vielleicht liegt hier ein kleines Mißverständnis vor.
PORT und PIN sind im Prozessor selbst zwei verschiedene Register, die 
auch zwei verschiedene Aufgaben haben. Es ist zwar das gleiche Beinchen, 
was aus dem Prozessor rauskommt, aber intern ist für die Ausgabe das 
PORT-Register verdrahtet und für das Einlesen das PIN-Register.
Du kannst das PORT-Register auch auslesen, aber da erfährst du nur, ob 
die letzte Schreib-Operation auf das PORT-Register eine 1 oder 0 war. Du 
erfährst nicht, wenn das ein Eingang ist, ob dort von außen 1 oder 0 
anliegt.

von Kostas V. (kostas)


Lesenswert?

Nein der Compiler sollte das machen und den passenden Assembler code
erstellen. Auf µC Ebene darf das natürlich nicht passieren.

Aber wie gesagt, ich bin völlig einverstanden damit so wie es ist.
Ich kann damit Super umgehen. Das werde ich sicherlich nie wieder 
vergessen. :-)

von Kostas V. (kostas)


Lesenswert?

Hallo Gast,

wie gesagt, es gibt sicherlich Gründe warum das so ist. So wie du es
beschreibst ist das sicherlich ein triftiger Grund und somit ist
das völlig in Ordnung. Ich kritisiere das auch in keinster Weise.
Es war für mich massiv Lehrreich die Unterhaltung. Und mein Projekt
funktioniert in diesem Bereich jetzt einwandfrei. Nun kann ich mich
an den Rest ran machen. Bis ich wieder auf das nächste Problem stoße.
Aber in diesem Bereich ist ja ein Ende faktisch nie erreicht. Das macht
es ja so unglaublich interessant.

Gruß Kostas

von Amateur (Gast)


Lesenswert?

>Nein der Compiler sollte das machen und den passenden Assembler code

Das dürfte wohl nicht möglich sein. Während des Codens und Hackens 
gibt’s den Prozessor bzw. Port gar nicht. Und während der Laufzeit - ich 
wäre echt sauer, wenn der Compiler von sich aus Testcode einfügen würde 
um festzustellen, ob dass, was ich mache auch OK ist.
Sollte - warum und wann auch immer - der Anschluss seine Richtung ändern 
stürzt der Rechner ab ;-)

Da machen sich die Jungens von Atmel 'nen Haufen Arbeit mit Ihren 
Manuals, incl. der Beispiele, und keiner liest sie.

von Kostas V. (kostas)


Lesenswert?

Sorry, so ist es nun wirklich nicht, dass niemand die Manuals liest.
Wenn ich dir eine Doku gebe von irgendein Bauteil mit mehreren Duzend
Seiten, wirst du sicherlich auch nicht alles verstehen, selbst wenn du 
das
Manual zehn Mal durchliest, und schon gar nicht wenn du instinktiv eine
andere Erwartungshaltung hast. Das ist doch völlig normal. Für jemand
der das permanent macht ist das sicherlich selbstverständlich. Wenn dass
alles auch für mich so selbstverständlich wäre wie für Euch, dann 
müsstet
ihr lauter Deppen sein. Ich beschäftige mich beruflich mit Entwicklung
von Bausoftware. In diesem Bereich bin ich wahrscheinlich der Experte. 
Da gibt es Begriffe die du auch sicherlich nie gehört hast.

Sorry nochmals für meine Unwissenheit. Der einzige Trost für mich ist
mein Sprichwort: "Völlig Egal wie viel jemand an Wissen sich angeeignet 
hat, es gibt immer jemand der mehr Wissen hat, ebenso jemand mit weniger 
Wissen."

Dir noch eine schöne Zeit.
Gruß Kostas

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.