Jump to content
Intermodellbau 2024: Unser Stand in Halle 3 ist fertig für Besucher - schaut mal 'rein. ×
Schiffsmodell.net

Fragen zu "Zweites Programm: LED-Blinker"


Didi

Recommended Posts

HIER GEHTS ZUM THEMA

 

 

Ich denke das ist jetzt nur eine retorische Frage zum ersten Programm "Led-Blinker":

Alle Zeilen mit Apostroph am Anfang werden vom Chip nicht gelesen, es sind reine Kommentare. Diese werden vom Chip ignoriert, da kann man hinschreiben was man will ?

Edited by Torsten
Link to comment

Hi allerseits,

 

schön, dass es weitergeht!

Ich habe das Programm LED-Blinker gleich mal auf den Prozessor geschoben und anschliessend mal ein paar Änderungen/Erweiterungen ausprobiert (z.B. Blaulichtblitzer mit 2 LEDs). Macht Spaß...

 

Gruss

Andy

Link to comment

Hi allerseits,

 

das zweite Progrämmchen läuft bei mir auch. Wieder habe ich ein bischen rumgespielt, und irgenwie komme ich bei LED-Blinkprogrammen immer beim Doppel-Blaulichtblitzer raus... ;-)

Falls Interesse besteht, kann ich das Programm hier gerne mal posten, allerdings will ich Torsten nicht vorgreifen.

 

Gruss

Andy

Link to comment

Hi allerseits,

 

ok, dann mache ich mal. Ich habe Torstens Beispielprogramm so abgeändert, dass die beiden LEDs abwechselnd je zweimal nacheinander kurz aufblitzen, eben so wie ein Doppel-Blaulichtblitzer.

Hier ist der Programmcode:

 

'******************************************************
'
' (c)2012 SCHIFFSMODELL.NET
'
'******************************************************
'Projekt: Atmel-Programmierung für Einsteiger
'
'Prozessor: ATmega 8
'Bascom-Version: 2.0.7.5
'
'Programm 2a: LED-Blinker mit Timer, eigene Änderungen
'Blaulichtblitzer mit 2 LEDs
'Jetzt mit SELECT CASE statt IF...Then..END IF
'
'Hardware:
'Atmel Evaluation Board V2.01
'
'21.11.2012 T. Gietenbruch
'22.11.2012 A.Schulz (Änderungen)
'
'******************************************************
'======================================================
'System-Einstellungen
'======================================================
'Definition für Mega 16
$regfile "m16def.dat"
'Angabe der Taktfrequenz (1Mhz)
$crystal = 1000000
'======================================================
'Konstanten
'======================================================
Const Preload = 0
'=====================================================
'Deklarationen
'======================================================
Dim Time_s As Byte
Dim Pulse As Bit
Dim Pulse_s As Bit
'======================================================
'Konfigurationen
'======================================================
'Timer0 einrichten mit Prescale=256
Config Timer0 = Timer , Prescale = 256
Stop Timer0

'ISR-Zuweisung für Timer0
On Timer0 Timecount

'Ein- und Ausgänge festlegen
Config Portd.5 = Output
Config Portd.6 = Output

'======================================================
'ALIAS-Zuweisungen
'======================================================
Led_1 Alias Portd.5
Led_2 Alias Portd.6

'======================================================
'Initialisierungen vor Programmstart
'======================================================
'Timer0 mit Vorgabewert laden
Timer0 = Preload
'Timer0 Interrupt scharfmachen
Enable Timer0
'Interrupts freigeben
Enable Interrupts
'Timer0 starten
Start Timer0

'======================================================
'Hauptprogramm-Schleife
'======================================================
Do
'Die LED´s folgen den Timer-Pulsen
Led_1 = Pulse_s
Led_2 = Pulse

'Hier ist Ende -> zurück nach DO
Loop

'======================================================
'ISR für Timer0
'======================================================
Timecount:
'Timer0 mit Vorgabewert laden
Timer0 = Preload
'Variable hochzählen (+1)
Incr Time_s
'Led_1 blitzt zweimal, danach blitzt Led_2 zweimal, usw.
Select Case Time_s
'Led_1 an
Case 2 : Toggle Pulse_s
'Led_1 aus
Case 4 : Toggle Pulse_s
'Led_1 an
Case 6 : Toggle Pulse_s
'Led_1 aus
Case 8 : Toggle Pulse_s
'Led_2 an
Case 10 : Toggle Pulse
'Led_2 aus
Case 12 : Toggle Pulse
'Led_2 an
Case 14 : Toggle Pulse
'Led_2 aus
Case 16:
  Toggle Pulse
  Time_s = 0
End Select

'Und zurück ins Hauptprogramm
Return

'Programmende (nur formal)
End

Ein paar Erklärungen dazu:

Initialisierungs- und Konfigurationsteile sind eigentlich unverändert. Lediglich der Prescaler des Timers wurde auf 256 gesetzt. Daraus folgt:

Der Timer läuft ca. 16 (genau 15,3186) mal pro Sekunde über und löst dabei den Interrupt aus.

Auch die Hauptprogrammschleife ist gegenüber Torstens Code unverändert.

Wesentliche Änderungen gibt es nur im Unterprogramm Timecount, das bei jedem Interrupt (Überlauf des Timers) aufgerufen wird:

Ich habe den Select Case - Befehl benutzt. Dieser funktiniert ähnlich wie IF - Then - Else - End If. Abgefragt wird hier der Inhalt (Wert) der Variablen Time_s (Select Case Time_s), der bei jedem Aufruf dieses Unterprogramms um 1 hochgezählt wird. Über Case x werden nun bestimmte Befehle ausgeführt, wenn der Inhalt von Time_s dem Wert x entspricht:

Case 2: pulse_s wird 1 und Led_1 leuchtet

Case 4: pulse_s wird 0 und Led_1 erlischt

Case 6: pulse_s wird 1 und Led_1 leuchtet

Case 8: pulse_s wird 0 und Led_1 erlischt

Case 10: pulse wird 1 und Led_2 leuchtet

Case 12: pulse wird 0 und Led_2 erlischt

Case 14: pulse wird 1 und Led_2 leuchtet

Case 16: pulse wird 0 und Led_2 erlischt, Time_s wird auf 0 gesetzt

 

Das ist eigentlich schon alles.

 

@Torsten: Korrigiere mich bitte, wenn ich hier was falsch, unvollständig oder unverständlich beschrieben haben sollte.

Und was mich natürlich auch noch interessiert: Würde diese Anwendung in der Praxis von einem Profi auch so programmiert, oder gibt es da noch eine elegantere, bessere Lösung?

 

Gruss

Andy

Edited by AndyS
Korrektur
Link to comment

Ob ein Profi das so machen würde - keine Ahnung... ich bin keiner! :mrgreen:

Richtig ist, was funktioniert... ;)

 

Grundsätzlich sollte man die ISR möglichst knapp halten, damit das Hauptprogramm nicht zu lange unterbrochen wird.

 

Die CASE-Geschichte könntest Du eigentlich auch ins Hauptprogramm stellen, müsste genauso funktionieren.

 

Das Programm hast Du sehr schön geschrieben, man sieht daran gut, wie wichtig Kommentare sind, um "durchzusteigen".

 

Viele Grüße

 

Torsten

Link to comment

Hi Torsten,

 

Die CASE-Geschichte könntest Du eigentlich auch ins Hauptprogramm stellen, müsste genauso funktionieren

 

Ich habe das mal probiert, es kam aber nix vernünftiges bei raus. Die LEDs flackern sehr schnell, manchmal auch beide gleichzeitg ...

Kann das denn überhaupt funktionieren? Der Stand von Time_s muss doch direkt nach dem Hochzählen und damit nach dem Auftreten des Interrupt abgefragt werden?

 

Gruss

Andy

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.