Forum: Mikrocontroller und Digitale Elektronik Problem mit Bascom Programm


von Yannic (Gast)


Lesenswert?

Hallo,

ich wollte mit Bascom ein Programm schreiben, welches beim einschalten 
des µC 2 mal hintereinander piept und dann einen Timer startet. Wenn der 
Timmer dann z.B. bei 5 Sekunden angekommen ist, soll eine Lampe für 3 
Sekunden eingeschaltet werden. Doch irgendwie will mein Programm noch 
nicht so recht funktionieren.

Am Anfang piept es 2 mal wie es auch soll, doch wenn ich dann den Taster 
drücke (Ein Öffner kein schließer), dann leuchtet die Lampe sofort auf.

$regfile = "m16def.dat"
$crystal = 16000000


Config Porta.0 = Output
Config Portd.7 = Output
Config Pina.2 = Input
Dim Zeit As Byte
Dim A As Byte
Dim Main2 As Long
Dim Main1 As Long
Dim Main3 As Long


Main1:
Zeit=0
Portd.7 = 1
Waitms 300
Portd.7 = 0
Waitms 300
Portd.7 = 1
Waitms 300
Portd.7 = 0
Goto Main2


Main2:
Do
If Pina.2 = 0 Then
Goto Main3
Else
Zeit = 0
End if

Loop

Main3:

Zeit = Zeit + 1

If Zeit = 5 Then
Porta.0 = 1
Waitms 3000
Porta.0 = 0
End If
Goto Main2

Weiß jemand rat ?

von Roland Z. (r-zimmermann)


Lesenswert?

Hallo,

zwei Sachen fallen mir auf:

Du hast keine Tastenentprellung verwendet, das kann u.U Probleme geben 
muß aber nicht. Ich empfehle dir den "Debounce" Befehl zu verwenden der 
macht die Entprellung, passende Parameter stehen in der Bascom-Help.

Wichtiger: Solange der Taster gedrückt ist, rennt der uC immer in die 
Main3-Schleife. Der macht das mehrere 10000 mal je nach taktung.
Das ganze kommt dir das vor wie wenn die Lampe sofort angeht da die 5 
Takte innerhalb von ein paar microsekunden raufgezählt sind.

Einen Timer hast du keinen Verwendet, da ich keine Initialisierung dafür 
finden kann. Wenn du nen Timer verwenden willst ist das besser da mit 
den Wait-Befehlen der uC angehalten wird und in der "Wartezeit" nix 
machen kann. Machst du das mit nem Timer kann der uC nebenher noch 
andere Sachen abarbeiten da der Timer in der uC-Hardware selbstständig 
rennt. :) Wenn du einen Timer willst musst du nur wissen welchen du 
nehmen willst dein verwendeter Chip hat mehrere.

Wie erzeugst du das Piepen, hast du an dem Ausgangspin nen kleinen 
Summer angeschlossen der "von selbst" also sobald der Strom bekommt 
piepst?
Wie soll der Ablauf des Programmes sein:

Einschalten
2x Piepsen
Warten auf Tasterdruck
nach Tasterdruck 5 sec warten dann Lampe anschalten

oder hab ich was falsch gelesen?

Wenn du mir noch sagen kannst ob du am Tastereingang einen externen
Pull-Up dran hast oder ob du den internen benutzen willst, kann ich dir 
das Programm entsprechend umschreiben das es läuft. (Habe selbst die 
Bascom-Vollversion)
Den geänderten Programmcode poste ich dir dann hier.


Roland :)

von Yannic (Gast)


Lesenswert?

Hi,

Danke schonmal für deine Hilfe. Ja der Programmablauf ist so richtig.

Der Summer summt von alleine muss also nur geschaltet werden.

Und es ist kein externer Pullup gesetzt.

Trotzdem sollte es aber ohne waits gelöst werden, da später ggf. 
mehrere, auch länger als nur 5 sec dauernde Zeiten dazu kommen können. 
Deswegen wäre eine Angabe in Sekunden besser als in Millisekunden.

mfg Yannic

von Yannic (Gast)


Lesenswert?

Kann keiner mehr helfen ?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Yannic wrote:
> Kann keiner mehr helfen ?

Wobei?

von Yannic (Gast)


Lesenswert?

Wie ich es umsetzten kann das ich die Zeitangaben bei denen die Lampe 
leuchtet im sekundentakt angeben kann.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ah, also wie man einen Timer-Interrupt bzw. einen Timer in Bascom 
realisiert.
Ich mache mich mal schlau, ob und ggf. wie das geht.
Kann aber etwas dauern...

Schwupp bin wieder da.

Im Roboternetz ist ein Tutorial sogar in Deutsch:
http://www.roboternetz.de/wissen/index.php/Bascom_und_Timer

von PeterL (Gast)


Lesenswert?

irgendwo muss du eine sekunde warten
z. B.
Zeit = Zeit + 1
wait 1

sonst zählt er sofort bis 5 (µController sind dabei sehr schnell)

wobei warten sehr schlecht ist, da der Controller in dieser Zeit nichts 
anderes machen kann, besser einen Timer benutzen

von Falk B. (falk)


Lesenswert?

@ Yannic (Gast)

>Wie ich es umsetzten kann das ich die Zeitangaben bei denen die Lampe
>leuchtet im sekundentakt angeben kann.

Bitte? Was ist an

Waitms 300

unverständlich? Kleiner Tip. 1000ms = 1s.

MfG
Falk

von Roland Z. (r-zimmermann)


Lesenswert?

Hallo Yannic,

sorry bin grade erst von der Arbeit heimgekommen.
Ich kann nicht alles stehen und liegen lassen nur um dir das Prog zu 
schreiben (da hätte mein Chef was dagegen :D) Ich schreib dir das wie 
versprochen, aber sicher nicht innerhalb von nen paar Stunden, 
irgendwann muß ich auch noch pennen. Kurz vor Weihnachten ist immer die 
hölle los bei uns da gibts schon mal überstunden.
Ich bin schon am Ändern des Programmes dran (grade angefangen), geht 
noch ne weile.

Roland

von Yannic (Gast)


Lesenswert?

Wollte keinen Druck machen. Vielen Dank das du dich dran versuchst.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.