Forum: Compiler & IDEs Erstes C Programm


von Pierre G. (bqube)


Lesenswert?

Guten nabend,

ich versuche nur zum üben in einer zweiten Funktion eine Pin Abfrage zu 
realisieren aber warum auch immer im Simulator hat das ganze nicht 
hinn.... könntet ihr hier mal drüber schauen .... danke schonmal

Mfg Bqube
1
#include <avr/io.h>
2
3
uint8_t test(uint8_t var)
4
{
5
  if (var==0b10000000)
6
  {
7
    PORTB=0x00;
8
  }
9
  
10
  if (var==0b01000000)
11
  {
12
    PORTB=0xFF;
13
  }
14
  return 0;
15
}
16
17
uint8_t foo;
18
19
int main(void)
20
{
21
  DDRB = 0xFF;
22
  DDRD = 0x00;
23
  
24
  
25
  while (1)
26
  {
27
    foo = PIND;
28
    test(foo);
29
  }
30
  return 0;
31
}

von Karl H. (kbuchegg)


Lesenswert?

Pierre Gnauck schrieb:

>   if (var==0b10000000)

Gewöhn dir das ab.
WEnn du wissen willst, ob das Bit 7 gesetzt ist, dann schreibst du das 
so

    if( var & ( 1 << 7 ) )
oder
    if( var & 0x80 )
oder
    if( var & 0b1000000 )

aber auf keinen Fall vergleichst du mit dem Bitmuster. Denn wenn du das 
tust, dann MÜSSEN die restlichen Bits, an denen du unter Umständen noch 
nicht mal irgendwas angeschlossen hast, oder die vielleicht sogar auf 
Ausgang geschaltet sind, alle 0 sein.

Und darum willst du dich nicht kümmern müssen. Dich interessiert nur das 
Bit 7 und sonst nichts. An diesem Bit hängt dein Taster und nur den 
wertest du aus, indem du dir dieses Bit freimaskierst.


     if( var & ( 1<<7 ) )

ist die bevorzugte Schreibweise, weil in dieser Schreibweise unmittelbar 
ersichtlich ist, das dich das Bit 7 interessiert. Das verhindert dann 
auch ganz zwanglos, dass du dich bei der Binärkonstanten 0b1000000 in 
der Anzahl der 0-ern verzählst. Oder hast du beim Lesen gemerkt, dass 
ich in dieser Binärkonstanten das 1-Bit nicht an der Position 7 sondern 
an der Position 6 hatte? Den Unterschied zwischen 0b1000000 und 
0b10000000 bemerkt man nur dann, wenn man sehr sehr sehr genau schaut. 
Den Unterschied zwischen 1<<7 und 1<<6 kann ein Blindenhund auf 20 Meter 
Entfernung sehen. Und doch sind beides einfach nur 2 verschiedene 
Schreibweisen für dasselbe Bitmuster.




> int main(void)
> {
>   DDRB = 0xFF;
>   DDRD = 0x00;
>
>
>   while (1)
>   {
>     foo = PIND;

Wie sind deine Eingangspins verschaltet?
Üblich ist, dass man einen Taster so verschaltet, dass er den Pin mit 0 
verbindet, wenn man auf den Taster drückt. Denn dann kann man den 
internen Pullup Widerstand benutzen und braucht keinen externen 
Pulldown.

von Walter S. (avatar)


Lesenswert?

Pierre Gnauck schrieb:
> im Simulator hat das ganze nicht
> hinn

es wäre nett wenn Du schreiben könntest was nicht hinhaut,
dann wäre eine Antwort leichter

von amateur (Gast)


Lesenswert?

Wenn Dein Simulator funktioniert, so dürfte sich im obigen Falle nichts 
tun.

foo=PIND;              // = 0b00000000

if (var==0b10000000)   // !=
if (var==0b01000000)   // !=

watt nu?

von Pierre G. (bqube)


Lesenswert?

Alles klar dann werde ich die PIN Abfrage gleich mal ändern ...... für 
die Simulation verwende ich "AVR Simulator IDE" von OshonSoft.

Mit dem Simulator hat bis jetzt immer alles so funktioniert wie es sein 
sollte.

Die Simulation funktioniert weites gehend nur bei der Taster abfrage 
kommt es zu keiner Reaktion.

Wenn PIND.6 High dann PORTB 0-7 High
Wenn PIND.7 High dann PORTB 0-7 LOW
1
foo = PIND

So lese ich doch die Eingangspins ein oder nicht ?

So sollte die Funktion am ende aussehen.

Mfg Bqube

von amateur (Gast)


Lesenswert?

Gegen:

foo = PIND;

gibt's nichts zu sagen.

Das Problem ist, wie auch Karl Heinz schon gesagt hat, dass was Du damit 
machst.

von Pierre G. (bqube)


Lesenswert?

1
test(foo);

Damit übergebe ich doch den wert von foo an meine Funktion wo dann .....
1
uint8_t test(uint8_t var)
2
{
3
  if (var & (1<<7))
4
  {
5
    PORTB=0x00;
6
  }
7
  
8
  if (var & (1<<6))
9
  {
10
    PORTB=0xFF;
11
  }
12
  return 0;
13
}

Der zustand von den beiden Eingängen PIND.7 und PIND.6 abgefragt werden 
... nach der abfrage gleich eine Reaktion und durch die schleife 
wiederholt sich doch das ganze immer und immer wieder ? oder etwa nicht 
???

Mfg Bqube

von amateur (Gast)


Lesenswert?

Normalerweise sollte folgendes passieren:

Du aktivierst z.B. Pin 7
Daraufhin sollte ständig Port B gelöscht werden.
Bis Du die Aktivierung zurücknimmst.

Von außen: War irgendein Bit gesetzt, so wird es zurückgesetzt. Die 
weiteren Durchläufe gehen so schnell, das sich scheinbar und praktisch 
nichts tut.
Solange Du nichts weiter unternimmst, oder auch nochmal Pin 7 
aktivierst, passiert (sichtbar) nichts.

Die Rücknahme der Aktivierung selbst bewirkt keine Änderung.


Du aktivierst jetzt Pin 6
Daraufhin wird Port B ständig gesetzt.
Bis Du die Aktivierung zurücknimmst.

Von außen: Egal welchen Zustand Port B vorher hatte, es werden alle Bits 
gesetzt.
Auch hier gilt: Wenn Du nichts tust, tut sich auch nichts ändern.

Die Rücknahme der Aktivierung selbst bewirkt keine Änderung.


Sonderfall: Beide werden aktiviert.
Da die Abfrage von Pin 6 nach der Abfrage von Pin 7 erfolgt, wird am 
Ende immer Port B gesetzt. Ein Oszilloskop würde zwar einen Zucker 
zeigen aber Port B ist scheinbar dauernd an.

Bei der Rücknahme der Doppelaktivierung gewinnt der der zuletzt noch 
Kontakt hatte.

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.