Frage zu C

Gast #462498
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!!
Gast #462514
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
1
LOOP:
2
    ldi r16, (1 << PD5) ;r16 mit Bitmaske laden
3
    out PORTD, r16  ;PD5 setzen
4
    clr r16         ;r16 löschen
5
    out PORTD, r16  ;Port D "0" setzen
6
    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
1
PORTD = 0;
Bits setzen, ohne andere Bits im selben Register anzutasten geht mit
1
REGISTER |= (1 << BITNAME);
Bit löschen mit
1
REGISTER &= ~(1 << BITNAME);

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.