Bascom BASCOM ; Erste Schritte zum Ausprobieren

  • Frohe Ostern

Heini-14

Mitglied
31 Dez 2018
33
0
6
Huglfing
Sprachen
BascomAVR
Habe jetzt das HTem so halbwegs verstanden. Man muss das GND jedes mal setzen und wieder lösen.
Das Terminal in Bascom ist nicht so umständlich und habe es jetzt auch mit dem Code aus #26 hin bekommen.
Nur aus #28 zeigt mir weder Bascom noch das HTem etwas an.
Was soll eigentlich ausgegeben werden?
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.143
58
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Mit dem Bascom-Terminal hab ich(!) mich nicht wirklich beschäftigt. HTerm ist möglicherweise komplexer - aber kann das Bascom-Terminal mehr als ASCII senden/empfangen/darstellen?

Hab beim Code aus #28 mal die Länge des Strings auf "5" erhöht (damit man mehr spielen kann):

CodeBox BascomAVR
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 19200
Dim Zeichen As String * 5
Do
   Input Zeichen
   Print Zeichen
Loop


Auf der Schaltung muß dann natürlich auch Rx (des Controllers) mit dem Adapter verbunden werden (bei mir TXO):
Heinis tut_Steckplatine_II.png
Geflasht wie gehabt, anschließend den Controller im Reset gehalten, HTerm gestartet.
Baudrate und Bitkonfiguration kontrolliert (außerdem Newline at CR+LF und den Haken bei Show Newline raus).
Verbunden, und den Reset des Controllers freigegeben.

erstmal passiert nichts, klar.

Unten bei Input Control Kann ich hinter Type die zu sendenden Bytes eingeben, als Ascii oder als Zahl (Hexadezimal, Dezimal oder Binär). Gesendet wird die Folge (Text) erst, wenn Du Enter betätigst.
Wenn Du das jetzt tust, also zB 1 Enter, erscheint die "1" unten bei Transmitted Data (wurde gesendet), bei Received Data oben erscheint die aber auch. Das ist das Echo von Input.
Schickst Du noch 'ne 2, 3, 4 und 5 hinterher (geht natürlich auch zusammen: 2345 Enter), erscheinen die auch bei Transmitted und Received.
Die "6" erscheint nur noch bei Transmitted. Warum?
Weil Input hier einen höchstens fünf Zeichen langen String erwartet. Alle weiteren eintrudelnden Ascii werden ignoriert. Trotzdem ist Input noch nicht abgeschlossen. Es erwartet nämlich einen Wagenrücklauf (CR).
Wenn Du also unten bei "Input Control" bei "Send on Enter" "CR" auswählst, und … sagen wir mal die 7 senden läßt (7 Enter), steht bei Transmitted Data inzwischen 1 2 3 4 5 6 7 \r.
Wählst Du bei Input Control neben der ASCII-Checkbox zusätzlich Hex und Dec aus, erkennst Du, daß "\r" eine dezimale 13 bzw 0Dhex ist - eben das Byte das dem Wagenrücklauf (CR) entspricht.
Oben bei Received erscheint sofort 1 2 3 4 5, das war die Print-Instruktion.

Schickst Du nur ein CR (also nur Enter), wird das CR von Input erstmal zurück-ge-echo-t, der String ist leer aber vollständig (CR empfangen), folglich sendet Print einen leeren String zurück, hängt aber CR und LF an.
 

Heini-14

Mitglied
31 Dez 2018
33
0
6
Huglfing
Sprachen
BascomAVR
Guten Morgen,
deine Anleitung habe ich Schritt für Schritt nachvollzogen und hat auch die gewünschten Ergebnisse ausgegeben.
Aber was sollte ich jetzt daraus lernen? Damit kann ich immer noch keinen µC nach meinen Vorstellungen programmieren.
Ich experimentiere am liebsten mit LED's ode LCD-Display herum. Das LCD I2C funktioniert nur mit dem Arduino-Board. Mit Bascom hab ich alle möglichen Einstellungen und I2C-Treiber ausprobiert, ohne Erfolg.
Leider hab ich bis jetzt nur Beispiele aus dem Internet ausprobiert.
Wie komme ich dahin, etwas selbständig zu programmieren?
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.143
58
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Aber was sollte ich jetzt daraus lernen?
Aus dem ersten Beispiel:
erstens:
daß das Programm im Controller nicht gestartet und beendet wird, sondern ununterbrochen Instruktionen aus dem Programmspeicher abgearbeitet werden. Deswegen mußt Du dafür Sorge tragen, daß das Programm pseudo-beendet wird, indem es in irgendeiner Art von Endlosschleife landet. Die leer sein ("End" generiert nur eine solche), oder endlos zu wiederholenden Code enthalten ("Hauptprogrammschleife" zB) kann.
(Du könntest in dem Programm zB mal das "End" weglassen. Wenn Bascom das nicht automatisch ergänzt, sollten ununterbrochen "Moin Moin"s kommen.)
zweitens:
daß "Print" Strings (ASCII-Codes) sendet, und Bascom selbständig ggf nötige Umwandlungen dazwischen setzt. Außerdem werden am Ende die Steuer-ASCII für "Wagenrücklauf" (CR) und "Zeilenvorschub" (LF) angehängt. Kann man möglicherweise auch irgendwo konfigurieren.

Aus dem zweiten:
erstens:
daß "Input" ebenso mit Strings operiert, und ggf nötige Konvertierungen vornimmt.
zweitens:
daß entsprechend der erwarteten Variablen ein Empfangspuffer eingerichtet wird, der maximal die erwartete Anzahl an Bytes (ASCII) aufnimmt.
drittens:
daß jedes dabei eingehende Zeichen zurückgesendet wird, sofern man das Echo nicht unterbindet.
viertens:
daß der Programmfluß bei "Input" wartet (bedingte Endlosschleife), bis ein "Wagenrücklauf" (CR) empfangen wurde (welches natürlich auch als Echo zurückgegeben wird, so nicht unterbunden).

Mit Print und Input hast Du jetzt zwei Werkzeuge in der Hand, mit denen Du einerseits Programmabläufe einfach verfolgen kannst (debugging), und andererseits auch steuernd eingreifen kannst.

Kleine Schritte.

Ich experimentiere am liebsten mit LED's ode LCD-Display herum.
Das LCD später, 'ne LED können wir jetzt hinzufügen...
Nächste Aufgabe:
Schließe an D7 eine (geeignete) LED mit geeignetem Vorwiderstand (gegen Gnd) an, und bringe sie im Input-Programm zusätzlich zum leuchten.
sollte vor dem Eintritt in die Hauptprogrammschleife geschehen.
D7 muß Ausgang sein
ein High-Pegel bringt die LED (gegen Gnd) zum leuchten
Das Port-Bit von D7 kann mit Alias "klingend" benamst werden
 

Heini-14

Mitglied
31 Dez 2018
33
0
6
Huglfing
Sprachen
BascomAVR
Ich habe mir das so gedacht, aber funktioniert nicht.


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

Ddrd = &B_1111_1111
Portd = &B0000_0000

Led_rot Alias Portd.7

Dim I As Byte

Do
   Input I
   Led_rot = 1
Loop
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.143
58
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Sicher?
Du verwendest zwar "I" nach dem Input nicht, trotzdem wartet der Controller in Zeile 16 auf die Eingabe - bevor er in Zeile 17 die LED manipuliert.

In den Zeilen 8 und 9 setzt Du alle acht Beine von PortD auf Ausgang und Gnd - wenn Du da jetzt aus versehen extern 'ne Spannung dranlegst, hast'n kurzen...
Besser wäre es, nur die nötigen Bits zu setzen (das PORTD-Register ist abgesehen davon Default 0x00)

Du gehst den Weg über die Register (nicht falsch, ich mach das so auch lieber), aber Du könntest das Bein ebenso mit Config Port/Pin machen.

Derzeit würdest Du die LED bei jedem Schleifendurchlauf einschalten (also immer wieder) - eigentlich wollte ich sie nur vor dem Schleifeneintritt anschalten lassen (Aufgabe schlecht gestellt...).
 

Heini-14

Mitglied
31 Dez 2018
33
0
6
Huglfing
Sprachen
BascomAVR
Meinst du es so.



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

Config Portd.7 = Output
Config Portd.7 = 0
Config Portc.0 = Input
Config Pinc.0 = 1

Taster Alias Portc.0
Led_rot Alias Portd.7

Dim Taster As Bit

Do
   If Taster = 1 Then
   Led_rot = 1
   End If
Loop
End


Zeile 19 wird bemängelt, aber keine Ahnung warum.
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.143
58
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Zeile 19 wird bemängelt, aber keine Ahnung warum.
Eigentlich sollte er in Zeile 16 meckern.
Du hast nämlich in Zeile Zeile 13 Portc.0 den Namen Taster verpaßt (Portc.0 ist Bit 0 in I/O-Register Portc).
In Zeile 16 definierst Du jetzt eine neue Bit-Variable (im SRAM), der Du denselben Namen geben willst. Das ist nicht erlaubt.

In Zeile 19 willst Du vermutlich den Zustand des Tasters prüfen. Da macht allerdings das Port-Register keinen Sinn, weil das durch den Taster nicht geändert wird - Das Port-Bit legt bei einem Ausgang den Pegel fest, und bei einem Eingang, ob der Pullup aufgeschaltet wird oder nicht (also beim Mega8 zumindest).
Den tatsächlichen Pegel mußt Du hingegen aus dem Pin-Register lesen!

ABER ein Taster war nicht die Aufgabe.
Ausgangspunkt war:


CodeBox BascomAVR
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 19200
Dim Zeichen As String * 5
Do
   Input Zeichen
   Print Zeichen
Loop
Sinnigerweise reduzieren wir die Länge von Zeichen schon mal wieder auf 1, und unterdrücken das Echo von Input:


CodeBox BascomAVR
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 19200
Dim Zeichen As String * 1
Do
   Input Zeichen , Noecho
   Print Zeichen
Loop

So, und jetzt nochmal die Aufgabe:
An D7 'ne LED mit passendem Vorwiderstand nach Gnd schalten.
Im Code ergänzen/hinzufügen:
D7 als Ausgang festlegen, und 'nen geeigneten Namen vergeben.
LED vor Begin der Endlosschleife zum leuchten bringen.

(Als Ergebnis solltest Du dasselbe wie in #43 beschrieben haben, nur daß eben auch die LED an D7 dauerleuchtet, und nur noch ein Zeichen ein- und zurückgegeben wird.)
 

Heini-14

Mitglied
31 Dez 2018
33
0
6
Huglfing
Sprachen
BascomAVR
Zeile 7 (Dim Zeichen As String*1)
Ich glaube, dass ich das noch nicht begriffen habe. Du schreibst, die Länge von Zeichen reduzieren. Um was für Zeichen handelt es sich da eigentlich?
Dann kommt Input Zeichen, Noecho und Print Zeichen.
Ja, die Zeile 16 habe ich gemeint.
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.143
58
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Mit Dim reservierst Du in Bascom Speicherplatz für Variablen. Wenn nicht anders angegeben im SRAM.
Natürlich mußt Du der Variable einen Namen geben, und bei Hochsprachen auch den Variablentypen festlegen.


CodeBox BascomAVR
Dim Zeichen As String * 5

Es wird Platz für fünf (aufeinanderfolgende) Characters im SRAM reserviert (sogar sechs, der sechste ist die ASCII-Null, die den String terminiert).
Jeder Character "verbraucht" im SRAM ein Byte.
Unter Zeichen (das ist nur ein Name, den ich willkürlich vergeben habe) merkt sich Bascom die Startadresse dieser sechs Adressen. (Der Controller selbst kennt keine Variablen, nur Speicheradressen. Statt Zeichen müßtest Du jedesmal mit konkreten Adressen jonglieren - Bascom nimmt Dir das als Compiler ab.
Füge mal testhalber folgendes ein:


CodeBox BascomAVR
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 19200
Dim Zeichen As String * 5
Zeichen = "A"
Zeichen = Zeichen + "Y"
Do
   Input Zeichen
   Print Zeichen
Loop

In Zeile 7 wird also der Platz für einen 5 + ASCII-Null - Zeichen langen String reserviert. Bascom Initialisiert den (genaugenommen den ganzen (ungenutzten) SRAM) mit 0x00 (=ASCII-Null).
In Zeile 8 Wird dem String jetzt "A" zugewiesen, im SRAM landet dann das entsprechende Byte (also der ASCII-Code).
In Zeile 9 wird an das "A" jetzt ein "Y" angehängt, es landet also in der Speicherzelle hinter dem "A".
Starte das Programm nach dem Compilieren im Simulator.8016
Bei "1" aktivierst Du die Ansicht der Speicher.
Uns Interessiert der SRAM (also der Reiter bei "2")
Die ganzen "Nullen" sind der, von Bascom genullte SRAM. Er beginnt beim Mega8 bei Adresse 0x0060, dann 0x0061 und so weiter. Klickst Du so eine Zelle an, wird unten angezeigt, welche Variable diese Zelle "besetzt" (occupy).
Unsere 5+1 Bytes von Zeichen landen (da sie als erste und einzige Variable angelegt wurden also in den Adressen 0x0060..0x0065 (erstmal alles Nullen)
Jedesmal wenn Du auf "4" klickst, wird ein Bascom-Befehl ausgeführt
Der Hellblaue Pfeil unten am Code zeigt Dir den nächsten Befehl (ich hab also schon ein paar mal geklickt).
Simuliere mal die paar Zeilen, und beobachte die Speicheransicht rechts.
Wenn Du in der Input-Zeile angekommen bist, mußt Du noch ein weiteres mal auf die "4" klicken (unten steht in meiner Statuszeile "Pause", da muß dann "running" erscheinen. Dann kannst Du im UART0-Fenster (Dunkelblau) bis zu fünf Zeichen eingeben. Das simuliert den zeichenweisen Empfang vom UART, und ist im Speicherabbild nachvollziehbar.
Input wird erst mit einem Enter abgeschlossen, danach kannst Du das Programm mit "4" weitersimulieren...
Im UART0-Fenster werden Dir die eingetippten Zeichen angezeigt, das ist aber eigentlich nur das Echo von Input. Der simulierte Controller sendet jedes empfangene Zeichen zurück.
Hast Du die Engabe mit Enter abgeschlossen, gibt Print als nächster Befehl den ganzen String aus.
Ergänze jetzt mal in Zeile 11 das "Noecho" (Input Zeichen , Noecho), und simuliere das ganze nochmal.
Jetzt mußt Du die Zeichen im UART-Fenster "blind" eingeben (naja, im Speicherabbild kannst Du den Empfang ja verfolgen).
Nach dem Abschließen (mit Enter) erscheint der eingegebene Befehl im nächsten Schritt dann mit Print.

Noch Fragen? Ansonsten zurück zum zweiten Codeblock aus #48. Echo unterdrückt, klar - und der String Zeichen nimmt jetzt nur noch ein ASCII auf, und das NullByte dahinter (also die Adressen 0x0060 mit dem eigentlichen Zeichen, und 0x0061 mit 'ner ASCII-Null für das Stringende).

Ran an die Aufgabe! ;)
 

Heini-14

Mitglied
31 Dez 2018
33
0
6
Huglfing
Sprachen
BascomAVR
Jetzt wird mir schon einiges klarer. Das muss ich mir heut Abend genauer ansehen.
Vielen Dank.
 

Heini-14

Mitglied
31 Dez 2018
33
0
6
Huglfing
Sprachen
BascomAVR
Ich habe im Simulator die Abläufe mit Pause und Running getestet, die Veränderung im Speicher beobachtet.
Eine LED bringe ich damit nicht zum leuchten.
Die Veränderungen der Zahlen und Ziffern im Speicher bleiben mir immer noch Rätselhaft.
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.143
58
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Ich habe im Simulator die Abläufe mit Pause und Running getestet, die Veränderung im Speicher beobachtet.
[…]
Die Veränderungen der Zahlen und Ziffern im Speicher bleiben mir immer noch Rätselhaft.
Nochmal ganz langsam:
Bevor Du das erste mal auf (4) klickst, stehen im SRAM-Abbild nur 0xFFs - tatsächlich ist der Zustand aber eher zufällig, der SRAM ist flüchtig.
Nach dem ersten (4)-Klick werden die internen Initialisierungen von Bascom simuliert - insbesondere löscht Bascom alle SRAM-Adressen (also auf 0x00). Nach jedem Reset. Kann man aber mit irgendeiner Direktive (noramclear?) auch unterdrücken.
Die Direktiven in den Zeilen 1..6 erzeugen keinen weiteren Code - wenn, dann wurde er beim Init bereits erledigt (Baudrate ins Baudratenregister schreiben).
Auch das Dim in Zeile 7 erzeugt keinen Code - es sagt Bascom nur, wo die Bytes liegen, die Du im Code "Zeichen" nennst, und das immer wenn von dieser Variable gebrauch gemacht werden soll, der Inhalt als String zu verwenden ist.
Dem String wird also die SRAM-Adresse &H0060 (das ist die erste SRAM-Adresse, steht also links oben in der Darstellung) als Anfang zugewiesen, sowie die folgenden 4 Bytes (Adressen). Außerdem gehört die ASCII-Null in Adresse &H0065 als String-Terminator dazu.

Zeile 8 weist Du jetzt dem String das ASCII-Zeichen "A" zu. "A"=&H41=65dez (ASCII-Tabelle). SRAM-Adresse &H0060 wird also das "A" ( = &H41) zugewiesen, den anderen fünf 'ne &H00 (ASCII-Null).

In Zeile 9 wird zum String ein "Y" "addiert" - also angehängt. "Y" ist &H59 bzw 89dez. Bascom sucht ab der Startadresse von Zeichen (war ja &H0060) beginnend die erste SRAM-Zelle, die 'ne ASCII-Null enthält (das wäre die &H0061, da die &H0060 ja das "A" enthält), und schreibt da das "Y" (also &H59) rein.
Außerdem wird in die Adresse dahinter 'n neuer Terminator (ASCII-Null) geschrieben. Genau das ist der Zustand in dem Bild oben.
Die beiden Roten Bytes sind genau die Änderungen, die Zeile 9 vorgenommen hat.
Wenn ich das Fenster breiter gezogen hätte, würde man rechts neben der Hexadezimalen Darstellung auch 'ne ASCII-Darstellung sehen - mit "A" und "Y" eben.
Zeile 10 enthält keinen ausführbaren Code, sondern nur 'ne Sprungadresse (loop springt dahin),
Zeile 11 wartet auf 'nen empfangenen String - also insbesondere auf ASCII &H0D (CR), Wagenrücklauf...
Solange keine Bytes empfangen werden (simuliert), wartet das Programm ewig.
Die empfangenen Zeichen (bis zu fünf) werden in die SRAM-Adressen &H0060..&H0064 geschrieben, solange das Input-Echo nicht unterdrückt wird, gibt der (simulierte) Controller jedes Zeichen außerdem zurück.
Wenn (CR) &H0D empfangen wurde, ist Input abgearbeitet - in Zeile 12 wird jetzt nochmal der ganze String gesendet.
Danach wird zum Input zurückgesprungen - Endlosschleife.
Eine LED bringe ich damit nicht zum leuchten.
Nein, die Zeilen 8 und 9 hatte ich nur zwischengeschoben, um Dir zu veranschaulichen wo die Stringvariable im Speicher liegt, und was Input eigentlich macht. Insbesondere wartet Input immer auf ein (CR), und sendet ggf jedes Zeichen nebenbei zurück (solange der Puffer nicht voll ist).

Wie schon gesagt:
zurück zum zweiten Codeblock aus #48.
An D7 'ne LED mit passendem Vorwiderstand nach Gnd schalten.
Im Code ergänzen/hinzufügen:
D7 als Ausgang festlegen, und 'nen geeigneten Namen vergeben.
LED vor Begin der Endlosschleife zum leuchten bringen.
Das hast Du eigentlich schon in #47, nur nicht an der richtige Stelle, und der Taster war da nicht gefordert...
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.143
58
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Dann will ich (wieder einmal) auflösen:
An D7 'ne LED mit passendem Vorwiderstand nach Gnd schalten.
8017
Hab hier grad weiße LEDs mit 11 Candela rumliegen, normalerweise blenden die mit knapp 20mA - mit 'nem 10K-Vorwiderstand an knapp 5V sollten sie also weniger als 'n halbes mA aufnehmen. Immer noch recht hell als Signallämpchen, aber akzeptabel.
Im Code ergänzen/hinzufügen:


CodeBox BascomAVR
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 19200
Dim Zeichen As String * 1

Led_rot Alias Portd.7                                       'Name für Portbit des Beines
Config Led_rot = Output                                     'LED ist Ausgang
Set Led_rot                                                 'high Pegel

Do
   Input Zeichen , Noecho
   Print Zeichen
Loop

In Zeile 9 geben wir dem Bein (genauer: dem Port-Bit) 'nen Namen.
In Zeile 10 wird das Bein Auf Ausgang geschaltet. Ich verwende den neuen Namen - eigentlich müßte man das DDR-Bit setzen; Bascom kann das aber korrigieren, deswegen kann der Name verwendet werden.
In Zeile 11 wird das Bein auf high-Pegel geschaltet. Dort könnte ebenso Led-rot=1 stehen.

Nach dem Programmstart (Reset) geht die LED an, die restliche Programmfunktion wie gehabt: In der Schleife wartet Input auf ein eingegebenes (mit Enter terminiertes) Zeichen (ASCII), und gibt dieses nach Empfang (ergänzt um ein (CR) und ein (LF) zurück.

Neue Aufgabe:
Werte das in der Schleife empfangene Zeichen aus. Nach einer "1" soll die LED angeschaltet werden, nach einer "0" soll die LED ausgeschaltet werden, nach einem "t" soll die LED umgeschaltet werden und nach einem "?" soll der Zustand der LED zurückgesendet werden.
Beim An-, Ab- bzw Umschalten könnte auch 'ne entsprechende Meldung zurückgesendet werden.
 

Heini-14

Mitglied
31 Dez 2018
33
0
6
Huglfing
Sprachen
BascomAVR
Guten Morgen

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

Config Portd.7 = Output
Config Portd.7 = 1

Dim Zeichen As String * 1

Led_rot Alias Portd.7

Do
Input Zeichen
Print Zeichen
Loop
End

ich wollte die LED mit der Do...Loop Schleife anschalten, also mit Input und Zeichen. Aber das war anscheinend auch nicht die Aufgabe.
Warum muss an die LED ein Vorwiderstand von 10K bzw. habe ich schon einige mal gelesen 1K.
Der Ausgangsstrom der Ports liegt doch weitaus niedriger, also reichen doch R 220 vollkommen aus.
Wo liegt mein Denkfehler.
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.143
58
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Meine Lösung wäre
Geht auch - wenn Du Alias vorziehst, kannst Du den Namen beim setzen des Beines bereits verwenden. Siehe auch meine Lösung + Erklärung.
Warum muss an die LED ein Vorwiderstand von 10K
Muß sie nicht, ich hatte nur grad 'ne superhelle rumzuliegen, und die liefert selbst mit 10K noch recht viel Licht für 'ne einfache Signallampe. Nimm 'nen geeignete Vorwiderstand (geeignet für Dich und Deine LED).
Der Ausgangsstrom der Ports liegt doch weitaus niedriger,
Nein, die Ports vertragen maximal 20mA (bzw was im Datenblatt steht - über den Daumen max. 20mA pro Bein, 100 mA pro Port (Beingruppe). Gilt aber auch nicht für alle Controller, und kommt auch auf die Versorgungsspannung an).
Um Die Strombegrenzung mußt Du Dich kümmern, zB eben über einen geeigneten Vorwiderstand vor LEDs...
ich wollte die LED mit der Do...Loop Schleife anschalten, also mit Input und Zeichen. Aber das war anscheinend auch nicht die Aufgabe.
Die neue Aufgabe in #45 hast Du bereits gesehen?
 

Heini-14

Mitglied
31 Dez 2018
33
0
6
Huglfing
Sprachen
BascomAVR
Ich kann diese Aufgabe nicht lösen. Bei allen Versuchen und Möglichkeiten bekomme ich in Bascom nach dem compilieren eine Fehlermeldung. Ich finde einfach nicht den richtigen Weg.
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.143
58
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Nach einer "1" soll die LED angeschaltet werden, nach einer "0" soll die LED ausgeschaltet werden, nach einem "t" soll die LED umgeschaltet werden und nach einem "?" soll der Zustand der LED zurückgesendet werden.
Also...
Wenn das empfangene Zeichen eine "1" war soll die LED eingeschaltet werden, sonst...
Wenn das empfangene Zeichen eine "0" war soll die LED ausgeschaltet werden, sonst...
Wenn das empfangene Zeichen ein "t" war soll die LED getoggelt werden, sonst...
Wenn das empfangene Zeichen ein "?" war soll der Zustande der LED zurückgegeben werden, sonst...
Keine Aktion.
Hinweis I war IF..Then..Else..Endif.
Hinter der Input-Zeile; statt der Print-Zeile fügen wir folgendes ein:

CodeBox BascomAVR
   If Zeichen = "1" Then
      'LED anschalten
      ' (ggf Rückmeldung)
   Elseif Zeichen = "0" Then
      'LED Abschalten
      ' (ggf Rückmeldung)
   Elseif Zeichen = "t" Then
      'LED toggeln
      ' (ggf Rückmeldung)
   Elseif Zeichen = "?" Then
      'LED-Zustand Rückmelden
   End If

Die grünen Kommentare sind jetzt durch entsprechenden Code zu ersetzen - LED-anschalten hatten wir ja schon mal. Bei Aus- und Umschalten sollten die Hinweise II und III helfen, wenn nötig. Wo ist der tatsächliche Zustand der LED auswertbar? (Also was manipulierst Du beim an- und abschalten?)
 

Heini-14

Mitglied
31 Dez 2018
33
0
6
Huglfing
Sprachen
BascomAVR
Habe es erst einmal ohne Rückmeldung


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

Config Portd.7 = Output
Config Portd.7 = 1

Dim Zeichen As String * 1

Led_rot Alias Portd.7

Do
   Input Zeichen
   If Zeichen = "1" Then
     Led_rot = 1
   Elseif Zeichen = "0" Then
      Led_rot = 0
   Elseif Zeichen = "t" Then
      Toggle Led_rot
      Waitms 500
   Elseif Zeichen = "?" Then
   End If
Loop
End

Kann momentan nicht testen, da mein Netzteil vom Laptop hinüber ist und ich nur an diesem die Seriellen Anschlüsse habe.
 

Ü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)