Forum: Mikrocontroller und Digitale Elektronik Problem mit io Auswertung pinb1


von herrmann (Gast)


Lesenswert?

Hallo

Ich habe ein komischen Phänomen am Pin B1 eines Atmega 8L


Definition PinB 1 als Eingang

#define port_B1()    DDRB&=~(1<<1);//CD


in der hauptschleife soll abgefragt werden ob der pin high or low ist.

if(PINB & (1<<PINB1))
{
led_low();
}
else
{
led_high();
}


laut oszi ist der pin auf low aber in der if anweisung ist er high und 
die led leuchtet.

wie jann das sein????

das selbe habe ich mal an Pin D7 gemacht an dem gehts. led geht nur wenn 
d7 high ansonsten aus.

Liegts es am OC1A??? Der wird aber nicht benutz.

Danke

von Johannes M. (johnny-m)


Lesenswert?

herrmann wrote:
> Definition PinB 1 als Eingang
>
> #define port_B1()    DDRB&=~(1<<1);//CD
Vielleicht solltest Du Dich mal informieren, was ein #define überhaupt 
macht! Jedenfalls "definierst" Du so keinen Pin als Eingang...

> laut oszi ist der pin auf low aber in der if anweisung ist er high und
> die led leuchtet.
>
> wie jann das sein????
Und wie herum ist die LED angeschlossen? Low-Side oder High-Side?

von herrmann (Gast)


Lesenswert?

Hallo

Also ich mache es immer über die defs.

im hauptprogramm rufe ich dann nur noch

Port_B1(); auf

die led geht an wenn pin auf low gezogen wird.

Danke

von Johannes M. (johnny-m)


Lesenswert?

herrmann wrote:
> Hallo
>
> Also ich mache es immer über die defs.
>
> im hauptprogramm rufe ich dann nur noch
>
> Port_B1(); auf
Ach, und warum schreibst Du das oben nicht? Und warum so kompliziert?

> die led geht an wenn pin auf low gezogen wird.
Aha.

Hast Du den Pull-Up am Eingang aktiviert?

von lkmiller (Gast)


Lesenswert?

Das ist leider wieder ein Fall von unglücklichen defines:
:
led_low();
:
led_high();
:
Eine Led ist nicht Low oder High, die ist an oder aus,
hell oder dunkel, grün oder rot...

Und wenn dann noch dazukommt:
> die led geht an wenn pin auf low gezogen wird.
blickt ohne Schltplan garantiert keiner mehr durch.

Und mit
1
#define port_B1()    DDRB&=~(1<<1);//CD
ist gar nix geholfen.
Wenn im Code irgendwo
1
port_B1();
steht, weiß trotzdem keiner was da passiert und muß im Kommentar zum 
define nachsehen.

So zu definieren
1
#define port_B1()    DDRB&=~(1<<1);//CD
(also mit Strichpunkt und Zeilen-Kommentar)
kann übrigens böse ins Auge gehen. Aus
1
port_B1();
mach der Compiler durch einfaches Ersetzen erst mal
1
DDRB&=~(1<<1);//CD;

Hier klappts gerade noch so, aber z.B. mit dem einfachen
1
#define DVF 345  //dreivierfuenf
und dem Aufruf
1
res = 5 + DVF;
gehts dann schief.
Wenn schon Kommentare in defines, dann mit
1
#define DVF 345  /*dreivierfuenf*/

von herrmann (Gast)


Lesenswert?

#define port_B1()    DDRB&=~(1<<1);//EINGANG PIN von RF Modul für daten 
liegen an
#define PORT_RXLED()  DDRD|=(1<<2); //LED für daten liegen an
#define rx_led_high()  PORTD|=(1<<2); //LED AUS
#define rx_led_low()  PORTD&=~(1<<2); //LED AN

in der hauptschleife soll abgefragt werden ob der pin high or low ist.


int main(void)
{
port_B1();
PORT_RXLED();
rx_led_high();
.....Code für empfänger init......
..
...
...
...

while(1)
{

if(PINB & (1<<PINB1))
{
rx_led_low();//LED AN WENN DATEN ANLEIGEN
}
else
{
rx_led_high();//LED AUS WENN KEINE DATEN ANLIEGEN
}


}

Wenn ich wie gesagt das ganze an den PIN D7 oder B0 anlege und diese im 
code ersetze dann geht nur die led an wenn daten anliegen wie es sein 
soll.

an Pin B1 sieht es so aus als ob sie blinkt habe mal ein waitms(1000) 
eingaut und alle 1 sec led an 1 sec später led aus.

aber woher bekommt der AVR diese info.
Am oszi ist kein high pegel zu sehen außer wenn wirklich daten anliegen 
vom Empfänger.

Auch wenn der empfänger ab ist und nur der pin offen ist bekommt der AVR 
irgendwie einen High was ich nicht messen kann weil low pegel laut oszi.


Liegts an den Port selbst????

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.