Forum: Mikrocontroller und Digitale Elektronik Programmiersprache - C oder Assembler?


von Markus (Gast)


Lesenswert?

Hallo Community,


ich möchte mir für eine Steuerung eines Bus Systems einen 
Mikro-Controller programmieren. Ich habe bisher alles mit SPS gemacht, 
hier stößt man aber schnell auf Grenzen der Wirtschaftlichkeit.

Die Frage ist nun, in welcher Sprache ich mein Projekt am schnellsten 
erlernen und realisieren kann.

Im Projekt schaut so aus:

Eingang analog 4-20 mA, Digital wandeln. Mittelwert von 3 Sekunden, 3 
Abtastungen digital wandeln in 10 verschiedenen Schaltstufen.

Je nachdem welche Schaltstufe ermittelt wird, soll ein fester Befehl 
über den UART verschickt werden, 9200 Baud, 8N1. Der Befehl ist 8 Bit 
lang, und 4 Bytes. [Startbyte] [Adressbyte] [Parameterbyte] [Checksum]

Mit welcher Sprache kann ich sowas am schnellsten erlernen?

Assembler erscheint mir auf den ersten Blick logischer und einfacher.

Und noch eine Frage vorweg. Kann der UART mit Nutzdaten gefüttert 
werden, die Start und Stoppbits eigenständig dazu setzen? Oder müssen 
diese Bits von Hand mitprogrammiert werden?


Danke!

von avr (Gast)


Lesenswert?

Markus schrieb:
>Assembler erscheint mir auf den ersten Blick logischer und einfacher.
Wenn du weder C noch ASM kannst nimm ASM. Das ist zwar aufwändiger aber 
lernt sich schneller als C.
> Und noch eine Frage vorweg. Kann der UART mit Nutzdaten gefüttert
> werden, die Start und Stoppbits eigenständig dazu setzen?
Ja.
> Oder müssen
> diese Bits von Hand mitprogrammiert werden?
Nein. Näheres im Datenblatt des verwendeten Controllers.

von Werner (Gast)


Lesenswert?

Markus schrieb:
> Und noch eine Frage vorweg. Kann der UART mit Nutzdaten gefüttert
> werden, die Start und Stoppbits eigenständig dazu setzen? Oder müssen
> diese Bits von Hand mitprogrammiert werden?

Bei einem Software-UART muß man sich natürlich darum kümmern, beim 
Hardware-UART werden Start- und Stopbit gewöhnlich durch die Hardware 
automatisch erzeugt. Darüber gibt i.A. das Datenblatt des betreffenden 
µCs Auskunft.

von spess53 (Gast)


Lesenswert?

Hi

>Und noch eine Frage vorweg. Kann der UART mit Nutzdaten gefüttert
>werden, die Start und Stoppbits eigenständig dazu setzen?

Ja.

>Die Frage ist nun, in welcher Sprache ich mein Projekt am schnellsten
>erlernen und realisieren kann.

>Im Projekt schaut so aus:

>Eingang analog 4-20 mA, Digital wandeln. Mittelwert von 3 Sekunden, 3
>Abtastungen digital wandeln in 10 verschiedenen Schaltstufen.

Das Problem ist eher trivial. Such dir eine Programmiersprache die dir 
gefällt aus. In beiden Fällen wirst du die erst mal mehr mit dem 
Controller beschäftigen müsse.

MfG spess

von sebastian (Gast)


Lesenswert?

Hi,

da du, deinem Post zu folgen, wohl noch nichts mit uPC gearbeitet hast, 
gibt es neben dem erlernen der Programmiersprache auch noch weiter 
herausforderungen für dich. Du mußt dich, anders als bei einer SPS, 
damit auseinandersetzten wie du z.B. den Oszillator ansteuerst, 
Interrups auswetest, timer setzten, I/Os ber Special function register 
configurierst usw....

Als Einstieg eignet sich IMHO das MSP430 Launchpad (~5€) ideal.
Hier findest du einen sehr guten einführungsworkshop und viele 
Beispielprojekte. Auch die tools (bis 16k) bekommst du Kostenlos.
siehe: http://e2e.ti.com/group/msp430launchpad/w/default.aspx

Deiner Projektbeschreibung zu folge sollte das mit +/- 40 Zeilen C-Code 
auf einem MSP430 implementieren können.

viel spaß

von avr (Gast)


Lesenswert?

sebastian schrieb:
> Deiner Projektbeschreibung zu folge sollte das mit +/- 40 Zeilen C-Code
> auf einem MSP430 implementieren können.
Wenn man die Sprache kann... (und da gibt es bekanntlich einige 
Fallstricke). 430 ist imho unnötig kompliziert, da reicht wohl auch ein 
kleiner AVR.

von Ralph (Gast)


Lesenswert?

Markus schrieb:
> Die Frage ist nun, in welcher Sprache ich mein Projekt am schnellsten
> erlernen und realisieren kann.

C

Markus schrieb:
> Mit welcher Sprache kann ich sowas am schnellsten erlernen?

C

Markus schrieb:
> Assembler erscheint mir auf den ersten Blick logischer und einfacher.

Auf den ersten Blick magst du da recht haben.
Du wirst aber dabei über viele kleine Hinterhältigkeiten und Fallen 
stolpern. Ganz besonderst im Bereich Speicheradressierung.

Ein C Compiler nimmt dir sehr viel dieser Fallstricke weg indem der 
Compiler Speicherzugriffe, Speicheradressen,.... selbstständig regelt.

Du kannst dich also im großen und ganzen auf diene Programmlogik 
konzentrieren und musst dich nicht darum kümmern wie die Bits bei einer 
Addition,...... durch den µC geschoben werden.

Abgesehen davon, wenn du C lernst ist es nahezu egal wo du lernst, µC , 
Pc , ..... C bleibt C . ( zumindest wenn du dich an die ANSI Normen 
hälst)
Assembler ist auf jedem Prozessor unterschiedlich wobei innerhalb einer 
Familie doch meist sehr ähnlich.


Allerdings kann es auch nichts schaden wenn zumindest Grundkenntnisse 
Assembler für den verwendeten µC vorhanden sind. Es erleichtert das 
Debuggen ungemein.

von spess53 (Gast)


Lesenswert?

Hi

>Auf den ersten Blick magst du da recht haben.
>Du wirst aber dabei über viele kleine Hinterhältigkeiten und Fallen
>stolpern.

Und die hat C natürlich deiner Meinung nach nicht.

MfG Spess

von sebastian (Gast)


Lesenswert?

avr schrieb:
> 430 ist imho unnötig kompliziert, da reicht wohl auch ein
> kleiner AVR.

Ja, AVR oder PIC gehen natürlich auch genauso einfach.

Persönlich finde ich z.Zt. die MSP430 unschlagbar:
- Preis/Leistung sehr gut
- 16 bit
- gute Doku
- gute Bibliotheken (auch für SW UART)
- Kostenlose Toolchain (zumindest für die 16k value line)
- super preiswerter einstieg mit dem launchpad

Persönlich ist es mir egal wer was für einen chip einsetzt. d.h ich 
hänge keiner uPC religion an ;-)

Ich habe schon Projekte (privat/studium/job) mit AVR, PIC, 8051, arm7, 
cortex m3 ,c166, 68k, ppc e200z und alle haben Vor und Nachteile, so 
what..

von Ralph (Gast)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Auf den ersten Blick magst du da recht haben.
>>Du wirst aber dabei über viele kleine Hinterhältigkeiten und Fallen
>>stolpern.
>
> Und die hat C natürlich deiner Meinung nach nicht.
>
> MfG Spess

Die hat jeder Programmiersprache, aber bei weitem nicht in dem Umfang 
wie in Assembler.
Die Compiler und Interpreter der höheren Sprachen nehmen doch einiges an 
Fallen raus die man als Programmierer in Assembler immer wieder mal 
trifft.

von spess53 (Gast)


Lesenswert?

Hi

>Die Compiler und Interpreter der höheren Sprachen nehmen doch einiges an
>Fallen raus die man als Programmierer in Assembler immer wieder mal
>trifft.

Na welche denn, die nicht im Datenblatt stehen?

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Ergänzung:

...nicht im Datenblatt oder Instruction Set stehen?

MfG Spess

von 16 ist mehr (Gast)


Lesenswert?

avr schrieb:
> 430 ist imho unnötig kompliziert, da reicht wohl auch ein
> kleiner AVR.

Jeder kleine AVR ist komplizierter als der MSP430. Schon dieser FUSE 
Kram zur Konfiguration ist nicht mehr zeitgemäß.

Ja, ich habe schon mit beiden Achitekturen gearbeitet.

von Ralph (Gast)


Lesenswert?

Na es ist schon einiges an Übung und Erfahrung nötig um eine Spec so 
eindeutig lesen und verstehen zu können, ganz besonders für die 
Zusammenhänge die zwischen den Zeilen stehen.

Und außerdem sind solche Specs von Leuten geschrieben die Wissen von was 
sie schreiben, und für Leute die Wissen was sie da lesen. Das ist kein 
Stoff für Anfänger weil einfach zuviel vorausgesetzt wird.

Für einen Anfänger ist das schon eine gewaltige Herausforderung sich um 
jeden kleine Furz zu Fuß kümmern zu müssen.
Und bietet eine gewaltiges Frustpotential.

Was hat ein Anfänger damit gewonnen wenn er nach ein paar Monaten seinem 
Ziel keinen Schritt nähergekommen ist, weil er immer noch drum kämpft 
warum zb das CaryBit im Fall A nach Register xx geschoben wird und im 
Fall B ignoriert wird.
Und das nur weil er zwei Zahlen multiplizieren will.....

Was hat das mit der eigentlichen Aufgabenstellung zu tun.
Lass so einen kleinschiss den Compiler machen, der kann das besser, und 
vor allem vergisst er auch bei der 40 Wiederholung im sourcecode nicht 
irgendeinen Zwischenschritt.

Erst mal sehen das die eigentliche Programm Logik zum laufen kommt. ==> 
erste Erfolgserlebnisse.
Der tiefer Einstieg in die Details eines µC kommt dann im Lauf der Zeit 
von alleine.



Meiner Meinung nach ist Assembler für einen Einstieg in µC einfach eine 
Nummer zu heftig. Und wird oft durch viel Frust das Thema µC für 
denjenigen beenden. und das wäre Schade.

von holger (Gast)


Lesenswert?

>Jeder kleine AVR ist komplizierter als der MSP430. Schon dieser FUSE
>Kram zur Konfiguration ist nicht mehr zeitgemäß.
>
>Ja, ich habe schon mit beiden Achitekturen gearbeitet.

Heute nimmt man ARM. Ich kenne PIC, AVR, 8051 und noch
ein paar mehr. Erst mit ARM wird man glücklich.

Kein Code Banking, kein PROGMEM Geraffel und der
sonstige Unsinn. Programmiert wird natürlich in C.

von Rich (Gast)


Lesenswert?

holger schrieb:
> Heute nimmt man ARM.

Du fliegst auch mit einem Hubschrauber Zigaretten holen ;-)

von sebastian (Gast)


Lesenswert?

holger schrieb:
> Heute nimmt man ARM. Ich kenne PIC, AVR, 8051 und noch
> ein paar mehr. Erst mit ARM wird man glücklich.

Ja und heute nimmt man auch keine Fliegenklatsche um eine Mücke zu 
erlegen sonder schickt eine cruise missile?

Gerade für den Anfänger ist der ARM (acuh aufgrund des interrup 
handlings) nicht wirklich zu empfehlen (IMHO)

von Jobst M. (jobstens-de)


Lesenswert?

Ist das hier mal wieder der übliche C/ASM Flamewar?
Natürlich nimmt man Spin! :-P

Im Ernst: Ein so kleines Projektchen läßt sich prima in ASM umsetzen. 
Denn auch wenn man C lernt, empfiehlt es sich mit ASM den Controller 
erst mal kennen zu lernen.

Preislich nehmen sich ARM, AVR, PIC, MSP430 und 8051 nicht viel. Da von 
Hubschraubern zu sprechen, finde ich unangemessen, auch wenn der ARM mit 
der Aufgabe hoffnungslos unterfordert ist - die anderen sind es auch!

Für das von Dir geschilderte Problem würde ich einen ATmega48 benutzen. 
Der hat einen ADC und eine Hardware UART. Und ich würde es in ASM lösen. 
Ich denke, auch in ASM ist das mit <40 Zeilen Code realisierbar.

Gründe für meine uC-Auswahl:
PIC scheidet für mich aus, da ich mich damit nicht auskenne. (Ich habe 
damals die Finger davon gelassen, als ich die 'krummen' Registergrößen 
gesehen habe.)
ARM scheidet aus, da für Anfänger zu umständlich - auch in C.
Die kleinen 8051 haben häufig keinen ADC.
Die ATtinys haben keine UART. Für einen Anfänger möchte ich die SW-UART 
vermeiden.
Die kleinen MSP430 haben keine UART und keinen ADC - zumindest die, die 
ich kenne.
Den ATmega48 ziehe ich dem ATmega8 vor, da er moderner ist.


Gruß

Jobst

von oldmax (Gast)


Lesenswert?

Hi
Nun noch meine Meinung....
Wenn du von der SPS Seite kommst, wirst du wohl eher mit Assembler 
zurecht kommen wie mit "C". Die AWL einer SPS ist dem Assembler sehr 
ähnlich. Allerdings, wenn du mathematische Funktionen brauchst, ist C 
die bessere Wahl. Aber um jetzt schnell einen Erfolg zu sehen, denk ich, 
solltest du erst mal mit Assembler ein wenig üben.
Ubrigends.... ich will auch mal wieder klugsch....

>Ergänzung:

>...nicht im Datenblatt oder Instruction Set stehen?
Das Instuction Set steht im Datenblatt....


Gruß oldmax

von spess53 (Gast)


Lesenswert?

Hi

>Das Instuction Set steht im Datenblatt....

Aber nur als Übersicht.

MfG Spess

von Ralph (Gast)


Lesenswert?

Jobst M. schrieb:
> Denn auch wenn man C lernt, empfiehlt es sich mit ASM den Controller
> erst mal kennen zu lernen.

1.  geht das auch in C ganz gut.

2.  wie tief willst du da in den µC einsteigen ?
Mann muss in C gar nicht wissen wie eine Multiplikation einer 32 bit mit 
einer 64 bit Zahl auf einem 8 bit µC gemacht wird.
Es ist VÖLLIG egal. Der Compiler weiß es und macht das für dich.
Wer natürlich meint das er eine solche Multiplikation besser als der 
Compiler hinbekommt, der soll sich daran gerne versuchen.
Und wenn er dann fürs nächste Projekt eine andere µC Familie nutzen 
muss, fängt er wieder von vorne an. Damit hat er dann viel 
gewonnen.......

Nur mal als Beispiel, wenn du Auto fährst willst du auch nur wissen das 
ein Tritt aufs Gaspedal das Auto beschleunigt.
Es interessiert dich gar nicht welche Ventile, Hebel, Klappen, 
Zahnräder,...... sich da Bewegen müssen.

Das gleiche bei µC, du willst eine Logik die irgendwo zu bestimmten 
Bedingungen zb eine Lampe anmacht.
Es interessiert dich gar nicht welche Bits, Register, Speicherstellen, 
...... sich da Bewegen müssen.

Von der Seite aus, Assembler ist ganz nett, man sollte es zumindest in 
Grundzügen zum debuggen können. Aber dann hat es sich damit auch schon.


Und zur Auswahl des µC.
Man bekommt in jeder Familie ; PIC; AVR; 805x; ARM; irgendetwas 
passendes was von Größe, Leistung, Preis einen brauchbaren Kompromiss 
darstellt.

Viel wichtiger ist die Entwicklungsumgebung.
Man muss sich hier etwas suchen mit der man klarkommt, die alles bietet 
was benötigt wird, dazu bei einem akzeptablen Preis verfügbar ist.

von Icke ®. (49636b65)


Lesenswert?

Bevor man auf ein Mopped steigt, sollte man erst mal richtig gehen 
können. Auch die meisten Rennfahrer laufen vorher die Strecke zu Fuß ab, 
weil man die Unebenheiten besser erkennen kann.

Es schadet definitiv nicht, die Hardware zunächst auf unterster Ebene 
kennenzulernen, man versteht sie so einfach besser. Wenn dann die Wege 
zu weit werden, kann man das Mopped starten.

von Markus (Gast)


Lesenswert?

Danke für die vielen Antworten.

Ich werde mich mal in der Assembler Sprache probieren, mit dem ATMega 
48, wie von Jobst empfohlen.

Grund ist, weil mir die Assembler Schreibweise sehr viel Vertrauter 
vorkommt.
Es gibt sicher einfache Möglichkeiten, sich abrufbare Funktionen zu 
programmieren? Einen Baustein, welchen man mit einer einfachen 
Call-Anweisung ablaufen lassen kann?
Wie schaut eine einfache bedingte Verzweigung im Assembler aus?
Beispiel. Ist PINB1 = 1 dann springe zu Funktion SendeBusStufe1. Ist 
PINB 0 0, überspringe die CALL Funktion und checke PINB2



Kann mir jemand jetzt noch dazu gute Literatur empfehlen?

von Ich äh, 10 Minuten (Gast)


Lesenswert?

Nimm BASCOM, dann bist du in 10 Minuten fertig mit deinem Projekt.

von A. B. (funky)


Lesenswert?

sorry, aber wem erscheint denn bitte assembler auf den ersten blick 
logischer & einfacher als eine hochsprache?!

soll ja jeder machen wie er möchte, aber wer ungezwungen projekte mit 
mehr als ner DIN A4 seite quelltext in assembler schreibt, neigt wohl zu 
masochismus. und das bedeutet nicht im umkehrschluss, das man keine 
ahnung von der hardware haben muss/soll/braucht.

im hobbybereich kann das ja jeder handhaben wie er möchte, aber irgendwo 
wird es schon seinen grund haben, das in firmen niemand mehr seine 
firmware in assembler programmiert, ausser er ist wirklich drauf 
angewiesen
und mal ehrlich...die fälle, in welchen man unbedingt auf assembler 
angewiesen ist lassen sich an einer hand abzählen...wobei mir gerade 
kein triftiger grund einfällt

von A. B. (funky)


Lesenswert?

sebastian schrieb:
> Gerade für den Anfänger ist der ARM (acuh aufgrund des interrup
> handlings) nicht wirklich zu empfehlen (IMHO)

absolute zustimmung. aber dem anfänger dann den einstieg mit assembler 
zu empfehlen für schnelle erfolgserlebnisse finde ich schon gewagt

von Markus (Gast)


Lesenswert?

A. B. schrieb:
> soll ja jeder machen wie er möchte, aber wer ungezwungen projekte mit
> mehr als ner DIN A4 seite quelltext in assembler schreibt, neigt wohl zu
> masochismus. und das bedeutet nicht im umkehrschluss, das man keine
> ahnung von der hardware haben muss/soll/braucht.

Aber dazu meine Meinung. C Sprache ist sehr viel Computer und sehr wenig 
E-Technik.

Wenn ich mir die Tutorials für C anschaue, sehe ich erstmal nur 
ausführbare Windows Programme.

von steam (Gast)


Lesenswert?

Ich finde C auf'm Arduino ein sehr guter Einstieg.
Da wird dieses ganze Bitgeraffel mit den Port-Bits in bereits 
vorhandenen Funktionen versteckt.

Man kann in verständlichem C anfangen zu programmieren.

von steam (Gast)


Lesenswert?

>Wenn ich mir die Tutorials für C anschaue, sehe ich erstmal nur
>ausführbare Windows Programme.
Das stimmt. Weil alle meinen, ein C-Tutorial muss man mit Pointer 
anfangen.

von Carsten S. (dg3ycs)


Lesenswert?

Hi,

Es ist nun ja schon einiges geschrieben worden...

MEine MEinung geht auch mit vielen vorhergesagtem konform...

WENN es jetzt nur für dieses eine Projekt eine schnelle Lösung sein soll 
UND du gar kein C beherrscht, dann ist ASM für die zeitnahe Realisierung 
wohl das Mittel der Wahl.
Wenn du also nur dies vor hast und nicht weiteres mit µC planst nimm ASM 
und du kannst direkt zum Ende des Beitrages Springen.

Für Spätere Projekte müsste man schauen wie umfangreich es wird. Diese 
Anforderungen die du oben genannt hast sind auf jeden Fall noch halbwegs 
bequem in ASM Umzusetzen. Ich denke sogar auf dieser Ebene ist der 
Zeitunterschied zwischen ASM und C für einen erfahrenen Programmierer 
noch nicht wirklich vorhanden.

Mit zunehmender Größe und komplexität der Software aber geht die Schere 
immer weiter auseinander. Wenn aufwendige MAthefunktionen dazukommen 
etwas früher, geht es nur um einfache Logikentscheidungen etwas später. 
Aber es wird der Zeitpunkt kommen ab dem die komplette Umsetzung in ASM 
einfach unsinnig ist weil es ein vielfaches der Zeit erfordert und nur 
einen Bruchteil der Übersichtlichkeit bietet.

Wenn soetwas abzusehen ist bietet es sich auf jeden Fall an auch C zu 
lernen. (ggf. halt auch nach der Realisierung des konkreten Projektes)
Wobei ich wie von anderen auch geschrieben, es durchaus Sinnvoll finde 
wenn jemand der plant später in C zu schreiben zumindest die Grundlagen 
von ein oder zwei ASM Varianten kennt.
Gerade mit ASM hat man noch einen sehr engen Bezug zum tatsächlichen 
Ablauf im µC und lernt so die eigenheiten soch etwas besser. Zudem kann 
es später auch bei großen Projekten immer wieder vorkommen das sich 
bestimmte sehr zeitkritische Anforderungen nur in ASM Sinnvoll umsetzen 
lassen und man so dann doch einige Zeilen ASM in sein C Programm 
einbetten muss (Inline). Zudem hilft es etwas beim Debuggen und man 
versteht auch die ausgaben des Compilers.

Daher würde ich sagen: ASM Lernen macht auf jeden Fall SINN! Es ist nur 
die Frage wie Intensiv du dich damit beschäftigen solltest. Wenn du bei 
ASM bleien willst, was bei Projekten wie oben durchaus im Rahmen ist, 
dann halt etws intensiver, willst du früh auf C umsteigen halt etwas 
später.

Zur Architektur:
HAst du dir denn schon einen µC ausgesucht?
Einige sind ja schon genannt worden. Für den Einstieg würde ich auf 
jeden Fall mal "tief" stapeln, also mit 8Bit µC anfangen. (PIC18F, AVR, 
evtl. auch noch 8051). Die 32 Bit µC sind zwar deutlich 
leistungsfähiger, aber für einen Einsteiger daher auch deutlich schwerer 
zu verstehen. Ein LKW fährt sich halt schwerer als ein VW Polo. Wenn man 
dann die Grundzüge beherrscht spricht natürlich nichts dagegen sich auch 
in größeren Leistungsbereichen zu versuchen (ARM, PIC32 usw.)

Diese 8 bitter lassen sich gerade für Anfänger am einfachsten 
programmieren. Erst recht in ASM. Als zweites Kriterium als Anfänger 
würde ich mir noch etwas die Verbreitung in Hobbykreisen und in Foren 
ansehen. Was nützt dir die tollste Architektur wenn man bei Problemen 
dazu nichts im Netz findet und auch keinen Ansprechpartner hat. Zumal 
man ja auch als Einsteiger gar nicht weiß "wo" man nun GENAU suchen muss 
und auch noch nicht so zwischen den ZEilen liest, man evtl. doch 
vorhandene Info gar nicht ohne ZAunpfahl findet...

Ich selbst bin ja eher PIC Fan, obwohl ich auch schon mit einer 
beachtlichen Anzahl anderer Architekturen gearbeitet habe und immer 
wieder arbeitet. Wenn du des Englischen (lesen) einigermaßen mächtig 
bist, dann würde ich dir die PIC18 für den Einstieg empfehlen.
Dort bekommt man fast alles was man so benötigt direkt vom Hersteller 
(Tutorials, Librarys, Frameworks, Beispiele) hat eine große 
HArdwareauswahl und eine recht große Verbreitung.
Die Programmiertools sind günstig, ab ca. 25 Euro bekommt man eines das 
ALLE aktuellen PIC Familien beschreiben kann und das eine Debug Funktion 
bietet. Braucht man mal mehr Leistung kann man mit den selben Tools auch 
die 16Bit oder 32Bit PICs programmieren. Es gibt zudem unter den 16Bit 
Typen auch welche mit einem abgespeckten DSP Kern. Die Verfügbarkeit ist 
auch für Hobbyisten gut. Die Softwaretools sind alle kostenlos ohne 
Größenbeschränkung verfügbar.

Wenn es bei dir aber mit dem Verständniss von englischen Texten hapert 
würde ich doch eher zu AVR Raten. die haben hier im Deutschsprachigen 
Raum eine etwas größere Verbreitung, wobei das manchmal auch etwas 
täuscht, denn vieles was bei den AVR an SW Projekten oder Libs von 
dritten bereitgestellt wird und so als Fundstelle auf einer Homepage 
o.ä. bei google auftaucht bekommt man bei Microchip direkt vom 
HErsteller was dazu führt das niemand es selbst schreiben muss...

Hier im Forum hat AVR die größere Verbreitung, wobei man bei genauem 
LEsen der Threads dann sieht das es zwar für die Masse gilt, bei der 
"Klasse" sich die Auskünfte zu beiden Architekturen aber nicht 
unterscheiden.
Ganz ohne Englischfähigkeiten geht es bei der µC Programmierung aber 
auch mit AVR  nicht, zumindest nicht wenn man mal über die Blinkenden 
Lichter hinausgehen will.

GANZ WICHTIG ABER:
Bevor du dich dann endgültig entscheidest, mache dir die Mühe und schaue 
dir mal die Herstellerwebseiten was da an Informationen und Beispielen 
geboten wird. Lade dir ein paar Datenblätter und APP Notes herunter. 
Schaue ob du mit der Schreibweise zurecht kommst und dir der Stil 
zusagt. Auch wenn dir das als Anfäner nicht wichtig erscheint, später 
wird das immer wichtiger. Und prüfe auch die Verfügbarkeit für dich, 
sowohl in kleinen Stückzahlen wie auch auf kurze Leiferzeit. (Wobei das 
bei vorhandemen Gewerbeschein mittlerweile für fast keine Architektur 
mehr ein Problem darstellt -solange Atmel sich nicht wieder mal 
verkalkuliert und sechs Monate Lieferzeit ausruft)

Ach ja:
Jobst M. schrieb:
> Preislich nehmen sich ARM, AVR, PIC, MSP430 und 8051 nicht viel. Da von
> Hubschraubern zu sprechen, finde ich unangemessen, auch wenn der ARM mit
> der Aufgabe hoffnungslos unterfordert ist - die anderen sind es auch!
Ich denke hier ging es weniger um den Preis, zumindest für 
Kleinststückzahlen oder Hobby spielt es keine Rolle ob ich 1,50 für 
einen CortexM0 oder 80ct. für einen kleinen PIC bezahle um mal die 
untere Größe zu nennen...

ICh vermute eher das es hier um den Programmieraufwand ging. Und der 
"Overhead" an Einstellungen usw. ist bei den 32Bittern deutlich größer 
als bei den 8Bittern. Für einen Einsteiger halt nicht so leicht zu 
durchschauen.

> Für das von Dir geschilderte Problem würde ich einen ATmega48 benutzen.
> Der hat einen ADC und eine Hardware UART. Und ich würde es in ASM lösen.
> Ich denke, auch in ASM ist das mit <40 Zeilen Code realisierbar.
AVR kann man nehmen, ich würde halt aufgrund meiner Präferenz eher einen 
PIC vorschlagen. Typen ohne ADC oder UART muss man bei beiden Familien 
ja mittlerweile mit der Lupe suchen.

> PIC scheidet für mich aus, da ich mich damit nicht auskenne. (Ich habe
> damals die Finger davon gelassen, als ich die 'krummen' Registergrößen
> gesehen habe.)
Hier muss ich deinem Beitrag - dem ich ansonsten bis auf den Vorschlag 
ATMEGA voll zustimme- aber wiedersprechen. Krumme Registergrößen bei 
PIC?
Das stimmt nicht so ganz, Je nach Familie hat der ganz normal 8, 16 oder 
32Bit Register. Da hst du damals wohl einfach die Registergröße mit der 
Befehlswortbreite verwechselt. Die ist ja recht krumm!
Allerdings hat der Anwender DAMIT nun wirklich absolut nichts zu tun!
Das ist nur ein Architektonisches Detail...

Gruß
Carsten

von MirkoB (Gast)


Lesenswert?

Markus schrieb:
> Kann mir jemand jetzt noch dazu gute Literatur empfehlen?

Damals (tm) habe ich mit dieser Seite angefangen:
http://www.avr-asm-tutorial.net/   (->deutsch)

Das AVR-Assembler-Tutorial auf dieser Seite 
(http://www.mikrocontroller.net/articles/AVR-Tutorial) ergänzt sich 
damit sehr gut.

Als erster Fallstrick könnte evtl. die "falsche" Interrupttabelle 
auftauchen.
Die richtige Reihenfolge (und Anzahl der Einspungadressen) steht im 
Datenblatt des Controllers.
Einfach sich die Beispiele ansehen und die eigene passende 
Interrupttabelle eintippen. (Oder man findet noch eine der älteren µC 
und kann das per Copy&Paste aus dem Tutorial übernehmen).

Wenn die erste LED blinkt kommt dann der Rest von alleine... ;)

Mirko

von A. B. (funky)


Lesenswert?

Markus schrieb:
> A. B. schrieb:
>> soll ja jeder machen wie er möchte, aber wer ungezwungen projekte mit
>> mehr als ner DIN A4 seite quelltext in assembler schreibt, neigt wohl zu
>> masochismus. und das bedeutet nicht im umkehrschluss, das man keine
>> ahnung von der hardware haben muss/soll/braucht.
>
> Aber dazu meine Meinung. C Sprache ist sehr viel Computer und sehr wenig
> E-Technik.
>
> Wenn ich mir die Tutorials für C anschaue, sehe ich erstmal nur
> ausführbare Windows Programme.

ein uC spezifisches tutorial sollte man sich natürlich schon anschauen

von Markus (Gast)


Lesenswert?

Carsten Sch. schrieb:
> HAst du dir denn schon einen µC ausgesucht?
> Einige sind ja schon genannt worden. Für den Einstieg würde ich auf
> jeden Fall mal "tief" stapeln, also mit 8Bit µC anfangen.

Danke für deinen Post, Carsten Sch.
Zum Verständnis. Ist es tatsächlich ein Unterschied ob ich 8 bit oder 32 
bit programmiere für mein Projekt oben?

von steam (Gast)


Lesenswert?

>Zum Verständnis. Ist es tatsächlich ein Unterschied ob ich 8 bit oder 32
>bit programmiere für mein Projekt oben?
nein

von spess53 (Gast)


Lesenswert?

Hi

>Ist es tatsächlich ein Unterschied ob ich 8 bit oder 32
>bit programmiere für mein Projekt oben?

Nein. Bei deinem Projekt langweilt sich der Controller zu Tode. Das 
könnte man sogar mit einem 4-Bit-Controller erschlagen.

MfG Spess

von Peter D. (peda)


Lesenswert?

Markus schrieb:
> Ist es tatsächlich ein Unterschied ob ich 8 bit oder 32
> bit programmiere für mein Projekt oben?

Der Unterschied liegt im Einarbeitungsaufwand.
Ein 8Bitter läuft einfach los. Beim 32Bitter mußt Du erstmal die PLL und 
die ganze Takterzeugung usw. programmieren.

Beim 8Bitter gibst Du einfach nen Interrupt frei und schreibst den 
Handler an die festgelegte Einsprungadresse. Beim Einsprung löscht sich 
das Interruptflag automatisch.

Beim 32Bitter ist die Interruptlogik fast ein eigenständiger Prozessor, 
bei dem es ne Menge zu programmieren gibt. Und auch die Handler müssen 
viele Sachen in einer ganz bestimmten Reihenfolge machen, damit Du 
wieder sauber den nächsten Interrupt kriegst.

Und bei der sonstigen Peripherie sind ähnliche Unterschiede im 
Programmieraufwand.

Beim 32Bitter hast Du also schon einige kB Initcode bevor das Programm 
richtig läuft.


Peter

von Carsten S. (dg3ycs)


Lesenswert?

Hi,

spess53 schrieb:
>>Ist es tatsächlich ein Unterschied ob ich 8 bit oder 32
>>bit programmiere für mein Projekt oben?
>
> Nein. Bei deinem Projekt langweilt sich der Controller zu Tode. Das
> könnte man sogar mit einem 4-Bit-Controller erschlagen.

Also ich würde eher ein ganz klares JAIN zum besten geben.

Oder Ausführlich:
NEIN:
Von Kapazität her spielt es an sich keine Rolle.
Jeder halbwegs aktuelle µC mit 8 Bit wird sich wie geschrieben mit 
großer Wahrscheinlichkeit einfach nur fürchterlich Langweilen.
Und der 32Bit µC langweilt sich dann noch ein ganzes Eckchen mehr.

(Den 4Bit Controller und alte 8Bit µC würde ich so nicht 1-1 stehen 
lassen wollen da sich das zwar grundsätzlich realisieren lässt, diese 
alten Controller in der Regel aber noch kein On-Board UART haben und das 
deshalb alles in SW gemacht werden müsste, mit größerem Aufwand. Bei den 
4Bittern würde dann noch dazu kommen das zum Übetragen eines UART Datums 
gleich zwei Registerinhalte abgefragt werden müsste. -> Ist aber 
Korintenkackerei)

JA: Von der Schwierigkeit für einen Anfänger ist es schon ein 
Unterschied.
Die 32Bit µC, egal ob MIPS(wie PIC32) oder ARM sind ein ganzes Stück 
mächtiger als die hier genannten 8Bit µC (Pic, AVR).

Unter anderem gibt es in fast jeder hinsicht deutlich mehr 
Konfigrationsmöglichkeiten - Die dann aber auch ersteinmal alle 
abgearbeitet sein wollen! Auch bei den Direktzugriffen auf die Ports 
gibt es Unterschiede.
Für einen Anfänger der es wirklich von der Pieke auf lernen will - was 
meiner Ansicht nach zwar die ersten Tage etwas steiniger ist als mit 
dingen wie BASIC anzufangen- ist der direkteinstieg mit 32Bit einfach 
ein wenig mächtig.
Wenn es einem ausreicht einfach nur Copy&Paste zu machen und nur 90% des 
Programmcodes aus den Beispielprogrammen herauskopieren will ohne zu 
verstehen was das überhaupt ist, dann geht natürlich auch 32Bit direkt.

Allerdings führt NUR der erste Weg dazu das man dann auch flexibel ist 
und Projekte verwirklichen kann für die es keine Lib gibt und das man 
dann auch mal bei Bedarf einen µC aus einer anderen Familie einsetzen 
kann und nicht auf ewig nur an eine Familie gebunden ist.

Diejenigen die dann lauthals verkünden das der "steinigere" Weg ja 
blödsinn ist und man doch direkt mit BASIC oder "Arduino-C" anfangen 
sollte weil das schnelle Resultate bringt, das sind dann auch die Leute 
die hier regelmäßig auftauschen und schon Probleme bekommen wenn der µC 
bei selben Quarz dann statt 80Mhz nur mit 20Mhz läuft, oder die 
wochenlang herumdoktern weil das Programm einfach so langsam läuft ohne 
zu merken das in den Fusebits die PLL deaktiviert ist. Und so groß sind 
die ZEitunterschiede wirklich nicht. Lass es vielleicht 5 oder sechs 
lange NAchmittage für ein Grundlegendes Verständniss der HArdware von 
gängigen µC PLUS beherrschen der ASM Grundlagen sein, - Der Basic bzw. 
Arduino Nutzer hat dann zwar schon vier Tage seine LCDs am Leuchten, 
aber bei jeder Anforderung die nur ein wenig über Schema F hinausgeht 
wird er wieder ewig ins schleudern kommen...

Für reines Hobby mag die zweite Alternative ausreichen, für jede etwas 
anspruchsvolle (berufliche) Tätigkeit aber sicher nicht.

Gruß
Carsten

P.S.: eine Ergänzung noch zum Unterschied, unter dem Aspekt des 
Anwendungszwecks "Steuerung" vielleicht nicht ganz unwichtig:
Bei den üblichen 8Bit µC kann man GENAU das Zeitverhalten anhand des ASM 
Quellcodes (Entweder direkt selbst geschrieben oder halt die Ausgabe des 
C Compilers) vorhersagen und auch "Einstellen".
Bei den hier genannten 32Bit µC (ARM & MIPS) ist das nur recht 
eingeschränkt möglich da für viele Befehle die Ausführungszeit nicht 
exakt vorhersehbar ist und von äusseren Einflüssen abhängen kann. 
NAtürlich gibt es dann eine Menge anderer Wege ein halbwegs exaktes 
Zeitverhalten herzustellen, aber dazu muss man dann wieder die 
Grundlagen kennen.

von Thomas (kosmos)


Lesenswert?

da sich dieses Forum/Tutorial eigentlich hauptsächlich mit AVRs 
beschäftigt wurde es sich anbieten einen AVR zu nehmen.

Ich würde auf jedenfall mit Assembler anfangen dadurch lernst du die 
Hardware viel besser lernen. Später kannst du immer noch C lernen 
umgekehrt würde ich sagen fehlt einem die Grundlage wenn man gleich mit 
C anfängt.

Ich finde es immer wieder lustig wenn jemand schreibst der 2 kb Flash 
und seine 512 Byte RAM sind zu gering, für ein Programm das in Assembler 
nur 1/8 so groß ausfällt. Man muss sich hier sehr genau drum Kümmern ob 
z.b. eine Variable mit dem Wert 64 = 1 Byte nicht als Double Word 4 
Bytes verarbeitet wird und auch entsprechend Platz reserviert wird.

von dummschwaetzer (Gast)


Lesenswert?

MSP430, einen der 2-er Serie mit CodeComposer Studio5, da kann er mit 
GRACE relativ gut Konfigurieren.

von Sebastian H. (sh______)


Lesenswert?

Peter Dannegger schrieb:
> Markus schrieb:
>> Ist es tatsächlich ein Unterschied ob ich 8 bit oder 32
>> bit programmiere für mein Projekt oben?
>
> Der Unterschied liegt im Einarbeitungsaufwand.
> Ein 8Bitter läuft einfach los. Beim 32Bitter mußt Du erstmal die PLL und
> die ganze Takterzeugung usw. programmieren.

Das kommt sehr stark auf die IDE an. Bei Crossworks z.B. wählt man 
einfach nur den µC aus und das Projekt lässt sich direkt compilieren und 
läuft, ohne das man irgendwas spezifisches einstellen müsste.

Mit freeware wie Eclipse ist das ganze natürlich deutlich komplizierter.


Trotzdem würde ich auch jedem erstmal einen ATMega empfehlen. Einfach 
weil z.B. die Komplexität der Funktionen deutlich geringer ist. Es gibt 
deutlich weniger Konfigurationsmöglichkeiten was die Fehlermöglichkeit 
stark verringert.

von Gregor B. (Gast)


Lesenswert?

A. B. schrieb:
> sorry, aber wem erscheint denn bitte assembler auf den ersten blick
>
> logischer & einfacher als eine hochsprache?!

Demjenigen, der bisher auf der SPS mit der Anweisungsliste programmiert 
hat.
Sieht genau so aus wie ein Assembler, die Befehle sind bloß anders.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Sebastian H. schrieb:
> Bei Crossworks z.B. wählt man
> einfach nur den µC aus und das Projekt lässt sich direkt compilieren und
> läuft, ohne das man irgendwas spezifisches einstellen müsste.

Klar kann man das auch alles vor dem Anwender verstecken.  Allerdings
ist das dann alles erstmal wieder eine "Blackbox", eigentlich nicht
viel mehr als Bascom für BASIC-Hasser. ;-)  Mit "wissen, was wirklich
passiert" hat es jedenfalls nicht mehr viel zu tun.

Gut gut, auch ein ARM läuft natürlich erstmal irgendwie und mit
irgendeinem Takt los, ohne dass man die PLL anfasst.  Trotzdem ist
die Komplexität größer.  Sowas wie der vorgeschlagene ATmega48 (oder
ein beliebigens Pendant eines anderen Herstellers) sind da doch
deutlich überschaubarer.

16 ist mehr schrieb:
> Schon dieser FUSE
> Kram zur Konfiguration ist nicht mehr zeitgemäß.

Muss man allerdings eben auch gar nicht anfassen, um damit einfach
nur arbeiten zu können.  Das Argument der Fuses hält sich einfach
nur hartnäckig, weil es sonst nicht viele Argumente gegen einen AVR
(für ein Projekt dieser Dimension) gibt. ;-)

Ich persönlich würde übrigens so ein Projekt allemal in C anfangen,
allerdings bin ich notgedrungen voreingenommen, da ich C seit mehr
als 20 Jahren benutze.  Den Assemblercode seines Controllers sollte
man sehr wohl verstehen (insofern gehe ich mit all denen, die den
Assembler wegen des exakten Verständnisses für die Hardware hier
empfehlen, mit), aber es ist dann doch noch ein großer Unterschied
dazu, auch selbst ein entsprechendes Assemblerprogramm schreiben
zu können.

von Jobst M. (jobstens-de)


Lesenswert?

Markus schrieb:
> Es gibt sicher einfache Möglichkeiten, sich abrufbare Funktionen zu
> programmieren?

Ja.

> Einen Baustein, welchen man mit einer einfachen
> Call-Anweisung ablaufen lassen kann?

Ja.

> Wie schaut eine einfache bedingte Verzweigung im Assembler aus?
> Beispiel. Ist PINB1 = 1 dann springe zu Funktion SendeBusStufe1. Ist
> PINB 0 0, überspringe die CALL Funktion und checke PINB2
1
;SBIC – Skip if Bit in I/O Register is Cleared
2
;Es wird der nächste Befehl übersprungen, wenn geprüftes Bit 0 ist.
3
4
SBIC PINB, 1
5
CALL SendeBusStufe1 ; es kann auch RCALL verwendet werden
6
SBIC PINB, 2


Gruß

Jobst

von Markus (Gast)


Lesenswert?

Der Vormittag und halbe Nachmittag ist bisher drauf gegangen. Aber ein 
paar Zeilen habe ich geschrieben.

Kann mir jemand eine Meinung dazu geben? Funktioniert, oder ist grober 
Müll den ich da getippt habe?


Kann mir jemand noch Hilfestellung geben um dem µC die Baud-Rate 
beizubringen?
die ersten 4 digits im MSB, den rest im LSB, bei 0 angefangen?






/*
 * AssemblerApplication3.asm
 *
 *  Created: 06.06.2012 09:39:51
 *   Author: Markus
 */
.def temp = R18



.equ F_CPU = 1843200                           // Takt
.equ BAUD  = 9600                              // Baud




 // Stackpointer Initialisieren
 .DEF Stack = R16
  LDI Stack, HIGH(RAMEND);
  OUT SPH,Stack;
  LDI Stack, LOW(RAMEND);
  Out SPL,Stack;



 // Port B 0-7 Ausgang
LDI R16, 0xFF;
OUT DDRB, temp;

// Port C 0-7 PullUps aktivieren
OUT PORTC, temp;

 // Port C 0-7 Eingang
LDI R18, 0x00;
OUT DDRC, temp;






Main:

LDI R18, PINC
SBRS R18, 1;
RCALL UART_Stufe1;





RJMP Main





// UART Sende Stufe 1

UART_Stufe1:

// Init zum Senden
lds temp, UCSR0B;
sbr temp, (1<<TXEN0);
sts UCSR0B, temp;

loop:

ldi temp, 0x00
sts UDR0, temp
rcall warten
ldi temp, 0xFF
sts UDR0, temp
rcall warten
ldi temp, 0xFF
sts UDR0, temp
rcall warten
ldi temp, 0x00
sts UDR0, temp
rcall warten
ldi temp, 0xFF
sts UDR0, temp



rjmp Main

warten:

lds temp, UCSR0A
sbrs temp, TXC0
rjmp warten
ret

von Jobst M. (jobstens-de)


Lesenswert?

Benutze das nächste mal die [ avrasm ]Hier Code[ /avrasm ] - Tags (ohne 
Leerzeichen)

Wieso definierst Du für den Stack ein eigenes Register?
temp reicht dafür.

> LDI R18, PINC

wieso benutzt Du temp nicht?


> lds temp, UCSR0B;
> sbr temp, (1<<TXEN0);
> sts UCSR0B, temp;

Du brauchst kein Semikolon am Ende der Zeile.

Setze UCSR0B einfach so, wie Du es haben möchtest.

Allerdings würde ich die serielle Schnittstelle nur einmal am 
Programmanfang initialisieren.


Am Ende Deiner 'loop:' (welche keine ist - wird die Sprungmarke irgendwo 
benötigt?) Wartest Du nicht mehr darauf, daß das Byte abgeschickt wurde. 
Solltest Du aber, denn das Programm ist oben wieder dabei das nächste 
Byte zu verschicken, obwohl das untere noch gar nicht weg ist.


Viel wichtiger finde ich allerdings, daß Du hier mal genau beschreibst, 
was das Programm wirklich tun soll.


Gruß

Jobst

von spess53 (Gast)


Lesenswert?

Hi

>Kann mir jemand eine Meinung dazu geben?

Diplomatisch oder brutal?

1. Welcher Controller?
   Denn für jeden Controller gibt es eine xyzdef.inc-Datei die mir

   .include "xyzdef.inc"

   am Anfang des Programms eingefügt werden muss. Sonst kann der 
Assembler
   mit z.B. sts UDR0, temp nichts anfangen.

2.
>.def temp = R18
>....
>LDI R18, 0x00;

Entweder du benutzt dieses def-Gedödel, dann sind die Registernamen 
tabu.
Oder du benutzt nur die Registernamen. Das vermischen endet früher oder 
später, meist früher, in der Katastrophe.

3.
>ldi temp, 0x00
>sts UDR0, temp
>rcall warten

Codebeispiele für USART-Initialisierung, -Senden und -Empfangen 
findest du im Datenblatt deines Controllers.

MfG Spess

von Jobst M. (jobstens-de)


Lesenswert?

Markus schrieb:
> .def temp = R18
> :
> LDI R16, 0xFF;
> OUT DDRB, temp;

Ach ja: Das hier geht im übrigen in die Hose.


Gruß

Jobst

von Axel S. (a-za-z0-9)


Lesenswert?

Ralph schrieb:
> Jobst M. schrieb:
>> Denn auch wenn man C lernt, empfiehlt es sich mit ASM den Controller
>> erst mal kennen zu lernen.
>
> 1.  geht das auch in C ganz gut.

Die zusätzliche Schicht, die C hier drüber legt, macht die Sache nicht 
leichter, sondern oft schwieriger. Und es geht gar nicht so sehr um die 
Sprache C an sich, sondern vor allem um Eigenheiten des Compilers oder 
der Standardlibrary.

Beispiel: Interrupthandler. Das Datenblatt beschreibt z.B. eine Tabelle 
mit Adreßzeigern oder JMP-Instruktionen und nennt die Adresse für jeden 
einzelnen Interrupt. In Assembler liegt genau eine ORG Anweisung 
zwischen dem Lesen des Datenblatts und der erfolgreichen Anwendung.

Wenn man das gleiche in C machen will, muß man sich im Extremfall damit 
herumschlagen, wie man Code auf feste Adressen bindet und dem Compiler 
bestimmte Funktions-Prologe und Epiloge vorschreibt. Wenn man Erfahrung 
mit "C für Controller" hat, sucht man vielleicht gleich zielgerichtet 
nach dem C-Makro, mit dem man eine Funktion als ISR deklariert.

Ganz davon zu schweigen, daß sich Makros und Namen für Interrupts über 
die Grenzen von Toolchains (und Targets) typischerweise auch noch 
unterscheiden. Vorteil durch Verwendung von C: Null.


> 2.  wie tief willst du da in den µC einsteigen ?

Normal will man nur so tief einsteigen, daß man die zu verwendende 
Peripherie gebacken kriegt. Das ist in C genau gar nicht besser als in 
Assembler.

> Mann muss in C gar nicht wissen wie eine Multiplikation einer 32 bit mit
> einer 64 bit Zahl auf einem 8 bit µC gemacht wird.

Das hat so gut wie gar nichts mit dem µC zu tun. ALUs haben sich seit 
dem 6502 nur sehr geringfügig weiterentwickelt. Praktisch gar nicht, 
wenn man von der Wortbreite absieht [1].

Die Implementierung von Arithmetik mit einer größeren Breite als der 
ALU-Breite ist Grundwissen. Und auch wenn nicht jeder Programmierer 
solchen Code selber schreibt, so sollten ihm zumindest die Implikationen 
bezüglich Speicherbedarf und Laufzeit vertraut sein.


XL

[1] Ja, OK. Es gibt heutzutage Barrel-Shifter und 
Hardware-Multiplikation. An der Außenansicht der ALU hat das wenig bis 
nichts geändert.

von Markus (Gast)


Lesenswert?

Jobst M. schrieb:
> Viel wichtiger finde ich allerdings, daß Du hier mal genau beschreibst,
> was das Programm wirklich tun soll.

Sollte das Programm irgendwann Funktionieren soll es folgende Aufgaben 
lösen:

Eingang, 4...20mA -> Digital auflösen. 5,6 mA Schaltstufe 1, 7,2,  mA 
Schaltstufe 2 ... 20 mA Schaltstufe 10

Je nachdem welche Schaltstufe erkannt wird, soll ein 5 Byte langer 
Befehl über den UART verschickt werden. Die Befehle sind fix, brauchen 
keine Variablen.

Es gibt 10 Verschiedene Befehle, welche sich so aufbauen:
0x00            0xFF          0xC3          var         var
[Startbyte] [Adressbyte] [Kommandobyte] [Datenbyte] [Checksumme]
8N1 bei 9600 Baud

die Befehle unterscheiden sich nur im Datenbyte und Checksumme. Der Rest 
ist gleich.

Mehr nicht. ;)
Ich habe den ADC im Code erstmal ignoriert, das ist ne neue Baustelle 
für mich.


MfG Markus


Ich bin dankbar für jede Hilfe. Mein Ziel ist es, auf dauer den Code für 
solche Anwendungen selber ohne Copy und Paste schreiben zu können.

von Markus (Gast)


Lesenswert?

spess53 schrieb:
> 1. Welcher Controller?
>    Denn für jeden Controller gibt es eine xyzdef.inc-Datei die mir

die Include Datei hab ich auch mehrfach gelesen. Ich programmiere im 
Stuido6, ich denke das das Studio die automatisch inkludiert, denn alle 
Registernamen sind dem Programm bekannt.

Controller ATMega 168A

von spess53 (Gast)


Lesenswert?

Hi

>Ich programmiere im
>Stuido6, ich denke das das Studio die automatisch inkludiert, denn alle
>Registernamen sind dem Programm bekannt.

Stimmt. Aber deswegen benutze ich das Monstrum trotzdem nicht. Bringt 
für Assemblerprogrammierung keine Vorteile.

>Sollte das Programm irgendwann Funktionieren soll es folgende Aufgaben
>lösen:
>.....

Und jetzt zerlegst du das Ganze in schöne kleine Häppchen. Also z.B.

- Uart-Initialisierung
- 1 Byte senden
- Befehl senden
- .....

MfG Spess

von Jobst M. (jobstens-de)


Lesenswert?

So.

Der kleine Quellcode hat 58 Zeilen bei 1209Byte und erzeugt 230Byte 
Code.

Der große Quellcode (mit Kommentaren etc.) hat doppelte Zeilenzahl und 
die dreifache Größe. Erzeugt den selben Code.

Ist ungetestet. Wenn Du etwas davon sehen möchtest, sag bescheid.


Gruß

Jobst

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

A. B. schrieb:
> sorry, aber wem erscheint denn bitte assembler auf den ersten blick
> logischer & einfacher als eine hochsprache?!

Jedem, der mal eine Hochsprachen-Spezifikation komplett durchgelesen hat 
;-)

von Thomas (kosmos)


Lesenswert?

ich sehe die Vorteile des Assemblers darin das ich genau weiß was 
passiert, wie lange das dauert, wieviel RAM dafür gebraucht wird... 
Außerdem kann ich einige Sachen ganz gezielt beeinflussen z.B. 
Programmcounter, Stackpointer, Stack.

Bei C ist man da seinem Compiler und dessen Optimierungen ausgeliefert 
und kann das nie 100%tig sagen. Es sei den man deassembliert das 
Compilerergebnis, aber dann kann ich gleich mit Assembler arbeiten.

Vorteile sehe ich bei einer Hochsprache bei größeren Berechnungen

von Dominik S. (dasd)


Lesenswert?

Thomas O. schrieb:
> seinem Compiler und dessen Optimierungen ausgeliefert

Klingt ja gerade so als ob der Compiler an allen Ecken und Enden totalen 
Unfug erzeugen würde.
Bei sauberer Programmierung gehen die Fälle in denen es Zweifel gibt 
doch auf ein Minimum zurück (extrem zeitkritische Geschichten, bei denen 
es auf jeden CPU-Takt ankommt, jetzt mal außen vor - da mag man mit ASM 
und genauer Kenntnis der genutzten Befehle und somit CPU-Zyklen besser 
dran sein).

von egbert (Gast)


Lesenswert?

Die Frage ist falsch formuliert.

Richtig heissen müsste es: "C" oder eine Programmiersprache?

"C" ist immer dann das Mittel der Wahl, wenn das Ergebnis der 
Programmausführung bzw. dessen Funktion vollkommen egal ist. Auch wenn 
einige pickelige Kellerkinder mit muskulösem rechtem Arm etwas anderes 
behaupten, ist es vollkommen unmöglich, mit diesem Treppenwitz bzw. 
Aprilscherz der EDV-Geschichte eine funktionierende Anwendung zustande 
zu bringen.

...

10.2 Erfinder von UNIX und C geben zu: Alles Quatsch!

In einer Ankündigung, die die Computerindustie verblüffte, haben Ken
Thompson. Dennis Ritchie und Brian Kernighan zugegeben, daß das von
ihnen geschaffene Betriebsystem Unix und die Programmiersprache C ein
raffinierter Aprilscherz sind, der sich über 20 Jahre am Leben
erhalten hat. Bei einem Vortrag vor dem letzten
UnixWorld-Software-Entwicklungsforum enthüllte Thompson:
"1969 hatte AT&T gerade die Arbeit am
GE/Honeywell/AT&T-Multics-Projekt beendet. Brian und ich
experimentierten zu diesem Zeitpunkt mit einer frühen Pascal-Version
von Professor Niklaus Wirth vom ETH-Laboratorium in der Schweiz und
waren beeindruckt von seiner Einfachheit und Mächtigkeit. Dennis
hatte gerade "Der Herr der Klinge" gelesen, eine spöttische Parodie
auf Tolkiens Trilogie "Der Herr der Ringe". Im Übermut beschlossen
wir, Parodien zur Multics-Umgebung und zu Pascal zu verfassen. Dennis
und ich waren für die Betriebsystemumgebung verantwortlich. Wir sahen
uns Multics an und entwarfen ein neues System, das so komplex und
kryptisch wie möglich sein sollte, um die Frustation der
gelegentlichen User zu maximieren. Wir nannten es "Unix" in
Anspielung auf "Multics" und fanden es auch nicht gewagter als andere
Verballhornungen. Danach entwickelten Dennis und Brian eine wirklich
perverse Pascal-Version namens "A". Als wir bemerkten, daß einige
Leute tatsächlich versuchten, in "A" zu programmmieren, fügten wir
schnell einige zusätzliche Fallstricke hinzu und nannten es "B",
"BCPL" und schließlich "C". Wir hörten damit auf, als wir eine
saubere Uebersetzung der folgenden Konstruktion erhielten:

 for(;P("\n"),R--;P("|"))
 for(e=C;e--;P("_"+(*u++/8)%2))
 P("|"+(*u/4)%2)
Der Gedanke, daß moderne Programmierer eine Sprache benutzen würden,
die solch eine Anweisung zuließ, lag jenseits unseres
Vorstellungsvermögens. Wir dachten allerdings daran, alles den
Sowjets zu verkaufen, um ihren Computerfortschritt 20 Jahre und mehr
zu behindern. Unsere Ueberraschung war groß, als dann AT&T und andere
US-Unternehmen tatsächlich begannen, Unix und C zu verwenden! Sie
haben 20 weitere Jahre gebraucht, genügend Erfahrungen zu sammeln, um
einige bedeutungslose Programme in C zu entwickeln, und das mit einer
Parodie auf die Technik der 60er Jahre! Dennoch sind wir beeindruckt
von der Hartnäckigkeit (falls nicht doch Gemeinsinn) des gewöhnlichen
Unix-und C-Anwenders. Jedenfalls haben Brian, Dennis und ich in den
letzten Jahren nur in Pascal und einem Apple Macintosh programmiert
und wir fühlten uns echt schuldig an dem Chaos, der Verwirrung und
dem wirklich schlechten Programmierstil, der von unserem verückten
Einfall vor so langer Zeit ausging."

Namhafte Unix- und C-Anbieter und Benutzer, einschließlich AT&T,
Microsoft, Hewlett-Packard, GTE, NCR und DEC haben vorläufig jede
Stellungnahme abgelehnt. Borland International, ein führender
Anbieter von Pascal- und C-Werkzeugen, einschließlich der polulären
Turbo Pascal, Turbo C und Turbo C++, meinte, sie hätten diesen
Verdacht schon seit Jahren gehegt und würden nun dazu übergehen, ihre
Pascal-Produkte zu verbessern und weitere Bemühungen um die
C-Entwicklung stoppen. Ein IBM-Sprecher brach in unkontrolliertes
Gelächter aus.

(Quelle: Bernhard L. Hayes, NetNews-Gruppe)

von oldmax (Gast)


Lesenswert?

Hi
Netter Beitrag, Egbert...
Irgendwann wollte ich auch mal mit "C" anfangen, nicht auf µC, sondern 
vorher. Einfach nur, weil es eine Herausforderung gewesen wäre. Als ich 
mir dann den Syntax ansah, war mir klar: "Das ist eine Herausforderung"
... und so hab ich es gelassen. Sicherlich kommt die halbe 
Programmiereerwelt damit zurecht und sie hat sich an den Syntax gewöhnt, 
wie man sich auch an Fremdsprachen gewöhnt hat. Und wenn es sich 
herausstellen sollte, das "nur C" die Lösung eines Problems bedeutet, na 
ja, dann würd ich mich auch dadurch kämpfen. Aber solange es die 
Alternative Assembler gibt, bin ich da noch weit weg von. So, das sollte 
zur "Sprachempfehlung" reichen. Haben ja auch wirklich genug ihren Senf 
dazu gegeben.
So, Markus, jetzt bist du dran. Lade dir, falls noch nicht geschehen, 
das AVR Studio herunter und lies und arbeite das Tutorial auf dieser 
Seite durch. (Links oben unter "AVR) Es hat mir bei meinem Anfang viel 
gegeben.
Wenn du noch ein wenig weitere Hilfe brauchst, vielleicht hilft dir auch 
der Beitrag "Keine Angst vor Assembler" im Forum "AVR-Praxis.de" in der 
Rubrik "FAQ".
Gruß oldmax

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Vielleicht noch ein Hinweis. Bin mit Studio 6 nicht vertraut (Assembler 
mache ich in Studio 4 und die meisten C Sachen auch), aber der 
eingebaute Simulator ist gerade in Assembler sehr hilfreich. Er hat zwar 
seine Macken (vllt. in Studio 6 nicht mehr?), aber der direkte Blick auf 
Ports, MCU und all das andere Gedödel kann gerade am Anfang sehr 
hilfreich sein. Im Hintergrund das Datenblatt offenhalten, um da 
nachzulesen. Ausserdem solltest du dir unbedingt das grosse PDF mit dem 
AVR Befehlssatz runterladen und griffbereit haben, um das Verhalten von 
Flags, arithmetischen Operationen usw. zu beobachten.
C ist für komplexere Sachen einfach übersichtlicher. Ich habe zwar auch 
mal ein DMX Pult in Assembler gemacht, aber das würde ich heute nicht 
mehr tun. Da die heutigen Compiler recht gut optimieren und der 
Flashspeicher der Chips immer grösser wird, ist Platzbedarf auch nicht 
mehr so unbedingt das Argument.

von Markus (Gast)


Lesenswert?

Jobst M. schrieb:
> So.
>
> Der kleine Quellcode hat 58 Zeilen bei 1209Byte und erzeugt 230Byte
> Code.
>
> Der große Quellcode (mit Kommentaren etc.) hat doppelte Zeilenzahl und
> die dreifache Größe. Erzeugt den selben Code.
>
> Ist ungetestet. Wenn Du etwas davon sehen möchtest, sag bescheid.
>
>
> Gruß
>
> Jobst

58 Zeilen? So einfach ist das? Hm.


Ne Frage nebenbei, hast du dir dein Wissen selbst beigebracht oder im 
Studium?


Ich würde gern etwas sehen. Nur wo anfangen? Wie hast du deinen Code 
strukturiert? In der Main Loop nur die Wertvergleiche mit Bedingter 
Sprunganweisung auf das entsprechende Unterprogramm?
An der Codelänge schätze ich, du hast nur ein UART Senden unterprogramm? 
Wie füttest du die Variablen für die letzen Bytes ein?


MfG Markus

von Markus (Gast)


Lesenswert?

Johann L. schrieb:
> A. B. schrieb:
>> sorry, aber wem erscheint denn bitte assembler auf den ersten blick
>> logischer & einfacher als eine hochsprache?!
>
> Jedem, der mal eine Hochsprachen-Spezifikation komplett durchgelesen hat
> ;-)
>


Wie gesagt, ich habe bisher nur SPS gemacht. Eine Hochsprache und 
Assembler habe ich nie gelernt.
Zwar kann man SPS auch mit C Programmieren, aber darum hab ich bisher 
immer einen großen Bogen gemacht.
Die SPS AWL ist ähnlich dem Assembler aufgebaut, nur hat Assembler das 
10 fache an Befehlen und Fallstricken, zb. das ldi,ld,lds ..
Die Register gibt es in ner SPS zwar auch, aber in einer anderen Form. 
Um ein vielfaches kleiner, abgespeckt und benutzerfreundlicher. ;) Bei 
SPS greift auf jedes Register mit einem Befehl zu.

von A. B. (funky)


Lesenswert?

ich würde mal behaupten, das jeder heutige compiler besser optimiert als 
95% der standard-user hier und im allgemeinen...aber vielleicht hab ich 
auch zu wenig ahnung oder bediene meinen compiler einfach nur richtig.

hier wird ja so getan, als ob man da ständig hinterher sein müsste und 
der compiler nach dem zufallsprinzip irgendwelche compilate ausspucken 
deren zeitverhalten, flashverbrauch & ramvebrrauch beliebig gewürfelt 
werden

> ich sehe die Vorteile des Assemblers darin das ich genau weiß was
> passiert, wie lange das dauert, wieviel RAM dafür gebraucht wird...
> Außerdem kann ich einige Sachen ganz gezielt beeinflussen z.B.
> Programmcounter, Stackpointer, Stack.

klaro...beim 08/15 programm muss ich auch dauernd am stack & 
programmcountern rumfummeln.

evtl. hilft es, sich mal den quelltext eines RTOS anzuschauen...da sind 
gewisse teile (eben stackfummelei etc.) in asm geschrieben aber der 
grosse rest doch in C. also irgendwo wird sich ne hochsprache schon 
bewährt haben...

auch in der automobil industrie z.b. wo die programmierung sicherlich 
wesentlich sicherheitskritischer als bei irgendwelchen led-blinkern, 
heizungs&temperaturreglern etc. wird C eingesetzt(wenn auch nach 
besonderen standards ala MISRA usw.)
aber klar...man programmiert grössere projekte lieber in ASM wie schon 
1960

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

egbert schrieb:

> "C" ist immer dann das Mittel der Wahl, wenn das Ergebnis der
> Programmausführung bzw. dessen Funktion vollkommen egal ist.

Oje, da hat jemand mal ne gründliche Bauchlandung gemach, weil er zu 
faul war, die Sprache zu lernen und einfach nur rumgeclickt und 
rumprobiert hat.

Ging mir neulich genauso mit nem Flugzeug:

Eingestiegen, paar Knöpfchen gedrückt und Hebelchen umgelegt. Hat schön 
geblinkt und gebrummt aber das Resultat war komplett zufällig.

Scheiss Flugzeug.

Wenn du dir mit dem Hammer ständig auf die Finger schlägst, dann ist 
nicht der Hammer schuld.

Also lern erst mal worum es geht oder, anstatt bei jeder sich bietenden 
Gelegenheit dein unqualifiziertes "C = Zufall" loszulassen.

von oldmax (Gast)


Lesenswert?

Hi
Leute, es ist doch völlig egal, in welcher Sprache jemand seine 
Controller mit Aufgaben belegt. Auf den Menschen, der die Sprache 
anwendet und seine Probleme in Anweisungen hinterlegt kommt es doch 
schließlich an. Und wenn anschließend in einem Controller ein völlig 
blödsinnig unübersichtlicher Spaghetticode werkelt, wenn der Controller 
fehlerfrei seinen Job macht, interessiert's keinen. (vom Nachfolger, der 
das Programm pflegen soll mal abgesehen...) Und Markus hat nicht 
studiert, (nehm ich mal an) sondern ich vermute mal, eine Laufbahn in 
Steuerungstechnik hinter sich. Er kann weder Assembler noch eine andere 
Sprache, von daher muss er sowieso von Kleinauf lernen. Allerdings denke 
ich, ist ein Steuerungsmensch vom Denken her anders.Bei ihm gehen noch 
für die Bits die Lampen an und ein Befehl
     LDI R16, 0b01010111
ist für ihn verständlicher wie
     LDI  Reg_A, ( 1 << WGM12 ) | ( 1 << CS10 )
Auch ich hab's mir in den späten Abendstunden selbst beigebracht und 
beim Auftauchen solcher Befehle braucht's ein wenig, diese zu verstehen.
Übrigends weiß ich, das sie nicht vergleichbar sind und völlig 
unterschiedliche Ergebnisse liefern, daher braucht's dazu keine 
Belehrung. Soll ja auch nur verdeutlichen, das einer, der noch nie vor 
einer Programmiersprache gesessen hat, hier schon Probleme bekommt.
@markus
Noch einmal
Ignorier nicht den Hinweis auf das Tutorial, denn da steht zu Baudraten 
soetwas drin...
1
;********************************************************************************
2
;* Die folgenden Zeilen definieren ein paar Constanten. Diese Werte werden nur   *
3
;* einmal vom  Compiler zugewiesen. Danach werden sie nicht mehr verändert.    *
4
;********************************************************************************
5
.EQU   F_CPU  = 1000000        ; Systemtakt in Hz
6
.EQU   BAUD  = 9600            ; Baudrate ; Berechnungen
7
.EQU   UBRR_VAL  = ((F_CPU+BAUD*8)/(BAUD*16)-1)    ; clever runden
8
.EQU   BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))   ; Reale Baudrate
9
.EQU   BAUD_ERROR  = ((BAUD_REAL*1000)/BAUD-1000)    ; Fehler in Promille 
10
11
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))     ;max. +/-10 Promille Fehler  
12
.error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
13
.endif
Zeilen,, die mit einem Punkt beginnen sind keine Assembler-Anweisungen 
sondern Compiler-Direktiven. So setzt er überall, wo er "F_CPU" findet, 
den Wert "1000000" ein. Werden berechnete Werte zugewiesen, dann sind 
diese dann auch im Code für den Controller. Z.B. "UBRR_VAL"
1
;--------------- Serielle Schnittstelle parametrieren -------------------
2
;*************************************************************************
3
;* Die Parametrierung ist mit dem Koppelpartner abzustimmen.    *
4
;*************************************************************************
5
INIT_UART:  
6
  LDI  Reg_A, HIGH(UBRR_VAL)  ; Baudrate einstellen
7
  OUT  UBRRH, Reg_A
8
  LDI  Reg_A, LOW(UBRR_VAL)
9
  OUT  UBRRL, Reg_A
10
  ; Frame-Format: 8 Bit
11
   LDI  Reg_A, (1<<URSEL)|(3<<UCSZ0)
12
  OUT  UCSRC, Reg_A
13
   SBI  UCSRB, TXEN          ; TX aktivieren
14
  SBI  UCSRB, RXCIE                 ; Interrupt bei Empfang    
15
  SBI  UCSRB, RXEN                  ; RX (Empfang) aktivieren
16
RET
17
;*************************************************************************
Also,im Tutorial steht noch vieles mehr, was dir hilft, dein Ziel zu 
erreichen und lass die Diskussion, welche Sprache. Du siehst, das in den 
über 50 Beiträgen nur eine kleine Zahl wirklich hilfreich ist, weil sich 
die Mehrzahl darüber streitet, was einfacher zu erlernen ist und was die 
Firmen heut von ihren Mitarbeitern erwarten. Ich geb dir Brief und 
Siegel, das ein Spezialist im Assemblieren von Programmen immer noch 
hoch gefragt ist und er seine Programme ebenfalls in vergleichbarer Zeit 
wie ein "C"ler erstellt.  Ach ja, ich rede hier von Spezialisten, denn 
das Schreiben macht nicht die Zeit, sondern Konzept erstellen und die 
Prüfungen.
Gruß oldmax

von Peter D. (peda)


Lesenswert?

A. B. schrieb:
> ich würde mal behaupten, das jeder heutige compiler besser optimiert als
> 95% der standard-user hier und im allgemeinen

Ich hab etwa 10 Jahre 8051 Assembler gemacht, bin da also ziemlich fit.
Und dann habe ich ein C-Projekt übernehmen müssen.
Ich erzähl jetzt nicht die ganze Story, aber Fazit:
- C braucht etwa 5..20% mehr Flash
- C ist oft sogar schneller in der Ausführung
- C ist erheblich schneller beim Programm schreiben
- C ist wartbar und erweiterbar (Assembler überhaupt nicht)
- C ist portabel (Routinen von 8051 nach AVR sind ruckzuck portiert).

Insbesondere die Zeiteinsparung ist enorm. Wärend Villarriba (Assembler) 
noch Geschirr spült, feiert Villabacho (C) schon lange.

Auch beeindruckend, man kann ein fremdes C-Projekt erweitern, ohne es 
neu schreiben zu müssen oder komplett verstanden zu haben.


Peter

von Markus (Gast)


Lesenswert?

etwas anderer Ansatz. Bitte um Meinungen, Programmierfehler und 
Verbesserungen.

ADC ist immernoch weggelassen. Dafür "simuliert" Eingangspins. Die Ports 
wurden absichtlich nicht parametriert.


Danke!

Markus
1
/*
2
 * AssemblerApplication1.asm
3
 *
4
 *  Created: 07.06.2012 08:11:35
5
 *   Author: Install
6
 */ 
7
8
9
.equ F_CPU    = 1843200
10
.equ BAUD    = 9600
11
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
12
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate
13
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
14
 
15
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
16
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
17
.endif
18
 
19
.def temp = R16
20
.def cmd = R17
21
.def cs = R18
22
// Init Stackpointer
23
24
ldi temp, HIGH(RAMEND)
25
out SPH, temp
26
ldi temp, LOW(RAMEND)
27
out SPL, temp
28
29
// Init UART
30
31
lds temp, UCSR0B
32
sbr temp, 1<<TXEN0
33
sts UCSR0B, temp
34
lds temp, UBRR_VAL
35
sts UBRR0H, temp
36
lds temp, UBRR_VAL
37
sts UBRR0L, temp
38
39
40
MainLoop:
41
42
lds temp, PINC
43
sbrc temp, 0
44
rjmp Stufe_0
45
sbrc temp, 1
46
rjmp Stufe_1
47
sbrc temp, 2
48
rjmp Stufe_2
49
sbrc temp, 3
50
rjmp Stufe_3
51
52
53
rjmp MainLoop
54
55
56
57
// UART Senden
58
59
UART_Send:
60
61
rcall checkTXR
62
lds temp, 0x00
63
sts UDR0, temp
64
rcall checkTXR
65
lds temp, 0xFF
66
sts UDR0, temp
67
rcall checkTXR
68
lds temp, 0x9C
69
sts UDR0, temp
70
rcall checkTXR
71
sts UDR0, cmd    // Variable aus Stufe_n unterprogramm
72
rcall checkTXR
73
sts UDR0, cs
74
rcall checkTXR
75
rjmp MainLoop
76
77
checkTXR:      // Warteschleife für Fertig-Flag
78
ldi temp, UCSR0A
79
sbrs temp, TXC0
80
rjmp checkTXR
81
ret
82
83
84
Stufe_0:
85
ldi cmd, 0x80
86
ldi cs, 0x1B
87
rjmp UART_Send
88
89
Stufe_1:
90
ldi cmd, 0x9E
91
ldi cs, 0x39
92
rjmp UART_Send
93
94
Stufe_2:
95
ldi cmd, 0x3C
96
ldi cs, 0xD7
97
rjmp UART_Send
98
99
Stufe_3:
100
ldi cmd, 0x64
101
ldi cs, 0xFF
102
rjmp UART_Send

von Peter D. (peda)


Lesenswert?

Code als Anhang, sonst scrollt man sich die Finger wund.
Am besten aber nen neuen Thread, da das Thema ja nichts mehr mit "C oder 
Assembler" zu tun hat.

Niemand antwortet gerne nur für eine Person.
Daher muß das Topic zum Post passen.


Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

egbert schrieb:
> Richtig heissen müsste es: "C" oder eine Programmiersprache?

Nein: C, Assembler, oder eine Programmiersprache?  ;-)

von Jobst M. (jobstens-de)


Lesenswert?

Markus schrieb:
> 58 Zeilen? So einfach ist das? Hm.

Wenn Du jetzt nur die 58 Zeilen sehen würdest, würdest Du vermutlich 
nichts verstehen. Dort sind selbst die Label anonymisiert ;-)


> Ne Frage nebenbei, hast du dir dein Wissen selbst beigebracht oder im
> Studium?

Autodidakt. Ist aber eigentlich doch auch Studium :-D
Ich programmiere seit 1982 - da war ich 12.


> Ich würde gern etwas sehen. Nur wo anfangen? Wie hast du deinen Code
> strukturiert? In der Main Loop nur die Wertvergleiche mit Bedingter
> Sprunganweisung auf das entsprechende Unterprogramm?

Ich verzweige nicht, ich rechne. Ich ziehe vom gewandelten Wert den Wert 
für 4mA ab. Sollte ein Überlauf dabei passieren, kann eine 
Fehlerbehandlung gemacht werden (<4mA).
Dann Teile ich den Wert so, daß 20mA genau 10 ergeben. Es sollen doch 10 
gleiche Abschnitte sein, wenn ich das richtig verstehe?
Dieses Ergebnis multipliziere ich mit 5 (5 Byte pro Datenpaket) und 
addiere das wiederum zu der Staradresse meiner Wertetabelle. In dieser 
stehen hintereinander weg die einzelnen Datenpakete. Für die möglichen 
Werte 11-15 habe ich einfach noch 5 weitere Werte in die Tabelle 
geschrieben. Die Senderoutine sendet dann ab dieser Adresse einfach fünf 
Byte.


> An der Codelänge schätze ich, du hast nur ein UART Senden unterprogramm?

Nö. Steht einmal im Mainloop.


> Wie füttest du die Variablen für die letzen Bytes ein?

Stehen alle in der Tabelle. Ich sehe hier gerade noch Sparpotential :-D


Peter Dannegger schrieb:
> Am besten aber nen neuen Thread

Dann aber hier verlinken! ;-)


Muss los!

Gruß

Jobst

von Yalu X. (yalu) (Moderator)


Lesenswert?

Hier ist der Thread, wo die konkrete Softwareumsetzung diskutiert wird:

  Beitrag "Assemblercode Hilfestellung (Anfänger)"

von Markus (Gast)


Lesenswert?


von Ralph (Gast)


Lesenswert?

Dominik S. schrieb:
> (extrem zeitkritische Geschichten, bei denen
> es auf jeden CPU-Takt ankommt, jetzt mal außen vor - da mag man mit ASM
> und genauer Kenntnis der genutzten Befehle und somit CPU-Zyklen besser
> dran sein).

Wer auf solche Fälle stößt, hat ein grundlegendes Problem mit seinem 
Projekt.
Das heißt schlicht und einfach das entweder das Softwaredesign 
untauglich ist, und / oder der µC zu schwach ist.

==> zu Projektbeginn nicht richtig analysiert WAS eigentlich gebraucht 
wird um das Projekt bewältigen zu können.

Thomas O. schrieb:
> ich sehe die Vorteile des Assemblers darin das ich genau weiß was
> passiert, wie lange das dauert, wieviel RAM dafür gebraucht wird...
> Außerdem kann ich einige Sachen ganz gezielt beeinflussen z.B.
> Programmcounter, Stackpointer, Stack.

Und beim Autofahren stellst du auch permanent die Ventile neu ein, und 
änderst während der Fahrt den Luftdruck der Reifen,.......
Für was Brauchst du das denn ?????
Das kann ein Hochsprachen Compiler bedeutend besser und sicherer 
verwalten als 99% der selbsternannten Assemblergurus.

A. B. schrieb:
> auch in der automobil industrie z.b. wo die programmierung sicherlich
> wesentlich sicherheitskritischer als bei irgendwelchen led-blinkern,
> heizungs&temperaturreglern etc. wird C eingesetzt(wenn auch nach
> besonderen standards ala MISRA usw.)

Und zwar fast ausschließlich.

Ich programmiere beruflich Software für ESP Systeme.
Die einzigen Codebereiche die dort in Assembler geschrieben sind, ist 
der Scheduler des RTOS, und dort auch nur der Teil der die 
Taskumschaltung auf Registerebene ausführt, sowie die Behandlung von 
Exceptions wie zb Zugriffe auf ungültige Adressbereiche.

Alles in allen weniger als 0,1% der gesamten Codes

und warum ist das so ?
1. Assembler lässt sich nicht mit formalisierten Prüfalgorithmen wie zb 
die MISRA Standards prüfen. ==> Zuverlässigkeit / Sicherheit
2. Die Implementierung und Validierung des Codes dauert viel zu lange im 
Vergleich zu C ==> Kosten
3. Wechsel des µC, selbst innerhalb einer Familie benötigen ein 
vielfaches der Arbeit zur Codeanpassung als das in C der Fall ist. ==> 
Kosten
4. Der C Code lässt sich in Simulationen auch unabhängig des µC prüfen 
und testen.  ==> Zuverlässigkeit / Sicherheit
5. Bedeutend geringere Gefahr für fehlerhaftes Softwareverhalten 
aufgrund der abstrakteren Programmierung. ( der Compiler wird eine Logik 
immer identisch ins Assembler übersetzen, wenn das jedes mal von Hand 
gemacht wird, ist das nicht sichergestellt).  ==> Zuverlässigkeit / 
Sicherheit
6. Der Compiler ist auf den µC optimiert. Die Entwickler des Compilers 
haben da mit Sicherheit mehr Fachwissen wie sich der µC wann verhält als 
der Programmierer der meint das er als Einzelperson besser ist als ein 
ganzes Team das einen qualifizierten Compiler erstellt.
 ==> Zuverlässigkeit / Sicherheit

==> Assembler nur da wo es keine Alternative gibt.
Assembler so Viel wie notwendig, so Wenig wie möglich.

Das heißt aber auch, das Assembler für einen Programmierer in solchen µC 
Systeme kein Fremdwort sein darf.
Aber die Masse der Arbeit läuft in C.

von Carsten S. (dg3ycs)


Lesenswert?

Johann L. schrieb:
> egbert schrieb:
>
>> "C" ist immer dann das Mittel der Wahl, wenn das Ergebnis der
>> Programmausführung bzw. dessen Funktion vollkommen egal ist.
>
> Oje, da hat jemand mal ne gründliche Bauchlandung gemach, weil er zu
> faul war, die Sprache zu lernen und einfach nur rumgeclickt und
> rumprobiert hat.
> ...
> Wenn du dir mit dem Hammer ständig auf die Finger schlägst, dann ist
> nicht der Hammer schuld.
>
Nett und zutreffend gesagt, ABER

Johann L. schrieb:
> Also lern erst mal worum es geht oder, anstatt bei jeder sich bietenden
> Gelegenheit dein unqualifiziertes "C = Zufall" loszulassen.

Glaubst du wirklich bei jemanden der einen ARTIKEL der nun schon vor 
fast 20 Jahre in einer Computerzeitschrift als APRILSCHERZ 
veröffentlicht wurde und seit Jahren auf allen Witzseiten mit IT Bezug 
durchs Netz geistert scheinbar für bare Münze nimmt noch Lernfähigkeit 
erwarten zu können?

Der Originaltext ist im übrigen unter "C Hoax" an zahlreichen Stellen im 
Netz zu finden...

Gruß
Carsten

von C ist für Einsteiger einfacher (Gast)


Lesenswert?

hier mal ein schönes Bsp.     lol
Beitrag "Problem mit Stackpointer"

möge jeder für sich entscheiden wie der Einstieg leichter fällt. :->>>

von A. B. (funky)


Lesenswert?

Na zum Glück muss man auch mit ASM nicht so besch... programmieren :) 
Aber trotzdem. Einfach mal auf Peter&Ralph hören.

Und wie gesagt...wenn man im Hobbybereich Spass an ASM hat, gerne so 
kompliziert&minimalistisch programmiert wie möglich dann spricht da ja 
nix gegen.
Aber sobald andere Menschen den Quellcode auch verstehen sollen, und 
evtl. mal ne Änderung durchführen müssen, dann ist ASM sicherlich nicht 
die zu bevorzugende Sprache

von Thomas (kosmos)


Lesenswert?

ich denke mal das es unbestritten ist das sich C leichter lesen läßt als 
ASM. Allerdings hat man bei beiden noch die Möglichkeit Bausteine zu 
kommentieren.

Der Vorteil von C ist ja wohl die Portierbarkeit also kann man leicht 
auf einen neuen µC oder Mitarbeitet umswitchen. Weitere Vorteile sehe 
ich in komplexen Berechnungen das ist in ASM dann doch etwas aufwändiger 
wenn man sehr viele Formeln zu rechnen hat.

Einen größeren µC zu nehmen halte ich für die letzte Lösung, lieber 
sollte man sich Gedanken machen, möglichst sparsam mit Ressourcen 
umzugehen, dann bräuchten wir heute auch keinen Quadcores um zu 
vertuschen das das Betriebssystem elend langsam geworden ist. Da heute 
aber fast jeder C benutzt kommen dann so Kommentar wie, da muss man halt 
den µC 2-3 Nummern größer wählen.

Du begehst 100% keinen Fehler mit ASM anzufangen und später auf C zu 
wechseln.

von A.T. (Gast)


Lesenswert?

Ralph schrieb:
> 1. Assembler lässt sich nicht mit formalisierten Prüfalgorithmen wie zb
> die MISRA Standards prüfen. ==> Zuverlässigkeit / Sicherheit

Dabei darf man nicht vergessen, dass MISRA hauptsächlich Empfehlungen 
enthält, um die im C-"Standard" enthaltenen Interpretationsfreiräume zu 
beschränken und damit C überhaupt erst mit MISRA zu einer sauber 
spezifizierten Programmiersprache wird.
Erst mit diesen Nachbesserungen/Beschränkungen wird das Verhalten von 
C-Compilern überhaupt eindeutig und damit ein vorhersagbares 
Programmverhalten möglich.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Thomas O. schrieb:
> Der Vorteil von C ist ja wohl die Portierbarkeit also kann man leicht
> auf einen neuen µC oder Mitarbeitet umswitchen.

Ein Vorteil von C ist auch, dass bestimmte Routineoperationen
durch den Compiler abgenommen werden, und dieser aufgrund seiner
hinterlegten Vorschriften eben in diesen keine eigenen Fehler
mehr macht.  Die logische Umsetzung eines simplen "if (x > y)"
kann im Assembler halt in sowas ausarten wie "überspringe den
nächsten Befehl nicht, wenn die Bedingung wahr ist, und benutze
als nächsten Befehl einen Sprung, weil dieser ein weiter entferntes
Ziel erreichen kann als ein Branch".  Bei einer Assemblerprogram-
mierung hat man gute Chancen, in so eine doppelte oder dreifache
Negation schnell einen Denkfehler einzubauen.

> Einen größeren µC zu nehmen halte ich für die letzte Lösung

Jein.  Du erkaufst damit u. U. einfach Wartungsfreundlichkeit und
eine effizientere (im Sinne von: schneller fertig werden) Program-
mierung.  Wenn der nächstgrößere Controller nur zwei oder drei
Euro mehr kostet, du aber stattdessen für das minimalistische
Programm statt zehn Stunden Arbeit dann fünfzig Stunden in Assembler
programmierst und debuggst, dann würde ich für ein Einzelstück
allemal dem nächstgrößeren Controller den Vorzug geben.

Wenn man für Serien von 10000+ Stück bauen muss, sieht die Sache
natürlich völlig anders aus.

A.T. schrieb:
> und damit C überhaupt erst mit MISRA zu einer sauber
> spezifizierten Programmiersprache wird.

Nein, sauber spezifiziert ist sie so auch.  MISRA verbietet nur
die Nutzung bestimmter Konstrukte, die in der Vergangenheit als
Fehlerquellen (der Programmier wohlgemerkt) bekannt geworden sind.
(Inwiefern davon vieles noch zeitgemäß ist oder nicht durch
verbesserte Warnmöglichkeiten aktueller Compiler ohnehin überflüssig,
steht auf einem anderen Blatt geschrieben.  MISRA lebt noch auf einem
mittlerweile mehr als 20 Jahre alten Standard.)

Die Alternative in Richtung Hochsprache wäre wohl stattdessen Ada,
um vergleichbare Probleme möglichst von vornherein zu vermeiden.

von A. B. (funky)


Lesenswert?

Thomas O. schrieb:

> Einen größeren µC zu nehmen halte ich für die letzte Lösung, lieber
> sollte man sich Gedanken machen, möglichst sparsam mit Ressourcen
> umzugehen, dann bräuchten wir heute auch keinen Quadcores um zu
> vertuschen das das Betriebssystem elend langsam geworden ist. Da heute
> aber fast jeder C benutzt kommen dann so Kommentar wie, da muss man halt
> den µC 2-3 Nummern größer wählen.

nur leider wird dabei oft unter den teppich gekehrt, das heutige 
betriebssysteme um einiges mehr bieten (komfortfunktionen)
das sowas leistung schluckt ist ja normal. selbst das achso effiziente 
linux macht heute auf nem x486 auch keinen spass mehr(bzw es läuft da 
nicht mal mehr unbedingt).

von Colonel (Gast)


Lesenswert?

A. B. schrieb:
> selbst das achso effiziente
> linux macht heute auf nem x486 auch keinen spass mehr(bzw es läuft da
> nicht mal mehr unbedingt).

Du kannst Dir jederzeit aus aktuellen Sourcen einen Kernel 
konfigurieren/bauen, der aus Deinem 486-25SX mit 4MB RAM das Optimum 
raus holt. :-)

Nur wirst Du keinen solchen Kernel vorkompiliert in einer aktuellen 
Linux-Distribution finden. :-D

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.