Bascom BASCOM ; Erste Schritte zum Ausprobieren

TommyB

Premium Benutzer
17 Mai 2010
1.872
73
48
35
127.0.0.1 ;)
Sprachen
Assembler, LunaAVR, VB.Net, Python, C#
Was würde das bringen, außer dass du dir in deine Timings rein fummelst?

Du weißt doch jetzt wie du einen Taster abfragst (der "dumme" Test Code).
Und du weißt wie du das PWM startest und ihm einen Wert (Countdown) zuweist.
Jetzt musst du nur noch beides kombinieren -> OnKey1Pressed

Du musst keinen der beiden Teilprogramme modifizieren oder erneut aufrufen.
 

Heini-14

Mitglied
31 Dez 2018
187
0
16
Huglfing
Sprachen
BascomAVR
Die beiden Code Teile sehen so aus


CodeBox BascomAVR
Main:
   If Ischarwaiting() = 1 Then Gosub Onuartrx
   If Tifr.tov1 = 1 Then Gosub Ontimer1overflow
   If Key1 = 0 Then Gosub Onkey1pressed
   Goto Main



CodeBox BascomAVR
Onkey1pressed:
   Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
   Incr Countdown
   Conutdown = 30
   If Countdown = 0 Then
      Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
   End If
Return

Was ist falsch?
 
Zuletzt bearbeitet:

TommyB

Premium Benutzer
17 Mai 2010
1.872
73
48
35
127.0.0.1 ;)
Sprachen
Assembler, LunaAVR, VB.Net, Python, C#
Wie ist Key1 definiert?
Eigentlich kann es so gar nicht funktionieren. Du fragst ab ob Key1 0 (also low) ist, wenn ja startest du die Routine. Soweit richtig.
Darin fragst du ab ob der Taster (!) den Wert 30 hat. Warum das? Er sollte nur 0 oder 1 (respektive nicht-null) haben können. Gedrückt oder nicht.
Also, in einer idealen Welt könnte nie was passieren. Ideale Welt gibt es nicht, solch Taster prellen etwas, daher rutschst du vielleicht mal durch (erste Abfrage ist Low, nächste High).

Und du setzt den Countdown nicht. Du musst schon sagen wie lange deine Lampe an bleiben soll, sonst setzt der nächste Sekundenimpuls alles wieder zurück.

In OnKey1Pressed gehören nur 2 Befehle rein. Keine If.
Das Config wie du es hast, und das Countdown = x
Wobei x der Wert für 8 Stunden ist.
 

Heini-14

Mitglied
31 Dez 2018
187
0
16
Huglfing
Sprachen
BascomAVR
War ein Schreibfehler
Jetzt kann ich allerdings max. 65535 Sekunden Countdown wählen. Sind aber immer noch 18 und ein bisschen Stunden.
Dann gibt es noch die Regelung mit einem Lichsensor. Müsste so ähnlich sein, wie mit dem Poti.
 

Anhänge

Zuletzt bearbeitet:

TommyB

Premium Benutzer
17 Mai 2010
1.872
73
48
35
127.0.0.1 ;)
Sprachen
Assembler, LunaAVR, VB.Net, Python, C#
Es gibt auch größere Variablen als ein Word (16 Bit).
Ob das benötigt ist sei dahingestellt.

Den Lichtsensor kenne ich nicht, und ohne Datenblatt wird's schwierig.
Normalerweise braucht man solch Platinen aber eher nicht. Nur den Lichtsensor ansich und vielleicht noch einen Wiederstand, dann könnte man über den ADC gehen. Ich vermute mal dass der Sensor entweder bei einem einstellbaren Wert (Poti) High oder Low ausgibt - wie ein Taster, oder über ein seriellen Bus angesprochen werden muss (I²C, SPI).

p.s.: Bitte bearbeite deine Beiträge nicht elementar, sonst kommt man durcheinander.
Außerdem gibt es für Edit's keine Benachrichtigungen.
 

Heini-14

Mitglied
31 Dez 2018
187
0
16
Huglfing
Sprachen
BascomAVR
Wie ohne Code? Es gibt ja auch nur den einfachen LDR. Ist ja auch nur ein Lichabhängiger Widerstand, genenau wie ein Poti (von Hand).
Den Code hatte ich schon ein mal.
Jetzt muss ich in die Arbeit.
 

TommyB

Premium Benutzer
17 Mai 2010
1.872
73
48
35
127.0.0.1 ;)
Sprachen
Assembler, LunaAVR, VB.Net, Python, C#
Genau das meine ich mit dem Editieren.
Dein:
Countdown = 60
Fehler: Countdown ist ein Word
Beitrag, den du weg rationalisiert hast.
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.257
59
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Lichtsensor: wenn die blinkende Led grad aus ist, diese mal auf Eingang schalten, mit getadc messen und danach wieder auf Ausgang schalten. Das Ergebnis der Messung mit Print ausgeben lassen.
Bei meiner Led gehts - zwischen 300 und 400...
Messung gegen Vcc intern. Ich würde jetzt gegen die interne Referenz (2,65V oder so) messen, aber bei dem einen Board von Heini ist der Aref extern auf Vcc geschaltet...
Idee klar, Thomas?
(War aber erst vorgesehen, wenn die getimte Variante läuft. Alternativ liegt die andere Led nicht ohne Absicht an einem der Comperator-Beine, und auf das andere kann die interne Bandgap oder der ADC-Multiplexer geschaltet werden...)
 

TommyB

Premium Benutzer
17 Mai 2010
1.872
73
48
35
127.0.0.1 ;)
Sprachen
Assembler, LunaAVR, VB.Net, Python, C#
@LotadaC:
Du willst also die "Ich lebe noch" LED als Lichtsensor nutzen?
Ich muss zugestehen, das habe ich selbst noch nie probiert...
Sonst hätte ich erst mit Interrupts anfangen wollen, ist ja jetzt leicht, wo es strukturiert ist.

Btw, ist Bascom echt so schlecht geworden? Hatte es heute mal installiert, gestartet, zig Zugriffsverletzungen und Fehler und Crash. Flog prompt wieder runter.
Nachher mal schaun was meine XP VM dazu sagt... Lässt die Anwendung aber nicht grade seriös aussehen.
 

Heini-14

Mitglied
31 Dez 2018
187
0
16
Huglfing
Sprachen
BascomAVR
Nein, kein LED sondern ein Lichtempfindlicher Sensor. Aber ich würde schon weiter machen, wie Du geplant hast, also interrupts.
Ich habe halt mir Bascom angefangen, weil ich ein Lehrbuch dafür bekommen habe. Scheint allerdings älter zu sein und dort sind die Erläuterungen nicht so ins Detail.
 

TommyB

Premium Benutzer
17 Mai 2010
1.872
73
48
35
127.0.0.1 ;)
Sprachen
Assembler, LunaAVR, VB.Net, Python, C#
Ja, ne, beides. Auch normale LEDs soll man wie Fotodioden verwenden können. Habe ich nur noch nie versucht.

Also, das Grundgerüst steht ja bereits, du hast die On* Unterprogramme.
Diese kann man jetzt direkt mit Interrupts verknüpfen.
Also: Jetzt läuft deine Main ja ständig durch und fragt ab ob eine Bedienung erfüllt ist. Wir wollen es aber jetzt so haben dass die Main (nahezu) gar nichts mehr macht und nur noch die Unterroutinen vom Controller selbst gestartet werden, bei Bedarf eben.

Prinzipiell sind dazu 4 Schritte nötig:
1.: Die Routine für den Interrupt erstellen - hast du schon.
2.: Bascom sagen welche Routine den Interrupt behandeln soll
3.: Die jeweiligen Interrupts scharf stellen (Enable)
4.: Interrupts generell aktivieren.

2 - 4 gehören dementsprechend in den Init Teil deiner Anwendung, vorzugsweise am Ende, also direkt vor die Main Loop.

Für den Uart wäre es:
On Urxc OnUartRx
Enable Urxc

Für den Timer1 wäre es:
On Timer1 OnTimer1Overflow
Enable Timer1

Für den Taster (angeschlossen an INT0):
On INT0 OnKey1Pressed
Enable INT0

Und wegen Punkt 4:
Enable Interrupts

In der Main stehen ja jetzt nur noch die 3 If's drin. Die sind dann komplett unnötig. Die Teilprogramme führt der Controller bei Bedarf selbst aus.
Also: Löschen oder (besser) erst mal auskommentieren.

So läuft es vom Prinzip ab. Da Bascom bei mir nicht mehr will ist das jetzt ungetestet, aber es geht ja auch eher um das Prinzip.
Sollte aber eigentlich so gehen.

Falls du möchtest kannst du ja mal den Stromverbrauch vom Controller messen wo er jetzt noch mit Polling arbeitet. Und später, wenn es läuft mit Interrupts, kümmern wir uns um Sleep. Danach kannste noch mal messen ;)
(Strom messen natürlich ohne dass die LEDs angeschlossen sind)
 

Hero_123

Mitglied
17 Sep 2010
101
2
18
Sprachen
C
Hallo LotadaC

Lichtsensor: wenn die blinkende Led grad aus ist, diese mal auf Eingang schalten, mit getadc messen und danach wieder auf Ausgang schalten. Das Ergebnis der Messung mit Print ausgeben lassen.
Bei meiner Led gehts - zwischen 300 und 400...
Messung gegen Vcc intern. Ich würde jetzt gegen die interne Referenz (2,65V oder so) messen, aber bei dem einen Board von Heini ist der Aref extern auf Vcc geschaltet...
Wenn ich 'ne LED als Lichtsensor nehme - was kann ich damit anfangen? Wusste gar nicht, dass 'ne LED auch als "Photosensor" benutzt werden kann ...
Du hast also 'ne LED an z.B. PC0 (= ADC0) als LED (= Ausgang), diesen Ausgang PC0 schaltest Du als Eingang, wenn die LED = LOW ist und misst die Eingangsspg (??? LED ??) gegen Vcc ... Du misst dann einen Wert zwischen 300 ... 400 - was sagt dieser Wert aus?

mfg

Hero_123
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.257
59
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Du misst dann einen Wert zwischen 300 ... 400 - was sagt dieser Wert aus?
Wenn ich mich recht erinner (nagel mich nicht drauf fest) - 300 etwa bei schummrigem Licht abends im Zimmer, um die 400 Wenn ich mit'ner Taschenlampe drauffunzel...
Um die Differenz zu verstärken, würde ich statt gegen Vcc gegen die interne Referenz messen - oder den AC probieren...

Leider muß man auf Eingang schalten - Beim Tiny10 zB könnte man sonst den ADC automatisch durch den Timer (Compare Match A) triggern lassen - also der Timer schaltet die LED im PWM ab und startet automatisch den ADC. Wenn der ADC fertig ist, kann er seinen IRQ werfen - oder man liest einfach nach Lust und Laune das Result-Register aus. Dummerweise ist dann das Bein aber immer noch Ausgang, es wird Gnd=0 gemessen...

Jede LED ist auch eine Solarzelle - nur eben nicht auf Generator, sondern auf Leuchte optimiert - grundsätzlich ist der Vorgang aber umkehrbar...
Halt einfach mal'n Multimeter (Spannungsmesser) an 'ne LED, und geh ans Fenster...
(So wie Du auch Peltier-Elemente als thermischen Generator verwenden kannst)
 

TommyB

Premium Benutzer
17 Mai 2010
1.872
73
48
35
127.0.0.1 ;)
Sprachen
Assembler, LunaAVR, VB.Net, Python, C#
Hm, eigentlich sollte die Stromaufnahme identisch sein (zumindest in Etwa).
Zumindest noch ;)

Also, mit leerer Sub Main und Interrupts funktioniert jetzt alles?
 

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