µController programmierung C lernen.

Gast #671387
Lesenswert?

Hallo leute...
mir ist aufgefallen dass das ein sehr aktuelles forum ist und da wollte 
ich doch glatt mein problem darlegen...

ich muss es hinbekommen für meine 5. prüfungskomponente (jugend forscht) 
einen µController mit C zu programmieren..

toll ich habe keine ahnung von C und würde gern wissen ob mir irgendwer 
sagen kann mit welcher anleitung  crashkurs  usw. ich am schnellsten 
und effektivsten C lernen kann!

eventuell wäre es schön wenn man mir ein einsteigerprogramm / -compiler 
nennen kann...

das wäre alles echt super
vielen dank schonmal leute

MfG
Max
Gast #671453
Lesenswert?

Hallo Max,
wenn der µController egal ist, nimm einen 8051er-Chip: 
Experimentalboards gibts genug davon und den C-Compiler von Wickenhäuser 
(www.wickenhaeuser.de). Mit der kostenlosen Demo-Version kannst Du schon 
richtig gute Programme schreiben.
Bei Bedarf kannst Du eine kleine Einführung in C für 8051er von mir 
bekommen.

Viel Spaß
Carlos
Gast #671635
Lesenswert?

Naja sinnvoll wäre es, wenn du das ganze direkt mit dem compiler, den du 
für dein projekt bauchst lernen könntest, von daher wäre der erste 
schritt einen controller auszuwählen...
beherscht du andere programmiersprachen mehr oder weniger gut?
Gast #671938
Lesenswert?

@ Robert

ja das ist schon richtig
aber ich versuch jetzt mal ein beispiel das ich am wochenende getest 
habe

ich hab jetzt nicht die genauen unterlagen hier
aber z.b

Setzte vom Port 1 Pin 2 des 8051 auf High
in Assembler kein problem für mich zumindest beim 8051

Setb P1.2

klar da fehlt jetzt noch die zuweisung sprich

Port1 equ 0x90
P1.0 bit 0x90
P1.1 bit 0x91
P1.2 bit 0x92
usw

und nu das ganze in C ???
Gast #671983
Lesenswert?

@ robert

ich muß heute abend wenn ich zeit habe das noch mal raus suchen
wie ich das beim keil in c geschrieben hatte.
Was mich babei wunderte war auch wenn ich z.b ein port anspreche
das diese anweisung z.b setze port A auf 0x5c als subroutine nach dem 
compilern ausgegeben wurde.

Ich werd das ganze nochmals genauer hier posten nur leider bin ich jetzt 
auf der arbeit
Gast #672136
Lesenswert?

@Commtel:
Das Ansprechen eines Port-Pins in C läuft sehr ähnlich zu dem in 
Assembler ab (Code für µC/51er-C-Compiler):
Du definierst den Port-Pin mit seiner zugehörigen Bit-Adresse:

  unsigned char bit P1_5 @ 0x95;  // Port-Pin P1.5 hat die Bit-Adresse 
95h

Und dann später im Programm selber:

  P1_5 = 1;   // Setzen auf HIGH und
  P1_5 = 0;   // Setzen auf Low.

Das war´s schon.

Gruß Carlos.
#672200
Lesenswert?

Der Vollständigkeit halber sei aber noch gesagt, dass es
sich hierbei um kein Standard-C Konstrukt handelt. Die Welt
von C endet bei Bytes (was auch immer ein Byte sein mag,
ob das jetzt 8 Bit, 9 Bit, 16 Bit oder sonstwas größer/gleich
8 ist.) Was kleineres als 1 Byte gibt es in C ganz einfach nicht.

Manche Compiler Hersteller haben daher Erweiterungen eingebaut
um Zugriff auf einzelne Bits zu ermöglichen.
Gast #672433
Lesenswert?

so jetzt mal an alle
ich hab folgendes geschrieben
**********************************************
sfr P1    = 0x90;
sbit TestPin1 = P1^5;

void main(void)

 {
  TestPin1 = 1;
 }
// wichtig an alle anfänger ist auch striche,kommas geschrieben wird
// sonst geht gar nix muste ich festellen
*************************************************
so ja heisen das von port1 pin5 gesetzt wird
also könnte man erwarten das in assembler

 SETB 1.5 sprich D2 95

rauskommen sollte oder nicht

tja denkste

C:0x0000    020003   LJMP     C:0003
C:0x0003    787F     MOV      R0,#0x7F
C:0x0005    E4       CLR      A
C:0x0006    F6       MOV      @R0,A
C:0x0007    D8FD     DJNZ     R0,C:0006
C:0x0009    758107   MOV      SP(0x81),#0x07
C:0x000C    02000F   LJMP     main(C:000F)
     4: void main(void)
     5:
     6:  {
     7:   TestPin1 = 1;
C:0x000F    D295     SETB     TestPin1(0x90.5)<-- das wollt ich NUR 
haben
     8:  }
C:0x0011    22       RET <--warum ist daraus eine subroutine geworden?

und wenn es eine subroutine wo steht denn was von LCALL?
Wäre das dann nicht einfacher und kürzer?
#672499
Lesenswert?

Was da vor dem main abläuft, ist eine Initialisierungsroutine. Erst 
werden die Interrupthandler übersprungen, dann das RAM gelöscht und 
schliesslich wechselt der Controller in das main.
Das muss also nicht mit einem lcall aufgerufen werden, sondern wird bei 
jedem Reset des Controllers genau einmal durchlaufen. (Programmcounter 
steht nach dem Reset auf 0).
Dass der Compiler auch aus dem main eine Subroutine baut, macht hier 
nicht so schrecklich viel Sinn, da die main-Routine ja so nicht mal 
aufgerufen, sondern nur angesprungen wird. Das liegt einfach an der 
Logik von C.
Gast #672536
Lesenswert?

Die Logik von C ist mir nicht so sympatisch aber nun ja
Was mienst du mit Interrupthandler?
die interruptadressen

0x0003 externer interrupt 0
0x000B Timer 0
?

ich werd mal versuchen eine endlos schleife einzubauen nach
 {
  TestPin1 = 1;
 }

damit das ganze ein wenig sinn ergibt.
#672542
Lesenswert?

Ich meine damit die Adressen kurz nach dem Anfang des Flash, an die der 
µC beim Auftreten des jeweiligen Interrupts springt. Also schon das, was 
du grad geschrieben hast.

Was stört dich denn an der C-Logik? Der überflüssige ret?
Das mit der Endlosschleife ist aber eh ne gute Idee, weil die main auf 
µC NIEMALS beendet werden darf (der ret am Ende der main darf niemals 
ausgeführt werden).
Es ist eh fraglich, wo er dann im obigen Programm hinspringen sollte, 
wenn er ja nichtmal ne Rücksprungadresse auf dem Stack liegen hat...
Gast #672549
Lesenswert?

würd sagen irrt sonst wo rum G

so habs geändert

sfr P1    = 0x90;
sbit TestPin1 = P1^5;

void main(void)

 {
  TestPin1 = 1;
  while(1);
 }

C:0x0000    020003   LJMP     C:0003
C:0x0003    787F     MOV      R0,#0x7F
C:0x0005    E4       CLR      A
C:0x0006    F6       MOV      @R0,A
C:0x0007    D8FD     DJNZ     R0,C:0006
C:0x0009    758107   MOV      SP(0x81),#0x07
C:0x000C    02000F   LJMP     main(C:000F)
     4: void main(void)
     5:
     6:  {
     7:   TestPin1 = 1;
C:0x000F    D295     SETB     TestPin1(0x90.5)
     8:   while(1);
C:0x0011    80FE     SJMP     C:0011

mit welchen befehl kann ich 0x0003 resavieren?

ich find gerde nirgends wo man bei keil ein hex file dazu ausgeben 
lassen kann um es im eprom zu brennen.
Bei assembler geht das oder vileicht bin auch gerade nur zu müde.
#672559
Lesenswert?

Das hex-File kriegst du, wenn du unter Project->Options for 
Target->Registerkarte Output den Haken bei "Create HEX File" setzt. Das 
File liegt dann in deinem Projektverzeichnis.

Das HEX kommt aber ins Flash und nicht ins EEPROM, denn aus dem EEPROM 
kann der Controller keinen Code ausführen. Das EEPROM ist vor allem dazu 
da, nichtflüchtig Daten abzulegen oder grosse Mengen an Konstanten zu 
speichern.

>mit welchen befehl kann ich 0x0003 resavieren?

reservieren? für was denn?
Gast #672608
Lesenswert?

sorry hatte mich unklar gestern abend ausgedrückt
Ich meinte wenn ich im flash die adresse 0x0003 im voraus resavieren 
will
oder z.b das meine main erst ab 0x0050 abgelegt wird.
Dafür muß es doch auch ein Befehl geben.

Ich hab noch ein 80c32 daher das mit eeprom ist natürlich ein Eprom 
(ein27c64)
War doch etwas spät gestern ;-)
#672638
Lesenswert?

commtel wrote:
> sorry hatte mich unklar gestern abend ausgedrückt
> Ich meinte wenn ich im flash die adresse 0x0003 im voraus resavieren
> will
> oder z.b das meine main erst ab 0x0050 abgelegt wird.
> Dafür muß es doch auch ein Befehl geben.
>

0x0003 ist erstmal reserviert für den EXINT0, da du diesen nicht 
verwendest, kann der Compiler der Platz dafür für seine 
Initialisierungs-Routine und die main verwenden.

Man kann es dem Linker irgendwie sagen, dass er nen Adressoffset 
draufhauen soll(der Keil macht ja in der Demoversion immer feste 2k), 
aber frag mich nicht wie. Habs noch nie gebraucht ;)
Was willst du damit denn erreichen?


> Ich hab noch ein 80c32 daher das mit eeprom ist natürlich ein Eprom
> (ein27c64)
> War doch etwas spät gestern ;-)


Ahso, dann ist das natürlich was anderes. Bin jetzt von einem moderneren 
Controller ausgegangen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren