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
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
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
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.
!!! 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
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).
Beliebter Fehler ist zb, dass man in der Abfrage des Pins das PORTx Register benutzt und nicht das PINx Register.
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
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
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
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
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. |
HI
> RelaisStatus1[@PortB,4] : Bit;
Das Eingangsregister eines Ports heißt PinX und nicht PortX.
MfG Spess
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
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
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
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
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
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
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.
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. :-)
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
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.