Mein erstes Bascom Projekt !!

Status
Für weitere Antworten geschlossen.
boahh..alles verschoben, wenn ich Deine Version kopiere...

Beruf : Ich supporte ( Elektronische Drucksysteme ) bzw Projektiere diese und mache Schulungen über unsere Softwaresysteme...mache seit 20 Jahren !! ist alles wahr...

Ich will Euch mit meiner Proleme nicht nerven...können wir es gerne beenden wenn ihr wollt..ich werde es schon dann alleine rauskriegen..werde nicht sauer...
 
Hi !

Stimmt natürlich!
Einfach aus dem Fenster kopieren geht nicht...... bzw. du hast dann alles in einer Zeile. ;)

Habe es eben mal umkopiert und nun als BAS-Datei gespeichert.
Datei befindet sich im Anhang.... ;)

Gruß,
Cassio
 

Anhänge

  • sulawesi-LCD Uhr-NEU_1.bas
    1,8 KB · Aufrufe: 14
Hallo !

Na fein!

Wenn es nun funktioniert, dann vergleiche mal meine Version mit deiner!

Was passiert mit dem "Lcd_flag"...... wann und wo wird es gesetzt (1) und wieder zurück gesetzt (0).

Wo wird der "Zaehler2" inkrementiert.....

Die Idee mit der separaten SUB für das LCD ist völlig in Ordnung.
Du könntest es aber auch als IF-Then-Else Funktion in der Do-Loop Schleife laufen lassen.
Lass es aber nun ruhig so wie es ist.



Dann arbeiten wir nun mal mit der neuen und funktionierenden Basis weiter. ;)

Hier mal das Programm, ohne die alten überflüssigen Zeilen:


CodeBox bascom

$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100


Dim Zaehler1 As Byte 'Der Zähler
Dim Zaehler2 As Byte
Dim Lcd_flag As Bit 'Merker für die LCD-Ausgabe


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 'Timer
On Timer1 Timer_isr 'Springe zu Sub
Enable Timer1

Timer1 = 3036

Enable Interrupts



Do

If Lcd_flag = 1 Then
Incr Zaehler2
Gosub Lcd_print
Else
End If 'Raus

Loop
'widerholen


'===================================================================
Timer_isr:
Stop Timer1

Lcd_flag = 1
Incr Zaehler1

Timer1 = 3036
Start Timer1

Return


'===================================================================
Lcd_print:

Locate 1 , 1
Lcd "Zaehler1 = " ; Zaehler1

Locate 2 , 1
Lcd "Zaehler2 = " ; Zaehler2

Lcd_flag = 0

Return

End




Die Subroutine "Lcd" habe ich mal in "Lcd_print" umbenannt, weil "Lcd" eigentlich ein Befehl von BASCOM ist!



Da "Zaehler1" und "Zaehler2" nur Bytes sind müssten wir noch dafür sorgen, dass beide Werte nicht über....... sagen wir mal 59.... kommen. ;)

Das "Knifflige" ist nun, dass die beiden Zähler an völlig verschiedenen Stellen inkrementiert werden.

Hast du eine Idee?

Gruß,
Cassio
 
Ja es ist schon einer bessere Version, habe schon genau angeschaut.;)

Zähler1 wird incrementiert in Timer_isr:

erstmal wird der Timer gestoppt und das Flag auf 1 gesetzt damit wird der Zähler 2 in Main incrementiert anschließend im LCD SUB Flag auf 0 gesetzt.

dann loop
 
Hi!

Joa..... kann man so gelten lassen. ;)


OK, nun hast du das Prinzip gesehen, wie ein Flag funktioniert! :)

Du setzt also das Flag immer dann, wenn du etwas ändern oder ausführen möchtest.
Sobald dies passiert ist und die Änderung abgeschlossen ist, wird das Flag wieder zurück gesetzt.

Flag setzen = 1
Flag rücksetzen = 0

In BASCOM kannst du daher auch schreiben.....
Code:
Set Lcd_flag
Reset Lcd_flag
....musst du aber nicht!

Allerdings funtioniert dies nur an Stellen, an denen es nur eine 1 oder eine 0 gibt!
Also bei einer Bit-Variable, einem einzelnen Bit in einem Byte (Word, Long), oder auch bei einem Portpin (zum Beispiel: PINA.1 oder auch PORTB.5)


Der große Vorteil eines Flags ist, dass du es an jeder Stelle des Programms bearbeiten kannst..... und du dadurch nur den Ablauf des Programms beeinflusst...... aber nicht die Funktion verändern musst.


Nun wieder zurück zur neuen Aufgabe!
Hast du das Rücksetzen BEIDER Zähler bei "größer 59" schon erledigt?

Gruß,
Cassio
 
irgendwie löscht es nicht sauber auf 00 sondern aud 09 oder so...muss mal schauen

Zählt auch aber ab falsch..zähnerweise..muss mal genau beobachten..
 
Hi !

Ich behaupte nun einfach mal, dass deine Zähler schon richtig gelöscht werden....
und auch anschließend wieder richtig hochzählen.

Was du nun siehst ist eine "optische Täuschung". ;)

Wenn das Programm z.B. 19 Sekunden lang gelaufen ist, dann steht im Display:
Zaehler1 = 19
Zaehler2 = 19

Wenn du nun die Zähler auf Null zurücksetzt, dann steht im Display plötzlich:
Zaehler1 = 09
Zaehler2 = 09

Das kommt daher, das wir die Byte-Variablen nun "direkt" ausgeben und nicht erst in einen String formatieren. ;)

Wie lässt sich aber dies "Problem" nun mit dem Rücksetzen der Zähler lösen, OHNE die Byte-Variablen erst in weitere String-Variablen zu übergeben und zu formatieren.


So, das wird dann wohl die Aufgabe zur Nacht werden.
Wird schon langsam spät....

Gruß,
Cassio
 
tricki :p erstmal...nun möchte ich mal das Programm analysieren, was passiert

Zähler 2

1) Wenn LCD Flag ist 1 dann
2) Zähler2 erhöhen
3) Springen zur LCD Sub
4) die 2 Zähler auf LCD ausgeben
5) LCD Flag auf 0
6) Zürück zu Main

Zähler1
1) Timer tickt
2) bei jedem Tick spingt zu Timer Sub
3) Timer stoppen
4) LCDF Flag setzen auf eins
5) Zähler 1 Erhöhen
6) Timer starten
7) zürück zu Main Loop

Tja leider kann ich die Rücksetzung nicht simulieren erstmal sehen was Sim macht

Also Zähler2 nur vom Gedanken her sollte folgendes drin stehen :

Code:
If Lcd_flag = 1 Then
   Incr Zaehler2
   If Zaehler2 > 60 Then
   Zaehler2 = 0
   End If
   Gosub Lcd
   End If
   Loop

So erstmal gucken ob der Ansatz richtig ist oder denke gerade an Select Case
 
Guten Morgen!

Ja, der Ansatz ist schon völlig OK! :)

Es gibt ja nun eine neue Bedingung....
Zähler den Zaehler2 nur hoch, wenn der Wert nicht über 59 ist..... sonst setze ihn auf Null.

Programmtechnisch könnte man es dann z.B. so schreiben:
Code:
If Zaehler2 < 59 Then
   Incr Zaehler2
Else
   Zaehler2 = 0
End if

Es wird also vorher geprüft, ob das Inkrementieren des Zählers sinnvoll ist.
Sollte der Wert zu hoch werden, wird auf Null zurück gesetzt!


Nun haben wir aber das Problem mit der Anzeige! :rolleyes:
Würden wir nichts weiter unternehmen, sieht die Anzeige in der 59. Sekunde so aus:
Zaehler1 = 59
Zaehler2 = 59

....und kurz darauf (nach dem Rücksetzen):
Zaehler1 = 59
Zaehler2 = 09

Das kommt daher, das wir nur die neue Null aus der Bytevariable nehmen.
Ergo wird nicht "00" zum Display geschickt, sondern nur eine "0" !

Was das Display mit der 13. Stelle in der zweiten Zeile machen soll, in der immer noch eine "9" steht, haben wir nicht programmiert.
Also wird die "9" von "59" dort auch brav stehen bleiben. ;)

Was nun ?

Gruß,
Cassio
 
Schön, daß Du auch da bist..

Ich habe gestern Nacht noch einige Gedanken gehabt. Sag mir wenn es falsch ist..

Wir haben die Zähler as Byte ( also Zahl definiert ) . Mit zahlen kann man gut rechnen. Anscheinend ist die Zahl "00" in Byte modus nur 0. Vom Gefühl her möchte nicht auf String * 2 ändern weil dahat man die Format Story am Hals...

Gedanke : cls verwenden finde ich hier auch käse...flackert...
Display mit blanks füllen ?
Lcd Space(10)

Mom bisschen telefonieren..

Noch etwas als "ablenkung"..Menüstuerung mit Poti"..ich hatte vor einigen Monaten dieses geniale Teil mal nachgebaut..

http://www.avr-asm-tutorial.net/avr_de/fcount/fcount_m8.html

Gibt es irgendwo eine gute Code Simulator ? in Basom das teil ist grotten schlecht..
 
So etwa ?

Code:
Do

   If Lcd_flag = 1 Then
   Incr Zaehler2
      If Zaehler2 < 59 Then
      Incr Zaehler2
   Else
      Zaehler2 = 0
      Locate 1 , 1
       Lcd Space(10)
   Gosub Lcd
      End If
   Gosub Lcd
      End If
   Loop
 
Moin!

Ja, ich bin auch noch da. ;)
Muss aber gleich mal weg!


Die Idee mit dem "Cls" wäre eine Möglichkeit......
Diesmal würde das Display aber nicht flackern, weil wir es ja nur EINMAL löschen würden. ;)

Das Konvertieren von Byte in String ist natürlich auch eine Möglichkeit.
Je nach Displaytyp und Anwendung wirst du dies später sowieso machen (müssen).
Zur Zeit lassen wir das Thema aber erst einmal unbeachtet. ;)


Wenn ich mich recht erinnere, hast du ein 16x2 Zeichen Display.
Wie oben schon geschrieben, bleibt ja nun dummerweise an der 13. Stelle im Display noch die "9" stehen.

Was lernen wir daraus?
Wenn wir etwas nicht programmieren, wird es auch nicht von selber passieren..... auch wenn unser Gehirn es für selbstverständlich hält. ;)

Wir lernen aber noch etwas daraus. :eek:
Wenn wir einmal etwas auf das Dispaly "schreiben" bleibt es solange dort stehen, bis wir es wieder entfernen. :cool:

Diese Eigenschaft können wir uns auch zu Nutze machen. :)
Bis jetzt haben wir einmal in der Sekunde das Display "komplett" neu beschrieben.
War das eigentlich notwendig?
Letztlich haben sich doch immer nur die Werte der Zähler-Variablen geändert.
Die Texte waren doch immer die Selben!

Wenn also das oben geschriebene mit dem LCD stimmt, dann müssten wir doch ganz zu Anfang nur einmal das Display mit den Texten beschreiben.
Also:
Code:
Locate 1 , 1
Lcd "Zaehler1 = "

Locate 2 , 1
Lcd "Zaehler2 = "

Solange wir dies nicht wieder entfernen, oder überschreiben, wird es im Dispaly immer stehen bleiben. :)

Nun müssen wir nur noch die Variablenwerte an die richtige Stelle zum Display schicken.
Demnach so:
Code:
Locate 1 , 12
Lcd Zaehler1

Locate 2 , 12
Lcd Zaehler2

Genauso können wir verfahren, wenn wir die Zahlen im Display wieder löschen wollen:
Code:
Locate 1 , 12
Lcd "  "          'zwei Leerzeichen eingeben

Locate 2 , 12
Lcd "  "          'zwei Leerzeichen eingeben

In den Zeichen 1 bis 11 des Displays steht dann immer noch der Text!
Die Zeichen 12+13 haben wir nun durch Leerzeichen ersetzt.
Es müsste dann so aussehen:
Zaehler1 =
Zaehler2 =

Nun kann das Zählen und Anzeigen wieder von vorn beginnen. ;)


Was wäre also zu tun?
VOR der Hauptschleife (Lo-Loop) EINMAL die Textausgabe für das Display realisieren.

Jeden Zähler zurück setzen und die Zeichen 12+13 beider Zeilen mit Leerzeichen überschreiben.

Nun musst du noch die Ausgabe und die Position der Zählerwerte anpassen und.....
Fertig. :)

Wenn du alles verstanden hast, dann sollte das Umbauen des Programmes ein leichtes sein.
Probiere es einfach mal.

Gruß,
Cassio
 
Ungetestete Version : ;) ( deshalb viele Kommentare

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                                     'Wenn LCD Flag 1 ist
   Incr Zaehler2                                            'Erhöhe Zähler2
      If Zaehler2 < 59 Then                                 'Wenn Zähler2 kleiner 59
      Incr Zaehler2                                         'erhöhen
   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
   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                                   '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
 
Hallo!

Mensch sulawesi! :mad:

Du sollst endlich aufhören irgendwelche Zeilen zusammen zu kopieren und dafür mal ein bisschen nachdenken!!!

Sieht so aus, als würdest du schon wieder anfangen das Kopieren von Bruchstücken verschiedener Programme als Programmieren zu betrachten!

Ich habe die groben Auffälligkeiten mal Fett gemacht.

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                                     'Wenn LCD Flag 1 ist
   [B]Incr Zaehler2[/B]                                            'Erhöhe Zähler2
      If Zaehler2 < 59 Then                                 'Wenn Zähler2 kleiner 59
      [B]Incr Zaehler2[/B]                                         'erhöhen
   Else                                                     'sonst
      Zaehler2 = 0                                          'auf Null setzen
      Locate 1 , 12                                         'Display an der Stelle mit 2 Space
      Lcd "  "                                              'LCD Sub gehen
   [B]Gosub Lcd[/B]
      End If
   [B]Gosub Lcd[/B]
      End If

   Loop                                                     'wiederholen



'Submenu
Timer_isr:
Stop Timer1                                                 'Timer anhalten

Lcd_flag = 1                                                'Wenn erfüllt
    [B]Incr Zaehler1[/B]                                           'Hochzählen
    [B]If Zaehler1 > 59 Then[/B]                                   'Wenn grösser 59
[B]Hier fehlt auch noch etwas ![/B]
    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


So, nun schau dir die makierten Zeilen noch mal an und denk mal etwas nach.
Ich bin mir sicher, dass du mit etwas Anstrengen selbst drauf kommst. ;)

Gruß,
Cassio
 
Sorry, wollte Dich nicht ärgern, bin im Büro..abgelenkt gewesen...

ist keine Entschuldigung...:)

gucke gleich...und weil Du soviel Gedld mit mir aufbrings, "muss" ich Dir noch Makrolon pLatten fürs Gehäuse fräzen lassen
 
Beruf : Ich supporte ( Elektronische Drucksysteme ) bzw Projektiere diese und mache Schulungen über unsere Softwaresysteme...mache seit 20 Jahren !! ist alles wahr...

Hi
Sorry, wenn ich hier ein wenig schmunzel, aber ich glaube, du erfährst grad am eigenen Leib wie es Schülern geht, die nicht durchblicken und wo der Fachman davor steht und händeringend nach Erklärungen sucht...:yes4:
Es ist wirklich schade, das ich hier nicht mitreden kann, mangels BASCOM Kenntnissen. Sicherlich könnte ich so einiges an Verwirrung beitragen. :) Weiter so.
Gruß oldmax
 
Hallo Oldmax!

Du darfst dich gerne als Schöööler neben sulawesi setzen. :D

Bleibt du aber mal lieber bei ASM.....
Wenn ich dann mal eine LIB brauche weiß ich ja, wen ich fragen kann. ;)

Gruß,
Cassio
 
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)