www.mikrocontroller.net

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


Autor: Bastian Neumann (filbert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,
ich möchte am Pin PD0 einen kurzen Impuls haben. Dazu habe ich diesen 
Code geschrieben:
#define PON PD0

DDRD |= (1 << PON);
PORTD |= (1 << PON);
_delay_loop_1(1);
PORTD &= ~(1 << PON);

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

Autor: Martin Vogel (oldmax)
Datum:

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

Autor: Bastian Neumann (filbert)
Datum:

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

Autor: Flo (Gast)
Datum:

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

Autor: Bastian Neumann (filbert)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <avr/io.h>

#define PON PD0

int main(void){

 DDRD |= (1 << PON);
 PORTD |= (1 << PON);
 _delay_loop_1(1);
 PORTD &= ~(1 << PON);

 while(0){

 } 
return 0;
}

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht die da aus?

 _delay_loop_1(1);

Selbstgeschrieben? Wenn ja her damit!

Autor: Bastian Neumann (filbert)
Datum:

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

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jetzt seh ichs:

while(0){

 }

sollte

while(1){

 }

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

Autor: Bastian Neumann (filbert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, aber dennnoch sollte ja der Impuls zu sehen sein, oder?

Autor: Flo (Gast)
Datum:

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

Autor: Bastian Neumann (filbert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar, probier ich zuhause gleich mal aus.

Autor: Pfeifer (Gast)
Datum:

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

Autor: Hc Zimmerer (mizch)
Datum:

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

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.