Problem mit io Auswertung pinb1

Gast #919710
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
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?
Gast
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
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?
Gast
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*/
Gast
#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????

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.