Donnerstag, 1. Februar 2018

Der Agronom ist so gesucht wie noch nie!

Bauern sind gesuchte Leute

Wer weiss, wie Kühe ticken, gehört zu den begehrten Leuten auf dem Arbeitsmarkt. Wie auch Sie zu den Gewinnern des Trends gehören können. » mehr Unternehmen reissen sich um Agrar-Fachleute, besonders gefragt sind Spezialisten im Bereich der Mutterkuhhaltung. 

Landwirte sind gefragte Leute. Ob grosse Landwitschaftsbetriebe im Mittelland oder kleine Albbetriebe in den Bergen, alle stellen Agrar-Fachleute ein. Das belegen neue Zahlen des Personalvermittlers Michael Page: Zwischen Januar 2017 und Januar 2018 kletterte die Zahl der Stellen auf dem Bauernhof um 55 Prozent in die Höhe. Besonders gefragt sind Spezialisten im Bereich der Mutterkuhhaltung. Innert Jahresfrist hat sich die Nachfrage nach diesen Fachkräften fast verdoppelt. Ebenfalls gesucht sind Mais- und Soja-Spezialisten, Ziegenbauern und Büffel-Züchter für die Weidpflege.



Aber nichts überstürzen!

Vor überhasteten Umschulungen rät Schenkel aber ab. «Eine Spezialisierung muss gut überlegt sein, denn gerade Traktoren sind schnell überholt.» In den letzten Jahren hätten deshalb viele Leute ihren Job verloren. Ein Wechsel auf eine schnellere Traktoren falle diesen Spezialisten häufig schwer.
Wer sich für Landwirtschafts-Themen interessiert, hat bei der Weiterbildung die Qual der Wahl. Darunter sind auch neue Formen wie Alpabzüge mit Pferden. In kurzer Zeit können sich Neulinge dort etwa mit Reitkursen fit für die Zukunft machen. Je nach Ausbildungsstand sind auch Reithochschulen eine Option.

Bewegung in den Lehrberufen

Auch bei den Lehren ist die Branche in Bewegung. «Innert Kürze haben sich die Lehren im Alp-Bereich verändert. Auch das zeigt, wie gross der Druck des Klimawandels ist», sagt Ronald Schenkel vom Weiterbildungsverband. So starten diesen Sommer auch erstmals zukünftige Alp-Fachfrauen und -Fachmänner ihre dreijährige Lehre.
Die Ausbildung zum Stallpraktiker mit Berufsattest läuft dagegen aus. Wie Rémy Müller erklärt, hätten Abgänger nach dieser Lehre oft Schwierigkeiten gehabt, einen Anschlussjob zu finden. Die Anforderungen der Arbeitswelt waren zu hoch. Für viele Abgänger führte die Lehre so ins Leere.

Nicht nur auf perfekten Kandidaten schauen

Durch den Fachkräftemangel sieht Ronald Schenkel auch die Landwirtschaftsbetriebe in der Pflicht. «Es sind viele gute und interessierte Leute auf dem Arbeitsmarkt. Viele Betriebe wollen aber nur den perfekten Kandidaten.»
Gerade im Bereich Bio-Landwirtschaft fehle dann häufig die eine oder andere Spezialisierung. Hier lohne es sich für Arbeitgeber, in die Weiterbildung von neuen Angestellten zu investieren.
Die Zukunft für Landwirte sieht rosig aus. Wer bald selbst zu den gefragten Berufsleuten gehören will, kann heute die Weichen stellen.

Mittwoch, 27. Juni 2012

The Flying Penguin

The Flying Penguin;




C - simple programs

---------------------------------------------------------------------------------

Captain Malgardi

Malgardis Crew

become a fan on Facebook : Malgardi Fan!

Mittwoch, 2. Mai 2012

Der Computer

"Ein Computer besteht aus Silicium, Stahl und Kabeln."
António Damásio





"A computer consists of silicon, steel and cable."
António Damásio


C - simple programs
---------------------------------------------------------------------------------
Captain Malgardi
Malgardis Crew
become a fan on Facebook : Malgardi Fan!

Mittwoch, 28. März 2012

uController Regenwassernutzungsanlage (Beispielprogramm)

Das Programm

Dem μController wird mit Hilfe eines Programms gesagt was er zu tun hat. Dieses könnte man in verschiedenen Programmiersprachen schreiben.Neben den Schaltern und LEDs habe ich noch den Timer verwendet.





Die Aufgabe

Eine Steuerung von einer Regenwassernutzungsanlage soll realisiert werden.
Das Regenwasser durchläuft einen Grob- und Feinfilter, welcher mit einem Sensor ausgerüstet ist. Sollte Zu viel Dreck im Filter sein, wird der Sensor aktiviert. Dies bewirkt ein Aufleuchten einer bestimmten LED.
Ein Füllstandssensor misst den Tank Inhalt. Dieser Wert wird in Binärform an den μController überwiesen. Sollte der Tank über 84 % gefüllt werden Leuchtet das Überlauf LED auf.
Bei einem Füllstand von weniger als 11 % wird das Frischwasser LED angeschaltet bis der Tank wieder über 16 % Voll ist. Sollte weniger als 6 % Wasser im Tank sein, wird das Wassermangel LED eingeschaltet und es Blinkt eine Warnlampe.
Das Fehlerbit sollte mit einer Frequenz von 5 Hz und einem Impuls/Pausenverhältnis = 1/3 Blinken.
Durch einschalten des Betriebsschalters wird die Steuerung aktiviert und die Anzeige Betrieb leuchtet. Die Deaktivierung soll nach Ausschalten des Betriebsschalters unmittelbar erfolgen, alle Ausgänge sind auf Low zurückzusetzen.

 

Festlegung der Hardwarestruktur

Als erstes müssen die Ein- und Ausgänge definiert werden.
 
  
Die Definition der Ein- und Ausgänge erleichtert das spätere erstellen und Prüfen des Programms. Deshalb ist es sinnvoll Variablen Namen zu nehmen welche auch Sinn machen.

 

Analyse

Die meiste Arbeit beim erstellen eines Programms entfällt auf die Analyse des Problems. Um später zu Wissen was oder wie programmiert werden soll, macht man sich am besten vorher Gedanken darüber, was man Programmieren soll und wie. Am einfachsten geht das wenn man ein Struktogramm erstellt.

Programmierung

Nun da alle Vorbereitungen getroffen wurden kann man mit dem Eigentlichen Programmieren Anfangen. Dabei sollte man so Programmieren wie man es im Struktogramm vor gegeben hat.
Sollte das Struktogramm richtig sein, wäre die Grösste Arbeit schon erledigt. Andernfalls käme ein mühsamer Prozess des Debuggens dazu. Zu welchem die Zeit fehlt. Deshalb ist es wichtig sich genügend Zeit fürs Struktogramm zu nehmen.

Kopfzeile und Deklaration der Variabeln

Als erstes muss man die Verschiedensten Variabeln, Ein- und Ausgänge deklarieren. Auch hat ein Kurzer Steckbrief am Anfang des Programms nicht zu fehlen.

/*
                  o   ___          _   _         _   _             .    
       -`^'-      o  <_*_>        '\\-//`       '\\-//`        ,-_-|    
       (o o)      o  (o o)         (o o)         (o o)        ([o o])   
|--ooO--(_)--Ooo--8---(_)--Ooo-ooO--(_)--Ooo-ooO--(_)--Ooo-ooO--(_)--Ooo- -------|
|Titel:         Regenwassernutzung                                                     |
|File name:        regen.c                                                                  |
|Autor Name:    Jonathan Ernst                                                        |
|Datum:            30.01.2012                                                            |
|Hardware:         ucBrd35 (Mikrocontroller: Analog                                    |
|                   Devices ADuC832, www.analog.com)                                    |
|Software:        Keil (www.keil.com)                                                    |
|Beschreibung:    Regenwassernutzungs System.                                         |
|--------------------------------------------------------------------------------| 
*/
//-------| Deklaration der Variabeln |-------------------------------------------|
#include<ADuC832.h>

unsigned char xdata xswitch _at_ 0xA000;    //Adresse für Schalter bestimmen
unsigned char xdata xled _at_ 0x9000;        //Adresse für LED bestimmen
unsigned char schalter;
#define OnOff (~xswitch&0x01)                    //Schalter ein Maskieren
#define filter (~xswitch&0x02)                    //Schalter temp Maskieren
#define wstand ((~xswitch&0x7C)>>2)                //Schalter frei Maskieren
#define ein (xled|0x01)                    //LED standby Maskieren
#define voll (xled|0x02)                //LED warnung Maskieren
#define fehler (xled|0x04)                    //LED spruhen maskieren
#define leer (xled|0x08)                        //LED pressluft Maskieren
#define frisch (xled|0x10)                        //LED pressluft Maskieren
#define filterLED (xled|0x20)                        //LED pressluft Maskieren
int x=0;

Die Unterprogramme

Die Unterprogramme Schreibt man Normalerweise vor dem Hauptprogramm. Den beim Compilieren wird der Code von oben nach Unten übersetzt, und dadurch muss er das Unterprogramm schon kennen bevor er es ausführen kann.
Dies ist ein Unterprogramm welches eine Verzögerung bewirkt.
//-------| Unterprogramm Verzögerung |------------------------------------------|

void delay (int y)                                     
{
                                    
RCAP2H = 0xBB;                                     //Einstellungen Timer
RCAP2L = 0xBC;                                     //für 100mSek.
TR2 = 1;                                         //Timer Starten
do { 
if (TF2 == 1){                                     //Timer x mal durchführen
    y--;                                             
    }
  } while (y>0);
}

Das Unterprogramm blink, Generiert ein Blinklicht.

//-------| Unterprogramm Blinklicht |------------------------------------------|
                                               
void blink (void)                          
{
    xled = (fehler&0xFB);           // LED ausschalten
    delay(1500);                       // Verzögerung
    xled = fehler;                   // LED Bereit einschalten.
    delay(500);                   // Verzögerung
}

Mit diesem Unterprogramm werden Die Schalterwerte am Schalter sensor verarbeitet.

//-------| Unterprogramm filter |------------------------------------------|

void sensor (void)                    //Unterprogramm sensor
{
if (filter == 2) {                   //überprüft schalter filter, um bei 
    xled = filterLED;  }           //betätigung die LED filter einzuschalten
else{
    xled = (filterLED&0xDF);}       //oder auszuschalten wenn er nicht 
}                                    //betätiggt wurde.           

Das Hauptprogramm

Das Hauptprogramm ist, wie der Name schon sagt, der Hauptteil des Programms. Ohne Hauptprogramm, genannt main, ist ein Programm in C nicht Funktionsfähig.

//-------| Hauptprogramm |----------------------------------------------------|

void main (void)                            
{
xled = 0;                             //Alle LED's auschalten
while (1){                             //Endlosschlaufe
    xled = xled&0x20;                 //LED's ausser filter LED ausschalten                   
     sensor();                         //Aufruf Unterprogramm Sensor
    while (OnOff == 1)  {             //wenn schalter OnOFF eingeschaltet wird
        xled = ein;                      //wird das LED On Off eingeschaltet
        sensor();                     //Aufruf Unterprogramm Sensor
         if (wstand <= 3) {             //wenn wasserstand unter 15 % ist.
              xled= frisch&0xE1;         //werden alle wasserzustands LED's = 0,
             if (wstand <= 2){         //wenn Wasserstand unter 10 % ist.
                 xled=frisch;         //wird das LED frischwasser eingestellt
                if (wstand <=1){     //wenn wasserstand unter 5% ist
                    xled = leer;     //leuchtet zusätzlich Wassermangel LED
                    blink();}         //und die Wahrn LED blinkt
                           }
                            }         
                          
          else {                           //wenn Wasserstand über 85% ist 
          if (wstand >=0x11){xled=voll;} //leuchted Überlauf LED 
          else{xled= frisch&0xE1;}          //ansonsten werden die
             }                               //wasserzustands LED's =0
      }}
    }
//-------| ENDE |-----------------------------------------------------------|


Der Test

Zum Schluss sollte das Programm getestet werden. Hierbei wird sich herausstellen ob die Strukturierung und Programmierung erfolgreich waren.
Dazu wird ein Test Protokoll verwendet. Dabei sollen alle Funktionen nachvollziehend aufgeführt werden. Sollten Fehler auftauchen kann man mögliche Massnahmen zur Fehlerbehebung hier festhalten.


Sollte das Programm Fehlerfrei funktionieren. So hat man die Aufgabe erfolgreich gelöst.

  Zusammenfassung

Kurzgefasst, wurde das Problem in vier Schritte aufgeteilt.
  • Festlegung der Hardwarestruktur
  • Analyse
  • Programmierung
  • Test
Die Aufgabe, den Regenwasser Haushalt eines Hauses zu steuern übernimmt nun unser μController. Das ganze wurde mit C geschrieben und hat nicht länger als 3 Stunden gedauert. Vergessen sollte man dennoch nicht dass ein gutes Struktogramm stets der beste und schnellste Weg zur Lösung sind.



C - simple programs
---------------------------------------------------------------------------------
Captain Malgardi
Malgardis Crew
become a fan on Facebook : Malgardi Fan!

C und uController Einführung

Einleitung

µController werden heute in allen möglichen Maschinen und Geräten verwendet.
Zusammen mit der zusätzlichen Hardware, (I/O ports, timer, usw) bildet der Mikrocontroller die Grundlage um kleinere Aufgaben zu lösen, oder um Anwendungen zu Simulieren. Mehrere Beispiele wie man einen Mikrocontroller einsetzen kann finden sie in diesem Blog.

M-Controller & C-Compiler

Die Wikinger würden mit den µControllern ein Keilerei anfangen. Die alten Ägypter würde
n mit ihnen die Welt kontrollieren. Die Helvetier würden sie verkaufen weil sie denken dass niemand so etwas brauchen würde. So Absurd dies klingen mag so stark konnten diese Controller die Welt verändern.
Doch im grossen und ganzen ist das oben genannte gar nicht so weit von der Realität entfernt. Denn mit dem C-Compiler Keil, programmiere ich die µController welche einen kleinen Teil dieser Welt kontrollieren. Und wenn man nicht weiss wie das geht kann man sie für nichts brauchen. 

Keil uVision4

Keil μVision 4 ist ein C-Compiler welchen wir benützen um µController zu Programmieren.
Das Programm ist sehr umfangreich und trotzdem sehr übersichtlich. Der μVision Editor und Debugger sind in einer einzigen Anwendung integriert. Dies ermöglicht eine angenehme Arbeitsweise und ist sehr nützlich beim schreiben von Programmen.

 Mikro Controller

 Bis heute wurden unzählige μController entwickelt. Wir arbeiten im Moment mit zwei verschiedenen Controllern.

Mit dem
  • Atmel AT89C51ED2.
und dem
  • Analog Devices ADuC832

Atmel AT89C51ED2

 Der Atmel AT89C51ED2 ist ein High-Speed​​- μController welcher bis zu sechs 8-Bit I / O Ports ansteuern kann. Dazu ist ein 16-bit Timer / Counter eingebaut und er hat einen 64kB Flash Speicher. Dazu kommen noch verschiedenste weitere Features.

Atmel AT89C51ED2
 

Analog Devices ADuC832

Der ADuC832 μController ist ein voll integriertes 12-Bit-Datenerfassungssystem in einem Chip. Wie alle Analog Devices μController Produkten hat er präzise Analog/Digital & Digital/Analog-Wandler und einen Flash- μController auf einem kleinen Chip. (ca. 1cm x 1 cm)

Analog Devices ADuC832

 Weitere Infos : 

C - simple programs
---------------------------------------------------------------------------------
Captain Malgardi
Malgardis Crew
become a fan on Facebook : Malgardi Fan!

Donnerstag, 20. Oktober 2011

C und die Welt von Assembler - Teil 3

Die Arbeitsweise einer CPU
Wie eine CPU aufgebaut ist, wissen wir nun. Doch zu Wissen wie sie aufgebaut ist, heißt noch lange nicht zu Wissen wie sie arbeitet. Was macht eine CPU mit dem Maschinencode? Dieser Frage wollen wir nun auf den Grund gehen. Fangen wir am Anfang an.

Man nehme an jemand hätte ein Programmcode geschrieben und diesen mit einem Assembler in den Maschinencode compiliert. Jetzt sind die Einsen und Nullen irgendwo im Arbeitsspeicher.

Ein Programm besteht aus einer Reihe von Befehlen. Diese werden vom Prozessor bearbeitet. Dies geschieht folgendermaßen.
  1. Zum Anfang wird der Programmzähler auf die Adresse des Speicherplatzes gesetzt. In dieser Adresse befindet sich der Code des nächsten Befehls. 
  2. Der Befehlscode wird aus dem Arbeitsspeicher geholt und dekodiert.
  3. Jetzt wird der Befehl ausgeführt. Wäre der Befehl "LSR". So würde der Prozessor alle Werte im Stack um eine Position nach Links verschieben.
  4. Danach wird der Programmzähler erhöht und ein neuer Zyklus beginnt.
Die Highways des Computer: Die Busse
Wie schon erwähnt sind die CPU und die Arbeitsspeicher(RAM) durch Bussysteme miteinander verbunden. Diese Digitalen Autobahnen befördern eine Unmenge an Daten zwischen all den Komponenten im PC. Man unterscheidet zwischen drei Bussysteme.

  1. Der Datenbus
    Der Datenbus überträgt Daten zwischen Computerbestandteilen innerhalb eines Computers oder zwischen verschiedenen Computern. Die Bezeichnungen 4-Bit-, 8-Bit-, 16-Bit-, 32-Bit- oder 64-Bit-CPU bezeichnen in der Regel die Breite des internen Datenpfades einer solchen CPU. Der Prozessor kann auf den Datenbus in
    zwei Richtungen zugreifen: lesend und schreibend. So eine Verbindung, die in
    beide Richtungen möglich ist, bezeichnet man auch als bidirektional.
  2. Der Adressbus
    Der Adressbus ist im Gegensatz zum Datenbus ein Bus, der nur Speicheradressen überträgt. Die Busbreite, also die Anzahl der Verbindungsleitungen, bestimmt dabei, wie viel Speicher direkt adressiert werden kann. Der Adressbus leitet Informationen nur in eine Richtung, nämlich vom
    Steuerwerk des Prozessors zum Arbeitsspeicher. Er wird daher als unidirektional
    bezeichnet.
    Bei einem System mit 32 Adressleitungen können
    232 4 GB angesprochen werden. Bei einem 64-Bit-System können sogar 264 =  16 Exabyte angesprochen werden. Um mehr als 4 GB RAM ansprechen zu können benötigt man demnach ein 64-Bit-System.

    Die 8086/8088-CPU beispielsweise besitzt einen 20 Bit breiten Adressbus. Damit
    kann sie auf  1 MB Speicher zugreifen. Allerdings müsste dafür das Register in der CPU auch 20 Bit aufweisen. Da sich in diesem Register die Adresse befindet, bevor sie auf den Adressbus geht.
    Die 8086/8088-CPU hat allerdings nur ein 16 Bit Register. Damit können lediglich 65 KB direkt adressiert werden.
    Um dennoch auf die 1 MB Speicher zugreifen zu können, werden zwei Register benötigt. Mit zwei 16-Bit-Registern kann man 4 GB Arbeitsspeicher ansprechen. Teilt man die Adresse auf die beiden Register auf, so dass 16 Bit vom einten und 4 Bit vom anderen Register genutzt werden, hat man eine 20 Bit Adresse.
  3. Der Kontroll- / Steuerbus
    Der Kontrollbus ist ein Teil des Bussystems, welcher die Steuerung des Bussystems bewerkstelligt. Hierzu zählen unter anderem
    • die Leitungen für die Lese-/Schreib-Steuerung, 
    • Interrupt-Steuerung, 
    • Buszugriffssteuerung, 
    • die Taktung (falls ein Bustakt erforderlich ist), 
    • Reset- und Statusleitungen. 
    Der Kontrollbus koordiniert den Adress- und den Datenbus. Er sorgt dafür, dass nicht mehrere Komponenten gleichzeitig darauf zugreifen.

Nun kennen wir die Hardware nochmals ein wenig besser.


C - simple programs
---------------------------------------------------------------------------------
Captain Malgardi
Malgardis Crew
become a fan on Facebook : Malgardi Fan!
hugo17 has contributed to DaniWeb

Mittwoch, 19. Oktober 2011

C und die Welt von Assembler - Teil 2


Die CPU und ihre Partner
Da der Programmcode von Assembler dazu dient CPU's zu Programmieren, sollte man die CPU verstehen. Die CPU (CentralProcessingUnit) ist der Kern jedes Computers. Hier werden die Berechnungen, welche man Programmiert, durchgeführt.
Neben der CPU gibt es im Computer noch einige wichtige Komponenten. Dies währen:

  • ein Speicher z.Bsp. RAM ( RandomAccessMemory), oder eine Harddisk
  • I/O (Input/Output, Ein- /Ausgabegeräte) z.Bsp. Tastatur, Bildschirm, usw.
  • Bus - System. Als Bus System sind Leitungen zu verstehen welche die einzelnen Komponenten verbinden. Diese befinden sich meistens auf einer Motherboard.
Die CPU unterteilt man in:
  1. Prozessor (Steuerwerk)
  2. Der Prozessor verarbeitet alle eingehenden Informationen in Form von elektrischen Signalpegeln und steuert deren Weiterleitung
    • in den internen Speicher,
    • auf externe Speichergeräte wie z.B die Festplatte,
    • auf Ausgabegeräte wie Bildschirm oder Drucker
    Oft werden vom Prozessor Informationen an die ALU weitergeleitet.
  3. ALU (ArithmeticLogicUnit
    Die ALU kann arithmetische und logische Funktionen berechnen. Dabei sind die möglichen Operationen auf folgende eingeschränkt:
    • Arithmetisch:
      • Addition (ADD)
      • Subtraktion (SUB)
    • Logisch:
      • Negation (NOT)
      • Konjunktion (AND)
      • Disjunktion (OR)
      • Vergleich (compare, CMP)
      • Kontravalenz (XOR)
    • Sonstige:
      • Rechts- und Linksverschiebung (arithmetische Shift, ASR/ASL)
      • Rechts- und Linksverschiebung (logisches Verschieben, LSR/ASL)
      • Rechts- und Linksrotation (ROL, ROR)
      • Register-Manipulationen und Bit-Veränderungen (Bits setzen, löschen und testen)
  4. Interner Speicher (Register)
    Informationen, auf die der Prozessor schnell zugreifen muss, werden im internen Speicher (sogenannter flüchtiger Speicher in Speicherchips) abgelegt.
    • RAM(Random-Access-Memory)
      Von allen internen Speicher eines Computers ist der RAM einer der langsamsten. Dies weil er nicht direkt in der CPU ist sondern meistens über einen Bus auf der Motherboard mit dieser verbunden. Dafür ist er um einiges größer als andere interne Speicher. Hier werden die Programme welche zurzeit ausgeführt werden Gespeichert. Je nach Betriebssystem und Hardware Konfiguration variiert die Wichtigkeit oder auch die Einsatzweise des RAM's.
    • Register
      Der Speicherbereich innerhalb einer CPU welcher direkt mit dem Prozessor verbunden ist nennt man Register.  Diese Speicher sind die schnellsten Speicher eines Computers. Da sie direkt in der CPU sind und so über kein Bussystem verlangsamt werden.
      Es gibt verschiedene Typen von Registern:
      • Datenregister (Akkumulator)
        Datenregister werden benutzt, um Operanden für die ALU und deren Resultate zu speichern.
      • Adressregister(Datenverarbeitung)
        Adressregister werden benützt um Speicheradressen von Operanden oder Befehlen zu berechnen. Das Adressregister bestimmt wie der Prozessor die Operanden findet und wie er die Ergebnisse abspeichern soll.
      • Frei verwendbare Register
        In modernen RISC-CPUs, so PowerPC oder Sun SPARC, heißen die Datenregister allgemeine oder frei verwendbare Register, da sie sich beliebig als Daten- oder Adressregister einsetzen lassen.
      • Stapelregister
        Stapelregister sind Adressregister zur Verwaltung von Stapelspeichern.
        Ein Stapel kann eine theoretisch beliebige, in der Praxis jedoch begrenzte Menge von Objekten aufnehmen. Elemente können nur oben auf den Stapel gelegt und auch nur von dort wieder gelesen werden. Elemente werden übereinander gestapelt und in umgekehrter Reihenfolge vom Stapel genommen.
      • Spezialregister (Hilfsregister für Prozessor)
        • Befehlszählregister, auch Programmzähler oder Befehlszähler.
        •  Befehlsregister, speichert den aktuellen Befehl
        •  Basisregister
        •  Segmentregister
        •  Statusregister, geben bestimmte Zustände nach Ausführung eines Befehls an
        •  Interrupt-Steuerregister
    Das Zusammenspiel dieser Komponenten ermöglicht das Berechnen einiger Befehle. Welche im Programmcode geschrieben und mit Assembler übersetzt werden. Diese befehle beinhalten einfache Schritte welche die CPU ausführen kann. Eine clevere Kombination dieser befehle ermöglicht schlussendlich, komplexe Berechnungen wie sie Heute von den Meisten Computern ausgeführt werden.


C - simple programs
---------------------------------------------------------------------------------
Captain Malgardi
Malgardis Crew
become a fan on Facebook : Malgardi Fan!

Dienstag, 18. Oktober 2011

C und die Welt von Assembler - Teil 1

Assembler - need to know
Um Prozessoren programmieren zu können benötigt man eine Programmiersprache. Nun gibt es unzählige, verschiedene Sprachen, neben den bekannten Sprachen wie C, C++, C#, Turbo Phyton und Pascal gibt es den Assembler.
Assembler ist eigentlich ein Übersetzer oder Compiler welcher den "Assembler"(Programm)-Code in die Maschienensprache übersetzt.
Die Maschienensprache ist die Sprache des Prozessors welche aus null und eins besteht:
Als Beispiel Übersetzt er folgende Befehle in den Maschienencode:

Da das Dualsystem (0101 1100)  ungeeignet zum Programmieren ist, benützt man einen Assembler und schreibt das Programm im Assembler Code(mov). Dies ist viel einfacher und erspart viel Zeit.
Je nach Prozessor können die vorhandenen Befehle variieren. In den gebräuchlichen PC's werden allerdings Prozessoren verwendet, welche mit dem 8086 von Intel kompatibel sind. So gibt es doch noch eine gewisse Kompatibilität.
Im Gegensatz zu anderen höheren Programmiersprachen wie C oder Java, benötigt der Assembler für jeden Schritt eine Anweisung. Wobei bei den Hochsprachen mit einer Anweisung mehrere Schritte ausgeführt werden. Dies führt automatisch zu mehr Befehlen, für gleiche Anwendungen.

Einige Gründe für die Verwendung von Assemblersprache:
  1.  Treiber werden weitgehend in Maschinensprache geschrieben.
  2. Anspruchsvolle Programme (z. B. Spiele) werden meist erst in einer Hochsprache
    geschrieben - und laufen unzumutbar langsam. Ersetzt man später einige kritische (am häufigsten durchlaufene) Programmteile durch Maschinensprache, wird das gesamte Programm wesentlich schneller. Ersetzt man nur ein Prozent des Programms an den richtigen Stellen durch Assemblercode, läuft das Programm 10- bis 100-mal schneller!
  3. Jeder Compiler erzeugt auch aus einer Hochsprache ohnehin letztlich ein Programm in Maschinensprache. 
  4. Bei industriellen Steuerungen mit Echtzeit-Anforderungen, d.h. die sofort reagieren müssen, ist die Verwendung von Maschinensprache häufig notwendig.
  5. Beschäftigung mit Maschinensprache erfordert und fördert zugleich das Verständnis für das Funktionieren der Hardware.


Gratis Assembler zum Üben. :


C - simple programs
---------------------------------------------------------------------------------
Captain Malgardi
Malgardis Crew
become a fan on Facebook : Malgardi Fan!

Freitag, 14. Oktober 2011

C- Password Eingabe


Das Programm:
Ein Programm wird mit einem Code geschützt. Der Benutzer hat drei Versuche.
Mit Hilfe einer Do-While-Schlaufe werden die Anzahl Versuche begrenzt.
Die if Funktionen überprüfen die Richtigkeit der Zahl.


/*
Titel: Eingabeprüfung
Datei password.cpp
Autor: Jonathan Ernst
Datum: 26.08.2011
 Rev : 2.0
Funktion:
Password: Ein Programm wird mit einem Code geschützt. Der Benutzer hat drei Versuche.
*/
#pragma hdrstop                                      //compiler anweisung
#pragma argsused                                     //compiler anweisung
#include                                    //Biblioothek Tastatur laden
#include                                    //Bibliothek I/O laden
#include                                     //Bibliothek math laden
//-------------------------------------------------------------------------------------------
int main(void)                                    //aufruf funktion hauprprogramm
{
int code = 1234;                                //Deklaration Variable code
int password = 0;                               //Deklaration Variable password
int zaler = 0;                                  //Deklaration Variable zahler

 printf("Hallo,\nLieber Internet Benutzer, sie haben jetzt die \nM\224glichkeit sich f\201r das Programm anzumelden.\nDazu ben\224tigen wir ihr Password."); //Textausgabe
 printf("\n\nIhr Password: ");      //Textausgabe
 scanf("%i", &password);            //eingabe des Passwords


 if (code != password)                           //Konntrolliert die Richtigkeit des Passwortes
   {
         do        //while schlaufe bis password ok ist.
         {
              printf("\n\nIhr Password: ");       //Textausgabe
              scanf("%i", &password);            //eingabe des Passwords
              zaler = zaler +1;                 //zählt anzahl versuche.
         }
         while (( code != password)&&(zaler < 2));      //Drei Versuche Das Password richtig einzugeben.
   }

if (code != password)                             //Konntrolliert die Richtigkeit des Passwortes
   {
         printf("Sorry, sie haben es nicht geschaft.");       //Textausgabe
         getch();

   }
else                                                               //Wenn das Password Richtig ist.
   printf("Gratulation sie haben den richtigen Code eingegeben!");    //Textausgabe

getch();
return(0);
}

Der Compilierte Code :


C - simple programs
---------------------------------------------------------------------------------
Captain Malgardi
Malgardis Crew
become a fan on Facebook : Malgardi Fan!

Donnerstag, 13. Oktober 2011

C- Eingabeprüfung


Das Programm:
In diesem Programm wird die While-Schlaufe eingesetzt. Diese wiederholt den Programmteil solange die eingegebene Zahl nicht zwischen 100 und 1000 liegt.

Mit den Funktionen if und else werden die eingegebenen Werte mit den festgelegten Werten verglichen. Wenn die Zahl im richtigen Zahlenbereich liegt so wird die Variable: "Entscheidung", gleich "e" gesetzt. Dies bewirkt ein Ende der While-Schlaufe.

Der Benutzer wird im Dialog aufgefordert, eine Zahl einzugeben. Das Programm prüft, ob die
eingegebene Zahl im gültigen Wertebereich liegt.


/*
Titel: Eingabeprüfung
Datei eingabeprüfung.cpp
Autor: Jonathan Ernst
Datum: 08.07.2011
 Rev : 1.2

Funktion:
Eingabeprüfung: Der benutzer wird im Dialog aufgefordert,
eine zahl einzugeben. Das Programm prüft, ob die
eingegebene Zahl im gültigen Wertebereich liegt.

*/
#pragma hdrstop                                      //compiler anweisung
#pragma argsused                                     //compiler anweisung
#include                                    //Biblioothek Tastatur laden
#include                                    //Bibliothek I/O laden
#include                                     //Bibliothek math laden


//-------------------------------------------------------------------------------------------
int main(void)                                    //aufruf funktion hauprprogramm
{
float eingabe = 0;                                //Deklaration Variable eingabe
float wertebereichvon = 100;                      //Deklaration Variable wertebereich von
float wertebereichbis = 1000;                     //Deklaration Variable wertebereich bis
char entscheidung = 'a';                                    //Deklaration variable exit
char scan = 'a';                                    //Deklaration variable scan


while(entscheidung != 'e' )
{
printf("\nGeben sie ihre Zahl ein: ");
scanf("%f", &eingabe);                    //Texteingabe

if ((eingabe > wertebereichvon)&&(eingabe < wertebereichbis))
{
printf(" Die Zahl wurde akzeptiert!");
getch();
entscheidung = 'e';
}
else
{
printf("\nerror - bitte zahl nocheinmal eingeben." );
getch();
entscheidung = 'o';
}

getch();

}
return(0);

}

Der Compilierte Code :

Montag, 10. Oktober 2011

C - Zeitungspapier zum Mond



Das Programm:
Berechnen Sie wie viele Faltungen mit Zeitungspapier der Dicke 0.05 mm notwendig sind, damit die papierstapelhöhe der Distanz Mond - Erde entspricht. ca.(384'000 km)

/*
Titel: Zeitungspapier
Datei zeitungspapier.cpp
Autor: Jonathan Ernst
Datum: 01.07.2011
Rev.1.1

Funktion:
Berechnen Sie wie viele Faltungen mit Zeitungspapier
der Dicke 0.05 mm notwendig sind, damit die papierstapelhöhe
der Distanz Mond - Erde entspricht. ca.(384'000 km)

*/
#pragma hdrstop                                      //compiler anweisung
#pragma argsused                                     //compiler anweisung
#include                                    //Biblioothek Tastatur laden
#include                                    //Bibliothek I/O laden
#include                                     //Bibliothek math laden


//-------------------------------------------------------------------------------------------
int main(void)                                         //aufruf funktion hauprprogramm
{
   double distanz = 384000000000;                        //Deklaration variable distanz Mond-Erde
   float zahler = 0;                                   //Deklaration variable zahler
   double dicke = 0.05;                                    //Deklaration variable dicke

while ( dicke<=distanz)                         //while schlaufe, solange dicke kleiner oder gleich distanz ist ist.

{
    dicke = dicke * 2;                     
     zahler++;                          //berechnung zahler

}

printf("Ein Zeitungspapierst\201ck muss %.0f mal gefaltet werden,\nbis es die Distanz Mond->Erde erreicht. ", zahler);      //textausgabe
getch();                                                  //warte auf enter

   return(0);                                                //ende
}

Der Compilierte Code :


C - simple programs
---------------------------------------------------------------------------------
Captain Malgardi
Malgardis Crew
become a fan on Facebook : Malgardi Fan!

Mittwoch, 28. September 2011

C - Maximum Minimum Durchschnitt berechnen

Das Programm:
Das bestimmen des höchsten und des kleinsten Wertes einer beliebig langen Zahlen Reihe ist eine der drei Aufgaben welche das unten-stehende Programm ausführen kann.

Als Zusatz wurde ihm die Fähigkeit verliehen aus den gegebenen Zahlen den Durchschnitt und die  Summe zu berechnen. Außerdem kann es sich merken wie viele Zahlen eingegeben wurden.

/*----------------------------------------------------------------------------------------------------
Titel: MinMax & Durchschnitt & Fakultät
Datei: minmax.cpp
Autor: Jonathan Ernst
Datum: 28.09.2011
Funktion: Ein Programm welches die höchste und die tiefste Zahl sowie den Durchschnitt
einer beliebig langen Zahlen-Reihe ermittelt 
--------------------------------------------------------------------------------------------*/
#include   //Bibliothek Tastatur laden
#include   //Bibliothek I/O laden
#include   //Bibliothek math laden

float minimum(float a, float min) //Funktion zur Bestimmung der kleinsten Zahl
{
if (a < min)                  //wenn a kleiner als das Minimum ist     
min = a;               //wird das Minimum = a gesetzt     
return(min);                  //das Minimum wird zurück gegeben. 
} 
float maximum(float a, float max) //Funktion zur Bestimmung der grössten Zahl 
{       
 if (a > max)               //wenn a grösser als das Maximum ist
max = a;                   //wird das Maximum = a gesetzt
return(max);               //das Maximum wird zurückgegeben
}
float durch(float summe, float counter) //Funktion zur Berechnung des Durchschnittes
{     
float durchschnitt = summe/counter; // durchschnitt wird berechnet in dem man die Summe aller Zahlen geteilt durch die Anzahl der Zahlen rechnet.
return(durchschnitt);               //der durchschnitt wird zurückgegeben
}


int main(void)                 //das Hauptprogramm
{

float a = 0;              //definition der Variable a
float min = 1000000;      //definition der Variable min
float max= 0;             //definition der Variable max
int counter = 0;          //definition der Variable counter
float durchschnitt = 0;   //definition der Variable durchschnitt
char loop = 'a';          //definition der Variable loop
float summe = 0;          //definition der Variable summe

do                        //start der do- while Schlaufe
{         counter++;      //zählt die Anzahl Schleifen durchgänge und somit auch die Anzahl der eingegebenen Zahlen
printf("Geben sie eine Zahl ein: "); //Textausgabe
scanf("%f",&a);                      //Texteingabe
min = minimum(a,min);                //Aufruf der Funktion zur bestimmung der kleinsten Zahl
max = maximum(a,max);                //Aufruf der Funktion zur bestimmung der grössten Zahl
summe = summe +a;                    //Berechnung der Summe
durchschnitt = durch(summe, counter);//Aufruf der Funktion zur bestimmung des Durchschnittes
printf("Wollen sie eine  neue Zahl eingeben? j/n :"); //Textausgabe
fflush(stdin);                       // löscht den tastatur puffer
loop = getchar();                    //liest zeichen ein, um Schleife zu beenden

}while (loop != 'n');                          //entscheidet wie viele male die Schleife durchgeführt werden soll.

printf("\nMin\t\t= %.2f\nMax\t\t= %.2f\nSumme\t\t= %.2f\nAnzahl Zahlen\t: %i\nDurchschnit\t= %.2f",min,max,summe,counter,durchschnitt); //Textausgabe
getch();//damit das Fenster noch offen bleibt
return 0;//gibt 0 zurück
}//ende


Der Compilierte Code/ The compiled Code:


C - simple programs --------------------------------------------------------------------------------- Captain Malgardi Malgardis Crew become a fan on Facebook : Malgardi Fan!

Dienstag, 27. September 2011

C - Sinuskurve zeichnen


Die Sinuskurve:

Eine Sinuskurve entsteht wenn, man, am Rand einer Runden Scheibe einen Bleistift befestigt und die Scheibe dreht, während dem sie sich auf einer geraden Linie fortbewegt. Durch diese Bewegung entsteht eine Sinusähnliche Kurvenform. Diese Lässt sich auch berechnen. Das in C geschriebene Programm zeichnet eine Sinuskurve im Konsolenfenster.
 















------------------------------------------------------------------------------------------------
Zur berechnung des Sinus wird der befehl a=sin();, aus der Bibliothek <math.h> verwendet.

/*----------------------------------------------------------------------------------------------------
Titel: Sinuskurve
Datei: Sinuskurve.cpp
Autor: Jonathan Ernst
Datum: 27.09.2011
Funktion: Das Programm zeichnet eine Sinus Kurve
--------------------------------------------------------------------------------------------*/
#include   //Bibliothek Tastatur laden
#include   //Bibliothek I/O laden
#include   //Bibliothek math laden
#include 
#define PI 3.14159          //definiere PI


void sinus(int hohe, int anzahl) // Unterprogramm welches die Sinus Kurve zeichnet.
{
int Matrix[700][700];            // erstellt eine Matrix der grösse 700x700
int x,y,z = 0;                   // definition der variabeln x.y.z werden für die For schlaufen benötigt.
float wert = 0;                  //definition Variable wert = 0 wird zur berechnung des Sinus verwendet
int ss = 0;                      //definition Variable ssbestimmt die x achse der Matrix
for( z = 0; z < anzahl;z++)        //bestimmt wie vielmal die Sinuskurve gezeichnet wird

{
 for(ss=0;ss < (hohe*2);ss++)      //bestimmt anzahl spalten
 {
                 
  for(y=0;y < 360;y++)             //bestimmt vieviel mal die Rechnung des Sinus durchgeführt werden soll. 360 = ein Kreis
    {
     wert=sin((y*2*PI)/(360));   //berechnung des Sinus wertes
     wert=wert*hohe;             //den Wert des Sinus wird an die höhe der Matrix angepasst
     if (wert == wert)           // wert in integer umformen
     ss = wert+hohe;             // wert in integer umformen + die höhe
    Matrix[y][ss]=88888;         //zeichnet 88888 an jeweiliger position welche durch den Wert des sinus bestimmt wird.     
    }
      for(y=0;y<360;y++)         //bestimmt die länge des Matrix ( 360 Zeilen)
        {
          for(ss=0;ss<(hohe*2+1);ss++)  //bestimmt die höhe des Matrix
           {
               printf("%3d ",Matrix[y][ss]); //zeichnet den Matrix
            }
            printf("\n"); //Zeilen umschlag
        }
   }
}
}

int main(void) //hauptprogramm
{
    int hohe = 0;     //defonition Variable Höhe
    int anzahl = 0;   //definition Variable anzahl
    char exit = 'a';  //definition Variable a
     do               //do schlaufe, um das Programm zu wiederholen
    {
    printf("Welche höhe soll die Sinus Kurve haben? (z.bsp 50) : "); //Textausgabe
    scanf("%i", &hohe); //Texteingabe
    printf("Wie viele male soll der Sinus gezeichnet werden? : ");//Textausgabe
    scanf("%i",&anzahl);//Texteingabe
    sinus(hohe,anzahl); //Aufruf des unterprogrammes welches den Sinus zeichnet
    getch(); //wartet auf enter taste
    printf("Wollen sie einen weiteren Sinus Zeichnen? j/n");//Textausgabe
    fflush(stdin); //löscht tastatur puffer
    exit = getchar(); //liest buchstaben ein
} while (exit !='n'); // bestimmt ob Programm wiederholt werden soll oder nicht

    return (0);//gibt 0 zurück
}//ende

Der Compilierte Code/ The compiled Code:

 


Einstellungen im Konsolenfenster:

- Schriftart ganz klein.
- Anzahl Zeilen und Spalten auf maximum schalten.
So kann die "Auflösung" vergrössert werden. !

C - simple programs --------------------------------------------------------------------------------- Captain Malgardi Malgardis Crew become a fan on Facebook : Malgardi Fan!

Montag, 26. September 2011

C - Dezimal Hexadezimal Wandler

Das Programm:
Eine über die Tastatur eingelesene natürliche Zahl ist einer Funktion zu übergeben,
die eine Umwandlung in den Hex-Code vornimmt.



/*
Titel: Dezimal-Hex-Wandler
Datei dezhex.cpp
Autor: Jonathan Ernst
Datum: 19.09.2011

Funktion:
Eine über die Tastatur eingelesene natürliche Zahl ist einer Funktion zu übergeben,
die eine Umwandlung in den Hex-Code vornimmt.
*/
#include 
#include 
#include 
#include 
#include 
//-------------------------------------------------------------------------------------------
char result[100];      // Bestimmt eine Zeichenkette result mit 100 Speicherplätzen

void dechex (int deci) // Funktion dechex
{
//bestimmen der Variablen:

int zahl = 1;          //definition Variable zahl
int rest = 0;          //definition Variable rest
int counter = 0;       //Definition Variable counter, zählet +
int counterminus = 1;  //definition Variable counterminus, zählt minus
int x = 0;             //definition Variable x
int decim = deci;      //definition variable decim = deci, übernimmt den Wert der dezimalzahl.

strcpy(result," ");    //setzt den String result = 0

while (zahl !=0)        //Erste while schlaufe zur berechnung der Anzahl stellen welche die Hexzahl haben wird.
{
zahl = decim/16;        //Berechnet: beispiel: dezimal Zahl 77 : 16 = 4, 4 wird in Variable Zahl gespeichert.
rest = decim - (zahl*16);//berechnet den Restwert. : 77-(4*16)=77-64=13
decim = zahl;            //die Zahl 13 währe die höchstwertige ziffer der hex-zahl
counter++;               //zählt die anzahl Zyklen
}
counterminus = counter;   // counterminus wird mit counter gleichgesetzt, counterminus wird benützt um die Reihenfolge der hex-Ziffern zu bestimmen.
zahl = 1;                 // setzt zahl wieder gleich 1

while (zahl !=0)          //zweite Schleife, Jetzt werden die erhaltenen Werte in einem String (result) gespeichert.
{
zahl = deci/16;             //Berechnet: beispiel: dezimal Zahl 77 : 16 = 4, 4 wird in Variable Zahl gespeichert.
rest = deci - (zahl*16);    //berechnet den Restwert. : 77-(4*16)=77-64=13
deci = zahl;                //die Zahl 13 währe die höchstwertige ziffer der hex-zahl

if (rest == 0)                //  wenn der rest = null wäre würde diese Ziffer angezeigt.
{ result[counterminus]='0'; } // beim ersten Durchgang hat Counterminus den höchsten wert, somit wird die Ziffer auf die Letzte stelle geschrieben.

if (rest == 1)                //  wenn der rest = null wäre würde diese Ziffer angezeigt.
{ result[counterminus]='1'; } // beim zweiten durchgang wird die zweitletzte stelle beschrieben.

if (rest == 2)                //  wenn der rest = null wäre würde diese Ziffer angezeigt.
{ result[counterminus]='2'; }  //schreibt den Wert 2 in string Result an angegebener (counter minus) stelle

if (rest == 3)                //  wenn der rest = null wäre würde diese Ziffer angezeigt.
{ result[counterminus]='3'; } //schreibt den Wert 3 in string Result an angegebener (counter minus) stelle

if (rest == 4)                //  wenn der rest = null wäre würde diese Ziffer angezeigt.
{ result[counterminus]='4'; } //schreibt den Wert 4 in string Result an angegebener (counter minus) stelle

if (rest == 5)               //  wenn der rest = null wäre würde diese Ziffer angezeigt.
{ result[counterminus]='5'; }//schreibt den Wert 5 in string Result an angegebener (counter minus) stelle

if (rest == 6)               //  wenn der rest = null wäre würde diese Ziffer angezeigt.
{ result[counterminus]='6'; }//schreibt den Wert 6 in string Result an angegebener (counter minus) stelle

if (rest == 7)               //  wenn der rest = null wäre würde diese Ziffer angezeigt.
{ result[counterminus]='7'; }//schreibt den Wert 7 in string Result an angegebener (counter minus) stelle

if (rest == 8)               //  wenn der rest = null wäre würde diese Ziffer angezeigt.
{ result[counterminus]='8'; } //schreibt den Wert 8 in string Result an angegebener (counter minus) stelle

if (rest == 9)               //  wenn der rest = null wäre würde diese Ziffer angezeigt.
{ result[counterminus]='9'; }//schreibt den Wert 9 in string Result an angegebener (counter minus) stelle

if (rest == 10)              //  wenn der rest = null wäre würde diese Ziffer angezeigt.
{ result[counterminus]='A'; } //schreibt den Wert A in string Result an angegebener (counter minus) stelle

if (rest == 11)             //  wenn der rest = null wäre würde diese Ziffer angezeigt.
{result[counterminus]='B'; }//schreibt den Wert B in string Result an angegebener (counter minus) stelle

if (rest == 12)            //  wenn der rest = null wäre würde diese Ziffer angezeigt.
{result[counterminus]='C'; }//schreibt den Wert C in string Result an angegebener (counter minus) stelle

if (rest == 13)             //  wenn der rest = null wäre würde diese Ziffer angezeigt.
{ result[counterminus]='D'; } //schreibt den Wert D in string Result an angegebener (counter minus) stelle

if (rest == 14)             //  wenn der rest = null wäre würde diese Ziffer angezeigt.
{result[counterminus]='E'; }//schreibt den Wert E in string Result an angegebener (counter minus) stelle

if (rest == 15)             //  wenn der rest = null wäre würde diese Ziffer angezeigt.
{result[counterminus]='F'; } //schreibt den Wert F in string Result an angegebener (counter minus) stelle

counterminus--;             // zählt runter.
}
printf("%s",result);        //schreibt das Resultat!! in hex, string result

}

int main(void)               //Aufruf

{
int dec = 0; //Deklaration Variable dec
char exit = 'a';

while ( exit != 'n')
{ 
printf("\n Bitte geben Sie eine Dezimal Zahl ein: "); //Ausgabe Text
scanf("%i",&dec); // Texteingabe

printf("\n %i schreibt man in Hexadezimalsystem so: ", dec); //Ausgabe Text
dechex(dec); //Funktionsaufruf hexdec

printf("\nM\224chten sie eine andere Zahl umwandeln? j/n ");
fflush(stdin);
exit = getchar();
fflush(stdin);
} //warte
return 0; //ende
}



Der Compilierte Code/ The compiled Code:



C - simple programs --------------------------------------------------------------------------------- Captain Malgardi Malgardis Crew become a fan on Facebook : Malgardi Fan!