mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC 16f628a C


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

ich habe hier gerade ein Paar 16f628a vor mir liegen, und würde diese 
gerne mit C Programmen füttern.
Mit ASM -> HEX files geht es wunderbar, aber bei C komm ich einfach 
nicht weiter!

Welchen compiler kann ich dafür denn unter Windoof verwenden, der mir 
nach Möglichkeit ein .HEX file ausspuckt?


lg,

Stefan

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CC5x

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Holger,

den hab ich schon probiert, spuckt mir auch ein HEX file aus, aber das 
funktioniert dann nicht. :(

lg

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SDCC würde ich sagen.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe nun folgenden Code:
#include <C:\cc5x\16f628a.H>    // Prozessor-Typ definieren
#pragma config |= 0b.1111.1111.0010  // Konfigurations-Wort

void pause(uns16 ms)      // Unterprogramm zum Abwarten einer
{          // angegebenen Anzahl von Millisekunden
while(ms)      // Schleife verlassen, wenn ms=0 ist
  {
  OPTION = 2;    // Vorteiler auf 8 einstellen
  TMR0 = 131;    // 125 * 8 = 1000 (= 1 ms)
  while (TMR0);    // Abwarten einer Millisekunde
  ms--;      // "ms" mit jeder Millisekunde erniedrigen
  }
}

void main(void)        // Hier beginnt das Hauptprogramm
{
char i;
TRISB = 0b.0000.0000;    // PortB als Ausgang definieren
PORTB = 0;
Sprungmarke:
PORTB.0 = 1 ;      //  Bit 0 von PortB setzen
pause(500);      // LED 0 halbe Sekunde leuchten lassen
for (i=0 ;i<7 ;i++)    // folgende Befehle 8-mal wiederholen
  {
  PORTB = PORTB << 1 ;  // 1 kommt ins nächste Bit links
  pause(500);    // jede LED  halbe Sekunde leuchten lassen
  }
PORTB = 0;      // Alle LEDs löschen
goto Sprungmarke;    // Alles wiederholen
}

der sollte mir auf PORTB[x] alle LED's nach und nach einschalten. tut es 
aber nicht. any ideas?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>den hab ich schon probiert, spuckt mir auch ein HEX file aus, aber das
>funktioniert dann nicht. :(

Könnte am Programm liegen.

>SDCC würde ich sagen.

Naja.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
>>den hab ich schon probiert, spuckt mir auch ein HEX file aus, aber das
>>funktioniert dann nicht. :(
>
> Könnte am Programm liegen.
>
>>SDCC würde ich sagen.
>
> Naja.


das hilft mir nur bedingt weiter :)
hat jemand ein Beispiel programm für den PIC 16f628a?


lg

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
>>SDCC würde ich sagen.
>
> Naja.

Was spricht gegen den SDCC?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die tatsache das er die einfachsten Programme nicht compiliert.

Autor: Kaila (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm mal den Code hier...

//------------------------------------------------------------
#include <pic16f628a.h>

typedef unsigned int word;
word at 0x2007 CONFIG = _WDT_OFF &
    _PWRTE_ON &
    _INTOSC_OSC_NOCLKOUT &   // internal clock
    _MCLRE_OFF &
    _LVP_OFF &
    _DATA_CP_OFF;

void isr() interrupt 0 {
}

void main() {
  OSCF=1;           // 4MHz internal clock
  CMCON=0x07;       // comparators off, enable I/O ports

  while(1){

    // mach hier mal was...

  }
}
//--------------------------------------------------------------

der Kaila

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Sprungmarke:
> PORTB.0 = 1 ;      //  Bit 0 von PortB setzen
> pause(500);      // LED 0 halbe Sekunde leuchten lassen
> for (i=0 ;i<7 ;i++)    // folgende Befehle 8-mal wiederholen
>   {
>   PORTB = PORTB << 1 ;  // 1 kommt ins nächste Bit links
>   pause(500);    // jede LED  halbe Sekunde leuchten lassen
>   }
> PORTB = 0;      // Alle LEDs löschen
> goto Sprungmarke;    // Alles wiederholen

HEILIGE MUTTER MARIA GOTTES. ICH KRIEG DIE KRIESE.

Mein Freund (oder auch nicht) es gibt wenige NOGOs in C:

einer davon ist NIE NIE NIE und einfach NIE NIE NIE ein "goto" zu 
verwenden. Das ist einer der Todsünden bei C. Das dürfen nur die 
Basic-ler und das auch nur weil sie nix besseres haben.

Bitte bitte tu uns das niemehr an. Du bist der einzige auf dieser Welt 
der in C ein goto verwendet.

Ich hab schon von Compilern gehört bei denen GOTO zu einigen 
Komplikationen geführt hat. Manche springen angeblich zu "origin 0". Was 
da passiert sollte dir klar sein.

Mit der while - Schleife bist du bestens bedient:

while(1){
.. den ganzen schmodder ...
}

Danke, dass du niewieder gotos verwendest ...

Gruß

Autor: K. J. (theborg0815) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Stefan schrieb:
 einer davon ist NIE NIE NIE und einfach NIE NIE NIE ein "goto" zu
> verwenden. Das ist einer der Todsünden bei C. Das dürfen nur die
> Basic-ler und das auch nur weil sie nix besseres haben.
>
> Bitte bitte tu uns das niemehr an. Du bist der einzige auf dieser Welt
> der in C ein goto verwendet.
>
Hrhr doch die Basic Leute ham auch was besseres ;P nen wunderschönes 
call nutzt nur keiner von denen :P

Bei dem anderen wirste wol recht haben lange nicht mehr in C gesehn

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Hallo Holger,
>
> den hab ich schon probiert, spuckt mir auch ein HEX file aus, aber das
> funktioniert dann nicht. :(
>
> lg

Es gibt dann 2 Möglichkeiten:

1) Dein C Programm funktioniert nicht -> Hex funktioniert auch nicht 
(irgendwie logisch)

oder

2) Du verwendest ein Programm das a) veraltet und nicht für 628geeignet 
ist oder b) hinüber oder falsch gecrackt ist oder c) deine 
Prgrogrammer-Software respektive dein Programmer ist teil-defekt oder d) 
du den falschen Device eingestellt (Compiler / Programmer)...

Du könntest mal mit nem Simulator hingehen und ein bischen die Register 
begutachten, ob dein Code überhaupts korrekt ist ...

Autor: Sebastian Hepp (sebihepp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst den Timer auch konfigurieren und starten. ;)

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian Hepp schrieb:
> Du musst den Timer auch konfigurieren und starten. ;)

Tut er doch!

Autor: Kaila (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso kein goto verwenden?? Schaut euch mal den Linux-Kernel 2.2/2.4 an!
Da wimmelt es von gotos!

Und eine goldene Regel: Bei Verwendung von goto niemals NIE NIE NIE nach 
oben springen!!! Nach unten ist haeufig kein Problem!

der Kaila

Ps: Wer mit Fortran gross geworden ist ...;-)))

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kaila schrieb:
> Wieso kein goto verwenden?? Schaut euch mal den Linux-Kernel 2.2/2.4 an!
> Da wimmelt es von gotos!
>
> Und eine goldene Regel: Bei Verwendung von goto niemals NIE NIE NIE nach
> oben springen!!! Nach unten ist haeufig kein Problem!
>
> der Kaila
>
> Ps: Wer mit Fortran gross geworden ist ...;-)))

Jaaahaaa aber nicht auf dem Microcontroller !!!

Autor: Michael Skropski (rbs_phoenix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe in meinem Programm auch 2 Goto's drinne, hab ich allerdings 
noch nicht getestet. Nur warum ist dann auf der CC5X-Seite genau das 
Beispiel gegeben, eine Schleife mit einem goto (also auch Sprung nach 
oben), wenn es angeblich nicht mit dem cc5x-Compiler geht?

Programm von cc5x.de:


#include <C:\cc5\16F84.h>      // Prozessor-Typ definieren

void main(void)          // Start des Hauptprogramms
{

char a;          // Variable a irgend ein freie Byte in RAM
char b;          // Variable b irgend ein freie Byte in RAM
char c @ 0xD;        // Variable c ist  Byte 14(D hex) in RAM

TRISB = 0b.0000.0000;      // Alle Pins des Ports B sind Ausgänge
a=7;          // "a" wird Wert 7 zugewiesen
b=5;          // "b" wird Wert 5 zugewiesen
Sprungmarke:

c=a*b;          // Multiplikation mit 5, Ergebnis ins "c"
PORTB=c;        // Ergebnis in PortB übertragen

goto Sprungmarke;      // Endlosschleife
}          // Ende des Hauptprogramms

Autor: Kaila (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Jaaahaaa aber nicht auf dem Microcontroller !!!
Warum nicht? Ist der SDCC so schlecht oder liegt es nur daran, dass man 
als Softi auf den einschlägigen Unis beigebogen bekommt: NIE NIE NIE 
goto???
Wenn man weiss, was man tut, spricht nichts gegen goto, auch auf dem uC 
nicht...
der Kaila

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kaila schrieb:
>> Jaaahaaa aber nicht auf dem Microcontroller !!!
> Warum nicht? Ist der SDCC so schlecht oder liegt es nur daran, dass man
> als Softi auf den einschlägigen Unis beigebogen bekommt: NIE NIE NIE
> goto???
> Wenn man weiss, was man tut, spricht nichts gegen goto, auch auf dem uC
> nicht...
> der Kaila

Ich will hier garnicht groß mit dir diskutieren. Es ist mir auch egal ob 
das der und der Compiler kann oder dieser jene nicht. Darum geht es 
nicht.

Fakt ist einfach: Man macht es nicht. Ich kenne viele Programme auf 
einer riesen Bandbreite von Microcontrollern. Und ich kann dir 
versichern: Ich habe in noch keinem professionellen / 
semiprofessionellen C Code ein goto gesehen.
Gleiches gilt für Hobbyprojekte: Ich kenne keinen der je ein goto 
verwendet. Oder link du mir mal ein vernünftiges Projekt wo ein goto 
vorkommt.

Goto verwenden Leute die irgendwo versuchen C beizubringen. Das 
allerdings völlig falsch. Das ist einfach ein Anfängerfehler. Keiner 
der's kann wird das je tun. Wer sich ein vernünftiges C-Buch kauft oder 
ein Tutorial macht der macht sowas bestimmt nicht.

Und ob du's nun willst oder nicht - es gibt durchaus Problem mit goto 
auf Microcontrollern. Welche Compiler / Controller betroffen sind kann 
und will ich nicht abschätzen. Ich weiss nur, dass es Probleme geben 
kann. Ich hab's allerdings noch nie ausprobiert.
Der Threadersteller wäre allerdings nicht der erste der einen Code mit 
goto postet der nicht funktioniert.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kaila schrieb:

> Wenn man weiss, was man tut,

Du sagst es.
Neulinge wissen selten was sie tun.
Bei denen führt goto meistens schnurstracks zum Spaghetticode.

Auch wenn goto sein Anwendungen hat (speziell wenn es darum geht, die 
längst fällig Fehlerbahndlung in eine Funktion nachträglich 
reinzupimpen). in den meisten Fällen ist er schlicht und ergreifend 
unnötig, wie zb im hier gezeigten Beispiel und sollte besser durch 
stukturierte Alternativen ersetzt werden



0b.0000.0000   ?
Ist das wirklich gültige Syntax in deinem Compiler? Sieht ungewöhnlich 
aus.
Ersetz mal durch
TRISB = 0;

'char': Den Datentyp char willst du nur benutzen, wenn du es mit 
Zeichenverarbeitung im Sinne von Textverarbeitung zu tun hast. In den 
anderen Fällen (wenn man einfach nur einen kleinen Integer braucht) 
nimmt man "signed char" bzw. "unsigned char", respektive "int8_t" bzw. 
"uint8_t"

char c @ 0xD;        // Variable c ist  Byte 14(D hex) in RAM
Wenn es keinen speziellen, wirklich guten Grund gibt, warum Variablen an 
bestimmte Speicherpositionen müssen, dann überlassen wir es dem 
Compiler/Linker die Variablen im Speicher anzuordenen und mischen uns da 
nicht ein.

#include <C:\cc5\16F84.h>
Der Compiler weiß selber, wo die System Header Files installiert wurden 
und wo er die finden kann. Mit einer Pfadangabe an dieser Stelle baut 
man sich nur eine nicht notwendige Abhängigkeit auf deine spezielle 
Entwicklungsplattform ein.
#include <16F84.h>       // Prozessor-Typ definieren

void main(void)          // Start des Hauptprogramms
{
  unsigned char a;       // Variable a irgend ein freie Byte in RAM
  unsigned char b;       // Variable b irgend ein freie Byte in RAM
  unsigned char c;       // Variable c ist  Byte 14(D hex) in RAM

  TRISB = 0;             // Alle Pins des Ports B sind Ausgänge
  a = 7;                 // "a" wird Wert 7 zugewiesen
  b = 5;                 // "b" wird Wert 5 zugewiesen

  while( 1 ) {
    c = a * b;           // Multiplikation mit 5, Ergebnis ins "c"
    PORTB = c;           // Ergebnis in PortB übertragen
  }
}                        // Ende des Hauptprogramms

Autor: Kaila (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Goto verwenden Leute die irgendwo versuchen C beizubringen. Das
>allerdings völlig falsch. Das ist einfach ein Anfängerfehler. Keiner
>der's kann wird das je tun. Wer sich ein vernünftiges C-Buch kauft oder
>ein Tutorial macht der macht sowas bestimmt nicht.
Tja, ich mit meinen 17 Jahren Berufserfahrung im Embedded-Engineering 
brauche mir C nicht mehr beibringen ;-) Zu lange gemacht. Goto ist schon 
seit Jahren nicht mehr dabei gewesen. Ich habe es frueher immer benutzt. 
um Code zu sparen. Das war vor 15 Jahren noch noetig.
Hab auch keine Lust mehr, zu diskutieren. Wenn es mir in den Kopf kommt, 
benutzte ich es. Ob einer sagt, das ist professionell oder nicht. In 
China faellt 'ne Schaufel um!
der Kaila

Autor: -Gast_XIV (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal Hand auf's Herz.  Stefan hat  gefragt welcher C Compiler für seine 
Pic's geeignet scheint und ob der Code so passt.

Ist da die Frage Goto or NoGoto nicht ein wenig off topic?

Das Goto die Struktur verwuselt wird er über kurz oder lang schon selbst 
bemerken.


Off Topic :
Mit Basic hat das nichts zu tun, auch dort ist die Zeit nicht stehen 
geblieben. Die Pointer, Stack Overflows und der andere Wahnsinn den die 
strukturelle Write Only language "C" so bietet sind auch nicht das gelbe 
vom Ei und letzlich macht auch der tollste Compiler aus jedem 
superstrukturiertem Code wieder - na was wohl - simple Gotos.

Autor: Michael Skropski (rbs_phoenix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich finde das ansich kein Off-Topic. Denn ich denke der 
Threadersteller will auch wissen, warum der Code eventuell nicht 
funktioniert und wie man es besser machen kann.

Ich habe mir von den C-Programmen, die ich mit CC5X compiliert habe, 
meistens eine zusätzliche asm-Datei gemacht und mir die angeguckt (als 
Kommentare steht dort ja noch zusätzlich der C-Code).
Dort sind die einzelnen Funktionen als Diese auch vorhanden und werden 
über Call aufgerufen (also für den Stack-Speicher ist return wichtig). 
Also darf (oder kann?) man nicht von einer Funktion per goto in eine 
Andere springen. Schleifen, Bedingungen etc. sind meist mit btfss oder 
btfsc und einem goto Befehl dahinter realisiert. Darum bitte ich um eine 
gute Beschreibung, warum ein goto Befehl in ASM fast immer verwendet 
wird, in C aber eine Straftat sein soll. Also besser als, "das macht man 
nicht" oder "Professionelle nehmen es auch nicht". Außerdem nehme ich 
an, dass es den Befehl in C deshalb gibt, damit man ihn benutzen kann.

Autor: Kaila (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine beiden Vorredner scheinen etwas kritischer zu sein und sagen 
offensichtlch niemals NIE. Vernuenftig.

Um auf das Problem zurueckzukommen. Ich benutze den SDCC mit GPUTILS und 
GPSIM. Mit dem Simulator kann ich zumindest pruefen, ob das Programm 
logisch funktioniert, also sozusagen eine Durchführung einer 
Verhaltensanalyse. Funktioniert dann das Programm nicht auf dem PIC, 
dann liegt es meistens am Konfigurationswort oder es ist nicht richtig 
geflashed worden. Mit der geeigneten IDE (PIKLAB) kann man wunderbar 
Flash, EEPROM + Konf-Wort zureucklesen und vergleichen.
der Kaila

Autor: nummernschalter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der 16F628 ist für C alles andere als geeignet. Es ist schlichtweg zu 
klein, gerade mal 224 Register (RAM). Assembler ist hier die erste Wahl.

Andererseits gibt es einen "pic simulator" aus Osteuropa, welcher auch 
BASIC-Programme auf so kleinen Kameraden zum Laufen bringt.

Autor: Michael Skropski (rbs_phoenix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab auf dem 16F84A auch ein C-Programm zum laufen gebracht. So wie 
ich das bisher gehört und verstanden habe ist das resultierende Programm 
eines C-Codes nur unnötig größer, als wenn man es direkt mit Assembler 
programmiert, weshalb es eigentlich für jeden PIC gehen sollte. Dafür 
ist es halt mit C bedeutend einfacher. Doch wenn das Programm größer 
ist, als Platz auf dem PIC, würde ich eher einen anderen PIC wählen, als 
das ganze nochmal in Assembler zu machen. Und ich glaube, der 
cc5x-compiler erkennt auch, wenn ein Programm zu groß ist bzw. wenn eine 
nicht existierende Adresse beschrieben werden soll.


nummernschalter schrieb:
> Es ist schlichtweg zu
> klein, gerade mal 224 Register (RAM)

Der 16F84A hat 68 glaube ich und da gings wie gesagt auch. Hat aber 
ansich doch nur was mit benutzten Variablen zutun, denn das Programm 
wird ja in einen anderen Speicher geschrieben (bei 16F628A ist der 
3,5kB). Also sollte ein einfaches Programm, dass viel kleiner ist als 
die 3,5kB und dazu vielleicht nur 10 Variablen benutzt, kein Problem 
sein. Denn ob der Hex-Code von einem C-Compiler kommt oder vom 
ASM-Compiler, merkt der PIC ja nicht. Und das der Compiler das richtig 
macht, merkt man ja anhand von Simulation bzw. größeren PICs.

Autor: nummernschalter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der 16F628 hat nur 2048 x 14 Bit Speicher und die Register (abgesehen 
von den wenigen Universalregistern) sind über Speicherbankumschaltung 
erreichbar. Das muß schon ein ausgeklügelter Compiler sein...

Um das Teil wirklich effektiv zu nutzen, kommst Du um Assembler nicht 
herum.

Autor: Michael Skropski (rbs_phoenix)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Wie ich gesagt habe, 3,5kB Programmspeicher (siehe bild hp.png). Und es 
gibt ja 1-, 2- und 3-Byte Befehle, also sollte das Platz genug für ein 
simples Lauflicht sein. Zudem glaube ich, zeigt cc5x am Ende des 
Compilens an, wie groß das Programm geworden ist. Und ist das unter 2k 
Words oder unter 3,5kB sollte das Platzmäßig kein Problem sein.

Dazu (siehe Bild speicher.png) ist der RAM zwar in unterschiedlichen 
Banken, allerdings haben sie trotzdem eigene Adressen. Ich denke mal, 
der Compiler wird wissen, welche Bank-Größe und Anzahl der PIC hat und 
kann dadurch bestimmen, welche Bank geschaltet werden muss (0x00 bis 
0x7F = Bank 0, 0x80 bis 0xFF = Bank 1, etc.). Schließlich kann er auch 
Problemlos die TRIS-Register beschreiben, wo in der header-Datei auch 
nur die Adresse 0x85 für TRISA angegeben ist.

Doch wie gesagt, so hab ich es gelesen und hab es anders auch noch nicht 
erlebt. Allerdings hatte ich bisher auch noch nicht soviel Variablen, 
dass die 96 Byte in der Bank0 immer ausreichend waren. Falls das alles 
nicht stimmt, belehrt mich eines Besseren.

MFG RBS_Phoenix

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

Bewertung
0 lesenswert
nicht lesenswert
Hier mal ein Beispielprogramm, welches dir auf PORTB
alle LEDs einschaltet und wieder aus.
Der µC läuft auf 4MHz.

Autor: -Gast_XIV (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Skropski schrieb:
> Also ich finde das ansich kein Off-Topic. Denn ich denke der
> Threadersteller will auch wissen, warum der Code eventuell nicht
> funktioniert und wie man es besser machen kann.

Nur führst du ihn auf's Glatteis da er den Fehler im Compiler suchen 
wird und nicht bei Dingen die einfach näher liegen (Init Fuses etc)

>
> Ich habe mir von den C-Programmen, die ich mit CC5X compiliert habe,
> meistens eine zusätzliche asm-Datei gemacht und mir die angeguckt (als
> Kommentare steht dort ja noch zusätzlich der C-Code).

Was wohl für die meisten Compiler gilt

> Dort sind die einzelnen Funktionen als Diese auch vorhanden und werden
> über Call aufgerufen (also für den Stack-Speicher ist return wichtig).



> Also darf (oder kann?) man nicht von einer Funktion per goto in eine
> Andere springen.

Natürlich kannst du das machen, nur wird dann ein anderes 
(unleserliches) Programm daraus.

> Schleifen, Bedingungen etc. sind meist mit btfss oder
> btfsc und einem goto Befehl dahinter realisiert.

So ist es, auch der branch Befehl selber ist ein Goto auf Microcode 
Ebene.

> Darum bitte ich um eine
> gute Beschreibung, warum ein goto Befehl in ASM fast immer verwendet
> wird, in C aber eine Straftat sein soll.

Nun eine gute Beschreibung kann ich dir nicht liefern aber eine Meinung.
Das verwenden von Strukturen mit Verzicht auf Goto zwingt einfach zu 
"besserer" Programmierung da man sich Gedanken darüber machen muss das 
Problem in Software besser (oder überhaupt mal) abzubilden.


> Also besser als, "das macht man
> nicht" oder "Professionelle nehmen es auch nicht". Außerdem nehme ich
> an, dass es den Befehl in C deshalb gibt, damit man ihn benutzen kann.

Ist schon richtig drauf zu verzichten s.o. Die gleiche Frage kannst du 
auch bei Zeilennummern oder dem "Compile" Befehl stellen. Letzlich sind 
die heutigen Entwicklungssysteme so leistungsfähig das Sie im 
Hintergrund compilieren können. Gibst halt so lange nichts ein bis Sie 
fertig sind oder den Make komplett durchlaufen haben. Gewohnheitssache

Autor: Michael Skropski (rbs_phoenix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich hab ein Programm im Moment so:
Auf Eingabe der ersten Zahl warten

erste Zahl anzeigen

Auf Eingabe der zweiten Zahl warten

zweite Zahl anzeigen

Auf Eingabe der dritten Zahl warten

dritte Zahl anzeigen

Auf Bestätigung warten

Zeitschleife

Das Programm ist für ein Belichtungsgerät. Am µC sind drei 
7-Segment-Anzeigen und die Tasten 0-9, Start und Cancel. Ich will die 
erste Zahl Eingeben (1er Sekunden), dann die zweite (10er Sekunden) und 
dann die dritte (1er Minuten). Am Ende steht also die Zeit da und mit 
druck auf Start wird die eingegebene Zeit ein Relais geschaltet.

Ich möchte jedoch, wenn ich die 2te Zahl eingeben soll, per Druck auf 
Cancel zurück zur Eingabe der ersten Zahl. Das gleiche von 3 zu 2 und 
von Bestätigung zu 3.
Also habe ich im Moment vor dem Warten von z.b. der ersten Zahl eine 
Sprungmarke "gobackeins". Wenn ich die 2te Zahl eingeben soll, drücke 
aber Cancel, soll er zu "gobackeins" springen. Sonst müsste ich über 
jede Tastenabfrage ein if setzen, damit das Programm bis zum Ende 
durchläuft, alles überspringt, um dann zur ersten Eingabe zu kommen.

In dem Beispiel denke ich mir, dass der Befehl goto das gewünschte Ziel 
am einfachsten löst, oder sehe ich das falsch? (Bitte nicht einfach nur 
schreiben, nein ;) )

Autor: -Gast_XIV (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Skropski schrieb:
> Ich möchte jedoch, wenn ich die 2te Zahl eingeben soll, per Druck auf
> Cancel zurück zur Eingabe der ersten Zahl. Das gleiche von 3 zu 2 und
> von Bestätigung zu 3.

Das ist m.E und ohne jetzt lange nachgedacht zu haben ein Pardebeispiel 
wo goto sinnlos ist.

Mit Select Case in Basic bzw Switch in C wird das übersichtlicher

Autor: nummernschalter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... so kann man Programmspeicher auch "aufblasen". 2048x14 entsprechen 
rein rechnerisch natürlich 3584x8, also 3,5kB. Wer kommt denn auf sowas 
?

Autor: Michael Skropski (rbs_phoenix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-Gast_XIV schrieb:
> Mit Select Case in Basic bzw Switch in C wird das übersichtlicher

shit.. da hast du natürlich recht ;)


nummernschalter schrieb:
> 2048x14 entsprechen
> rein rechnerisch natürlich 3584x8, also 3,5kB

Hab das nur erwähnt, weil ich geglaubt habe, dass der cc5x compiler die 
Programmgröße in KB und nicht in KWord ausgibt. Aber es ist anders rum, 
es tut mir sehr leid ;) Ich habe ein Programm geschrieben, weil ich was 
testen wollte: LED an, 5 sec warten, LED aus, 5 sec warten und wieder 
von vorn. Ausgabe vom Compiler:
Total of 40 code words (3 %)

Da ist noch Luft bis 2048, und so viel mehr Wörter hat ein Lauflicht 
auch nicht. Mir gehts ansich auch Hauptsächlich um diese Aussage:

nummernschalter schrieb:
> Der 16F628 ist für C alles andere als geeignet. Es ist schlichtweg zu
> klein, gerade mal 224 Register (RAM).

Selbst wenn 2048 Wörter wenig ist, ist es trotzdem genug für ein 
C-Programm, dass compiliert nur ca. 100 Wörter (wenn überhaupt) hat. 
Benutzte Ram-Adressen sind bestimmt auch höchstens 10 und passt somit 1. 
in ein 224 Byte Speicher und 2. in die Bank0, wo es also auch nicht am 
umschlaten liegen kann.

Autor: -Gast_XIV (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Michael Skropski schrieb:
> Selbst wenn 2048 Wörter wenig ist, ist es trotzdem genug für ein
> C-Programm, dass compiliert nur ca. 100 Wörter (wenn überhaupt) hat.

Nun da will ich als Basic Fan mal mein Program beisteuern (s. Anhang)

Autor: Michael Skropski (rbs_phoenix)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So ich habe das Programm vom Threadersteller mal (mit while(1) statt 
goto) als C, compilierte Hex und ASM hochgeladen und die .occ auch 
gleich mal mit.
Aufgeführt: C:\....\CC5X.EXE test.c -atest.asm

Ich habe das Programm mal mit der Demo von Proteus simuliert, das 
Lauflicht geht auch, nur werden RB4-7 nicht geschlatet, evtl. muss da 
noch was in Richtung AD-Wandler oder so eingestellt werden. Doch sonst, 
Compiler macht kein Error und wie gesagt funktioniert es ansich auch.


Wäre auch mal schön, wenn er mal sagt, wie es bei ihm aussieht ;)

PS:
 Chip = 16F628A
 RAM : -------- -------- -------- -------- ===***** ******** ******** ********
  40h: ******** ******** ******** ******** ******** ******** ******** ********
  80h: -------- -------- -------- -------- ******** ******** ******** ********
  C0h: ******** ******** ******** ******** ******** ******** -------- --------
 100h: -------- -------- -------- -------- ******** ******** ******** ********
 140h: ******** ********
RAM usage: 3 bytes (3 local), 221 bytes free
 Optimizing - removed 1 instructions (-1 %)
 File 'test.asm'
 File 'test.occ'
 File 'test.hex'
Total of 63 code words (3 %)

Wie zusehen ist, überall noch viel Platz.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Toll die Sache mit dem Goto. Die ist zwar nicht das Problem aber man 
kann diskutieren. Würd mal jemand was dazu sagen, der ein wenig mehr 
weiß?

Also ich hab mit dem PIC16F64 Probleme, dass der CCX5 mir die 
Configurationsbits nicht setzen (richtig) kann und auch der Code wird 
mehr als unbrauchbar umgesetzt. Hier kann ich nur empfehlen sich mal 
nach einer Alternative umzuschaun. Vielleicht liegts auch an der IDE, 
ich hab da MPLAB in Verwendung.

Autor: -Gast_XIV (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Also ich hab mit dem PIC16F64 Probleme, dass der CCX5 mir die
> Configurationsbits nicht setzen (richtig) kann und auch der Code wird
> mehr als unbrauchbar umgesetzt. Hier kann ich nur empfehlen sich mal
> nach einer Alternative umzuschaun. Vielleicht liegts auch an der IDE,
> ich hab da MPLAB in Verwendung.

Gab es deise Frage hier nicht schon einmal? Im ersten Posting?

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.