6. Grundstruktur und ein paar Grundbefehle (Basic-Sprache)

Anleitungen für "hausgemachte" LED Projekte

Moderator: T.Hoffmann

Antworten
Benutzeravatar
Pehu
Mega-User
Mega-User
Beiträge: 469
Registriert: Mi, 01.11.06, 19:33
Kontaktdaten:

Di, 09.01.07, 21:53

Sodele, im Tut "4. Das erste Programm & Übertragung zum Microcontroller":
http://www.lumitronixforum.de/viewtopic.php?t=1599
wurde kurz erklärt wo man sein eigenes Programm/Code reinschreiben muss und wie man es zum Microcontroller überträgt.
Nun kommen wir zum Programme schreiben bzw. programmieren.

Alle Beispiele hier sind für den Atmega8 geschrieben. Mit einem anderen Microntroller könnte es vielleicht nicht laufen (wenn z.B. der I/O-Port nicht vorhanden ist). Außerdem sind die Beispiele/Codes für das Pollin-Board geschrieben. Dadurch wurden in den Beispielen die richtigen I/O-Pins ausgewählt, wo die 2 Leds, 3 Taster,... angeschlossen sind!

Kurz: alle die den Atmega8 in Kombination mit dem gleichen Pollin-Board wie ich verwenden. Können die Beispiele 1:1 übernehmen.
:wink:

Grundstruktur
Die Grundstruktur ist folgender Maßen aufgebaut:

$regfile = "m8def.dat" <- Hier wird der Microcontroller-Typ festgelegt, in diesem Code ist es der Atmega8, für Atmega32 wäre es "m32def.dat" anstatt "m8def.dat"

$crystal = 1000000 <- Hier wird der Takt festgelegt, 1000000 sind 1 Mhz, immer den Takt angeben, den der Oszillator bzw. der Taktgeber erzeugt! Sonst läuft es mit der falschen Geschwindigkeit oder es ruckelt. Übertakten kann man damit nicht. :wink:

Do <- "Do" heißt so viel wie mache/führe folgendes aus, er führt den Code unter "Do" aus
<- Hier kommt unser Programm/Code rein
Loop <- Loop kann man einem Looping vergleichen, ist eine Endlosschleife und springt zu "Do" zurück und macht dies endlos. Sprich er führt unseren Code zwischen "Do" und "Loop" Endlos aus.

Hier der reine Code ohne Erklärung:

Code: Alles auswählen

$regfile = "m8def.dat"

$crystal = 1000000  

Do

Loop
So das war die Grundstruktur.

Kommentare in den Code reinschreiben

Möchte man Kommentare im Code hinterlegen, so muss man vor dem Kommentar ein ' (Apostroph) schreiben.
Ansonsten würde der Compiler es als einen Befehl nehmen und ausführen oder ein Fehler bringen.

Alles was hinter dem ' (Apostroph) in der gleichen Zeile wie das ' (Apostroph) steht, wird vom Compiler nicht berücksicht. Z.B.:

$regfile = "m8def.dat" 'Hier kann ich mein Kommentar schreiben

Im Bascom werden Kommentare als grüne Schrift dargestellt

I/Os-Pins (Eingänge/Ausgänge) deklarieren und ansteuern

Damit ein I/O bzw. Pin angesteuert wird, braucht man natürlich mehr als die Grundstruktur. :wink:

Wichtig ist die Bezeichnungen der Pins, welche man unter 5. Informationen zu einzelnen AVR-Microcontrollern-Typen: http://www.lumitronixforum.de/viewtopic.php?t=1615 findet. Z.B.: "PD5" oder "PD2". Da man mit dieser Bezeichnung die einzelne I/Os bzw. Pins anspricht.

Deshalb ergänzen wir das Ganze (ich erkläre nur die neu hinzugefügten Befehle):

$regfile = "m8def.dat"

$crystal = 1000000

Config Pind.5 = Output <- Hier wird ihm gesagt, dass der Pin "PD5" ein Ausgang ist. Wäre die Konfiguration für den Pin "PC0" so würde es "Config Pinc.0 = Output" heißen.
Config Pind.6 = Output <- Hier wird Pin "PD6" als Ausgang deklariert.
Config Pind.2 = Input <- Hier wird Pin "PD2" als Eingang deklariert.

Do

Portd.5 = 1 <- Der Pin "PD5" wird auf 1 bzw. High gesetzt. Sprich Pin "PD5" mit 5 Volt versorgt. Wichtig ist, dass beim Ansteuern mit "PortX.X" und weiter oben beim Deklarieren mit "PinX.X" schreibt!
Waitms 1000 <- Hier macht er 1 sek. Pause (1000 Milisekunden = 1 Sek.)
Portd.5 = 0 <- Der Pin "PD5" wird auf 0 bzw. Low gesetzt. Auf Deutsch 0 Volt.
Waitms 1000 <- Wieder 1 Sek. Pause
Portd.6 = 1 <- Diesmal "PD6" auf High
Waitms 1000 <- Wieder 1 Sek. Pause
Portd.6 = 0 <- "PD6" auf Low
Waitms 1000 <- Wieder 1 Sek. Pause

Loop

Hier der Code ohne Erklärung:

Code: Alles auswählen

$regfile = "m8def.dat"

$crystal = 1000000

Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.2 = Input

Do

Portd.5 = 1
Waitms 1000 
Portd.5 = 0 
Waitms 1000 
Portd.6 = 1 
Waitms 1000 
Portd.6 = 0
Waitms 1000

Loop

So, was passiert, wenn man den Code zum Microcontroller überträgt?
Die Led1 leuchtet, nach 1. Sek. geht sie aus, nach 1. Sek. geht Led2 an, nach 1 Sek. geht Led2 aus, 1 Sek. Pause und das ganze fängt wieder von vorne an. Somit endlos.
Ist sozusagen, ein Wechselblinker zwischen zwei Leds. Man kann die 1 Sek. Pause runterdrehen auf z.B. 200. Dadurch würde das ganze schneller blinken.

Die Standard I/O- bzw. Pin-Bezeichnungen durch eigene Bezeichnung ersetzen und ansteuern
Die Standard Pin-Bezeichnungen sind schwer zu merken und kaum auseinander zu halten.
Hierfür gibt es eine Lösung, man verwendet folgenden Befehl:

Meinname Alias Portd.5


Dadurch kann ich den "PD5" mit "Meinname" ansprechen. Z.B: "Meinname = 1" und somit Led1 auf High stellen.
Der oberige Code würde mit eigenen Bezeichnungen dann so aussehen:

Code: Alles auswählen


$regfile = "m8def.dat" 

$crystal = 1000000 

Config Pind.5 = Output 
Config Pind.6 = Output 
Config Pind.2 = Input

Taster1 Alias Pind.2 
Led1 Alias Portd.5
Led2 Alias Portd.6 

Do 

Led1 = 1 
Waitms 1000 
Led1 = 0 
Waitms 1000 
Led2 = 1 
Waitms 1000 
Led2 = 0 
Waitms 1000 

Loop
Zuletzt geändert von Pehu am Do, 11.01.07, 21:57, insgesamt 1-mal geändert.
Andy
Hyper-User
Hyper-User
Beiträge: 1284
Registriert: Mi, 17.05.06, 13:03

Di, 09.01.07, 22:07

Na, das nenne ich mal eine SUPER Aufschlüsselung der Befehlssätze.

Gefällt mir sehr gut... weiter so.

Auf diverse weitere Befehle mit Beispielen und Erklärungen bin ich sehr gespannt, würde mich Freuen, wenn noch diverse weitere Beispielprogrammierungen volgen würden.

Wie wäre es mit dem Programm für den LED Cube ? 3x3x3 , 5x5x5 etc... hehehe... wäre net schlecht, um neue Anregungen und Ideen um zu setzen.

Und was auch noch gut wäre...allerdings sicherlich sehr Umfangreich,...... ein Program für eine LED Matrix Ansteuerung, damit man nicht die mega großen yC´s benötigt und diese womöglich noch Kaskadieren muß.
Benutzeravatar
norminator85
Ultra-User
Ultra-User
Beiträge: 596
Registriert: Mi, 13.12.06, 21:45

Di, 09.01.07, 22:10

echt gut gemacht... scheint ja garnicht soooo schwer zu sein wen man es so gut erklärt bekommt! ich werd mir wohl auch son teil taufen bei pollin! die werden sich wundern warum sie auf ein schlag so viele los werden!
Benutzeravatar
alexStyles
Auserwählter
Auserwählter
Beiträge: 2333
Registriert: So, 20.08.06, 16:51
Wohnort: Düsseldorf
Kontaktdaten:

Mi, 10.01.07, 02:44

Ja :D Meine Bestellung ist raus bei Pollin ...
NEO bestellt sich auch noch eins und die Norminator und wer wohl noch alles :P
Habe mir auch mal eine Zeitschrift zum Thema gekauft
Alles erscheint mir zwar noch ein wenig kompliziert aber
Ich versteh schon einmal viel mehr als noch vor einem Jahr :lol:
Da wusste Ich nichmal wie Ich mit Leds umzugehen hatte :oops:
Es freut mich wirklich durch dieses Forum und einigen anderen Personen so einen "Draht" zur Elektronik/Technischen Verarbeitung bekommen zu haben :oops:

Mit dankenden Grüßen Alex
Benutzeravatar
Doc_McCoy
Hyper-User
Hyper-User
Beiträge: 1962
Registriert: Sa, 03.06.06, 15:49
Wohnort: Neualbenreuth
Kontaktdaten:

Mi, 10.01.07, 19:49

Kann man eigentlich mit Bascom/Ponyprog ein Programm schreiben, womit man Leds über den Parallelport steuern kann.
Also ich will kein PIC/Microcontroller über Parallelport programmieren, sondern nur einfach Leds ansteuern!

Funktioniert das?
Andy
Hyper-User
Hyper-User
Beiträge: 1284
Registriert: Mi, 17.05.06, 13:03

Mi, 10.01.07, 19:55

Mit PonnyProg und Bascom....Glaube ich nicht...wüßte ich zumindest net...

Mit dem Programm K8Control geht es aber definitiv...is allerdings eher eine Zeitsteuerung der 8 Ports des Parallelports des Rechners...es Funzt recht gut...aber ich Glaube, das deinen Ansprüchen damit nicht genüge getan werden würde.... is halt nur ne Simple Zeitsteuerung der Kanäle...(ein und aus auf Zeit mit Timerfunktion)
Proggy is ca. 1,6MB groß...oder klein?...lol... :wink:
Andy
Hyper-User
Hyper-User
Beiträge: 1284
Registriert: Mi, 17.05.06, 13:03

Do, 11.01.07, 21:55

So...

Ich habe da dann nun auch mal die eine oder andere Frage.

1. Könnte man einen Fadereffekt Simulieren?
Zum Beispiel led1 geht LANGSAM an , während led1 dann LENGSAM wieder aus geht geht parallel dazu LED2 LANGSAM an und dann led3 dann langsam an, während led2 wieder langsam aus geht und so weiter dann led1 und 2 dann 1 und 3 .......

Das wären dann ja schon 2 bis 3 Abläufe zeitversetzt mit einer zeitlichen überschneidung.

Wenn´s gehen würde, wie würde denn da der Programmablauf aussehen?...am besten mit kleinem Beispiel.



2.Wie sieht es aus... können die yC´s denn auch 2 oder mehr Programme gleichzeitig ablaufen lassen?

Meinetwegen auf den Ausgängen 1, 2 und 3 einen fader Effekt (RGB Led nachbildung) und auf den Ausgängen 4 - 8 dann eine Art Lauflicht mit diversen Mustern?

Wenn ja...bitte ein kleines Beispiel.


Somit kommen wir dann zu 3. was dann ein schwierigkeitsgrad höher sein dürfte.

Und zwar...

Eingang ist ein Taster und soll dann einmal getastet werden... diese Funktion soll dann permanent ablaufen...also als Loop... bis man den Taster 1 ein 2tes mal betätigt, dann soll das ganze dann wieder aus gehen.

Bitte dann auch ebenfalls mit Beispiel


Somit zu nummer 4

das ganze wie vorher, jedoch mit 2 oder 3 Tastern, die dann ein Programmablauf starten...wobei jeder Taster ein anderes Programm bekommen würde, welche dann aber auch gleichzeitig oder aber auch einzeln ablaufen können sollten.
Hier auch wieder als Loop, bis man denjenigen Taster erneut tastet und das jeweilige Programm dann endet oder man Taster4 betätigt und dann alle programme stoppen.

Ist dieses möglich?...wenn ja, bitte ein kurzes Beispielprogramm posten.
Benutzeravatar
Pehu
Mega-User
Mega-User
Beiträge: 469
Registriert: Mi, 01.11.06, 19:33
Kontaktdaten:

Do, 11.01.07, 22:43

@Andy

1. und 2.: Der Microcontroller kann nichts parallel ausführen.
Die Klasse "Thread" wie bei Java gibt es hier nicht. :wink:

Alles passiert nacheinander, jedoch ist der Microcontroller so schnell, dass wir alles als parallel empfinden können. Vorausgesetzt das selbst erstellte Programm ist auch sogut.

Genauso, ist das bei einem normalen PC ohne Dual-Prozessor!
Der Prozessor arbeitet alles nacheinander bzw. Threadweise mit Zeitmultiplexing ab! Dadurch empfinden wir es als würde er parallel arbeiten. Das Gleiche muss du auch softwaretechnisch mit dem Microcontroller umsetzen.

Du muss hier selber was erfinden bzw. schreiben.
Ist aber nicht sehr einfach.

3. Von 0 auf 100 geht es nicht. Sonst knallt man sehr schnell gegen die Wand. Wenn man die Basic-Sachen nicht versteht hat man keine Chance.

Siehe nächste Tut mit dem einen Problem (so schnell können Probleme entstehen):

http://www.lumitronixforum.de/viewtopic.php?t=1654

Beim Programmieren muss man vieles Beachten! Bei größeren Programmen muss man einiges beachten.

Wer noch nicht programmiert hat, was gar nicht wer schwer das sein kann.

Zum Glück arbeite ich im IT-Bereich und habe Erfahrung mit Programmieren.

4. Wie gesagt, der Microntroller kann nichts gleichzeitig machen. Siehe Punk 1.

Hier kommen zum nächsten Thema, Interrupt, mit Interrupt kann man das Hauptprogramm unterbrechen und ein Unterprogramm ausführen, nach dem das Unterprogramm ausgeführt wurden ist, setzt er an der Stelle des Hauptprogramm fuhrt wo er davor aufgehört hat.

Wie gesagt, werde noch ein paar Tuts schreiben, bitte um ein bisschen Geduld.
Zuletzt geändert von Pehu am Fr, 12.01.07, 06:37, insgesamt 1-mal geändert.
Andy
Hyper-User
Hyper-User
Beiträge: 1284
Registriert: Mi, 17.05.06, 13:03

Do, 11.01.07, 22:51

Klar, die habe ich.
Danke für deine Antwort.
Meine Vorbelastung mit dem Programieren liegt schon einige Zeit zurück... und hat die Wurzeln in der Dos Programierung (eigene kleinere Proggy´s Geschrieben) aber halt nichts dolles...
Und dann haben wir da noch die GAL Programierung... allerdings sind das LOGIK Verknüpfungen gewesen, die man da Programieren muß.... (Und, nand, nor, exor verknüpfungen mit BCD zu 7 Segment treibern etc.)
Benutzeravatar
Fightclub
Post-Hero
Post-Hero
Beiträge: 5114
Registriert: Mi, 01.03.06, 18:40

Fr, 12.01.07, 13:48

@pehu: andys frage nr1 ist mir aber immernoch nicht genau beantwortet ;)
mich würd nämlich auch mal interessieren ob man den pegel mit nem yc auch regeln kann oder obs nur high und low gibt :?:
andys nr.3 find ich jetzt nichtmal soo schwer ;) einfach ne variable setzen, wenn taster gedrückt, dann var ändern und im loop immer abfragen ob variable gesetzt *g*
Benutzeravatar
Pehu
Mega-User
Mega-User
Beiträge: 469
Registriert: Mi, 01.11.06, 19:33
Kontaktdaten:

Fr, 12.01.07, 19:04

@Fightclub Oh, stimmt. Also es gibt nur Low und High. Somit muss man es mit PWM lösen...
Benutzeravatar
Fightclub
Post-Hero
Post-Hero
Beiträge: 5114
Registriert: Mi, 01.03.06, 18:40

Sa, 13.01.07, 12:00

hm schade, aber sowas hab ich mir schon fast gedacht
Andy
Hyper-User
Hyper-User
Beiträge: 1284
Registriert: Mi, 17.05.06, 13:03

Sa, 13.01.07, 14:06

Die PWM Lösung würde mich Brennend Interessieren.
Benutzeravatar
Fightclub
Post-Hero
Post-Hero
Beiträge: 5114
Registriert: Mi, 01.03.06, 18:40

Sa, 13.01.07, 14:13

@andy: is relativ einfach. Wenn man jetzt eine Frequenz von sagen wir 200Hz hätte würde der reine PWM Teil lauten:

Do

Portd.5 = 1
Waitms 3
Portd.5 = 0
Waitms 2

Loop

Müsste zumindest. Der Port wird auf High gesetzt, er wartet 3ms, dann wird der Port wieder auf Low gesetzt, nochmal 2ms warten und wieder auf 2. Das gesamte wären dann 5ms also in der sekunde 200mal, => Frequenz von 200Hz.
Ich vermute mal wenn man noch einen externen 16kHz Quarz anschließt dürfte man das ganze dann auch noch was genauer machen könne, stimmts pehu?
Andy
Hyper-User
Hyper-User
Beiträge: 1284
Registriert: Mi, 17.05.06, 13:03

Sa, 13.01.07, 14:17

Na ja...meine Led´s sollten dann schon 3 bis 4 sec. benötigen um die volle Leistung an bzw. Ab zu schalten...sprich ne Faderzeit von ca 3 bis 4 sec. nach möglichkeit.
Benutzeravatar
Fightclub
Post-Hero
Post-Hero
Beiträge: 5114
Registriert: Mi, 01.03.06, 18:40

Sa, 13.01.07, 14:19

@andy: du hast nach pwm gefragt, also kriegst du auch pwm :P
Für den Fader müsste man das ganze noch in eine Schleife basteln, bei der dann immer die An-Zeit erhöht wird ;)
Andy
Hyper-User
Hyper-User
Beiträge: 1284
Registriert: Mi, 17.05.06, 13:03

Sa, 13.01.07, 14:24

Jou...PWM finde ich jetzt schon gut.... :lol: Sch...egal, wie aufwendig das wird.... ich WILL´s wissen... hehehe :twisted:
Benutzeravatar
Fightclub
Post-Hero
Post-Hero
Beiträge: 5114
Registriert: Mi, 01.03.06, 18:40

Sa, 13.01.07, 14:28

:shock: wasn nu? der code für ne einfache pwm frequenz steht oben
Andy
Hyper-User
Hyper-User
Beiträge: 1284
Registriert: Mi, 17.05.06, 13:03

Sa, 13.01.07, 14:31

Szimmt...habe ich gelesen... ich meinte so das Faden selbst auf Zeit (die Fadersequenz an 3 bis 4 sec.in mörlichst vielen Schritten von 0 bis 100%)
Benutzeravatar
Fightclub
Post-Hero
Post-Hero
Beiträge: 5114
Registriert: Mi, 01.03.06, 18:40

Sa, 13.01.07, 14:36

jo schon klar. Problem ist bei mir nur grade, wie man das am vernünftigsten macht, denn je länger die intervalle, desto genauer kann mans einstellen, aber desto kleiner wird auch die frequenz und dann fängts an zu flackern. Wenn man aber ne hohe Frequenz hat sind die Intervalle relativ klein. Und ich glaub nicht dass Waitms mit Fließkommazahlen klar kommt :?
Andy
Hyper-User
Hyper-User
Beiträge: 1284
Registriert: Mi, 17.05.06, 13:03

Sa, 13.01.07, 14:42

Müßte man mal schauen, was Pehu dazu sagen würde...oder einfach mal ausprobieren....
Benutzeravatar
Pehu
Mega-User
Mega-User
Beiträge: 469
Registriert: Mi, 01.11.06, 19:33
Kontaktdaten:

Sa, 13.01.07, 14:58

@Fightclub & Andy Hier mal ein Beispiel:

Dim Zaehler As Byte
Dim Trigger As Byte

Trigger = 254

Do

If Zaehler > Trigger Then Portb.0 = 1 Else Portb.0 = 0
Zaehler = Zaehler - 1

Loop

Durch ändern der Variabel "Trigger" kann man die Frequenz von 0-255 einstellen.
Da ein Byte achtstellig ist und 256 Möglichkeit bietet.

Wenn die Variabel "Zaehler" größer als "Trigger" ist. Wird die Led leuchten.
Die Variabel "Zaehler" wird nach jedem Durchlauf um 1 vermindert. Sobald 0 erreicht ist, fängt es wieder von 255 an.

Je größer der Wert "Trigger" (max. 254) ist, umso seltener wird die Led leuchten, denn nur wenn Zaehler=255 ist es größer als "Trigger". Je kleiner der Wert "Trigger" ist, desto häufiger wird die Led leuchten...
Benutzeravatar
Fightclub
Post-Hero
Post-Hero
Beiträge: 5114
Registriert: Mi, 01.03.06, 18:40

Sa, 13.01.07, 15:21

aha und für nen fader würde man dann nach jedem kompletten durchlauf von Trigger Trigger um 1 runtersetzen
Antworten