µC in C Programmieren

Dieses Thema im Forum "Informatik" wurde erstellt von Elektrohauer, 2 Jan. 2013.

  1. Hallo.

    Habe schon einige fehlgeschlagene Versuche zu diesem Thema in mikrokontroller.net gestartet. Vielleicht könnt ihr mir weiterhelfen.

    Ich versuche über RideIDE und ProgISP einen µC mit einem Programm zu "beschreiben". Die Programme schreibe ich in C und beim compilieren in der Entwicklungsumgebung werden mir keine Fehler angezeigt und in der programmeigenen Simulation laufen diese auch wie sie sollen.

    Ein Standard-Programm zum Testen, das eine LED ansteuert funktioniert auf dem µC. Wenn ich jedoch eine Schleife programmiere, in der jede einzelne LED angesteuert werden soll und dieses Programm auf den µC lade leuchten alle LEDs auf und es tut sich nichts.

    Zwischen der Ansteuerung der LEDs liegt eine Warteschleife. Das Programm habe ich mal angehängt. Wird wahrscheinlich nicht daran liegen.

    Vielleicht hat jemand eine Idee, woran es liegen könnte.

    Code:
    #include<reg51.h>
    
    int i_schleife, w_schleife;
    void warte()
    {
    	for (w_schleife = 1; w_schleife < 128; )
    	{
    		w_schleife = w_schleife * 2;
    	}
    }
     
    void main()
    {	 
    	 while(1)
    	 {
    	 	for (i_schleife = 1; i_schleife < 128; i_schleife = i_schleife * 2)
    	 	{
    	 	P0 =~ i_schleife;
    	 	warte();
    	 	}
    	 }
    }
    
    
     
  2. AW: µC in C Programmieren

    In der warte Funktionen werden 6 Ganzzahl Multiplikationen in einer Schleife ausgeführt. Wie viel Zeit benötigt der µC für eine Multiplikation? Ich vermute die Zeit ist viel kleiner als 1ms. Dann wird in weniger als 10 ms eine andere LED angeschaltet. Für das Auge sieht es aus, als würden alle LEDs gleichzeitig leuchten. Wenn die Bibliothek keine Sleep Funktion und keinen Zugriff Uhr hat, würde ich es mit viel mehr Multiplikationen versuchen, Tausende oder Millionen, je nach µC. Rechnen mit floats, wenn vorhanden, sollte langsamer als Rechnen mit int sein. Im Handbuch des µC sollten Zeiten für Rechenoperationen zu finden sein.
     
  3. AW: µC in C Programmieren

    Die Warteschleife habe ich auch schon bis 2048 hochzählen lassen. Ich habe auch versucht vor P0 = i und hinter P0 = i die Warteschleife arbeiten zu lassen. Hat auch nicht viel gebracht. Werde aber morgen die Schleife bis 16384 oder 32768 hochzählen lassen.

    Es ist ein AT89S52 den ich programmiere. Vielleicht hilft das weiter?

    Bin langsam ratlos! Fummel an dem Controller schon zwei Tage rum und nichts hilft. :mad:
     
  4. AW: µC in C Programmieren

    Ich denke das ich den Fehler gefunden habe. Auf der Platine befindet sich der USBasp von Fischl.

    ProgISP hat zwar Treiber mitgeliefert, aber diese scheinen wohl die falschen zu sein. Ich werde mir mal den "Fischl-Treiber" besorgen und ausprobieren wie es dann aussieht. Falls es daran liegt bin ich froh.

    Die Fehlersuche auf der Platine hat nichts ergeben. Keine Schlüsse oder "kalte Lötstellen". Es sind auch keine Leiterbahnen unterbrochen.
     
  5. AW: µC in C Programmieren

    Zum AT89S52 habe ich ein Manual auf http://www.atmel.com/Images/doc1919.pdf gefunden.

    Der Takt des µC liegt bei 0 Hz bis 33 MHz. Das ist ein sehr großer Bereich. Bei welchem Takt läuft dein Testsystem?

    Die Nutzung eines Timers wäre die beste Wartefunktion. Auf http://microcontrollershop.com/product_info.php?products_id=3741 habe ich Links zu verschiedenen Informationen zum AT89S52 gefunden. Ein Link http://www.youtube.com/watch?v=4C3AijZJHr4 führt auf ein Video, in dem eine Wartefunktion über den Timer genannt wird:
    Headerfile einbinden: #include <util/delay.h>
    Wartefunktion: _delay_ms( Hier Zeit in ms schreiben. )

    Eine Wartefunktion mit aktiver CPU habe ich auf http://www.techtoys.com.hk/8051/AT89S52-gLCD-STK1/chp2_LEDBlink.pdf gefunden:
    Code:
    void DelayMs(unsigned int msec)
      {
        unsigned int x,y;
        for(x=0; x<=msec;x++)
        {
          for(y=0;y<=110;y++);
        }
      }
    
    In der Schleife sind 111 Additionen für 1 ms Verzögerung programmiert. (Die 110 Additionen sind vermutlich für einen AT89S52 mit 11 MHz Takt programmiert. Die Funktion scheint einen Fehler zu enthalten, weil beim Parameterwert 0 ebenfalls die innere Verzögerungsschleife durchlaufen wird.)

    Die Multiplikation mit 2 (also ein shift) könnte in der gleichen Größenordnung liegen. Für ein gut sichtbares Blinken im Sekundentakt sind demnach rund 100.000 Operationen notwendig. Der Versuch „Grenzwert 2048“ also 12 Multiplikationen ist weit unter der sichtbaren Zeit.

    Die Spannung an einer LED mit einem Oszilloskop überwachen könnte helfen den Fehler einzugrenzen. Mit dem Oszilloskop sind schnelle Schaltvorgänge sichtbar, die das Auge nicht mehr sieht. Ein Multimeter mit Frequenzmessung könnte auch eine Prüfmöglichkeit sein.
     
  6. AW: µC in C Programmieren

    Meiner läuft auf 12Mhz. Im Unterricht hat es auch mit 5000 Operationen, sogar mit 100 Operationen, sichtbar funktioniert. Deshalb bin ich schon auf 1024 bzw. 2048. Aber werde es auf jeden Fall mal ausprobieren.

    Wartefunktionen über den Timer haben wir (noch ?) nicht benutzt. Bin froh, das ich das Lauflicht und andere einfache Programme ohne Probleme schreiben kann. :oops:

    Die Fehlersuche muss ich leider per Ausschlussverfahren durchführen, weil ich die genannten Hilfsmittel nicht nutzen kann bzw. es besteht dazu keine Möglichkeit.
     
  7. AW: µC in C Programmieren

    Der Wert 1024 oder 2048 in deiner warte Funktion wird nach 10 oder 11 Multiplikationen (shifts) erreicht. Das ist deutlich weniger als die 5.000 oder 100 Operationen, die du im Unterricht verwendet hast.
     
  8. AW: µC in C Programmieren

    Verstehe schon wie du das meinst. Falls ich noch ein Programm aus dem Unterricht auf meinem Stick habe werde ich die Warteschleife mal ansehen und ggf. posten.
     

Diese Seite empfehlen