Bascom BASCOM ; Erste Schritte zum Ausprobieren

Hallo Heini-14

Dann können es manchmal auch ganz simple Fehler sein, auf die ich selbst nicht komme, und dann bei verschiedenen Versuchenden ganzen Code durcheinander haue.

Dann versuche, den Code zu verstehen. Und wenn Du ihn NICHT verstehst, unterteile ihn in einzelne Abschnitte - bis Du ihn verstehst.
Und wende Dich Neuem NUR DANN ZU, wenn Du das vorherige komplett verstanden hast.

Und ganz ehrlich - Du hast hier sehr viel (und auch dauernd und sofort) Hilfe bekommen.
Irgendwann musst auch Du mal "selber laufen" und das bislang Erlernte ohne zusätzliche Hilfe anwenden können.

mfg

Hero_123
 
  • Like
Reaktionen: TommyB
Nicht schlecht, also wird bereits der Vergleich wegoptimiert.
Nö, der Vergleich ist völlig überflüssig, da das AND bereits das Z-Flag gesetzt oder gelöscht hat.
Bei anderen Vergleichen als gleich oder ungleich Null kann das schon anders aussehen.
Was ist mit If ((Bytevariable AND Bytevariable)>127) Then…?
Aus

CodeBox C
    if ((x & y) > 127) 
wird - mit x und y als unsigned byte - folgendes:


CodeBox Assembler
00000344 MOV R24,R17         Copy register 
00000345 AND R24,R3          Logical AND 
00000346 BRGE PC+0x15        Branch if greater or equal, signed 
Bei signed byte wird der Vergleich komplett wegoptimiert, x & y kann ja nie größer als 127 werden.
Und

CodeBox C
    if ((x & y) < 127)
wird zu:

CodeBox Assembler
00000345 MOV R24,R17         Copy register 
00000346 AND R24,R3          Logical AND 
00000347 CPI R24,0x7F        Compare with immediate 
00000348 BRCC PC+0x15        Branch if carry cleared 
Bei signed byte wird der Vergleich auch diesmal komplett wegoptimiert.

Spaßeshalber nochmal das ganze mit 128. signed habe ich mir gleich geschenkt, da die 128 nicht im Zahlenbereich von signed byte enthalten ist.

CodeBox C
    if ((x & y) > 128)


CodeBox Assembler
00000345 MOV R24,R17         Copy register 
00000346 AND R24,R3          Logical AND 
00000347 CPI R24,0x81        Compare with immediate 
00000348 BRCS PC+0x15        Branch if carry set 


CodeBox C
    if ((x & y) < 128)


CodeBox Assembler
00000345 MOV R24,R17         Copy register 
00000346 AND R24,R3          Logical AND 
00000347 BRLT PC+0x15        Branch if less than, signed 
Wie das aussieht, wenn man mit einer Variablen statt einer Konstanten vergleichen würde, probiere ich vielleicht nächstes mal aus.
Bascom läßt, wie bereits festgestellt, bei der Bedingung einer IF-Instruktion gar keine Rechenoperationen zu. Es dürfen nur (einfache)Bedingungen logisch verknüpft werden
Dann schreibt man halt statt


CodeBox BascomAVR
If ((Bytevariable AND Bytekonstante)=0) Then…


CodeBox BascomAVR
Test = Bytevariable AND Bytekonstante
If Test = 0 Then
 
Dann versuche, den Code zu verstehen. Und wenn Du ihn NICHT verstehst, unterteile ihn in einzelne Abschnitte - bis Du ihn verstehst.
Ok, so habe ich es jetzt auch gemacht. Auf meine Weise, wie ich es verstehe und es handhaben kann. Die Uhr mit Datum bis 2032, was ich unmöglich erreichen werde, funktioniert tatelos.
 

Anhänge

  • LCD_Uhr.zip
    21,7 KB · Aufrufe: 3
Hallo Heini-14

Ok, so habe ich es jetzt auch gemacht. Auf meine Weise, wie ich es verstehe und es handhaben kann. Die Uhr mit Datum bis 2032, was ich unmöglich erreichen werde, funktioniert tatelos.

???

Und was soll Dein angehängtes "LCD_Uhr.zip"?

mfg

Hero_123
 
@Hero_123
Was es soll, kA, aber es beweist, dass er das mit (Year AND 0b00000011) = 0 nicht verstanden hat ;)
Wurde hier schon erklärt.
Und dass mein Code mit Select Case wohl doch nicht so falsch war...
 
Ich möchte mein Projekt "LCD_Uhr" zu stellen der Uhr mit Sensortastern bestücken.
Dazu habe ich ein Programm mit Led's zum testen aufgebaut.
Zwischen Sensor Ausgang und ADC 10K Widerstand.


CodeBox BascomAVR
$regfile = "m8def.dat"                  ' eingesetzter Mikrocontroller
$crystal = 8000000                      ' eingestellte Taktfrequenz
$hwstack = 40
$swstack = 32
$framesize = 60
$baud = 19200
'-------------------------------------------------------------------------------
Config Portb = Output                   'gesamten Port B als Ausgabeport
Blau Alias Portb.0
Rot Alias Portb.1
'-------------------------------------------------------------------------------
Dim Seta As Word                        'Sensortaster
Dim Count1 As Byte
'-------------------------------------------------------------------------------
Config Adc = Single , Prescaler = Auto , Reference = Avcc       'Analogwandler
Start Adc
   ' Konfiguration Timer 2 (CTC, 8MHz/256/249 = 8ms)
Config Timer2 = Ctc , Prescale = 256 , Clear_timer = 1
Ocr2 = 249                              ' Setze Maximalwert für Timer 2 (CTC)
On Oc2 Isr_oc2                          ' Setze ISR für Timer 2 Overflow Compare
Enable Oc2                              ' Aktiviere Timer 2 Overflow Compare Int.
'-------------------------------------------------------------------------------
   ' Konfiguration Watchdog
Config Watchdog = 2048                  ' Setze Watchdog Timeout auf ~2sec
Start Watchdog                          ' Aktiviere den Wachhund
Enable Interrupts
'-------------------------------------------------------------------------------
Main:
   ' Den Wachhund zurücksetzen
   Reset Watchdog
   ' Einschlafen (bis zum nächsten Interrupt)
   Config Powermode = Idle
   Goto Main                            ' und zurück
'-------------------------------------------------------------------------------
' ISR wenn Timer 2 compare event eintritt (alle 8ms, bei aktueller Konfiguration)
Isr_oc2:
   ' Erhöhe internen Zähler
'   Incr Count
   ' Wenn Zähler einen gewissen Wert erreicht hat, auf 0 setzen und abzweigen
   Incr Count1
   If Count1 = 5 Then
      Count1 = 0
      Gosub Taster0
   End If
Return
'-------------------------------------------------------------------------------
Taster0:
   Seta = Getadc(1)                     'Analogeingang einlesen und Wert in Variable Analogeingang
   Print "SeTa: " ; Seta
   If Seta = 1023 Then
      Blau = 1
   Else
      Blau = 0
   End If
Return

Bis dahin funktioniert alles. Wenn ich einen zweiten Sensor an ADC(2), in das gleiche Interrupt (Taster0:) anschließe, reagiert er nicht auf die Rote Led.
Muss ich für jeden Sensortaster ein eigenes Unterprogramm setzen?
 
Der Sensor liefert ein digitales Signal aus, kein analoges. Er funktioniert also wie ein handelsüblicher Taster, nur dass er VCC und GND braucht und dazwischen schaltet.
Den ADC brauchst du also nicht und es ist quasi alles beim Alten geblieben.

Datenblatt des TTP223
 
Irgendwie schnall ich nicht, was Du da eigentlich zusammengesteckt hast, also warum Du mit dem ADC C1 digitalisierst...

Dein "Sensor"-IC erfaßt selbständig die "Berührung/Annäherung", und liefert ein entsprechendes digitales Signal auf seinem Ausgang.
Zwei Beine Stromversorgung, ein Bein Elektrode, ein Bein Ausgang.

Mit den anderen ´beiden Beinen kannst Du festlegen, ob der Ausgang active-low oder active high sein soll, oder alternativ bei jeder Betätigung toggeln soll.

Hier mal ein Datenblatt...

Edit: Thomas war schneller...
 
Ok danke habe verstanden, funktioniert jetzt. Irgendiwe kam ich mit den digitalenund analogen Signalen nicht klar.
Wenn man den Sensor als Schalter benutzen will, muss "Kontakt B" überprückt werden.
 
"A" und "B" scheinen Brücken gegen Vcc zu sein.
"A" sollte dann den "output high or low selection pin" (AHLB=Pin4) mit Vcc verbinden können;
"B" entsprechend den "output type Option pin" (TOG=Pin6).

"B" legt also fest ob Toggle oder Taster; "A" legt quasi den Grundzustand fest (high oder lowactive beim "Taster" bzw den Zustand beim Powerup beim "Schalter")

Interessant wäre, was mit dem unbestückten Bauteil ist - also wo genau die Pads angeschlossen sind. Der in der Ecke scheint direkt auf die Sensorfläche durchkontaktiert zu sein; der andere auf Gnd zu liegen (?)
Dann sollte man da ggf durch einlöten eines KERKOs die Empfindlichkeit verändern können - und/oder 'ne externe Sensorfläche/draht anbinden können.

Was ist mit dem Kerko direkt über "A"? Der puffert nur die Betriebsspannung (rechts ist er an Gnd angeschlossen, linksüber die Brücke auf der anderen Seite direkt neben dem viereckigen GND-Pad entlang, und dann direkt unter dem Bestückungsdruck auf das Vcc-Pad unten??)

LED und Vorwiderstand unten signalisieren nur den Zustand des Ausganges - enes von beiden kann man auslöten, wenn einen das Geleuchte stört..

Soweit korrekt?
 
Bin noch nciht zufrieden, da mir noch einiges zu denken übrig lässt.
Warum hat die Configuration von PortD keinen Einfluß mehr. Wie im Code zu sehen ist, PortD auskommentiert, die Tasten wiederum reagieren (mit und ohne Configuration). Allerdings muss ich in dei Schleife "If Key1 = 1 Then" schreiben.
Wenn die Verbindung vom Taster unterbrochen wird, ist Led an.
Ist in diesem Code alles richtig


CodeBox BascomAVR
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 40
$framesize = 40
$baud = 19200
'------------------------------------
Ddrb = &B0000_0011
Portb = &B1111_1100
'Ddrd = &B0011_1111
'Portd = &B1100_0000
'------------------------------------
Blau Alias Portb.0
Rot Alias Portb.1
Key1 Alias Pind.7
Key2 Alias Pind.6
'------------------------------------
Do
   If Key1 = 1 Then
      Blau = 1
      Print "an"
   Else
      Blau = 0
      Print "aus"
   End If
   If Key2 = 1 Then
      Rot = 1
      Print "an"
   Else
      Rot = 0
      Print "aus"
   End If
Loop
 
"B" legt also fest ob Toggle oder Taster; "A" legt quasi den Grundzustand fest (high oder lowactive beim "Taster" bzw den Zustand beim Powerup beim "Schalter")
Genau so ist es. Ich habe diese Teile einen Fachmann gezeigt, der mir dieses Detail verraten hat, da ich ihn als Schalter benutzen wollte. Ich will diesen Schalter für meine Küchen-Arbeitsflächen-Beleuchtung benutzen. Dazu sind noch ein paar weitere Bauteile nötig (BSP 752T und ein Spannungsregler 7805) um es mit 12V betreiben zu können.
 
Mit:
'Ddrd = &B0011_1111
würdest Du die Beine D0..D5 als Ausgang konfigurieren, und die Beine D6 und D7 als Eingang.
Nach dem Reset/Programmstart sind alle Beine erstmal Eingang - da Du nur D6 und D7 verwendest, ändert sich hier also nichts.
Weiter, alle D-Beine sind also Eingang.
Mit:
'Portd = &B1100_0000
würdest Du D0..D5 auf tristate schalten (da sie Eingang sind) - das ist aber auch hier der Grundzustand nach dem Powerup; für D6 und D7 würdest Du die internen Pullups aufschalten.
Der Unterschied ist also, daß die Pullups wegen der Kommentare nicht aktiviert werden. Wenn extern keine Spannung aufgelegt wird, hängen die Beine "in der Luft", und liefern irgendwas zufälliges, wahrscheinlich aber immer "0".
Dein Sensor scheint aber (als Schalter) feste Spannungen zu liefern - wäre der Pullup aktiv, würde er einfach übersteuert werden.

Ist in diesem Code alles richtig
Sollte zumindest laufen...
Aber 1: in Zeile 10 würdest Du unbenutzte Beine auf Ausgang schalten - da kann man sich schnell irgendwelche Kurzschlüsse mit fabrizieren, wenn man später nicht dran denkt. (hast Du auskommentiert, aber nur mal so als genereller Hinweis...)
Aber 2: erfolgen die Print-Ausgaben in der Endlosschleife ununterbrochen - also auch, wenn sich nichts am Zustand der Taster ändert (ich denke mal nicht, daß das so beabsichtigt ist.

Ich will diesen Schalter für meine Küchen-Arbeitsflächen-Beleuchtung benutzen.
1. Sollen die Lampen irgendwie gesteuert werden, oder nur An-Aus?
2. Mit 'nem kleinen Controller, oder direkt durch den Sensor-als-Schalter?
3. Willst Du die Sensorfläche der kleinen Platine selbst nutzen, oder 'ne externe Elektrode?
Dann sollte man da ggf durch einlöten eines KERKOs die Empfindlichkeit verändern können - und/oder 'ne externe Sensorfläche/draht anbinden können.

Ich plane bei uns derzeit auch die Beleuchtung unter den Hängeschränken, verwendet werden sollen entsprechende Aluprofile mit transluzenter Abdeckung.
Die Verwendung der eloxierten Aluprofile als Sensorfläche wäre da eine Überlegung wert...
 
1. Sollen die Lampen irgendwie gesteuert werden, oder nur An-Aus?
2. Mit 'nem kleinen Controller, oder direkt durch den Sensor-als-Schalter?
3. Willst Du die Sensorfläche der kleinen Platine selbst nutzen, oder 'ne externe Elektrode?
  1. Lampe nur aus/an
  2. direkt der Sensor als Schalter (also Kontakt B überbrücken)
  3. Nicht die Sensorfläche (zu klein), sonden über den Kontakt auf der anderen Seite (Lötseite)
Habe schon einen Prototyp zusammen gebastelt und funktioniert. Nur die Anfertigung in der Küche muss noch geplant werden. Die Tastfläche soll ja nicht Erkennbar sein. Geht übrigens auch durch etwas 5mm Holz oder Plastik.
Aber 1: in Zeile 10 würdest Du unbenutzte Beine auf Ausgang schalten - da kann man sich schnell irgendwelche Kurzschlüsse mit fabrizieren
Ok, das habe ich nicht beachtet, muss ich noch ändern.
Das mit den Led's ist nur zumTesten, soll dann in mein Uhr-Projekt zum stellen der Uhr.
 
Dein Sensor scheint aber (als Schalter) feste Spannungen zu liefern - wäre der Pullup aktiv, würde er einfach übersteuert werden.
Der Sensor-Taster hat noch den Kontakt A, mit dem man den Ausgangs auf High (A = überbrückt) oder Low (A = offen) setzen kann. Ich habe diesen Kontakt überbrückt, so dass ich die übliche Schreibweise

CodeBox BascomAVR
'------------------------------------
Ddrb = &B0000_0000
Portb = &B1111_1111
Ddrd = &B1100_0000
Portd = &B0011_1111
'------------------------------------
Led1 Alias Portd.7
Led2 Alias Portd.6
Taster1 Alias Pinb.0

Do
   If Taster1 = 0 Then
      Led1 = 0
      Led2 = 1
   Else
      Led1 = 1
      Led2 = 0
   End If
Loop

Es hat mich ein bisschen durcheinander gebracht.
Frage: Muss zwischen Ausgang des Sensor's und dem Port Eingang ein Widerstand gesetzt werden? Wenn ja, wieviel?
 
Der Sensor-Taster hat noch den Kontakt A, mit dem man den Ausgangs auf High (A = überbrückt) oder Low (A = offen) setzen kann...
"A" und "B" scheinen Brücken gegen Vcc zu sein.
"A" sollte dann den "output high or low selection pin" (AHLB=Pin4) mit Vcc verbinden können;
"B" entsprechend den "output type Option pin" (TOG=Pin6).
Im, von Thomas und mir bereits verlinkten Datenblatt findet sich zu AHLB und TOG auf Seite 4 folgende Tabelle:
TOGAHLBPad Q option Features
0​
0​
Direct mode, CMOS active high output​
0​
1​
Direct mode, CMOS active low output
1​
0​
Toggle mode, Power on state=0​
1​
1​
Toggle mode, Power on state=1​
Eine "1" heißt, daß TOG bzw AHLB mit Vcc verbunden wird (Deine Brücken "A" und "B"), für die "0" würde man eine Brücke nach GND vermuten - auf Seite 6 im Datenblatt findet sich aber ein "Application Circuit" wo genau diese Brücken als Schließer dargestellt sind; der Pin also für die "0" einfach offen gelassen wird.
Wenn man genauer nachliest, findet man in den "DC/AC Characteristics" auf Seite 3, daß der Wert der Pull-Down Widerstände dieser beiden Beine typischerweise 28kOhm beträgt -> die haben also offensichtlich Pulldowns...

Im "direct mode" (TOG=0 bzw "B" offen) wechselt der Ausgang während einer erkannten Betätigung vom inaktiven in den aktiven Zustand, und anschließend wieder zurück ("Taster"). Bei AHLB=0 ("A" offen) ist low der inaktive Zustand, und high der aktive ("active high" eben). Bei AHLB=1 ("A" geschlossen)entsprechend umgekehrt ("active low" eben).

Im "toggle mode" (TOG=1 bzw "B" geschlossen) kippt der Ausgang bei jeder erkannten Betätigung einmal ("Schalter"). AHLB legt hier nur den Zustand beim Powerup fest.

Der Ausgang wechselt also (festgelegt durch den Mode und den AHLB-Grundzustand) zwischen Vcc und Gnd, bei den "DC/AC characteristics" steht dazu, daß der Output Pin (bei 3V VCC) 8mA Strom aufnehmen kann (also "von Vcc in den Pin rein (wenn der intern auf Gnd schaltet)"), und 4mA Strom liefern kann (also "von intern auf Vcc geschaltet aus dem Pin raus gegen Gnd").

Muss zwischen Ausgang des Sensor's und dem Port Eingang ein Widerstand gesetzt werden? Wenn ja, wieviel?
Nein, wenn die Pins des Controllers als Eingang (DDR-Bits=0) verwendet werden (selbst über die internen Pullups des AVR können dann nicht mehr als etwa 0,2mA fließen (im worst Case)).
Ja, wenn Du nicht sicher bist, daß der Pin immer Eingang ist (wobei er ja nur dann zum Ausgang wird, wenn DU ihn so programmierst). Welcher Widerstand dann? Er sollte den Strom auf maximal 4mA begrenzen können. Bei 5V und vernachlässigtem Spannungsabfall an den Schalttransistoren in AVR und Sensor käme man rechnerisch auf 1250Ohm - ich würd 'n 1k5, 3k3 oder 4k7 probieren - was grad in der Grabbelkiste ist...
 
Ich möchte mehrere 7-Segmet Anzeigen(3621BS) zum zählen bringen.

CodeBox BascomAVR
'3-Cathode         A        PortB.0
'9-Cathode         B        PortB.1
'8-Cathode         C        PortB.2
'6-Cathode         D        PortB.3
'7-Cathode         E        PortB.4
'4-Cathode         F        PortB.6
'1-Cathode         G        PortB.7
'2-Cathode         DP
'5-Anode          Digi2
'10-Anode         Digi1


' __A3__
'|      |
'|      |
'|F4  B9|
'|      |
'|__G1__|
'|      |
'|      |
'|E7  C8|
'|      |
'|__D6__|
'       °dp2
'-------------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
'-------------------------------------------------------------------------------
Ddrb = &B1111_1111
Ddrd = &B0000_0110

Dim Ad1 As Byte
Dim Ad2 As Byte
Dim Counting As Byte

Do
   Incr Counting
   Ad1 = Lookup(counting , Digits)
   Portb = Ad1
   Waitms 1000
   If Counting = 9 Then
      Counting = 0
   End If
Loop

Digits:
   Data &B10000000
   Data &B11011001
   Data &B01000100
   Data &B01010000
   Data &B00011001
   Data &B00010010
   Data &B00000010
   Data &B11011000
   Data &B00000000
   Data &B00010000

Erst einmal zeigt es mir hierbei keine Null an. wie muss ich vorgehen, damit ich dei "Zehner-Ziffer" ansteuern kann. Momentan zeigen beide Anzeigen die gleichen Zahlen an.
Kann mir jemand weiter helfen?
 
Stichwort Multiplexverfahren.
Du willst eine Zahl (Zehner) nur auf dem einen Display haben, die Andere (Einer) nur auf dem Anderen.
Aber das geht ja nun schon eher in den Bereich Elektrotechnik Basics und hat mit Bascom nicht mehr wirklich was zu tun ;)
 
Aber das geht ja nun schon eher in den Bereich Elektrotechnik Basics und hat mit Bascom nicht mehr wirklich was zu tun
korrekt, trotzdem ist Dein Link viellecht etwas zu viel für Heini. Ich würde als Suchbegriffe "Siebensegmentanzeige Multiplexen" vorschlagen, einer der ersten Treffer wäre dann der hier.

Im vorliegenden Datenblatt ist die Multiplex-Verschaltung bereits realisiert.

In der Tabelle mit den technischen Daten ist der Tabellenkopf (bei mir) nicht lesbar, insofern kann man über die Stromstärke nur vermuten. Allerhöchstwahrscheinlich wird ein Controllerbein aber nicht in der Lage sein, im worst case alle sechzehn LEDs zu versorgen, also wirst Du die Common-Anschlüsse über einen Transistor/FET ansteuern müssen...

P.S.: nebenbei erwähnt gibt es natürlich spezielle ICs, die vin vier Bit parallel auf die sieben Segmentausgänge "wandeln", der Controller müßte dann ein Digit in Form einer 4-Bit-Binärzahl ausgeben.
Oder man verwendet serielle Schieberegister.

Aber Deine Module sind auf Multiplexing verdrahtet...
 
Zuletzt bearbeitet:
Aber das geht ja nun schon eher in den Bereich Elektrotechnik Basics und hat mit Bascom nicht mehr wirklich was zu tun ;)
Das ist das,was ich bis jetzt auch nur gefunden habe. Also,allein mit Programmierung geht es nicht.
Mein Vorhaben wäre am Ende eine Uhr mit etwas größeren 7-Segmenten für die Arbeit gedacht. Aber das lohnt sich nicht bei diesen Aufwand.
 

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