www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Warum blinkt hier nix? (C-Code)


Autor: Markus Neubauer (roboscan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi.
Ich habe heute meinen ersten test Chip bekommen.
Ich möchte gerne das die LEDs abwechselnd blinken aber warum tun sie
das nicht?

#include <avr/io.h>

#ifndef F_CPU
#define F_CPU 7372800UL
#endif

#include <avr/delay.h>

int main(void)
{
  
DDRA = 0x00; // Setzt alle Pins des Ports A auf Eingang
PORTA = 0xFF; //Pull-Up Wiederstände an


DDRB = 0xFF; // Setzt alle Pins des Ports B auf Ausgang;
PORTB = 0xFF; //PortB ausschalten


while (1 > 0)
{
  PORTB = 0x00; //PortB einschalten
  _delay_ms(200);
  
  PORTB = 0xFF; //PortB ausschalten
  _delay_ms(200);

}

}

Ich komme einfach nicht dahinter.

Gibt es ausserdem noch ne elegantere Version als meine While Schleife
zum Schluss damit sich alles immer wiederholt?

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zuerst das einfachere...

while(1)   oder    for(;;)

Jetzt das komplexere.

Sieh Dir doch mal die Kommentare im avr/delay.h zu _delay_ms() an  :)
(bzw. ab libc v1.0.4 in util/delay.h)

"The maximal possible delay is 262.14 ms / F_CPU in MHz."

Zudem sollen die ms als float Wert angegeben werden :)

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zu Frage 2:
1.  while(1)
    {
      ...
    }

2.   for(;;)
     {
       ...
      }

zu Frage 1. LEDs falsch gepolt?? Mal mit einem Messeisen am Port
nachmessen, ob ein Spannungswechsel zu detektieren ist.

Wenn nicht, dann kommen Oszillator, Resetpin-Beschaltung,
Versorgungsspannung ... in Frage.

MW

Autor: Markus Neubauer (roboscan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ne die LEDs sind ja an... aber blinken tun sie eben nicht.

Hab das von dir Werner nicht ganz kappiert.
Also aus den Kommentaren werde ich nicht schlau, sorry bin noch totaler
Anfänger auf dem gebiet.
Und was is'n float Wert?

Wäre super wenn du mir den Code kurz so schreiben könntest damit es
auch läuft. Dann hätte ich jetzt ein Beispiel und dann kann ich darauf
aufbauen.

Danke für eure Antworten.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. wenn du while(1) schreibst, hast du eine Endlosschleife, was eine
kürzere Formulioerung als deine ist.

2. die grösste Zahl, die du bei _delayms einsetzen kannst, wird durch
262.14ms/ Fosc in MHz beschrieben.
Du hast 7,xx MHz, also kannst du keine 200ms verzögern.

Nimm sonst erst mal ein paar verschachtelte For-Schleifen (2 von 0-255
und eine bis 50). Dann hast du erst mal ein Blinken...

Autor: Markus Neubauer (roboscan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah danke Raul probier ich sofor aus.

Autor: Markus Neubauer (roboscan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Juhuuuuu es funktioniert

hab jetzt folgendes geschrieben
#include <avr/io.h>
#include <stdint.h>

uint8_t w1;
uint8_t w2;
uint8_t w3;
uint8_t w4;


int main(void)
{
  
DDRA = 0x00; // Setzt alle Pins des Ports A auf Eingang
PORTA = 0xFF; //Pull-Up Wiederstände an


DDRB = 0xFF; // Setzt alle Pins des Ports B auf Ausgang;
PORTB = 0xFF; //PortB ausschalten


while (1)
{
  for (w1=1; w1 <= 200; w1++)
  {
    for (w2=1; w2 <= 200; w2++)
    {  
    }
  }

  PORTB = 0x00; //PortB einschalten
  
  for (w1=1; w1 <= 50; w1++)
  {
    for (w2=1; w2 <= 200; w2++)
    {
    }
  }
  
  PORTB = 0xFF; //PortB ausschalten

}

}

Dank euch ;-)

Autor: Johannes (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hier haste ne delay-funktion (Timer-Funktion), die in etwa
Millisekunden verzoegert.

Schreibst am anfang in dein Programm: "#include <delayms.c>"

und nachher kannste ueberall "delayms(200)" reinschreiben um zB
200Millisekunden abzuwarten. Geht auch mit 3000 fuer 3 Sekunden usw...

mg,
Johannes

Autor: Markus Neubauer (roboscan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HI Johannes
Ich weiß leider noch nicht genau wo der Fehler in deinem Code liegt
aber es tut sich mit z.B. delayms(200) oder auch delayms(2) garnix.


Noch eine Theoretische frage.
Angenommen mein IC arbeitet mit einer Taktfrequenz von 4 MHz.
Dann müsste ich doch mit folgendem Code genau 1ms verzögern oder
nicht?

for (w1=1; w1 <= 4; w1++)
{
     for (w2=1; w2 <= 1000; w2++)
     {
     }
}

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein.weil da noch etwas "Overhead" durch die Schleifen ansich entsteht
(Initialisierung, Überprüfen der Abbruchbedingung etc).
Ausserdem wird es kaum gehen mit einem uint8 bis 1000 zu zählen...

Besorg dir am besten ein vernünftiges C-Buch z.B. K&R "Programmieren
in C".

Autor: Markus Neubauer (roboscan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
is ja auch unit16 aber danke ich werd mir auch morgen ein Buch für C
holen ;-)
somit werd ich deinen Buch Tip anschauen.

Autor: Lumpi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Delays sind die schlechteste Lösung. Damit blockiert man den Controller
. Besser ist es, in einem Timer-Interrupt Variablen
auf/abzählen zu lassen. Diese Variable kann man auf zB. 0 testen
und dann eine Aktion auslösen.

SG Lumpi

Autor: Lumpi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timerinterrupt zB alle 1ms:

if (Timer_ms > 0) Timer_ms--;


Main:

if (Timer_ms == 0) {PORTA = !PORTA ; Soft_Timer = 300;}



SG Lumpi

Autor: Markus Neubauer (roboscan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit den Timern werde ich angreifen wenn ich erst ma den Grundaufbau
von den AVRs kappiert hab.
Im Moment kämpfe ich noch mit den Eingängen.
Aber danke.

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.