www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit io Auswertung pinb1


Autor: herrmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: herrmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#define port_B1()    DDRB&=~(1<<1);//CD
ist gar nix geholfen.
Wenn im Code irgendwo
port_B1();
steht, weiß trotzdem keiner was da passiert und muß im Kommentar zum 
define nachsehen.

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

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

Autor: herrmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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????

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.