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?
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?
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*/ |
#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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.