Anzeige:

Zähler

Hier finden sie die archivierten Beiträge des alten PHPBB Forums von www.loetstelle.net

Zähler

Von modellfreund am 15.12.2009 19:25

Hallo,

ich nutze nun immer öfters die µC für kleine Steuerungen für meine Modelleisenbahn. Bisher habe ich immer nur Steuerungen programmiert die ohne Eingänge auskahmen (z.B. Blinklichter, Ampelsteuerung). Nun will ich folgende Steuerung bauen. Die Hardware sollte für mich kein Problem mehr sein.

Ein, in die Fahrbahn eingelassener Reedschalter, soll über die selbstfahrenden Autos betätigt werden. Wenn 10 Autos über den Reedschalter gefahren sind soll ein Blitzer kurz aufblitzen. Ich will also so zusagen ein "Starrenkasten" auf meiner Anlage installieren der aber nicht jedes mal auslöst.

Wie könnte nun das Programm aussehen?

Gruß Felix

Von Tim Sasdrich am 15.12.2009 21:49

Welchen µC willst du verwenden? Gibt ja sehr viele.

Re: Zähler

Von gerold am 15.12.2009 22:20

modellfreund hat folgendes geschrieben:
Wenn 10 Autos über den Reedschalter gefahren sind soll ein Blitzer kurz aufblitzen.

Hallo Felix!

Einen Reed-Schalter kannst du wie jeden anderen Schalter/Taster an die AVRs hängen.

Mit DEBOUNCE kannst du in der Hauptschleife abfragen, ob der Taster (Reed-Schalter) gedrückt wurde. Siehe:
http://halvar.at/elektronik/kleiner_bascom_avr_kurs/taster_entprellen/

Die Kapitel 14 bis 21 führen dich durch die Möglichkeiten und zeigen Vor- und Nachteile auf.

Wenn du DEBOUNCE nimmst, dann springst du bei jedem Tastendruck in eine Unterroutine, die dann abgearbeitet wird. In dieser Unterroutine zählst du eine Variable hoch. Und immer dann, wenn die Variable 10 enthält, dann löst du den Blitzer aus.
In etwa so:
Code:

DIM char_count AS BYTE
...

DO

    Debounce reed_taster , 0 , On_reed_taster , Sub

LOOP
END


On_reed_taster:

    INCR char_count

    IF char_count = 10 THEN
        char_count = 0
        LED_BLITZER = 1
        WAITMS 100
        LED_BLITZER = 0
    END IF

RETURN

lg
Gerold
Smile

Von modellfreund am 16.12.2009 20:09

Hallo Gerold,

vielen Dank für deine Antwort. Ich werde mich am Wochenende mal ranstürzen.

Welchen µC verwende ich denn am besten für solche kleinen Aufgaben? Bisher habe ich immer einen Atmega8 genommen, aber der erscheint mir für solche kleinen Schaltungen etwas groß.

LG Felix

Von gerold am 16.12.2009 21:01

modellfreund hat folgendes geschrieben:
Welchen µC verwende ich denn am besten für solche kleinen Aufgaben?

Hallo Felix!

Der ATtiny13 ist der kleinste µC der noch sinnvoll mit Bascom programmiert werden kann. Er hat sehr sehr sehr wenig Speicher (64 Byte). Deshalb ist es kein Einsteiger-µC. Aber für so kleine Aufgaben ist er nicht schlecht. Außerdem kostet das Ding ca. 80 Cent.

Eher für Einsteiger geeignet ist der ATtiny45. Der ist genau so klein wie der ATtiny13, hat aber sehr viel mehr Speicher (4.000 Byte) und kann deshalb genau so sorglos wie der ATmega8 programmiert werden. Dafür kostet das Ding aber auch 1,9 Euro. Das ist mehr als der ATmega8 kostet.

Die Aufgabe die du an den µC stellst ist wirklich simpel. Der ATtiny13 ist bei so einfachen Aufgaben auch noch recht einfach programmierbar. Man muss das Programm nur so umstellen, dass DEBOUNCE nicht in eine Unterprozedur (SUB) springt, sondern dass DEBOUNCE nur mit GOTO ein Label anspringt. Das kostet weniger Speicher. Das kann ich dir zeigen, wie das geht.

lg
Gerold
Smile

Von modellfreund am 18.12.2009 13:15

Hallo Gerold,

ich habe mir die Kapitel mal durchgelesen und bin schon etwas schlauer geworden. Nur das Programmierbeispiel "Goto" könnte etwas ausgedehnter und Praxisnaher dargestellt werden. Ich habe mal versucht, mit deinem oben gezeigten Beispiel, ein Programm zu erstellen:

Code:
$regfile = "Attiny13.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100



Dim Char_count As Byte


Led_blitzer Alias Portb.3
Config Led_blitzer = Output


Reed_taster Alias Pinb.4
Config Reed_taster = Input
Portb.4 = 1

Do

    Debounce Reed_taster , 0 , On_reed_taster , Sub

Loop
End


On_reed_taster:

    Incr Char_count

    If Char_count = 10 Then
        Char_count = 0
        Led_blitzer = 1
        Waitms 100
        Led_blitzer = 0
    End If

Return


Ich weiß jetzt aber nicht, wie ich das Programm mit Goto ausführe. Ich habe noch eine Frage zu Bascom-AVR. Gibt es die Möglichkeit im Programm zu schauen wie groß der Programmiercode ist?

LG Felix

Von caargoo am 19.12.2009 16:30

Hallo!

Was willst Du mit Goto?

Wenn Du den µC mit Spannung versorgst, rennt Dein Programm
los. Wenn der Reedschalter 10x betätigt wurde leuchtet die Led auf.
Das wiederholt sich permanent.
Übrigens: Den Tiny13 musst Du auf crystal=1200000 stellen,
der kann keine 1MHz. Auch Framesize, Softwarestack u. Hardwarestack
sind ein bißchen viel für den kleinen Kerl.

MfG
caargoo

Von gerold am 19.12.2009 20:33

Hallo Felix!

modellfreund hat folgendes geschrieben:
Ich weiß jetzt aber nicht, wie ich das Programm mit Goto ausführe.

Wenn man sehr speicherschonend programmieren muss, dann kann man GOTO einsetzen um Programmteile anzuspringen. Nimmt man stattdessen GOSUB, dann ist das zwar komfortabler und viel weniger (programmier-)fehleranfällig, aber es wird intern auch mehr Speicher verbraucht.

Schreibt man größere Programme, dann sollte man GOTO komplett aus seinem Sprachschatz löschen. Hier beim ATtiny13 ist aber wenig Speicherverbrauch wichtiger als ein gut strukturiertes Programm.

DEBOUNCE nimmt intern den Befehl GOSUB, wenn man den Parameter "SUB" mit angibt. Wird "SUB" nicht mit angegeben, dann verwendet DEBOUNCE intern GOTO um ein Label anzuspringen.

Es ist sehr schwer, Programme mit GOTO gut strukturiert zu schreiben. Aber bei diesem Miniprogramm ist die Verwendung von GOTO kein Problem. Siehe:
Code:
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 16
$swstack = 10
$framesize = 16


Dim Char_count As Byte

Led_blitzer Alias Portb.3
Config Led_blitzer = Output

Reed_taster Alias Pinb.4
Config Reed_taster = Input
Portb.4 = 1


Main:

    If Char_count = 10 Then
        Char_count = 0
        Led_blitzer = 1
        Waitms 100
        Led_blitzer = 0
    End If

    Debounce Reed_taster , 0 , On_reed_taster

Goto Main
End


On_reed_taster:

    Incr Char_count

Goto Main



modellfreund hat folgendes geschrieben:
Gibt es die Möglichkeit im Programm zu schauen wie groß der Programmiercode ist?

Der Programmcode ist selten das Problem. Der SRAM-Verbrauch ist das Problem beim ATtiny13. Nimmst du aber einen etwas besseren µC wie z.B. den ATtiny45 oder einen ATmega8, dann brauchst du dich kaum mehr darum zu kümmern.

Ich weiß nicht, ob du damit schon etwas anfangen kannst: http://halvar.at/elektronik/kleiner_bascom_avr_kurs/speicher_hwstack_swstack_frame/
Wenn nicht, dann ist es auch egal. Nimm einfach einen µC mit genug SRAM und die Sache mit dem Speicherverbrauch löst sich von selbst.

Zur Frage ob Bascom Auskunft darüber geben kann, wieviel SRAM das Programm brauchen wird: Nein, Bascom kann das nicht abschätzen. Obwohl ich denke, dass Bascom das besser können sollte. Das bleibt leider uns selbst überlassen.

Man kann kleine Programme mit Bascom simulieren und nachsehen, ob Bascom meldet, dass zu viel Framspace usw. verwendet wird. Das ist aber nicht zuverlässig. Man braucht etwas Gefühl dafür.

lg
Gerold
Smile

Von pcprofi am 19.12.2009 21:04

BASCOM kann das sehr wohl, es tuts aber nur beim Compilieren.

Sprich: Wenn du beim compilieren zu wenig SRAM hast, dann meckert er "Out of SRAM-Space"

Gruß Rainer (der selber gerade merkt wie knapp der SRAM auf nem Mega32 auch werden kann...)

Von gerold am 19.12.2009 22:36

pcprofi hat folgendes geschrieben:
BASCOM kann das sehr wohl, es tuts aber nur beim Compilieren.

Hallo Rainer!

Du hast natürlich Recht. Bascom meldet sich wenn die Höchstgrenze "garantiert" überschritten ist. Wenn ich z.B. eine STRING-Variable für 200 Zeichen anlege, dann meckert Bascom beim ATtiny13 dass zu wenig Speicher dafür vorhanden ist.

Bascom kann aber nicht abschätzen, wie groß der HWSTACK, SWSTACK und FRAME sein muss, damit das Programm korrekt funktioniert. Aber genau hier erwarte ich mir eigentlich mehr Hilfe von Bascom, denn woher soll ich denn wissen (ohne viel Zeit zu investieren), wie die internen Highlevel-Befehle von Bascom so arbeiten und wie sie mit dem Speicher umgehen.

--------

Und hier eine gute Nachricht: Ich habe es geschafft, dass Bascom unter Ubuntu Linux (halbwegs) gut läuft. Smile Das heißt, dass ich zumindest kleine Programmbeispiele damit testen/kompilieren kann, ohne dafür die virtuelle WindowsXP-Maschine starten zu müssen.

Ich habe den bereits installierten Bascom-Programmordner von der Windows-Maschine zur Linux-Maschine kopiert. Denn das Setup von Bascom wollte sich nicht mit Wine starten lassen.

"Ernsthaft" mit Bascom unter Ubuntu Linux entwickeln kann man allerdings nicht.

lg
Gerold
Smile

Anzeige: