www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu C


Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich bin gerade dabei, mich ein wenig in C einzuarbeiten. Und da hab ich 
schon eine Frage. Ich habe deinen Code geschrieben, der eine LED 
einschaltet und danach gleich wieder ausschaltet. Ich wollte dies machen 
um die maximal erreichbare Frequenz zu messen (mit Oszi).
Doch wenn ich den Ausgang am Oszi ansehe, habe ich ein Tastverhältnis 
von 25% und nicht die (von mir) erwarteten 50%. Warum ist das so?

Ich verwende einen ATMega8.

Mein Code:

#include <avr/io.h>
#include <stdlib.h>
#define TAKT 8000000

void main(void)
{
//  unsigned char akku;
  DDRD = 0x20;
  while(1)
  {
  PORTD = (1 << PD5);
  PORTD = (0 << PD5);
  }
}


Danke für eure Infos!!

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hans,

weil das while(1) auch Zeit braucht. Nachdem der Port auf 0 gesetzt 
wurde,
prüft der µC erst noch die Bedingung 1 ab und setzt erst dann wieder den 
Port high.

Gruß
Patrick

Autor: Jörg B. (manos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wird wohl daran liegen dass er zwar in einem Takt von "1" auf "0" aber 
für die umgekehrte Richtung durchläuft das Programm wieder eine Abfrage.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, das wollte ich wissen!!

Tolles Forum hier!!

mfg
Hanns

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1.: Du programmierst in C, also in einer Hochsprache. Das bedeutet, dass 
das, was Du programmierst nicht unbedingt (sogar eher selten) das ist, 
was der Controller hinterher macht. Wenn Du Dir ansiehst, was der 
Compiler aus Deinem Code macht, dann wird da etwas in der Art von
LOOP:
    ldi r16, (1 << PD5) ;r16 mit Bitmaske laden
    out PORTD, r16  ;PD5 setzen
    clr r16         ;r16 löschen
    out PORTD, r16  ;Port D "0" setzen
    rjmp LOOP       ;Sprung zurück (Endlosschleife)
Die Bezeichner (LOOP, PORTD, PD5...) hab ich jetzt nur der Übersicht 
halber reingeschrieben. Wie man sieht, wenn man ein bisschen was von 
Assembler versteht, kommt nach dem Löschen des Portregisters der 
Rücksprung. Und der braucht nunmal zwei Zyklen. Während dieser zwei 
Zyklen und anschließend während des "ldi r16, (1 << PD5)" ist der Port 
0. Dadurch ist das Tastverhältnis natürlich nicht mehr 50%.

2.: "PORTD = (0 << PD5)" ist Unsinn. Wenn man eine Null verschiebt, 
bleibt es eine Null. Dann kannste gleich schreiben
PORTD = 0;
Bits setzen, ohne andere Bits im selben Register anzutasten geht mit
REGISTER |= (1 << BITNAME);
Bit löschen mit
REGISTER &= ~(1 << BITNAME);

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.