Mein erstes Bascom Projekt !!

Status
Für weitere Antworten geschlossen.
nette Jungs hier..wirklich, macht fun....

meine letzte Chance für trockenübung ohne AVR..( oder muss ich noch hier neben meinem Tisch auch noch Pollin Kit haben..LoL..würde mehr Eure Nerven schonen...:)

Code:
Config Timer1 = Timer , Prescale = 256
   On Timer1 Timer_isr
   Enable Timer1
   Timer1 = 3036
   Enable Interrupts


   'Fixtext für LCD
   Locate 1 , 1
   Lcd "Zaehler1 = "
   Locate 2 , 1
   Lcd "Zaehler2 = "

   Do
   If Lcd_flag = 1 And Zaehler2 < 59 Then                   'Wenn beide
   Incr Zaehler2                                            'Erhöhe Zähler2
      Else                                                  'sonst
      Zaehler2 = 0                                          'auf Null setzen
      Locate 1 , 12                                         'Display an der Stelle mit 2 Space
      Lcd "  "                                              'LCD Sub gehen
   Gosub Lcd
      End If

   Loop                                                     'wiederholen



'Submenu
Timer_isr:
Stop Timer1                                                 'Timer anhalten

Lcd_flag = 1                                                'Wenn erfüllt
    Incr Zaehler1                                           'Hochzählen
    If Zaehler1 > 59 Then
    Zaehler1 = 0                                            'Wenn grösser 59
    Locate 1 , 12                                           'an der Stelle
    Lcd "  "                                                '2 Blanks
    End If
    Timer1 = 3036
Start Timer1                                                'Starten

Return                                                      'Zurück


Lcd:
Locate 1 , 12                                               'Pos
Lcd Zaehler1                                                'Var
Locate 2 , 12                                               'Pos
Lcd Zaehler2                                                'Var
Lcd_flag = 0                                                'Flag auf 0
Return                                                      'zurück

End

Als Antwort hätte ich gerne nur Ja oder Nein..also Bit

If Ja then
Variable = freuen
else
Variable = zuhausen testen
end if

PS: Unsere Konvergation wird von vielen gelesen..über 1000 clicks..:pleasantry:
 
Hallo !

Nun gefällt es mir schon etwas besser! ;)
Teilweise bist du da schon auf den richtigen Weg.
Aber eben nur teilweise......


Code:
 [B]If Lcd_flag = 1 And Zaehler2 < 59 Then[/B]                   'Wenn beide
   Incr Zaehler2                                            'Erhöhe Zähler2
      Else                                                  'sonst
      Zaehler2 = 0                                          'auf Null setzen
      Locate 1 , 12                                         'Display an der Stelle mit 2 Space
      Lcd "  "                                              'LCD Sub gehen
   Gosub Lcd
      End If

Natürlich kann man auch mit AND arbeiten und BASCOM bemängelt das auch nicht.
Manchmal hat man auch keine andere Chance als mit AND bzw. OR zu arbeiten.
Hier wäre das aber nicht ganz in Ordnung!

TIPP: Du kannst die IF-Anweisungen ruhig verschachteln.
(Gleiches gilt z.B. auch für For-Next Schleifen.)


Schauen wir aber mal wieder über den Code und dolmetschen das mal ins Hochdeutsche. ;)
Wenn das Lcd_flag = 1 ist und Zähler2 ist kleiner 59, dann.....
soll er die Variable Zaehler2 inkrementieren.

Das war es! :eek:

Und wer sorgt nun dafür, dass die frisch inkrementierte Variable auf dem LCD angezeigt wird? :hmmmm:

Wenn nun der Lcd_flag = 0 ist und Zähler2 ist immer noch viiiiel keiner als 59, dann
setzt du den Zähler2 auf Null zurück. :eek:
...und um das Chaos perfekt zu machen, löscht du auch gleich die Zeichen 12 und 13 im Display...... in der falschen Zeile. :eek:


Tja.... scheint irgendwie doch noch nicht ganz richtig zu sein.

Wie oben schon mal erwähnt, kannst du IF-Then Schleifen verschachteln.
Mach dir das zu nutze!
Schreib doch mal (in Sätzen) auf, was du machen möchtest.
Zum Beispiel so:
Code:
Wenn Lcd_flag = 1 dann, 
   "mach watt"
sonst, 
   (nix machen)
Ende


"mach watt":
Wenn der Zähler2 kleiner 59 ist dann,
   inkrementiere den Zähler2
   zeige den neuen Wert am LCD an
sonst,
   Setze Zähler2 auf Null
   Lösche die Zeichen 12 + 13 in Zeile 2
Ende


Bekommst du das nun richtig zusammengebaut und übersetzt? :hmmmm:

Gruß,
Cassio


EDIT:
Ach so, ich sollte ja im Bitformat antworten: NEIN !
:)
 
sicher...

damit keine blamage ensteht, weil ich telefoniere ca 6 Std am Tag und schreibe 30 mails...und mache bascom neben bei...weil dies Spass macht..
meine Bascom...


Bis "Speta"

SUB :
Wie oben schon mal erwähnt, kannst du IF-Then Schleifen verschachteln.
Ich bin noch nicht ganz sicher mit dem Umgang von Verschatelungen

if
if
elseif
end if
end if..

total ünbersichtlich..20 mal end if...bräuchte noch eine Eselsbrücke...:stupido3:
 
Hi!

Ja ja.... mit zunehmenden Alter ist man auch nicht mehr so multitaskingfähig. ;)

Es gibt ja Personen die meinen, Männer wären das überhaupt nicht. :eek:
Ich bin eher der Meinung, ein Mann sollte nicht alles offenlegen was er wirklich kann. :D

OK.... bis später!

Cassio
 
Hi sulawesi,

Ein Drehencoder ist gut für eine Menüauswahl. Nimm einen mit Taster, dann kannst du gleich auswählen. Optisch oder nicht ist Geschmacks-und Geldbeutelsache.;)
Mit Taster- Pausen von 100 - 250ms kannst Du störungsfrei wählen. So eine Menüauswahl werde ich im nächsten Projekt einsetzen.

- All
Übrigens - in meinem Testgerät habe ich den Taster des Encoders entgegen des Datenblatts ohne C's und nur mit einem 10K- Pullup nach 5V direkt am Atmel-Pin angeschlossen - funktioniert einwandfrei und ist schneller als in meiner ersten Version nach Datenblatt (Hochzählen über 7- Segmente). Die Bascom- Routine scheint so besser zu greifen.


Grüsse,

Michael
 
Hallo Michael!

Hörst du wohl auf den Herrn sulawesi hier Flöhe ins Ohr zu setzen! ;)

Warte noch ein paar Beiträge (so knappe 200 :D ), dann sind wir bei dem Thema auch angekommen. ;)

Gruß,
Cassio
 
Hi,

:D:p:p:p

rein ins kalte Wasser. Musste ich auch.


Grüsse,

Michael
 
Habe fertig..:cheers:

Mal sehen was das Bit Ergebnis ist

Code:
$regfile = "m8def.dat"
   $crystal = 16000000
   $hwstack = 100
   $swstack = 100
   $framesize = 100
   '$sim
   Dim Zaehler1 As Byte
   Dim Zaehler2 As Byte
   Dim Lcd_flag As Bit


   Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , _
      Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
   Config Lcd = 16 * 2
   Cls
   Cursor Off


   Config Timer1 = Timer , Prescale = 256
   On Timer1 Timer_isr
   Enable Timer1
   Timer1 = 3036
   Enable Interrupts


   'Fixtext für LCD
   Locate 1 , 1
   Lcd "Zaehler1 = "
   Locate 2 , 1
   Lcd "Zaehler2 = "

   Do
   If Lcd_flag = 1 Then
      If Zaehler2 < 59 Then                                 'Wenn beide
           Incr Zaehler2                                            'Erhöhe Zähler2
      Else                                                  'sonst
      Zaehler2 = 0                                          'auf Null setzen
      Locate 1 , 12                                         'Display an der Stelle mit 2 Space
      Lcd "  "
      End If                                                'LCD Sub gehen
       Gosub Lcd
      End If

   Loop                                                     'wiederholen



'Submenu
Timer_isr:
Stop Timer1                                                 'Timer anhalten

Lcd_flag = 1                                                'Wenn erfüllt
    Incr Zaehler1                                           'Hochzählen
       If Zaehler1 > 59 Then
       Zaehler1 = 0                                            'Wenn grösser 59
       Locate 2 , 12                                           'an der Stelle
       Lcd "  "                                                '2 Blanks
    End If
    Timer1 = 3036
Start Timer1                                                'Starten

Return                                                      'Zurück


Lcd:
Locate 1 , 12                                               'Pos
Lcd Zaehler1                                                'Var
Locate 2 , 12                                               'Pos
Lcd Zaehler2                                                'Var
Lcd_flag = 0                                                'Flag auf 0
Return                                                      'zurück

End
 
Hallo!

Hast du dein Programm schon mal in den Mega geladen?


Und? :hmmmm:


Ich würde sagen, das Antwort-Bit ist immer noch-------> 0 !

Wenn du es ausprobiert hast, wirst du ja sehen war ich meine. ;)

Gruß,
Cassio
 
Ja habe ich sonst hätte nicht gepostet, nicht das "wieder Baustellen" enstehen..

also beide Zähler laufen sauber, syncron von 0 bis 59, dann beide sauber auf 0..usw..also ich habe in 3 durchläufen nichts bemerkt, was die Ausgabe anbelangt :)

oder meinst 0 ist Einstellig ?

if 0 einstellig then
fixxen
end if ?

bin auch noch im chat
 
also ich habe in 3 durchläufen nichts bemerkt, was die Ausgabe anbelangt :)

Hi!

Nun ja, du musst dabei auch schon auf das Display schauen. ;)

Nee im Ernst!
Es sind noch zwei kleine Fehler drin.
Kann aber gut möglich sein das es so schnell geht, dass du es nicht sehen kannst. ;)

Dann würde mich noch interessieren, warum du bei "Zaehler1" eine andere Routine zum Kontrollieren des "Höchststandes" (und Rücksetzen) nimmst, als bei Zaehler2? :hmmmm:

Gruß,
Cassio
 
Frage ist berechtigt wie immer ;)

nun meine Überlegung war, wenn wie die 2 Zähler an 2 verschiedene Orte "generiere" dort kontrolliere ich auch ...bin aber sicher, hast bessere Idee...weisst lass mich gerne belehren..:)

Möglich wäre klar alles in DO loop packen..was spircht dafür und dagegen, ich versuche gleich das Programm soweit wie möglich übersichtlich machen....

Andere Frage, so zwischendurch habe mal Gedanken gemacht und auch probiert ob es möglich Byte Ausgabe ohne formattierung auf String 2 Stellig ausgeben kann bzw. ob ein Befehl gibt für Ausrichtung ?
 
ob es möglich Byte Ausgabe ohne formattierung auf String 2 Stellig ausgeben kann bzw. ob ein Befehl gibt für Ausrichtung ?

Hallo !

Nein!
Ein Byte ist ein Byte und ein String ist ein String!
Wenn du aus einem Byte einen String machen möchtest, dann geht das nur über die Formatierung.

Hast du inzwischen die beiden Fehler gefunden?

Ach so...
Nimm bitte für die Subroutine "Lcd" einen anderen Namen!

Zum Beispiel: "Lcd_print" oder "Anzeige"
Nicht das es später im Programm mal zu einem Problem kommt, denn "Lcd" ist ein reservierter Name in BASCOM, weil es eine Anweisung ist!

Gruß,
Cassio
 
Projekte

Steuerung für RGB LED TV Beleuchtung
Termometer
Timer
 

Anhänge

  • Steuerung.jpg
    Steuerung.jpg
    96,8 KB · Aufrufe: 23
  • thermometer1.jpg
    thermometer1.jpg
    123,4 KB · Aufrufe: 21
  • timer.jpg
    timer.jpg
    125 KB · Aufrufe: 20
Hallo!

Beeindruckende Geräte...... und alle in einem schicken Gehäuse. ;)


Zur Auflösung des Abends habe ich das Programm nun noch mal zurecht gerückt.
Kannst es ja noch mal mit deinem Programm vergleichen und nach den kleinen Unterschieden suchen! :)



CodeBox bascom

'Sulawesi, Übungsprogramm Nr.2

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

$hwstack = 32
$swstack = 10
$framesize = 40



Dim Zaehler1 As Byte
Dim Zaehler2 As Byte
Dim Lcd_flag As Bit


Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcd = 16 * 2

Cls
Cursor Off


Config Timer1 = Timer , Prescale = 256
On Timer1 Timer_isr
Enable Timer1
Timer1 = 3036
Enable Interrupts


'Fixtext für LCD
Locate 1 , 1
Lcd "Zaehler1 = "
Locate 2 , 1
Lcd "Zaehler2 = "


'--------------------------------------------------------------
Do

If Lcd_flag = 1 Then
If Zaehler2 < 59 Then 'Wenn beide
Incr Zaehler2 'Erhöhe Zähler2
Gosub Anzeige
Else 'sonst
Zaehler2 = 0 'auf Null setzen
Locate 2 , 12 'Display an der Stelle mit 2 Space
Lcd Zaehler2 ; " " 'Null anzeigen und eine Stelle dahinter löschen
End If 'LCD Sub gehen
Else
End If

Loop 'wiederholen



'--------------------------------------------------------------
Timer_isr:
Stop Timer1 'Timer anhalten

Lcd_flag = 1 'Wenn erfüllt

If Zaehler1 < 59 Then 'Wenn beide
Incr Zaehler1 'Erhöhe Zähler1
Gosub Anzeige
Else 'sonst
Zaehler1 = 0 'auf Null setzen
Locate 1 , 12 'Display an der Stelle mit 2 Space
Lcd Zaehler1 ; " " 'Null anzeigen und eine Stelle dahinter löschen
End If

Timer1 = 3036
Start Timer1 'Starten

Return 'Zurück


'--------------------------------------------------------------
Anzeige:
Locate 1 , 12 'Pos
Lcd Zaehler1 'Var

Locate 2 , 12 'Pos
Lcd Zaehler2 'Var

Lcd_flag = 0 'Flag auf 0
Return 'zurück

End



Gruß,
Cassio
 
Danke fürs Lob, habe mich bemüht und den Code werde genaust untersuchen !

Nun zum Thread einige Anregungen, Erfahrungen Google und anderen Foren.

Es sind fast immer die gleiche Probleme ( abgesehen von Profis )

Was ist pin und was ist port
Configuration
DIM..was nimmt man für was.
die if schleifen
gosub und nicht goto
Berechnung vom Zähler...
vergleiche
speichern vom variablen.

dann DCF
1wire
ADC

fast immerwieder...
 
Status
Für weitere Antworten geschlossen.

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