www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu Programmierung mit STM8S


Autor: Mirco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

auf dem Gebiet der Microcontrollerprogrammierung bin ich leider ein 
ziemlicher Neuling und deshalb entschuldige ich mich schon mal im 
vorraus für etwaige Unkenntnisse.

Mein Problem ist folgendes:

Im unten angegebenen Quellcode wird einfach nur die LED auf dem Board 
periodisch an und aus geschaltet. Mit der Schleife stellt man halt die 
Zeit ein. Soweit ziemlich simpel aber ich wollte halt auch klein 
anfangen.

Was ich nun nicht verstehe ist, dass der STM8S105C6 nach einem Reset auf 
2Mhz Clock gestellt ist. D.h. in einer Sekunde 2Millionen 
Arbeitsschritte.
Also müsste, wenn die Schleife bis 50000 zählt, die LED ziemlich schnell 
blinken und ungefähr bei i = 2*10^6 müsste Sie eine Sekunde an und aus 
sein. Evtl kleinere Abweichungen. Aber bei i = 50000 Blinkt sie bereits 
ungefähr jede Sekunde.

Was mache ich falsch bzw. wo ist mein Denkfehler?

Auch mit allen anderen Clocks die es evtl sein könnten kommt es nicht 
hin.
Und das der STM8 einen Clock von 50kHz hat habe ich auch nirgends 
gelesen.

#include "stm8s.h"

main(){
  GPIO_DeInit(GPIOD);
  GPIO_Init(GPIOD, GPIO_PIN_0,GPIO_MODE_OUT_PP_LOW_SLOW);

  while (1){

    unsigned int i = 0;

  for(i=0;i<50000;i++);

    GPIO_WriteReverse(GPIOD, GPIO_PIN_0);
  }
}

Autor: Mirco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Push

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie groß ist der Zahlenbereich von unsigned int ???

Ich behaubte mal 16384...

Mach mal zwei verschachtelte Schleifeb draus.
1x 1000 Durchläufe und 1x 50.

Autor: noobuntu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Mirco,

du hast da einen kleinen Denkfehler. Ich bin mir nicht mehr sicher wie 
es beim STM8S war, aber ich glaube das der einen internen Prescaler für 
den Clock hatte? Hast du das schon berücksichtig? Aber das ist 
eigentlich auch nur nebensächlich.

Ein C Programm wie du es hast läuft nicht ohne weiteres auf einem uC. 
Wenn du dein Programm compilierst, wandelt dein Compilier es in 
Assembler um (Maschiensprach in für Menschen lesbare Befehle). Dieser 
Assembler Code ist länger als dein C Programm, außerdem hat jeder 
Assemblerbefehl eine bestimmte Laufzeit. Aufgrund dieser Laufzeiten 
kannst du dann die zum Beispiel deine Blinkfrequenz ausrechnen.

Das von dem Complier erzeugte Assembler File müsste bei dir auch in 
deinem Workspace Ordner vorhanden sein. Es hat die Endung ".asm" einfach 
mal öffnen. Vllt versteht du dann auch weshalb ich lieber C als 
Assembler programmiere!

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine 16-bit Addition dauert bei einer Wortbreite von 8 Bit auf einem 
RISC-Prozessor wesentlich länger als einen Takt. Außerdem werden durch 
die for-Schleife bedingt noch Sprünge ausgeführt, welche ebenfalls 
Taktzyklen benötigen.

Gruß Skriptkiddy

Autor: noobuntu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jop Skriptkiddy hat völlig recht. Hier hab ich mal den Assembler Code 
für ein Blinklicht für den STM8S. Nur das ich damals die Schleife bist 
60 000 Zählen lies.
   1                     ; C Compiler for STM8 (COSMIC Software)
   2                     ; Parser V4.8.32.1 - 30 Mar 2010
   3                     ; Generator V4.3.4 - 23 Mar 2010
  58                     .const:  section  .text
  59  0000               L6:
  60  0000 0000ea60        dc.l  60000
  61                     ; 4 main()
  61                     ; 5 {
  62                       scross  off
  63                       switch  .text
  64  0000               _main:
  66  0000 89              pushw  x
  67       00000002      OFST:  set  2
  70                     ; 6   GPIO_DeInit(GPIOD);
  72  0001 ae500f          ldw  x,#20495
  73  0004 cd0000          call  _GPIO_DeInit
  75                     ; 7   GPIO_Init(GPIOD, GPIO_PIN_0,GPIO_MODE_OUT_PP_LOW_SLOW);
  77  0007 4bc0            push  #192
  78  0009 4b01            push  #1
  79  000b ae500f          ldw  x,#20495
  80  000e cd0000          call  _GPIO_Init
  82  0011 85              popw  x
  83  0012               L72:
  84                     ; 13     for(i = 0; i < 60000; i++){
  86  0012 5f              clrw  x
  87  0013 1f01            ldw  (OFST-1,sp),x
  88  0015               L33:
  89                     ; 14       nop();
  92  0015 9d            nop
  94                     ; 13     for(i = 0; i < 60000; i++){
  97  0016 1e01            ldw  x,(OFST-1,sp)
  98  0018 1c0001          addw  x,#1
  99  001b 1f01            ldw  (OFST-1,sp),x
 102  001d 9c              rvf
 103  001e 1e01            ldw  x,(OFST-1,sp)
 104  0020 cd0000          call  c_uitolx
 106  0023 ae0000          ldw  x,#L6
 107  0026 cd0000          call  c_lcmp
 109  0029 2fea            jrslt  L33
 110                     ; 17     GPIO_WriteReverse(GPIOD, GPIO_PIN_0);
 112  002b 4b01            push  #1
 113  002d ae500f          ldw  x,#20495
 114  0030 cd0000          call  _GPIO_WriteReverse
 116  0033 84              pop  a
 118  0034 20dc            jra  L72
 131                       xdef  _main
 132                       xref  _GPIO_WriteReverse
 133                       xref  _GPIO_Init
 134                       xref  _GPIO_DeInit
 153                       xref  c_lcmp
 154                       xref  c_uitolx
 155                       end
 

Autor: Mirco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Antworten. Das hat mir sehr geholfen. Danke nun 
verstehe ich das besser.

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.