Port´s einstellen

Matthiasab64

Mitglied
21. Feb. 2012
82
0
6
Brandenburg an der Havel, de
Sprachen
  1. BascomAVR
Hallo AVR Gemeinde,:D

kurze Frage.
Ich habe gerade angefangen ein Programm für ein Mega8 zu schreiben und bin mir unsicher ob ich das mit den Ports richtig eingestellt habe.
Also es steht erstmal nur der Programmkopf.

Ist Port B und D so richtig eingestellt das heisst kann man es so machen mit den hex werten? Muss Port C noch eingestellt werden oder ist das im abschnitt Display damit erledigt?
Code:
'************************************************************************
'*                                                                      *
'*   Programm zum ansteuern eines automatischen Werkstückvorschubes     *
'*                                                                      *
'*   von Matthias G.                                                    *
'*                                                                      *
'************************************************************************


$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 19200



'****************** Initialisierung Display *****************************
Config Lcdpin = Pin , E = Portc.0 , Rs = Portc.1 , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2
Config Lcdbus = 4
Initlcd
Cls
'***************** Ports bestimmen **************************************
Ddrb = &H00                                                 'portb.0 - .5   eingänge
Ddrd = &H0F                                                 'portd.0 - .3   eingänge und .4 - .7 ausgänge
Portb = &HFF                                                'Port B alle Eingänge haben Pullup Widerstände
Portd = &HF0                                                'Port D Eingänge haben Pullup Widerstände , Ausgänge haben Low Pegel

'Ausgänge Port D
Spindel Alias Portd.4                                       'gibt der Maschine Freigebe zum bohren  1 = Freigabe
Z1 Alias Portd.5                                            'vordere Werkstückklemmung  1 = klemmen , 0 = lösen
Z2 Alias Portd.6                                            'hintere Werkstückklemmung  1 = klemmen , 0 = lösen
Z3 Alias Portd.7                                            'Werkstückvorschub   1 = vorn , 0 = hinten

'Eingänge Port D (Rückmeldung)
Z3v Alias Pind.0                                            'Zylinder ist vorn
Z3h Alias Pind.1                                            'Zylinder ist hinten
Di Alias Pind.2                                             'Drehzahlimpuls
Sr Alias Pind.3                                             'Spindelrückmeldung - fertig gebohrt Werkstück weiterschieben
'Eingänge Port B
Z1z Alias Pinb.0                                            'vordere Werkstückklemmung ist zu
Z2z Alias Pinb.1                                            'hintere Werkstückklemmung ist zu
Reserve Alias Pinb.2                                        'Reserve       **********************************
T1 Alias Pinb.3                                             'Taster 1      * Die Taster haben die Funktion, *
T2 Alias Pinb.4                                             'Taster 2      * die in der zweiten Zeile des   *
T3 Alias Pinb.5                                             'Taster 3      * Displays angezeigt werden.     *
'                                                                          **********************************


'***************** Variablen dimensionieren*****************************




Do

Loop

End


Danke

Gruss
Matthias
 
Hi Matthias,

Ich habe gerade angefangen ein Programm für ein Mega8 zu schreiben und bin mir unsicher ob ich das mit den Ports richtig eingestellt habe.

Ist Port B und D so richtig eingestellt das heisst kann man es so machen mit den hex werten? Muss Port C noch eingestellt werden oder ist das im abschnitt Display damit erledigt?
Code:
'***************** Ports bestimmen **************************************
Ddrb = &H[B][COLOR="#008000"]00[/COLOR][/B]                                                 'portb.0 - .5   [B][COLOR="#008000"]eingänge[/COLOR][/B]
Ddrd = &H[B][COLOR="#FF0000"]0F[/COLOR][/B]                                                 'portd.0 - .3   eingänge und .4 - .7 ausgänge
Portb = &H[B][COLOR="#008000"]FF[/COLOR][/B]                                                'Port B alle Eingänge haben [B][COLOR="#008000"]Pullup[/COLOR][/B] Widerstände
Portd = &H[B][COLOR="#FF0000"]F0[/COLOR][/B]                                                'Port D Eingänge haben Pullup Widerstände , Ausgänge haben Low Pegel
Bei PortD hast du die beiden Nibbles Bit0-3 und Bit4-7 vertauscht.

7..4 , 3..0 --- Bits

Du schreibst dreihundertfünfzig auch nicht als 053.

Gruß
Dino
 
Hallo Dino,

Danke, das hab ich voll übersehen, hatte vorher die Ausgänge am niederen Byte. Aber die schreibweise wird so von Bascom akzeptiert ja mit den hex Werten, hab das bis jetzt immer mit &Bxxxxxxxx gesehen.


Gruss
Matthias
 
Hallo Matthias!

Natürlich akzeptiert BASCOM die Anweisung als HEX-Wert.
Warum auch nicht?

Du kannst einmal schreiben:
PORTX = &B1000_0000

oder:
PORTX = &H80

oder auch:
PORTX = 128

Alles besagt schließlich das Selbe!


Meistens wird jedoch die binäre Schreibweise verwendet, damit man nicht (genau wie du) ausversehen die falschen Pins konfiguriert. :cool:
Mit HEX-Werten sollte man nur arbeiten, wenn man die problemlos im Kopf ins Binärformat übersetzen kann. :wink:


Grüße,
Cassio
 
Aber die schreibweise wird so von Bascom akzeptiert ja mit den hex Werten, hab das bis jetzt immer mit &Bxxxxxxxx gesehen.
klar wird das so akzeptiert. Es ist ja auch eine Zahl.
Mach dich frei vom starren Blick auf das Zahlensystem!
Du kannst zB folgendes schreiben ...

DDRB = &B0101_0010 ... oder ...
DDRB = &H52 ... oder ...
DDRB = 82 ... oder ...
DDRB = "R" ... (hat das schonmal einer probiert ?)

Das ASCII-Zeichen "R" ist gleichbedeutend mit dem Dezimalwert 82 oder dem Hexwert 52 oder dem Binärwert 01010010.
Für den Prozessor ist es immer absolut identisch. Du wirst auch im Speicher keinen Unterschied erkennen.
Der Unterschied ergibt sich nur dadurch das du im Programm mit diesem Wert etwas anderes bezwecken willst.

Du kannst auch zwei ASCII-Zeichen multiplizieren. Was hindert dich daran "A" und "X" zu multiplizieren ?
Das ist identisch mit &H41 mal &H58 in Hexadezimal
oder oder 65 mal 88 in Dezimal.

Also blockier deine Gedanken nicht mit Zahlensystemen. Es ist lediglich eine andere Schreibweise für ein und dasselbe.

EDIT : Direkt geht es nicht aber über einen Umweg geht es ;)
Code:
Dim B As Byte                                               ' Testvariable fuer alles moegliche
B = "R"
Ddrb = B
... es gibt schon verrückte Sachen :rolleyes:

Gruß
Dino
 
DDRB = "R" ... (hat das schonmal einer probiert ?)

Funktioniert nicht! Hier wirft BASCOM eine Fehlermeldung "Error 64 Line: xx , expected , in bla bla bla"
Der ErrorCode 64 besagt, dass dem Compiler irgendwo ein Komma fehlt .... ha, nur .... :rolleyes:

Grüße,
Ma

PS: Dino war mit seiner Antwort schneller. Lasse den Thread trotzdem stehen den ich finde es lustig .... so kann man wirklich Spaghetti-Code schreiben den keiner mehr lesen kann ...
 
Hallo,

danke für die zahlreichen Einblicke.

So jetzt war ich etwas durcheinander, so wie es in meinem Code steht war es Richtig nur die Kommentare
waren noch falsch den ich hatte mir zwischen durch überlegt das es besser wäre die Ausgänge und Eingänge zu tauschen,
weil ich den "TO Pind.4" als eingang für die Drehzahlmessung nutzen wollte, also kommentare noch fehlerhaft.

Also das Zahlenkonvertieren funktioniert im Kopf Perfekt ,ich hatte nur gefragt weil ich es in noch keinem Program gesehen hab mit Hexwerten,
aber ich die Schreibweise kürzer und übersichtlicher finde als mit Binärwerten oder gar jeden Portpin einzeln aufzulisten.

Mich wundert jetzt ein wenig die Schreibweise der Binären Variante ich kenne
&B01010010 und oben steht &B0101_0010, macht das einen Unterschied?

Gleich nochwas, ist es sinnvoll Die Daten fürs Display ins EEprom zu schreiben.



@Dino

Ich habe gerade dein Thema zur Drehzahlmessung gelesen(etwas älterer Beitrag). Was zum Teufel braucht in dem Code so viel Flash?
Da ich soetwas ja in meinem Projekt auch vor hab, hab ich ein paar Fragen.

Im Kopf meines Codes ist ja schon zu erkennen was der Mega8 später zu tun hat, ist er dann mit solch einer Drehzahlmessung überfordert?
Soll ich besser noch nen zweiten Controller nehmen?
Im unteren Drehzahlbereich ist es ja schwierig eine änderung der Drehzahl zur anzeige zu bringen bei einem wert pro Sekunde.
(wichtig fürs Gewindeschneiden und Abstechen an einer Drehbank)

Ist es da nicht sinnvoll pro Umdrehung 10 Impulse zu erhalten (scheibe mit 10 löchern auf der spindel ( aufbau wie in einer alten PC-Maus mit Kugel oder in Industriellen Drehcodern)) oder wird dann für hohe Drehzahlen die Frequenz zu hoch für den Atmel.
Dann könnte man sicher Softwaremässig ab einer bestimmten Freqenz auf ein zweiten Sensor umschalten der nur einen Impuls pro Umdrehung abgibt
und den "Einer" ständig als null zeigen weil das oberhalb von 1000(oder noch weniger) Umdrehungen uninteressant wird. Oder hab ich da jetzt nen Denkfehler.

Danke


Gruss
Matthias
 
Mich wundert jetzt ein wenig die Schreibweise der Binären Variante ich kenne
&B01010010 und oben steht &B0101_0010, macht das einen Unterschied?


Hallo Matthias!

Einen Unterschied gibt es nur in der Schreibweise. :wink:

Die Unterstriche unterteilen die Nibbels lediglich optisch nur ein wenig.
Das ist alles!

Man kann eine binäre Zahlenfolge besser überblicken, wenn man ein paar Unterteilungen einbaut.
Du kannst z.B. auch:
&B_1_000_111_0
schreiben, wenn du die einzelnen Pins vom Controller optisch "gruppieren" möchtest.

Das ist auch der Grund, warum die Meisten die binäre Schreibweise verwenden..... und nicht die Hexadezimale!
Als Hex-Wert sieht es vielleicht kürzer aus, aber übersichtlicher ist immer noch in binärer Form.

Grüße,
Cassio
 
Hallo,

also ignoriert Bascom die Unterstriche.
Kann man aus einem solchen Byte auch Bitmuster abfragen wobei ein bestimmtes Bit ignoriert werden soll?
Beispiel:
Ich will mein Port d und b auf Grundstellung abfragen,
diese währe in beiden fällen gegeben:
Portd = &B0110_0000 Portb = &B1111_1111 und
Portd = &B0111_0000 Portb = &B1111_1111
das heißt Pind.4 ist mein Drehzahlimpuls der mich bei der abfrage nicht interessiert.

Momentan frag ich das so ab:

if pind = &H60 and pinb = &HFF or pind = &H70 and pinb = &HFF then

geht das eleganter?

Genauso beim setzen der Ports.
In meinem Code ist ja das Lowbyte Ausgang und das Hibyte Eingang.
Wenn ich ohne die Eingänge zu beeinflussen alle Ausgänge auf 0 setzen will,
wie mach ich das? Im moment hab ich jeden Portpin einzeln auf null gesetzt.
Gibt es da ein Portd = &Hx0 (x = lass das in ruhe)?

Gruss Matthias
 
In Assembler kannst Du tatsächlich Bits innerhalb der PORT und PIN-Register einzeln lesen und schreiben (zumindest beim Mega8). Auf alle Register bis 0x1F lassen sich zum abfragen SBIS/SBIC und zum setzen/löschen SBI/CBI anwenden. Ob Bascom das ausnutzen kann, weiß ich nicht.
Jenseits von 1F muß also erst das ganze Register lesen, mit einer Maske zu verANDen, und dann den wert abzufragen.
AFAIK kannst Du aber in Bascom auch schreiben:
Code:
if IORegistername.Bit=1 then

Achso, eins noch:
Wenn Du ein Bit aus einem PORT-Register liest, liest Du den Wert zurück, der in dieses Register geschrieben wurde. Das muß nicht der logische Pegel an diesem Bein sein (zB wenn das Bein extern auf einen anderen Pegel gezogen/gezwungen wird). Um den wirklichen Pegel zu bekommen, mußt Du das entsprechende PIN-Register-Bit lesen.
(Ist ein häufiger Fehler;).
Wenn Du also ein Bein als Input (DDR) und hi (PORT) benutzt (also high über pullup), liefert das Lesen des PORT-Bits immer eins, lediglich das PIN-bit verändert sich mit dem Pegel...
 
Hi Matthias,

Ich habe gerade dein Thema zur Drehzahlmessung gelesen(etwas älterer Beitrag). Was zum Teufel braucht in dem Code so viel Flash?
Da ich soetwas ja in meinem Projekt auch vor hab, hab ich ein paar Fragen.
Effizienten und kurzen Code bekommst du nur mit Assembler. Für nen Anfänger ist das für manche allerdings ein ziemlicher Schritt wenn man vorher in C oder Basic programmiert hat. In Assembler gibt es grob gesagt keine Variablen mehr sondern nur noch Speicherstellen die man für alles mögliche verwendet. Bascom hat beim Code sehr viel Overhead drin. Wenn du ein LCD, UART oder Fließkommaoperationen verwendest dann geht das gleich richtig zur Sache. Bei kleinen Atmels solltest du also wenn irgendwie möglich alles in Ganzzahloperationen machen. Für 23,54 kannst du zB auch zwei Bytes (ein Word) verwenden in dem dann 2354 steht. Du mußt lediglich bei der Ausgabe dann wieder so umarbeiten das an der richtigen Stelle ein Komma erscheint.

Im Kopf meines Codes ist ja schon zu erkennen was der Mega8 später zu tun hat, ist er dann mit solch einer Drehzahlmessung überfordert?
Soll ich besser noch nen zweiten Controller nehmen?
Im unteren Drehzahlbereich ist es ja schwierig eine änderung der Drehzahl zur anzeige zu bringen bei einem wert pro Sekunde.
(wichtig fürs Gewindeschneiden und Abstechen an einer Drehbank)
Ist es da nicht sinnvoll pro Umdrehung 10 Impulse zu erhalten (scheibe mit 10 löchern auf der spindel ( aufbau wie in einer alten PC-Maus mit Kugel oder in Industriellen Drehcodern)) oder wird dann für hohe Drehzahlen die Frequenz zu hoch für den Atmel.
Wenn du den Mega8 mit 16MHz laufen läßt dann der ne ganze Menge am Timer ab. Die einzige Frage die du dir stellen mußt ist die ob an den Meßbereichsgrenzen noch die Genauigkeit erreicht wird die du dir wünscht.

Laß das mit den zwei Controller möglichst weg. Da wirst du am Anfang nicht wirklich glücklich. Dafür müßtest du dann auch eine Kommunikation zwischen den beiden Controllern programmieren.

Dann könnte man sicher Softwaremässig ab einer bestimmten Freqenz auf ein zweiten Sensor umschalten der nur einen Impuls pro Umdrehung abgibt
und den "Einer" ständig als null zeigen weil das oberhalb von 1000(oder noch weniger) Umdrehungen uninteressant wird. Oder hab ich da jetzt nen Denkfehler.
Alles viel zu kompliziert ;)
Du kannst es zB so machen das du bei niedrigen Drehzahlen die Zeit für eine Umdrehung mißt (also sozusagen die Periodendauer oder Umlaufzeit) und bei hohen Drehzahlen dann die Umdrehungen in einem bestimmten Zeitabschnitt (sozusagen die Frequenz oder Drehzahl)

Möglich ist vieles. Man muß sich lediglich vorher ein paar Gedanken machen und entsprechend planen.

Gruß
Dino
 
Wie Dino bereits sagte, kommt es einerseits auf die gewünschte Auflösung an, andererseits auf die mögliche "Periodendauer".
Mal ein paar Zahlen:
-der Mega8 kann mit 16MHz "bequarzt" werden.
-Timer1 kann bis 16bit zählen, also bis 65535
-mit Prescaler=1 wären das also 4,096ms bei einer Auflösung von 62,5ns
-mit Prescaler=1024 ca. 4,2s bei 64µs
ich hoffe, ich hab mich jetzt nicht verrechnet...

Wenn man jetzt also den Signalgeber an den InputCapturePin des Timers hängt, und dessen Interrupt dazu benutzt, den Timer zu resetten (TCNT=0), kann man quasi die Periodendauer im ICR ablesen (jaja, man muß es mit dem Prescaler und dem Takt verrechnen...). In der IC-ISR muß ja nur der Timer resettet werden. Das benötigt nur ein (zu sicherndes) Rechenregister, und das SREG wird auch nicht verändert (ein register sichern, 0 rein laden, diese in beide Timerregister (da 16bit) schreiben, register wiederherstellen, reti). Das einzige, was Du nicht beinflussen kannst ist, ob der IRQ bei einer 1 oder 2-Word-Instruktion zuschlägt.
Schlimmer wirkt es sich aus, falls grad ein anderer Interrupt IRQs verzögert.
Desweiteren könntest Du mit dieser Methode während des Betriebes die Meßbereiche umschalten, wenn man in die jeweiligen Grenzbereiche des grad aktiven Prescalers kommst.

Soweit meine fixen Ideen dazu...
LotadaC
 
Guten Morgen :D,

ersteinmal an alle ein Danke

Bascom hat beim Code sehr viel Overhead drin. Wenn du ein LCD, UART oder Fließkommaoperationen verwendest dann geht das gleich richtig zur Sache.

Letztlich wäre in Assamble aber der selbe Aufwand(Speicher) wenn ich da so etwas wie Lcd´s anspreche,
oder nimmt ein "Text" in Bascom mehr platz ein als zahlen in Assambler?

Mit nen zweiten Atmel war gemeint das der dann alleine läuft nur um die Frequenzmessung zu machen und auf einem eigenem LCD ausgiebt.
Zur Genauigkeit, wünschenswert ist von 10 bis 100 Umdrehungen jede umdrehung ab 100 - 30.000 upm(später vielleicht 120.000upm)
in 10upm und alles ganze positieve Zahlen. Wichtig wäre halt das gerade im unteren Drehzahlbereich bis 100 upm mehr als eine Messwert pro Sekunde erfasst wird.
Dem Gravierstichel ist es nachher Wurscht ob er mit 50.000 oder mit 52.000 upm läuft.
(geht zwar in dem Projekt nicht ums Gravieren, will die Messung später an jeder Maschine nutzen)


@ Lotadac
Also den icp muss ich nehmen ich dachte der TO wäre der den ich zum erfassen eines Impulses nehmen kann,
hab ich jedenfalls in den meisten Beiträgen zum Thema "Impuls oder Frequenzmessung gelesen.
Das würde bedeuten das ich alles wieder ändern muss im Programm, bin da schon etwas weiter Menüs, abfragen der Eingänge usw..

Und du schreibst das so von leichter Hand - da ein Register sichern hier eins verschieben dort zwei auslesen ------ Bahnhof :D
Wenn ich Assemble so leicht verstehen würde , würde ich auch sicher damit arbeiten.

Ich habe auch schon meine alten Unterlagen gesucht aber leider nix gefunden.
Zuletzt habe ich mir mal das angesehen was der "Oldmax" zusammen gefast - hat super gemacht nun brauch ich nur noch die zeit. :D
Bei vielen anderen "Hilfestellungen":
1 leider enden solche Beiträge die einem Anfänger eigentlich weiterhelfen sollen in irgendwelche Diskusionen zwischen Profis
2 wird immer nur gesagt das register laden und nur das geht dafür und das paar nehmen und ab der speicherstelle schreiben,
schön und gut ich mach es so weils da steht aber nicht weil ich verstanden hab warum

So nun wird der ein oder andere sagen dann kauf dir ein Buch, richtig,
und das hab ich und das ist nunmal Bascom (Kuehnel oder wie der heisst).
Nun ich bin zwar kein Student, aber die CNC-Fräse und die Drehbank
verschlingen unmengen an Geld. Darum alles nach und nach. ;)

Nochmal zum EEProm, ist es sinnvoll sich ständig wiederholende LCD-inhalte(text) dort abzulegen und über routinen abzurufen, bzw überhaupt möglich.
Ich weiss auch nicht ob man damit grossartig Speicher sparen würde.

So ich hoffe es nervt nicht aber ich hab jetzt noch ne Frage zu einer Menüstruktur.
Ich habe mir "Markus" seine Wintergartensteuerung angeschaut, find ich super,
und bin dann auch auf den Code gestossen den wohl viele kopieren und verwenden.
Dort wird richtig gut durch ein Menü navigiert und obwohl das Programm mehr als 15 oder gar 20 verzweigungen hat belegt es gerade mal 25 %.
In meinem Programm mit viel IF THEN ELSE und gerade mal vier Menüverzweigungen bringe es schon auf 17% und das Programm macht noch gar nix ausser Anzeigen.
Nun hab ich mir aber auch zur Aufgabe gemacht as ich nur Schnipzel verwende die ich auch wirklich verstehe, die sache mit dem ADR und ADR2 ist mir da "relativ" einleuchtend,
aber die "State Maschine" also das status abfragen bereitet mir Kopfschmerzen wahrscheinlich weil es ein Assamble Bascom mix ist.

Gruss
Matthias
 
@ Lotadac


so langsam verstehe ich dich, das heist das die Timer so flexibel sind das ich sie im laufendem Programm parametrieren kann.
Ich dachte das geht nur einmal in der Config zeile des Timer´s. Damit eröffnen sich ja ganz andere möglichkeiten, Danke....

gruss
Matthias
 
Geh mal im DB den Abchnitt von Timer1 durch;)
Meine fixe Idee war nur ein spontaner Vorschlag, der mit dem ICP einen komplett anderen Weg geht, als das Zählen mit T0. Ich hätte auch einen anderen externen Interrupt nehmen können. Vorteil beim ICP war, daß beim Input Capture Match der Zählerstand ins ICR kopiert wird, der Timer läuft ja weiter...
Ob die ganze Sache wirklich Sinn macht, bin ich nicht konkret durchgegangen. Bei mir wird aber bei jedem Impuls ein Interrupt ausgelöst, bei hohen Frequenzen/Umdrehungen ist es also sinniger, den Timer die Impulse im Hintergrund automatisch zählen zu lassen. Allerdings brauchst Du dann noch einen 2ten Timer für die Zeit.

Klar kannst Du zur Laufzeit den Timer umkonfigurieren, indem Du zum Beispiel den Prescaler umsetzt. Gestoppt wird der Timer letztendlich auch nur mit Prescaler=0. Wie gesagt, schau mal ins DB.
 
Danke. Ja das DB(Dickes Buch) :D schau ich mir nochmal an. Das mit dem Drehzahlmessen mach ich eh nur wenn ich nach meiner Menü murkserei noch Platz hab.
Wenn nicht wirds ein einzel Projekt das dan sicher auch im 2313 Platz hat. Aber erstmal muss die Hauptaufgabe das Bohren und der automatische vorschub funktionieren.

Weiss nicht vielleicht hat ja jemand mal Zeit sich den Stand meiner Dinge anzusehen (den Code) und mir sagen kann was ich anders lösen könnte.
Ich will keine fertigen Codeschnipzel haben, sonst lern ich nix.
Zu einem Befehl den ich verwendet habe nur einen Alternativ-Befehl mit dem es besser geht, dann beiss ich mich da schon durch, braucht halt Zeit.


So weit bin ich erstmal, hab da so ein Vertrag da steht drin das ich einmal am Tag zur Arbeit muss, das ist ganz schön Zeitraubend :D

Code:
'************************************************************************
'*                                                                      *
'*   Programm zum ansteuern eines automatischen Werkstückvorschubes     *
'*                                                                      *
'*   von Matthias G.                                                    *
'*                                                                      *
'************************************************************************


$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32

'$sim


'****************** Initialisierung Display *****************************
Config Lcdpin = Pin , E = Portc.0 , Rs = Portc.1 , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2
Config Lcdbus = 4                                           'Im Code sind längere Texte als das LCD 16 * 2 anzeigen kann, ich Tausche es noch gegen ein 20 * 2
Initlcd
Cls
'***************** Ports bestimmen **************************************
Ddrb = &H00                                                 'portb.0 - .5   eingänge
Ddrd = &H0F                                                 'portd.4 - .7   eingänge und .0 - .3 ausgänge
Portb = &HFF                                                'Port B alle Eingänge haben Pullup Widerstände
Portd = &HF0                                                'Port D Eingänge haben Pullup Widerstände , Ausgänge haben Low Pegel

'Ausgänge Port D
Ma Alias Portd.0                                            'gibt der Maschine Freigebe zum bohren  1 = Bohren 0 = Grundstellung
Z1 Alias Portd.1                                            'vordere Werkstückklemmung  1 = klemmen , 0 = lösen
Z2 Alias Portd.2                                            'hintere Werkstückklemmung  1 = klemmen , 0 = lösen
Z3 Alias Portd.3                                            'Werkstückvorschub   1 = vorn , 0 = hinten

'Eingänge Port D (Rückmeldung)
Di Alias Portd.4                                            'Drehzahlimpuls
Sr Alias Portd.5                                            'Spindelrückmeldung - fertig gebohrt Werkstück weiterschieben
Z3v Alias Portd.6                                           'Vorschubzylinder ist vorn
Z3h Alias Portd.7                                           'Vorschubzylinder ist hinten
'Eingänge Port B
Z1z Alias Pinb.0                                            'vordere Werkstückklemmung ist zu
Z2z Alias Pinb.1                                            'hintere Werkstückklemmung ist zu
Su Alias Pinb.2                                             'Spindel unten **********************************
T1 Alias Pinb.3                                             'Taster 1      * Die Taster haben die Funktion, *
T2 Alias Pinb.4                                             'Taster 2      * die in der zweiten Zeile des   *
T3 Alias Pinb.5                                             'Taster 3      * Displays angezeigt werden.     *
'                                                                           **********************************



'***************** Variablen dimensionieren*****************************
Dim Bo As Byte                                              'Bo steht für die anzahl der zu Bohrenden Löcher
Dim Boa As String * 2                                       'Boa wird zur formatierten Ausgabe von Bo benötigt




Bo = 1                                                      'vorgabe eine Bohrung


'****** Hauptprogramm **************************************************
Do


   Gosub Grundstellung                                      ' sprungbefehl zu Grundstellung
   Waitms 50                                                ' taster prellen noch werd´s noch anders lösen
   Bitwait T2 , Reset                                       ' warte auf betätigung Taster2 = "weiter"
   Gosub Anzahl_bohrungen                                   ' sprungbefehl Anzahl_Bohrungen
   Gosub Klemmung                                           ' sprungbefehl Klemmung
' geht dann noch weiter



Loop



'*********** Subroutinen ***********************************************
Klemmung:

   Upperline : Lcd "Werkst{129}ck Klemmen "                 ' Anzeige LCD   [COLOR="#B22222"]warum da kein "ü" gemacht wird kann ich mir nicht erklären bis 127 geht alles ab 128 nicht mehr,[/COLOR]
   Lowerline : Lcd "zu     ok    auf"                       [COLOR="#B22222"]'in nem anderen Testprogramm von mir hat es schon funktioniert[/COLOR]
   Wait 2
Return


Anzahl_bohrungen:
Waitms 250                                                  'entprellen und Anzeige beruhigen
Do                                                          'schleife
      Boa = Str(bo)                                         'wandelt variable in ein string um?
      Boa = Format(boa , "   ")                             'gibt den string in einem bestimmten Format zurück
   Upperline                                                ' LCD 1. Zeile anwählen

       If Bo = 1 Then                                       'wenn Bo = 1 dann gib den Text "Bohrung" aus
          Lcd Boa ; " Bohrung      "
       Else                                                 'sonst gib "Bohrungen" aus
          Lcd Boa ; " Bohrungen    "
       End If

   Lowerline : Lcd "-      ok      +"                       ' 2.Zeile gewählt und Ausgabe des Textes für die Funktion der  3 Taster

       If T3 = 0 Then                                       ' ist Taster3 (+) gedrückt dann addiere 1 zum Wert Bo dazu
        Incr Bo

          If Bo > 99 Then                                   ' Bo wird auf 99 begrenzt
             Bo = 99
          End If

       Elseif T1 = 0 Then                                   ' ist Taster1 (-) gedrückt dann subtrahiere 1 vom Wert Bo
         Decr Bo

           If Bo < 1 Then                                   ' ist Bo kleiner 1 dann setze Bo auf 1 und gib den Text aus
              Bo = 1
              Upperline : Lcd "  Sehr Witzig   "
              Wait 1
           End If

       Elseif T2 = 0 Then                                   ' wird Taste2 (ok) betätigt dann verlasse die Routine
         Return
       End If

  Waitms 100
Loop






Grundstellung:                                              ' Alle Ausgänge werden auf 0 gesetzt(Grundstellung)
    Ma = 0
    Z1 = 0
    Z2 = 0
    Z3 = 0

     Waitms 500                                             ' wird noch angepasst Aktionszeit der Zylinder oder Motore(hab mich noch nicht entschieden)

      If Pind = &H70 And Pinb = &HFF Or Pind = &H60 And Pinb = &HFF Then       ' Abfragen der Eingänge alle eingänge sollen nicht betätigt also High-Pegel haben
       Upperline : Lcd " Grundstellung  "                   ' ausser Pind.7(z3h in Grundstellung betätigt)muss Low-Pegel haben und bei Pind.4 ist der Pegel egal (drehzahlmessung)
       Lowerline : Lcd "    weiter      "                   ' ausgabe auf Display
       Waitms 500
    Return
      Else
       Upperline : Lcd "Fehler B" ; Bin(pinb)               ' zeigt port b und d im LCD an zur Fehlersuche oder was auch immer
       Lowerline : Lcd "       D" ; Bin(pind)
      End If
  Gosub Grundstellung
    Return



End

gruss
Matthias
 
Hi Matthias,

Bascom hat beim Code sehr viel Overhead drin. Wenn du ein LCD, UART oder Fließkommaoperationen verwendest dann geht das gleich richtig zur Sache.
Letztlich wäre in Assembler aber der selbe Aufwand(Speicher) wenn ich da so etwas wie Lcd´s anspreche, oder nimmt ein "Text" in Bascom mehr platz ein als zahlen in Assembler?
Die Daten sind in allen Programmiersprachen gleich groß. Dein Programm wird allerdings je nach verwendeter Programmiersprache mehr oder weniger effizient in den ausführbaren Code umgesetzt der dann in den Controller geflasht wird. Der ausführbare Code ist eigentlich nicht anderes als Assembler-Code. Wenn du also direkt in Assembler programmierst dann hast du die Möglichkeit am besten zu optimieren da du den vollen Zugriff auf dein Endergebnis (das ausführbare Programm) hast.

Basic ---> Zwischencode --> Assembler --> ausführbares Programm zum flashen
C -------> Zwischencode --> Assembler --> ausführbares Programm zum flashen
Pascal --> Zwischencode --> Assembler --> ausführbares Programm zum flashen
Assembler -------------------------------> ausführbares Programm zum flashen

Du umgehst also mit Assembler einige Zwischenschritte und kannst Klimmzüge anwenden bei denen dir jede andere Programmiersprache den Stinkefinger zeigen würde ;)

Darum kannst du das Flash des Controllers mit Assembler am besten ausnutzen und mit Funktionen vollpacken.
Assembler ist gegenüber anderen Sprachen auch bei der Performance (Ausführungsgeschwindigkeit) im Vorteil.
Um das auszugleichen gibt es für andere Sprachen extra hochoptimierende Compiler.

Gruß
Dino
 
Hi Dino,

Danke, also werde ich wohl doch nochmal Assambler lernen. Die Vorteile sprechen ja für sich, aber da braucht man sicher ne andere Vorgehensweise.
Beim Bascom und co kann man das ganze überfliegen und weis in etwa wo was gemacht wurde aber beim Assabler stell ichs mir schwierig vor da den überblick zu behalten.
Ich wüsste auch im Moment gar nicht mit welchem Programm da gearbeitet wird und ob es da auch so Comfortable funktionen gibt wie - auf fehler prüfen oder mal schnell in den Controller schreiben Fusebits setzen.
Kann mir vorstellen das das wie damals in Dos alles in einer CMD umgebung mit ewig langen anweisungen erfolgen muss.

gruss
Matthias
 
Hi Matthias,

aber da braucht man sicher ne andere Vorgehensweise.
etwas andere Vorgehensweisen muß man sich da schon aneignen. Sowas wie "Select/Case" oder "Print" gibt es da nicht. Das muß man sich erst selber zusammenbauen.

Beim Bascom und co kann man das ganze überfliegen und weis in etwa wo was gemacht wurde aber beim Assabler stell ichs mir schwierig vor da den überblick zu behalten.
Das ist auch nicht schwieriger. Man darf nur nicht vergessen den Programmcode vernünftig zu dokumentieren und mit Bemerkungen zu versehen. Das sollte man aber auch unter C oder Basic nicht vergessen.

Ich wüsste auch im Moment gar nicht mit welchem Programm da gearbeitet wird und ob es da auch so Comfortable funktionen gibt wie - auf fehler prüfen oder mal schnell in den Controller schreiben Fusebits setzen.
Geht alles mit AVR-Studio. Das ist auch recht komfortabel.

Als Beispiel hier mal meine Routinen für einen 1Wire-Bus ...
Code:
.equ	d1w_addrf = 0x00A0	; 8-Bit Family-Code
.equ	d1w_addr1 = 0x00A1	; Byte 1 |
.equ	d1w_addr2 = 0x00A2	; Byte 2 |
.equ	d1w_addr3 = 0x00A3	; Byte 3 | 48-Bit Slave-Adresse
.equ	d1w_addr4 = 0x00A4	; Byte 4 |
.equ	d1w_addr5 = 0x00A5	; Byte 5 |
.equ	d1w_addr6 = 0x00A6	; Byte 6 |
.equ	d1w_addrc = 0x00A7	; 8-Bit CRC (empfangen)
.equ	d1w_crc1  = 0x00A8	; 8-Bit CRC (berechnet)

.equ	d1w_scrp0 = 0x00B0	; Byte 0 | Temp LSB  |
.equ	d1w_scrp1 = 0x00B1	; Byte 1 | Temp MSB  |
.equ	d1w_scrp2 = 0x00B2	; Byte 2 | TH/UsrB1  |
.equ	d1w_scrp3 = 0x00B3	; Byte 3 | TL/UsrB2  | DS16S20
.equ	d1w_scrp4 = 0x00B4	; Byte 4 | Reserved  | Scratchpad
.equ	d1w_scrp5 = 0x00B5	; Byte 5 | Reserved  | (Digital Thermometer)
.equ	d1w_scrp6 = 0x00B6	; Byte 6 | Ct Remain |
.equ	d1w_scrp7 = 0x00B7	; Byte 7 | Ct / deg  |
.equ	d1w_scrp8 = 0x00B8	; Byte 8 | CRC       |
.equ	d1w_crc2  = 0x00B9	;          CRC (berechnet)
.equ	d1w_stat  = 0x00BA	; Status ( 0=Present , 1=Addr-CRC ok , 2=ScrPad-CRC ok )



; ##################################################################
; ##################################################################
; #### Dallas 1-Wire-Subroutinen ###################################
; ##################################################################
; ##################################################################
 
; PC0 ---- SCL | I2C-Interface
; PC1 ---- SDA | (TwoWire)
;
; PC2 ---- EX
; PC3 ---- R/!W
; PC4 ---- IOC2 --- A
; PC5 ---- IOC1 --- B
;
; PC6 ------------- !FE
; PC7 --------------------------------- 1Wire
;
;
;            __                  ___________              _________
; Init/Reset   |________________/           |____________/     :
;              :                :           :            :     :
;              |                |- 15-60us -|- 60-240us -|     |
;              |- >=480us ------|--------- >=480us ------------|
;              |- Master Tx ----|----------- Master Rx --------|
;
;
;           ___                             _______  <1us _______________________
; Master Tx    |___________________________/       |_____/  :        :        :
;              :        :        :        :        :        :        :        :
;              |- 15us -|- 15us -|- 30us -|        |- 15us -|- 15us -|- 30us -|
;              |----- 60-120us -----------|- >1us -|----- 60-120us -----------|
;              |     Slave-Sample^        |        |     Slave-Sample^        |
;              |- Master Write 0-Slot ----|        |- Master Write 1-Slot ----|
;
;
;           ___ >1us                        _______ >1us   ______________________
; Master Rx    |____ ________///////////////       |____ // : :               :
;              :    :   : :               :        :    :   : :               :
;              |- 15us ---|--- 45us ------|- >1us -|- 15us ---|--- 45us ------|
;              |    :   ^Master-Sample    |        |    :   ^Master-Sample    |
;              ##### vom Master generiert          ##### vom Master generiert
;

; ========== DS18S20 - Commands ==========
; 0xF0 - Search ROM		0x44 - Convert T			0x48 - Copy Scratchpad
; 0x33 - Read ROM		0x4E - Write Scratchpad		0xB8 - Recall EEPROM
; 0x55 - Match ROM		0xBE - Read Scratchpad		0xB4 - Read Power Supply
; 0xCC - Skip ROM		0xEC - Alarm Search


; ==================================================================
; ===== 1-Wire initialisieren ======================================
; ==================================================================
d1winit:
	push r18			; r18 auf Stack retten (fuer wiederherstellung)

	sbi ddrc,7			; 1-Wire auf Output
	cbi portc,7			; 1-Wire-Bus auf Low
	rcall wait516u		; 516us warten
	sbi portc,7			; 1-Wire-Bus auf High

	cbi ddrc,7			; 1-Wire auf Input
	rcall wait33u		; warten
	rcall wait33u		; warten

	lds r18,d1w_stat	; Status holen
	cbr r18,0b00000001	; Flag loeschen (Vorbereitung kein Present-Puls)
	sbis pinc,7			; 1-Wire-Bus auf High ? = kein Present-Puls vom Slave
	sbr r18,0b00000001	; Flag setzen -> Present-Puls = Slave vorhanden
	sts d1w_stat,r18	; Status sichern

	pop r18				; r18 wiederherstellen
	ret					; Subroutine Ende


; ==================================================================
; ===== 1-Wire 0 schreiben =========================================
; ==================================================================
d1wwr0:
	sbi portc,7			; 1-Wire-Bus auf High
	sbi ddrc,7			; 1-Wire auf Output
	cbi portc,7			; 1-Wire-Bus auf Low
	rcall wait33u		; warten | ==> 66us
	rcall wait33u		; warten |
	sbi portc,7			; 1-Wire-Bus auf High
	rcall wait750n		; warten | ==> 1,5us
	rcall wait750n		; warten |

	ret					; Subroutine Ende


; ==================================================================
; ===== 1-Wire 1 schreiben =========================================
; ==================================================================
d1wwr1:
	sbi portc,7			; 1-Wire-Bus auf High
	sbi ddrc,7			; 1-Wire auf Output
	cbi portc,7			; 1-Wire-Bus auf Low
	rcall wait750n		; warten | ==> 750ns
	sbi portc,7			; 1-Wire-Bus auf High
	rcall wait33u		; warten | ==> 66us
	rcall wait33u		; warten |

	ret					; Subroutine Ende


; ==================================================================
; ===== 1-Wire 1 Byte senden =======================================
; ==================================================================
d1wsnd:
	push r16			; r16 auf Stack retten (fuer wiederherstellung)
	push r18			; r18 auf Stack retten (fuer wiederherstellung)

	ldi r18,0x08		; 8 Bits senden

d1wsloop:	ror r16		; r16 in Carry rotieren - LSB zuerst
	brcs d1wsnd1		; Carry gesetzt ?
	rcall d1wwr0		; Carry geloescht also 0 senden
	rjmp d1wcont		; -> Continue
d1wsnd1:				; 1-Wire Send 1
	rcall d1wwr1		; Carry war gesetzt also 1 senden

d1wcont:				; Continue
	dec r18				; Bit-Zaehler incrementieren
	brne d1wsloop		; weiter senden (noch keine 8 Bit)

	pop r18				; r18 wiederherstellen
	pop r16				; r16 wiederherstellen
	ret					; Subroutine Ende


; ==================================================================
; ===== 1-Wire lesen ===============================================
; ==================================================================
d1wrd:
	sbi portc,7			; 1-Wire-Bus auf High
	sbi ddrc,7			; 1-Wire auf Output
	cbi portc,7			; 1-Wire-Bus auf Low
	rcall wait750n		; warten | ==> 1,5us
	rcall wait750n		; warten |
	sbi portc,7			; 1-Wire-Bus auf High

	cbi ddrc,7			; 1-Wire auf Input
	rcall wait10u		; 14us warten
	sec					; Set Carry
	sbis pinc,7			; 1-Wire-Bus auf High ? = 1 vom Slave
	clc					; Clear Carry
	ror r16				; Bit in r16 einrotieren  C->76543210
						; Nach 8 Durchlaeufen ist das Byte voll und
						; die Bits an der richtigen Position
	rcall wait33u		; warten | ==> 66us
	rcall wait33u		; warten |

	ret					; Subroutine Ende


; ==================================================================
; ===== 1-Wire 1 Byte empfangen ====================================
; ==================================================================
d1wrec:
	push r18			; r16 auf Stack retten (fuer wiederherstellung)

	clr r16				; Empfangsregister loeschen
	ldi r18,0x08		; 8 Bits empfangen

d1wrloop:				; 
	rcall d1wrd			; Bit einlesen
	dec r18				; Bit-Zaehler incrementieren
	brne d1wrloop		; weiter empfangen (noch keine 8 Bit)

	pop r18				; r16 wiederherstellen
	ret					; Subroutine Ende


; ==================================================================
; ===== 1-Wire DS18S20 SNr lesen ===================================
; ==================================================================
d1wsnr:
	push r16			; r16 auf Stack retten (fuer wiederherstellung)
	push r17			; r17 auf Stack retten (fuer wiederherstellung)
	push r18			; r18 auf Stack retten (fuer wiederherstellung)

	clr r17				; CRC-8 Accu clearen
	clr r18				; Buffer clearen

	ldi r16,0x33		; DS18S20 - Read ROM
	rcall d1wsnd		; Senden

	rcall d1wrec		; Family-Code empfangen
	sts d1w_addrf,r16	; speichern
	rcall crc_8			; Byte zur CRC-8 hinzufuegen

	rcall d1wrec		; Byte 1 SNr empfangen
	sts d1w_addr1,r16	; speichern
	rcall crc_8			; Byte zur CRC-8 hinzufuegen

	rcall d1wrec		; Byte 2 SNr empfangen
	sts d1w_addr2,r16	; speichern
	rcall crc_8			; Byte zur CRC-8 hinzufuegen

	rcall d1wrec		; Byte 3 SNr empfangen
	sts d1w_addr3,r16	; speichern
	rcall crc_8			; Byte zur CRC-8 hinzufuegen

	rcall d1wrec		; Byte 4 SNr empfangen
	sts d1w_addr4,r16	; speichern
	rcall crc_8			; Byte zur CRC-8 hinzufuegen

	rcall d1wrec		; Byte 5 SNr empfangen
	sts d1w_addr5,r16	; speichern
	rcall crc_8			; Byte zur CRC-8 hinzufuegen

	rcall d1wrec		; Byte 6 SNr empfangen
	sts d1w_addr6,r16	; speichern
	rcall crc_8			; Byte zur CRC-8 hinzufuegen

	; r17 = CRC-Accu mit Ergebnis
	sts d1w_crc1,r17	; berechnete CRC-8 speichern

	rcall d1wrec		; CRC empfangen
	sts d1w_addrc,r16	; speichern

	lds r18,d1w_stat	; Status holen
	sbr r18,0b00000010	; Flag setzen (CRC ist ok)
	cpse r16,r17		; Compare and Skip if r16 Equal r17
	cbr r18,0b00000010	; Flag loeschen (CRC ist falsch)
	sts d1w_stat,r18	; Status sichern

	pop r18				; r18 wiederherstellen
	pop r17				; r17 wiederherstellen
	pop r16				; r16 wiederherstellen
	ret					; Subroutine Ende


; ==================================================================
; ===== 1-Wire DS18S20 Scratchpad lesen ============================
; ==================================================================
d1wscrp:
	push r16			; r16 auf Stack retten (fuer wiederherstellung)
	push r17			; r17 auf Stack retten (fuer wiederherstellung)
	push r18			; r18 auf Stack retten (fuer wiederherstellung)

	clr r17				; CRC-8 Accu clearen
	clr r18				; Buffer clearen

	ldi r16,0xBE		; DS18S20 - Read Scratchpad
	rcall d1wsnd		; Senden

	rcall d1wrec		; Byte 0 empfangen - Temp LSB
	sts d1w_scrp0,r16	; speichern
	rcall crc_8			; Byte zur CRC-8 hinzufuegen

	rcall d1wrec		; Byte 1 empfangen - Temp MSB
	sts d1w_scrp1,r16	; speichern
	rcall crc_8			; Byte zur CRC-8 hinzufuegen

	rcall d1wrec		; Byte 2 empfangen - TH-Reg/UserByte1
	sts d1w_scrp2,r16	; speichern
	rcall crc_8			; Byte zur CRC-8 hinzufuegen

	rcall d1wrec		; Byte 3 empfangen - TL-Reg/UserByte2
	sts d1w_scrp3,r16	; speichern
	rcall crc_8			; Byte zur CRC-8 hinzufuegen

	rcall d1wrec		; Byte 4 empfangen - Reserved (0xFF)
	sts d1w_scrp4,r16	; speichern
	rcall crc_8			; Byte zur CRC-8 hinzufuegen

	rcall d1wrec		; Byte 5 empfangen - Reserved (0xFF)
	sts d1w_scrp5,r16	; speichern
	rcall crc_8			; Byte zur CRC-8 hinzufuegen

	rcall d1wrec		; Byte 6 empfangen - Count Remain
	sts d1w_scrp6,r16	; speichern
	rcall crc_8			; Byte zur CRC-8 hinzufuegen

	rcall d1wrec		; Byte 7 empfangen - Count Per degCelsius
	sts d1w_scrp7,r16	; speichern
	rcall crc_8			; Byte zur CRC-8 hinzufuegen

	; r17 = CRC-Accu mit Ergebnis
	sts d1w_crc2,r17	; berechnete CRC-8 speichern

	rcall d1wrec		; Byte 8 empfangen - CRC-8
	sts d1w_scrp8,r16	; speichern

	lds r18,d1w_stat	; Status holen
	sbr r18,0b00000100	; Flag setzen (CRC ist ok)
	cpse r16,r17		; Compare and Skip if r16 Equal r17
	cbr r18,0b00000100	; Flag loeschen (CRC ist falsch)
	sts d1w_stat,r18	; Status sichern

	pop r18				; r18 wiederherstellen
	pop r17				; r17 wiederherstellen
	pop r16				; r16 wiederherstellen
	ret					; Subroutine Ende
Das ist nur ein Teil des gesamten Programms. Mit rcall (Relativ Call) hab ich weitere Subroutinen aufgerufen. Die Namen (Labels, Startadressen) der Subroutinen sind beschreibend damit man gleich weiß was die Subroutine macht.

Der erste Teil ist die Definition der SRAM-Speicherzellen in die bestimmte Informationen geschrieben werden. Das sind sozusagen die Variablen in Assembler. Ich hab den SRAM-Adressen lediglich Namen verpaßt damit man das im Programm besser verstehen kann.

Es ist eigentlich sehr logisch aufgebaut und wenn man anfängt ist es relativ egal ob man sich nun in Basic, C oder Assembler einarbeitet. Von einer anderen Sprache umzusteigen ist allerdings erst einmal eine kleine Umgewöhnung.

Gruß
Dino
 
Hi Dino,

so langsam sehe ich auch in Assambler ein System, dein Code ist sehr überschaubar. Aber ich werde jetzt erst einmal das Projekt in Bascom abschliessen und auch noch mehr Bascom erfahrungen sammeln.

Ich habe das Programm jetzt fast Fertig(vorerst ohne drehzahl) bis auf einen lässtigen Fehler. Ich werde versuchen es in Worte zu fassen weil der Code ohne die Hardware nicht wirklich Funktioniert.

Das Problem was ich habe liegt an den Befehlen Gosub und Goto.
Es gibt eine Stelle im Programm wo ich hinspringen möchte ohne wieder zurück zu springen, das geht mit Goto, da ist aber wieder das Problem das alle variablen gelöscht sind. Dieser Sprung bezweckt aber eben das ich am ende des Programmes abfrage ob es mit der gleichen "zahl" wiederholt werden soll. Springe ich mit Gosub springt es logischerweise wieder zurück zum ende springe ich mit goto ist die "zahl" weg.

Gibs da ein Befehl der da sagt Spring da hin nimm die variablen mit und komm nicht zurück?

Gruss Matthias
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)