Mein erstes Bascom Projekt !!

Status
Für weitere Antworten geschlossen.

sulawesi

Neues Mitglied
07. Juni 2009
123
0
0
Raum Stuttgart
Sprachen
Nun habe ich meine LCD Uhr mit Alarm soweit fertig !


Funktionen ( für Anfänger ) :)

Über einen Schalter wird zwischen Uhr und Alarm Mode gewechselt.
Über 2 Taster kann man die Uhr bzw. Alarmzeit einstellen.
Alarm über Buzzer

Für Profis :
Über jede Anregung wie ich es besser machen könnte freue ich mich !
Was mir nicht gut gefällt:
1) Modus Auswahl ( wenn hin und her geschaltet wird) läuft die Uhr nicht.
2) Vorzeitige Alarmabbruch ist nicht sauber.
 

Anhänge

  • LCD Uhr.bas
    4,4 KB · Aufrufe: 121
Hallo !

Ich stelle deinen Programmcode hier mal direkt ein.....
Wenn wir darüber schon diskutieren wollen, dann sollten wir den Code auch sehen können. ;)



CodeBox bascom

$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100
Dim Sekunde As Word
Dim Minute As Word
Dim Stunde As Word
Dim Asekunde As Word
Dim Aminute As Word
Dim Astunde As Word
Dim S1 As String * 2
Dim S2 As String * 2
Dim S3 As String * 2
Dim S4 As String * 2
Dim S5 As String * 2
Dim S6 As String * 2


'---------------Ausgaben-----------------------------------------------
'Buzzer Port
Config Portc.5 = Output
Speaker Alias Portc.5

'LED definieren
Config Portc.4 = Output
Led Alias Portc.4

'--------------LCD Config-----------------------------------------------
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

'--------------Eingaben-------------------------------------------------
'Snooze
Config Pind.0 = Input
Portd.0 = 1
Snooze Alias Pind.0

'Uhr Mode
Config Pind.1 = Input
Portd.1 = 1
Taster0 Alias Pind.1

'Alarm Mode
Config Pind.2 = Input
Portd.2 = 1
Taster1 Alias Pind.2

'Minuten Einstellen
Config Pind.3 = Input
Portd.3 = 1
Taster2 Alias Pind.3

'Stunden Einstellen
Config Pind.4 = Input
Portd.4 = 1
Taster3 Alias Pind.4




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

Sekunde = 0
Minute = 0
Stunde = 0



Do


'----------------------Umschalter zwischen Uhr und Alarm-------------

If Taster0 = 0 And Taster1 > 0 Then
Waitms 50
Gosub Uhr
End If

If Taster1 = 0 And Taster0 > 0 Then
Waitms 50
Gosub Alarm
End If
'-------------------------------------------------------------------

'Alarm auslösen

If S1 = S4 And S2 = S5 And Snooze > 0then
Led = 1
Sound Speaker , 124 , 675
Sound Speaker , 110 , 758
Sound Speaker , 248 , 675
Led = 0
End If

Loop

End
'---------------------------SUB--------------------------------------
'Submenu Timer
Test:
Incr Sekunde
Timer1 = 3036
Return

'--------------------Submenu ZEIT------------------------------------
Uhr:
S1 = Str(stunde)
S1 = Format(s1 , "00")
'----------------------------------
S2 = Str(minute)
S2 = Format(s2 , "00")
'------------------------------------
S3 = Str(sekunde)
S3 = Format(s3 , "00")
'--------------------------------------
' S1 ist nun die Variable für Stunde
' S2 ist nun die Variable für Minuten
' S3 ist nun die Variable für Sekunden



'----------- Anzeige Stunden , Minuten, Sekunden auf Display ------------------

Locate 2 , 13
Lcd S3
Locate 2 , 11
Lcd ":"
Locate 2 , 8
Lcd S2
Locate 2 , 6
Lcd ":"
Locate 2 , 3
Lcd S1
Locate 1 , 1
Lcd "Aktuelle Uhrzeit"
Waitms 50


If Sekunde > 59 Then Minute = Minute + 1
If Sekunde > 59 Then Sekunde = 0
If Minute > 59 Then Stunde = Stunde + 1
If Minute > 59 Then Minute = 0
If Stunde > 23 Then Stunde = 0

'--------------Uhr einstellen Minute ------------------------------------------
If Taster2 = 0 Then
Waitms 50
Incr Stunde
End If
'--------------Uhr einstellen Stunde -----------------------------------------
If Taster3 = 0 Then
Waitms 50
Incr Minute
End If

'End If
Return

'---------------Submenu Alarm-------------------------------------------------
Alarm:
Locate 1 , 1
Lcd " Aktuelle Alarm "
S4 = Str(astunde)
S4 = Format(s4 , "00")
'----------------------------------
S5 = Str(aminute)
S5 = Format(s5 , "00")
'------------------------------------
S6 = Str(asekunde)
S6 = Format(s6 , "00")
'--------------------------------------
' S4 ist nun die Variable für Stunde
' S5 ist nun die Variable für Minuten
' S6 ist nun die Variable für Sekunden

Locate 2 , 13
Lcd S6
Locate 2 , 11
Lcd ":"
Locate 2 , 8
Lcd S5
Locate 2 , 6
Lcd ":"
Locate 2 , 3
Lcd S4
Locate 1 , 1
Cursor Off Noblink
Waitms 50

If Asekunde > 59 Then Aminute = Aminute + 1
If Asekunde > 59 Then Asekunde = 0
If Aminute > 59 Then Astunde = Astunde + 1
If Aminute > 59 Then Aminute = 0
If Astunde > 23 Then Astunde = 0


'--------------Alarm einstellen Stunde -----------------------------------------
If Taster2 = 0 Then
Waitms 50
Incr Astunde
End If
'--------------Alarm einstellen Stunde -----------------------------------------
If Taster3 = 0 Then
Waitms 50
Incr Aminute
End If


Return



Gruß,
Cassio
 
LCD Uhr komplett auf Pollin Board mit LCD Add-On

nun habe ich die Uhr komplett auf Pollin Board umgesetzt.

Folgendes wurden geändert:

Mit Taster1 schaltet man zwischen Uhr und Alarm Modus um
Mit Taster2 wird die Uhr /Alarm eingestellt
Mit Taster3 wird die Minute/alarm eingestellt

Buzzer auf dem Board als akustisches Signal.

Code:
   $regfile = "m8def.dat"
   $crystal = 16000000
   $hwstack = 100
   $swstack = 100
   $framesize = 100
   Dim Sekunde As Word
   Dim Minute As Word
   Dim Stunde As Word
   Dim Asekunde As Word
   Dim Aminute As Word
   Dim Astunde As Word
   Dim S1 As String * 2
   Dim S2 As String * 2
   Dim S3 As String * 2
   Dim S4 As String * 2
   Dim S5 As String * 2
   Dim S6 As String * 2


   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



   'Taster0 Umschalter ,nicht gedrückt Uhr,gedrückt Alarm
   Config Pind.2 = Input
   Portd.2 = 0
   Taster0 Alias Pind.2

   'Taster1 Uhr stellen
   Config Pind.3 = Input
   Portd.3 = 0
   Taster1 Alias Pind.3

   'Taster2 Minuten stellen
   Config Pind.4 = Input
   Portd.4 = 0
   Taster2 Alias Pind.4

   'LED definieren
   Config Portd.5 = Output
   Led Alias Portd.5

   'Buzzer Port
   Config Portd.7 = Output
   Speaker Alias Portd.7


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

   Sekunde = 0
   Minute = 0
   Stunde = 0



Do


'Umschalter zwischen Uhr und Alarm

If Taster0 = 0 Then
   Waitms 50
   Gosub Uhr
   Elseif Taster0 = 1 Then
   Waitms 50
   Gosub Alarm
End If


'Alarm auslösen

If S1 = S4 And S2 = S5 Then
   Led = 1
   Sound Speaker , 124 , 675
   Sound Speaker , 110 , 758
   Sound Speaker , 248 , 675
   Led = 0
End If



Loop

End

'Submenu Timer
Test:
Incr Sekunde
Timer1 = 3036
Return

'Submenu Zeit
Uhr:
S1 = Str(stunde)
S1 = Format(s1 , "00")
'----------------------------------
S2 = Str(minute)
S2 = Format(s2 , "00")
'------------------------------------
S3 = Str(sekunde)
S3 = Format(s3 , "00")
'--------------------------------------
' S1 ist nun die Variable für Stunde
' S2 ist nun die Variable für Minuten
' S3 ist nun die Variable für Sekunden



'----------- Anzeige Stunden , Minuten, Sekunden auf Display ------------------

Locate 2 , 13
Lcd S3
Locate 2 , 11
Lcd ":"
Locate 2 , 8
Lcd S2
Locate 2 , 6
Lcd ":"
Locate 2 , 3
Lcd S1
Locate 1 , 1
Lcd "Aktuelle Uhrzeit"
Waitms 50


 If Sekunde > 59 Then Minute = Minute + 1
 If Sekunde > 59 Then Sekunde = 0
 If Minute > 59 Then Stunde = Stunde + 1
 If Minute > 59 Then Minute = 0
 If Stunde > 23 Then Stunde = 0

'--------------Uhr einstellen Minute ------------------------------------------
 If Taster1 = 1 Then
   Waitms 50
   Incr Stunde
 End If
 '--------------Uhr einstellen Stunde -----------------------------------------
If Taster2 = 1 Then
   Waitms 50
   Incr Minute
End If
'--------Sound ----------------------------------------

'   Sound Speaker , 124 , 675
'   Sound Speaker , 110 , 758
'   Sound Speaker , 248 , 675


'End If
Return

'Submenu Alarm
Alarm:
Locate 1 , 1
Lcd " Aktuelle Alarm "
S4 = Str(astunde)
S4 = Format(s4 , "00")
'----------------------------------
S5 = Str(aminute)
S5 = Format(s5 , "00")
'------------------------------------
S6 = Str(asekunde)
S6 = Format(s6 , "00")
'--------------------------------------
' S4 ist nun die Variable für Stunde
' S5 ist nun die Variable für Minuten
' S6 ist nun die Variable für Sekunden

Locate 2 , 13
Lcd S6
Locate 2 , 11
Lcd ":"
Locate 2 , 8
Lcd S5
Locate 2 , 6
Lcd ":"
Locate 2 , 3
Lcd S4
Locate 1 , 1
Cursor Off Noblink
Waitms 50

If Asekunde > 59 Then Aminute = Aminute + 1
 If Asekunde > 59 Then Asekunde = 0
 If Aminute > 59 Then Astunde = Astunde + 1
 If Aminute > 59 Then Aminute = 0
 If Astunde > 23 Then Astunde = 0


'--------------Alarm einstellen Stunde -----------------------------------------
 If Taster1 = 1 Then
   Waitms 50
   Incr Astunde
 End If
 '--------------Alarm einstellen Stunde -----------------------------------------
If Taster2 = 1 Then
   Waitms 50
   Incr Aminute
End If


Return

Anbei noch die Einstellung für PonyProg. Wenn noch gewünscht Eagle Schaltplan mit einseites Layout
 

Anhänge

  • LCDUHR.jpg
    LCDUHR.jpg
    31,2 KB · Aufrufe: 44
Hallo sulawesi!

Nun schauen wir doch mal, wie du dein Programm überarbeiten könntest....

Generell solltest du schauen, dass die Hauptschleife (Do-Loop) nur den Ablauf deines Programmes bearbeitet, selbst aber gar nicht soviel erledigt.

Die Aufgaben kannst du dann in Subroutinen stellen.
Gerade wenn sich bestimmte Aufgaben oder Abläufe wiederholen, solltest du unbedingt Subroutinen verwenden.

Dann solltest du überlegen, ob du nicht mit verschiedenen "Flags" arbeitest.
Ein Beispiel:
Wenn du die Taste "Alarm einstellen" drückst, springst du nicht auf Grund des Tastendrucks in die passende Subroutine, sondern setzt nur ein "Merker" (Flag), dass der Taster gedrückt wurde.

Diese Flags haben den Vorteil, dass du zum Beispiel im Programm ruhig wieder zur Hauptschleife zurück kehren kannst und doch wieder beim "Alarm einstellen" landest.
Wo der Vorteil liegt?
Du kannst (um bei dem Beispiel zu bleiben) immer in die Hauptschleife zurück und andere Flags mit berücksichtigen..... und entsprechend verarbeiten. Oder einfach auch nur zwischendurch andere Dinge erledigen bzw. kontrollieren und trotzdem befindest du dich immer wieder in der Sub "Alarm einstellen".

Bleiben wir doch mal bei deinem Programm mit dem Wecker (Uhr mit Alarm).
Sicher wird dein Programm nun "irgendwie" funktionieren.
Möchtest du aber etwas ändern oder erweitern, musst du fast das ganze Programm überarbeiten.... oder zumindest den Ablauf im Auge behalten.

Du hast z.B. eine Snooze-Funktion für den Wecker.....
Wenn die für 5 Minuten aktiviert ist und du drückst in der Zwischenzeit (z.B. nach 3min 15 sec.) auf "Alarm aus", weil du schon früher aufgestanden bist, dann muss das dein Programm auch berücksichtigen!
Gleiches gilt für den "Alarm aus", wenn z.B. gerade der Wecker nur einen Piep von sich gegeben hat. Kannst du den Alarm dann während das Signal ertönt sofort abschalten?

Es gibt noch mehr Beispiele wie du dein Programm optimieren kannst.... oder solltest, damit es auch reibungslos funktioniert.


Bevor du nun aber anfängst und dein Programm auseinander nimmst, fang erst mal klein an.
Versuch doch mal, deine LCD-Anzeige nur dann zu aktualisieren, wenn es auch etwas zu aktualisieren gibt...... zum Beispiel eine neue Sekunde angezeigt werden muss.
Es würde doch eigentlich reichen, wenn dein LCD einmal nach einer neuen Sekunde aktualisiert wird und NICHT bei JEDEM Durchlauf des Programms.... gerade wenn du mit 16MHz Systemtakt arbeitest!

Wenn dir das gelungen ist und du das Prinzip dafür verstanden hast, dann geht es zum nächsten Schritt weiter. ;)

Gutes Gelingen und viel Spaß dabei,
Cassio
 
Guten Morgen vielen Dank Cassio für die nette Ratschläge.

Subs habe ich bereits verwendet, klar ich kann es irgendwie besser machen, muss mal schauen ob ich gute Beispiele finde..

"Wenn du die Taste "Alarm einstellen" drückst, springst du nicht auf Grund des Tastendrucks in die passende Subroutine, sondern setzt nur ein "Merker" (Flag), dass der Taster gedrückt wurde."

Hier wäre ein Beispiel auch hilfreich, damit ich sehen kann wie es funktioniert..

"Du hast z.B. eine Snooze-Funktion für den Wecker.....
Wenn die für 5 Minuten aktiviert ist und du drückst in der Zwischenzeit (z.B. nach 3min 15 sec.) auf "Alarm aus", weil du schon früher aufgestanden bist, dann muss das dein Programm auch berücksichtigen!
Gleiches gilt für den "Alarm aus", wenn z.B. gerade der Wecker nur einen Piep von sich gegeben hat. Kannst du den Alarm dann während das Signal ertönt sofort abschalten?"

Nein das geht leider noch nicht und meine Frage war damals, wie ich aus einem Sub rausspringen kann ohne das Compilerfehler passiert.

Sub :
macht hier irgendwas
if Taster1=1 then
exit sub

irgendwie war das Problem ( Compiler verlangte nach Return ) aber bascom sollte wissen woher man "gekommen ist" in die Sub Routine oder `?

"Versuch doch mal, deine LCD-Anzeige nur dann zu aktualisieren, wenn es auch etwas zu aktualisieren gibt...... zum Beispiel eine neue Sekunde angezeigt werden muss."

das habe ich auch schon bemerkt aber wusste ich nicht wie...

Trotzdem bin ich sehr froh dass es soweit geklappt und und bedanke mich für Eure zahlreiche Hilfen !!
 
Subs habe ich bereits verwendet, klar ich kann es irgendwie besser machen, muss mal schauen ob ich gute Beispiele finde..


Hallo!

Nein, du sollst nicht schauen, ob du irgendwelche Beispiele findest..... du sollst dir selbst Gedanken machen!

Ich habe nichts dagegen, wenn man sich das eine oder andere Programm zu Beginn aus dem Internet holt, um das Prinzip zu verstehen, oder sich erst mal ein Bild zu machen.

Danach sollte mit dem "abgucken" aber Schluss sein.
Am Ende kannst du vielleicht ein paar Programme lesen, aber selber keine schreiben. Nur weil du nicht weißt, wie du deine Gedanken nun in ein Programm bringen sollst.
Da hilft eben nur ausprobieren, ausprobieren und noch mal ausprobieren! ;)


irgendwie war das Problem ( Compiler verlangte nach Return ) aber bascom sollte wissen woher man "gekommen ist" in die Sub Routine oder `?

Na, na, na..... BASCOM weiß ganz genau vorher du gekommen bist, wenn du in eine Subroutine verzweigst.
Nach Verlassen einer Sub setzt das Programm genau an der nächsten Stelle fort, wo es zuvor verlassen wurde.

Es kann aber nicht sein, nur weil DU es falsch programmiert hast, scheint BASCOM einen Fehler zu machen. :cool:
Wenn dir die Fehlerhilfe beim Kompilieren schon auf die Sprünge hilft, dass ein "Return" fehlt und es daher keinen Sinn machen würde das Programm zu übersetzen, dann sei BASCOM doch für den Hinweis dankbar..... und programmiere es richtig.
BASCOM möchte dich ja nicht ärgern, sondern will dir lediglich helfen!


das habe ich auch schon bemerkt aber wusste ich nicht wie...

Tja und damit sind wir wieder oben beim Thema angekommen. :rolleyes:
Nur weil dies in den "gesaugten" Beispielen aus dem Internet vielleicht nicht vorhanden war, muss es doch irgendwie gehen, oder? ;)

Wie ich schon ein paar mal geschrieben habe.....
Dein Uhrenprojekt als erste Übung finde ich klasse. Zumnal du es selbst geschrieben hast.
Ich habe allerdings schon einige Zeit den Eindruck, dass du dein Uhrenprogramm zwar selber per Hand getippt hast, aber letztlich ein Großteil der Funktionen doch nur "zusammen kopiert" sind.


Ich würde daher sagen, pack dein jetziges Programm mal an die Seite und beginne mit einzelnen Teilen.

Bleiben wir mal beim LCD......
Nimm einen Timer, der dir z.B. jede Sekunde einen Interrupt erzeugt.
In dieser ISR (= Interrupt Service Routine, also Subroutine) zählst du eine Variable hoch.
Diese Variable lässt du dir auf dem Display an einer bestimmten Stelle anzeigen...... aber dies nur EINMAL, sobald sich der Variablenwert verändert hat. Wenn es nicht neues anzuzeigen gibt, wird das Display auch nicht aktualisiert.

Versuch es doch einfach mal..... und such nicht im Internet nach Lösungen. ;)
Kannst ja deine Versuche und Ansätze ruhig hier einstellen. Auch wenn sie nicht funktionieren.
Den einen oder anderen Tipp wirst du dann bestimmt erhalten..... aber mit Sicherheit keine fertige Lösung.

Wird schon klappen! :)

Gruß,
Cassio
 
"Nur weil dies in den "gesaugten" Beispielen aus dem Internet vielleicht nicht vorhanden war, muss es doch irgendwie gehen, oder?"...

Harte Worte, stimmt soweit nich aber egal...
 
Hallo!

Ach komm.... das waren keine "harten" Worte, nur eben Ehrliche. ;)

Außerdem hatte ich hinter dem Satz ja auch ein---> ;) Smilie gemacht.
Also können es gar keine "harten" Worte gewesen sein. :p


So, bleiben wir aber mal beim Thema....
Wie weit bist du denn mit der Aufgabenstellung schon gekommen?
Wenn du nicht weiter kommst, oder nicht weißt wie du beginnen sollst, dann schreib deine Gedanken dazu doch hier ins Forum.
Dafür ist ein Forum doch da. ;)

Also los..... wir lassen keinen Hängen, wenn er sich helfen lassen möchte.

Gruß,
Cassio
 
Passt schon....;)

Ich lese mich weiter im Thema Timer und Interrupts ein...nun sehe ich, dass bei meiner jetzige Lösung

Code:
'Timer konfigurieren 16000000 Hz System / 256 Teiler =   62500 Ticks
   Config Timer1 = Timer , Prescale = 256
   Enable Timer1
   On Timer1 Test                                           'Wenn Überlauf erreicht wird
   Enable Interrupts
   Timer1 = 3035

Wenn Überlauf erreicht wird springen wir in Sub zum Test

Code:
'Submenu Timer
Test:
Incr Sekunde
Timer1 = 3036
Return

und erhöhen wir die Minuten...dann wieder zurück..also nur vom Gefühl her
sollte man nich so viel hin und her springen oder ????

Oder Prozeduren anlegen, dort kann ich die Variablem auch deklarieren..

Ich überlege mir gerade wie ich das Programm anders strukturieren sollte..auch für weiter Optionen..

Ausserdem schau ich gerade das Thema ISR an..

ich stelle den Timer so ein ,dass bei einem Überlauf ein Interrupt ausgelöst wird. (OVF1) Ich brauche aber 2 Interrupts auf ein Signal von 1 HZ zu kommen
High-Low Low High...

Tja wie Ihr sieht habe hunderte Sachen im Kopf, und je mehr ich nachgelsen habe, umso schwieriger wird die Entscheidung, welchen Weg ich nehmen soll..

Am besten wäre irgendein FlowChart.........................

Das Erste wäre also, was wäre der richtige Struktur ( oder Menü )
 
Hallo!

Also der Ansatz ist soweit OK! :)

Die Sache mit dem Timer1 war ja nun auch nicht weiter schwer, denn das hattest du ja schon fertig. ;)

OK, nun wird also jede Sekunde die ISR "Test" aufgerufen.
In der ISR "Test" wird nun die Variable "Sekunde" immer um eins hochgezählt.

Jetzt hast du einen neuen Wert in der Variable "Sekunde", den du auch auf das Display bringen musst.
Mach das doch erst einmal und stelle hier immer den GESAMTEN Code mit ein.

Kannst dir ja nun schon mal ein paar Gedanken machen was du benötigst, um die Variable nur einmal anzeigen zu lassen. ;)


Was das ständige "hin und her" Springen im Programmcode betrifft, darüber mach dir mal keine Gedanken!
Es reicht zur Zeit auch völlig aus, wenn du dich mit dem Befehl "Gosub" beschäftigst.
"Declare Function" und Ähnliches lassen wir mal außen vor. Das brauchst du jetzt noch gar nicht!

Gruß,
Cassio
 
Danke erstmal..

Was meinst genau damit ?

"Mach das doch erst einmal und stelle hier immer den GESAMTEN Code mit ein"

Dann das nächste :
"Kannst dir ja nun schon mal ein paar Gedanken machen was du benötigst, um die Variable nur einmal anzeigen zu lassen"

Ich denke wenn ich sage :

Locate 1,5
LCD Hier kommt von mir aus S1 hin, dann wird es richtig ?

Du meinst nicht mit Debounce wo man eine Änderung verfolgen kann und mit Parametern bestimmen kann was passieren soll ? Habe gelesen sowas verwendet man beim Taster und so...

( Das Programm wird sowieso noch 20 mal umgebaut - Ich will später die Menuwahl über einen Poti machen, Ausgangspannung am Poti kann man ja messen..
IF 1-3 V dann Menü A usw )

Aber erstmal die Frage was ich mir stelle, funzt zwar momantan gut..wenn der Taster0 nicht gedrückt wrid dann Uhrzeit, wenn Ja dann Alarm...
Ob der Anfang schon korrekt ist...denke schon, solange bis ....was neues "kennenlerne"..
 
Hi !

Ich hatte doch zu Beginn gesagt, pack dein jetziges Programm erst mal an die Seite! ;)

Du schreibst jetzt quasi ganz neue Testprogramme für einzelne Bereiche!
Es ist daher auch egal, ob deine Variable in der ISR "Test" nun "Sekunde" oder "Karl_otto" heißt!

Du denkst schon wieder viel zu weit nach vorne und was du noch alles machen möchtest. Da sind wir aber noch gar nicht. ;)

Ich hatte dir eingangs den Hinweis gegeben mit "Flags" zu arbeiten.
Ein Flag ist also nur eine Variable von einem Bit!
Sie soll sich mit "1" oder "0" nur einen Zustand "merken".

Also ganz einfach so:
Code:
Dim Lcd_flag As Bit

So, jetzt bist du wieder dran!

Gruß,
Cassio
 
Hi !!!

Na endlich bin ich wieder zu Hause..war ein langer Tag...:(

Du hast recht, habe heute Vormittag viele Gedanken gehabt, wie ich das Programm neu aufbaue....

Ich dachte, bevor man anfängt zu programmieren, sollte man schon wissen, wie es aussehen sollte ( Konzept )..das ist normal....wen man*s kann

Dann habe ich schnell bemerkt, was Du gemeint hast. Erstmal sollte ich in "Blöcken" machen, also bessere Lerneffekte..Richtig ???

Ich werde dann diese Blöcke zum diskutieren hier posten, hoffe dass es nicht nur ein Dialog wird !! und viele Anfänger es gleich mitlesen und daraus auch lernen

Was würdest Du sagen um einen neuen Thread aufmachen "Schritt für Schrit programmieren lernen ???? Du hast bestimmte der nötige Know How...und das Projekt Uhr schon garnichtmal so schlimm, weil man vieles in dem Projekt gleich umsetzen kann.Denke an alle meine Ideen...

Morgen werde ich dann mehr über das Umsetzen schreiben...

THX !!!
 
Hallo !

Lerneffekt hin oder her.....
Es geht mir eigentlich nur darum, dass du in relativ kurzer Zeit einen "Aha-Effekt" bekommst.

Das Prinzip von Programmen ist oft das Gleiche und darum möchte ich dir nur mal ein paar Tipps geben.
Wir "stricken" hier kein neues Programm am Stück.... da kommst du dann mit der Zeit allein drauf und kannst es selbst ändern bzw. erweitern.

Du hast ja selber schon bemerkt, dass meistens die kniffligen Probleme im Detail liegen. Denken wir nur mal an den "Alarm-Aus" oder Snooze Taster. ;)

Ich bin mir aber sicher, dass du schon bald verstanden hast, wie ich das meine.

Viel Spaß weiterhin,
Cassio
 
Hi...

Du hattest mal gesagt :
"Du schreibst jetzt quasi ganz neue Testprogramme für einzelne Bereiche!"


okay..super gerne und ich sollte dann hier posten...wenn ich Dich richtig verstanden habe...
 
Hi !

Ja, genau!

So sieht das aus.
Immer nur kleine Programme schreiben.
Manchmal wirst du aber auch ein vorhandenes Programm erweitern können. ;)

Wir stehen nun aber immer noch bei der ersten Aufgabenstellung mit der LCD-Ausgabe. :cool:

Vielleicht hast du ja morgen mal einen Ansatz für mich......
Bitte nicht vergessen hier erst mal immer den gesamten Code zu posten.

Gruß,
Cassio
 
Guten Morgen Cassio,

nun schauen wir mal was Du "ausgedacht" hast mit Flags. bevor ich irgendwelche Codes tippe, schreibe mal was ich im Vorfeld gedacht habe.

Also ein Flag hat 2 Zustände, 0 oder 1.

So, was kann damit machen wenn es, wie in der "Aufgabenstellung" um die LCd Ansteuerung ging..:rolleyes:

Variante 1 : Mit dem Flag triggert S1, was auf die Anzeige kommt.hochzählen..Hat es einen Sinn ? nein...

Variante 2 : Mit dem Flag sprigen wir in die Routine

Code:
do 
  if flag = 1 then
    Gosub Uhrzeit
    Flag = 0
  end if
loop

Variante 3 : dadurch, dass es nur ein Flag byte ist belegt weniger speicher...ich denke mann könnte einfacher zälen ???

Code:
Dim Sec As Byte
Do
if Sec=60 then Sec=0
Locate x,y
Lcd Sec
Wait 1
Cls
Sec = Sec + 1
Loop

Die Frage ist noch, ob es einen Sinn macht ein extra Sub machen ?
( LCd flackert evtl ? )

Code:
Do
If Sec = 60 Then Sec = 0
Gosub Display
Sec = Sec + 1
Loop
'----------------------------------------------------------------

Display: 
Locate 1 , 1 'Löschen
Lcd Space(10)
'Neuen Wert schreiben
Locate 1 , 1
Lcd Sec
Return
 
Hallo sulawesi!

Also ich bin schon ein wenig enttäuscht.....
Vielleicht drücke ich mich aber auch nur falsch aus, oder ich sollte es mal mit Englisch versuchen. :hmmmm:

Scheinbar hast du immer noch nicht verstanden, was ich eigentlich möchte.....
Dann noch mal zum mitschreiben.... und diesmal gebe ich die Angaben vor!

Du erstellst ein neues Programm mit dem Namen: Bascom_unit_1.bas !
Im dem Programm gibt es einen Timerinterrupt, der jede Sekunde eine Subroutine (Name = Timer_isr) aufruft.

In der Sub wird dann eine Variable (Name = Zaehler1) immer um eins erhöht!

Die Ausgabe der Variable "Zaehler1" erfolgt via LCD, in der ersten Zeile beim ersten Segment!

Soweit so gut....

Nun kommt der knifflige Teil der Aufgabe.
Die Anzeige soll nur dann aktualisiert werden, wenn die Variable "Zaehler1" einen neuen Wert enthält.
Ansonsten passiert gar nichts!

Hoffe jetzt, dass es nun klar geworden ist!


Ich möchte also keine Überlegungen was wieviel Speicher verbraucht.....
wie oft das Programm hin und her springen muss......
ob irgend etwas beim Wert "60" auf Null gesetzt werden muss....
oder was weiß ich nicht noch alles!

Ich hätte nichts weiter gern, als eine funktionierende Lösung! ;)



Ach so..... nur mal nebenbei:
Wenn du nur ein Bit verwendest, wird trotzdem ein Byte im Speicher reserviert!
Allerdings werden weitere einzelne Bits in das Byte gepackt, bis es voll ist.
Es spielt also keine Rolle, ob du im Programm nur ein Bit für ein Flag verwendest, oder 8 Flags!
Der Speicherverbrauch ist der Gleiche!

So, nun aber ran an die Arbeit.... ;)
Cassio
 
Habe etwas länger gabraucht...bin noch bei der Arbeit..hoffe daß meine Logik passt...

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

   Dim Zaehler1 As Byte                                     'Der Zähler
   Dim Flag_zaehler As Byte                                 'Der "Merker"
   Dim Sekunde As String * 2                                'Ausgabe
   Cls

   Config Timer1 = Timer , Prescale = 256                   'Timer
   On Timer1 Timer_isr                                      'Springe zu Sub
   Enable Timer1
   Timer1 = 3035
   Enable Interrupts


   Sekunde = Str(zaehler1)                                  'Formatfunktion für die Ausgabe
   Sekunde = Format(sekunde , "00")

   Flag_zaehler = 0                                         ' Setze auf Null damit man sehen kann ob  er verändert wurde

   Do
   If Flag_zaehler = 1 Then                                 'Wenn das Flag  durch den Timer geändert wurde dann
   Locate 1 , 1
   Lcd Sekunde                                              'Ausgabe
   End If                                                   'Raus
   Loop                                                     'widerholen

   'Submenu
    Timer_isr:
    Incr Zaehler1
    Timer1 = 3036
    Flag_zaehler = 1                                        'Beim zählen Variable auf 1
    Return

So sehr schwierig wars letztendlich nicht im Sub ticke ich den Flag_zähler an
 
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)