Kleines Testprogramm tut nicht was es soll (C)

OP #3991201
Lesenswert?
• ▲
▼
Ich hab ein kleines Programm geschrieben was eigenzlich auf einen 
Tstendruck einen Zähler hochzählen soll und das Ergebnis auf 4 
Leuchtdioden ausgeben soll.
Irgendwie hab ich das Gefühl das das Programm nur ein mal durchlaufen 
wird.
Ich hab zum lernen ein AVR-C Tutorial von 2007. Ich hoffe das passt noch 
halbwegs da ich Anfänger bin und noch nicht die Ahnung hab.
Hier mal das Programm:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#define F_CPU 1000000UL
4

5
int main (void) {
6
  DDRD= 0x0f; //Port D die unteren 4 Bit als Ausgang
7
  DDRB= 0b00000000;
8
  PORTB = 0x02;// pull Up Wiederstand für ALLE PinS  aktiviert
9
  
10
  
11
  
12
    uint8_t tg=0;
13
    uint8_t taste=0;
14
    uint8_t dioden = 0;
15
  PORTD=0x0f;
16
  _delay_ms(500);
17
  PORTD=0x00;
18
  _delay_ms(100);
19
    
20
  while(1){
21
    
22
    if (!(PINB & (1<<PB1))){
23
      dioden++;
24
      PORTD=dioden;
25
      _delay_ms(100);
26
      loop_until_bit_is_set(PINC,PC3);
27
    }
28
    PORTD ^= (1<<PD3);
29
    _delay_ms(200);
30
    PORTD ^= (1<<PD3);
31
    
32
    //dioden &= 0x0f;
33
    //PORTD = ++dioden;
34
    //PORTD = taste;
35
    return 0;
36
  }
37
    
38
}
Ich hoffe  es kann mir mal einer erklähren warum die Diode an PD3 nicht 
laufend blinkt.

MfG Fritz
Gast #3991223
Lesenswert?
• ▲
▼
Was tut denn diese ominöse Funktion?
loop_until_bit_is_set()
Hängt er da vielleicht in dem loop?
Ansonsten halte ich es ebenfalls für Unsinn, ein Return 0 in die 
While(1)-Schleife einzubauen ;-)
#3991240
Lesenswert?
• ▲
▼
Christian schrieb:
> Was tut denn diese ominöse Funktion?
> loop_until_bit_is_set()

Der Name könnte doch eindeutiger nicht sein. Ist aber ein Makro:
http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__avr__sfr_1gaaf6857fa882da35f8685e2001e5c3bbe.html

> Ansonsten halte ich es ebenfalls für Unsinn, ein Return 0 in die
> While(1)-Schleife einzubauen ;-)

Was auch relativ gut dieses Problem erklärt:

Fritz Bie schrieb:
> Irgendwie hab ich das Gefühl das das Programm nur ein mal durchlaufen
> wird.
OP #3991284
Lesenswert?
• ▲
▼
Danke das war auch der Fehler mit dem Return in der Schleife!
Die Funktion loop_until_bit_is_set() dient hier eigentlich nur um ein 
sehr einfaches entprellen zu ermöglichen. Ist zwar unschön aber tuts für 
den Anfang.
Das Blinken vor der While Schleife dient nur dazu die Kontakte auf dem 
Steckbrett zu überprüfen. Und die Zeitschleifen in der While Schleife 
sind auch nur zum verlangsamen da.
Ich hab schon mal einen Einführungskurs in Assembler auf der 
Folkshochschule gemacht von da her kenn ich wenigstens ein bischen aus.
Danke für die schnelle Hilfe!!!


Mfg Fritz

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.