Forum: Mikrocontroller und Digitale Elektronik Impuls auf Pin (AVR)


von Bastian N. (filbert)


Lesenswert?

Guten Morgen,
ich möchte am Pin PD0 einen kurzen Impuls haben. Dazu habe ich diesen 
Code geschrieben:
1
#define PON PD0
2
3
DDRD |= (1 << PON);
4
PORTD |= (1 << PON);
5
_delay_loop_1(1);
6
PORTD &= ~(1 << PON);

Allerdings springt der PIN nach kurzer Zeit auf high und bleibt dann 
high.
Was mache ich falsch?

von Martin V. (oldmax)


Lesenswert?

Hi
Das kann nicht laufen, wenn das der ganze Code ist, soviel denke ich von 
C zu verstehen....
Vermutlich ist schon ein Flackern am Port, nur sehr schnell halt.....
Wie wär es, wenn das Programm in einer Schleife läuft?  Ich mein, so 
macht er das vermutlich auch, nur nicht nach Wunsch, sondern grad wie's 
ihm beliebt.... soll heißen, ich sehe keine Programmgrenze und daher 
läuft der µC ins Nirwana.
Gruß oldmax

von Bastian N. (filbert)


Lesenswert?

Das ist natürlich nicht der komplette code ;)

Dieser Block steht in der main funktion vor der Endlosschleife. Alle 
nötigen Header sind auch eingebunden. Das Programm kompiliert auch ohne 
Probleme. Der Chip hat mit gelöschtem Flash den Pin auf low. Dann 
programmiere ich den Chip über ISP und sehe am Oszi den Pegel von low 
auf high springen. Da bleibt er dann aber hängen.

von Flo (Gast)


Lesenswert?

Wie wärs mit dem ganzen Programm?
Was hängt an dem PD0 denn dran?

von Bastian N. (filbert)


Lesenswert?

An dem Pin hängt ein 1k Widerstand gegen Masse und eben mein Oszi

Vom Programm ist weiter nichts übrig, habe alles auskommentiert, nur 
noch diese paar Zeilen.
1
#include <avr/io.h>
2
3
#define PON PD0
4
5
int main(void){
6
7
 DDRD |= (1 << PON);
8
 PORTD |= (1 << PON);
9
 _delay_loop_1(1);
10
 PORTD &= ~(1 << PON);
11
12
 while(0){
13
14
 } 
15
return 0;
16
}

von Flo (Gast)


Lesenswert?

Wie sieht die da aus?

 _delay_loop_1(1);

Selbstgeschrieben? Wenn ja her damit!

von Bastian N. (filbert)


Lesenswert?

oh, die steht natürlich in <util/delay_basic.h> der avrlibc und ist 
natürlich auch includiert

von Flo (Gast)


Lesenswert?

jetzt seh ichs:

while(0){

 }

sollte

while(1){

 }

heißen, da er sonst die Endlosschleife nie ausführt ;-)

von Bastian N. (filbert)


Lesenswert?

Ok, aber dennnoch sollte ja der Impuls zu sehen sein, oder?

von Flo (Gast)


Lesenswert?

Der Prozessor schaltet P0 an, dann wartet er kurz (wieviel eigentlcih?), 
dann schaltet er aus.
Dann läuft er an der Endlosschleife vorbei und fängt das Programm neu 
an.
Wird ein hochfrequentes Flackern sein, so dass je nach Wartezeit in dem 
Delay (Puls-Pausenverhältnis) die Low-Flanken untergehen.

Probiers mal aus, fall es nicht klappt will ich nen Schaltplan oder noch 
besser n Bild vom Aufbau ;-)

von Bastian N. (filbert)


Lesenswert?

Alles klar, probier ich zuhause gleich mal aus.

von Pfeifer (Gast)


Lesenswert?

c is ja nich so mein ding, wenn ich das aber richtig interpretiert habe 
würde ich das so machen:


#include <avr/io.h>
#define PON PD0

DDRD |= (1 << PON);

int main(void){
 while(0)
 {
  PORTD |= (1 << PON);
  _delay_loop_1(1);
  PORTD &= ~(1 << PON);
  _delay_loop_1(1);
 }

return 0;
}

von Hc Z. (mizch)


Lesenswert?

Ich habe früher viel mit FlexeLINT gearbeitet.  Wenn ich mir die 
while(0)'s hier so betrachte, kapiere ich im Nachhinein, warum der für 
unendliche Schleifen einen for(;;) statt eines whiles sehen wollte ...

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.