Bascom Uhr, erste Schritte, Fragen und Probleme

Status
Für weitere Antworten geschlossen.
Hallo !

Wie wäre es in der ISR mit :


CodeBox bascom

Test:
Stop Timer1
Incr Sekunde

Timer1 = 3036
Start Timer1
Return



Mal abgesehen davon, was das Timertool errechnet hat.
Von Hand würde ich sagen:
Prescaler x Timerbreite
---------------------- = Überlaufzeit
Systemtakt

Bei meinem Vorschlag von 64 wäre es dann:
64 x 65536
----------- = 0,262144 sec. also 262,144ms
16.000.000

Das muss ja viel zu schnell sein!
Was rechnet die Software denn da aus? :hmmmm:


Ergo ist deine 256 die richtige Wahl gewesen, denn:
256 x 65536
------------ = 1,048576 sec.
16.000.000

Die Sekunde dauert also "nur" 48,576ms zu lange!
Dies musst du nun noch ändern.

Wenn du 1,048576 / 65536 rechnest, hast du die Zeitspanne eines Timerbits, also 0,000016 sec.

Demnach brauch Timer1 für eine Sekunde: 1 / 0,000016 = 62500 bits
Bleibt also der "Restwert" zum laden des Timers mit 3036!

Daher war dein alter Timerwert absolut richtig!!!
Warum die Software nun etwas völlig anderes ausgerechnet hat? :hmmmm:
OK, lassen wir das!

Wenn deine Uhr nun zu langsam ist, dann lade deinen Timer1 doch einfach mit einem höheren Wert.
Allerdings ist das auch nur eine Notlösung. ;)

Gruß,
Cassio
 
Danke Cassio...( Die Frage noch wie genau sind 16 MHz ???? Also ich werde es mit meinem DCF vergleichen...

Wie wöre die Lösung an XTAL1 eine TCXO anzuschliessen ?

Versteh...so langsam, werde noch ein bisschen Tüfteln und rechnen..

Es gibt was neues auf dem Simulator Front...

habe einfach mal gestartet, LCD im Simulator war leer....

nach ca 10 Min..stand im Display : Aktuelle Uhreit / 00:00:00 und im Hintergrund läuft "etwas"

aber die Uhrzeit ändert sich nicht...Ist es normal ?
 
Hallo Cassio,

Warum die Software nun etwas völlig anderes ausgerechnet hat? :hmmmm:

ich habe den Thread nicht ganz mitverfolgt, aber die Software hat das selbe raus, siehe Anhang.

Grüße,
Dirk
 

Anhänge

  • timercalculator.png
    timercalculator.png
    19 KB · Aufrufe: 25
ich habe den Thread nicht ganz mitverfolgt, aber die Software hat das selbe raus, siehe Anhang.

Hi Dirk!

Natürlich bekommt sie das Selbe raus....... :adore:
Wenn der Fehler aber wieder mal VOR der Tastatur sitzt, kann ja auch nur Unsinn rauskommen. ;)

Ich muss den Wert in der Software ja auch in µS eingeben..... und nicht in mS!
Dann klappt es auch mit dem Nachbarn. :)

Sorry, ich rechne sonst immer mit der Hand.... weil es nun mal schnell gehen sollte, habe ich die Software genommen...... und nicht richtig hingeschaut.

Dann bin ich ja froh, dass ich auf manuellen Wege wenigstens richtig gerechnet habe. ;)

Danke Dirk :flowers:
Cassio
 
Hi
Ich versteh da nicht so ganz eure Ansätze, tut mir leid. Es scheint mir, das Dirk bisher auch auf den richtigen Ansatz getippt hat, den Compair-dingsbums-Interrupt. Das ist auch der, den ich in der Assemblerroutine verwende. Der Prescaler wird auf 8 gesetzt, das ist der einzige Prescaler, der aus 16MHz saubere 2000MHz macht. Setzt du in die ISR einen Zähler, der die Interrupts zählt, dann fragst du einfach ab, ob du 2000 erreicht hast. Das ist dann 1 Millisekunde. Wenn BASCOM da automatisch alle Register sichert, nun , schau doch mal nach, ob du diese Routine nicht als Inline Assembler in dein Programm bekommst.
Natürlich kann man auch mit anderen Prescalern arbeiten, dann kommen halt krumme Zahlen raus. Der Rechenaufwand für den Abgleich ist ungleich höher, als wenn du mit ganzen Zahlen rechnen kannst. Also Integer-Bereich. 2000 lassen sich binär abbilden, 1,25 auch, aber mit wesentlich mehr Aufwand. Das Schöne: in Bascom bekommst du das gar nicht mit........
(Das ist übrigends auch ein Grund, warum ich Assembler auf einem Controller bevorzuge.)
Hier noch mal meine kleine Assemblerroutine:
Sie liefert in dieser Form ein Signal jede ms. Damit kannst du sogar kleine Tasks laufen lassen.... und alles sieht schön gleichmäßig aus.
Nur mal so zur Info:
1 MHz sind 1/16 000 000 Sek. Wenn 1 Befehl im Durchschnitt 2 Takte benötigt, dann dauert ein Befehl 1/8 000 000 Sek also rd. 125 pS
Das sind 8000 Befehle pro ms ! Selbst wenn Bascom alle Register sichert (32 beim ATMEGA 8 + Statusregister rd. 80 Befehle für Pushen und POPen), so bleiben immer noch 7920 Befehle bis zum Eintreffen des nächsten Interruptes....
Gruß oldmax
 
Guten Morgen,
Hi
Ich versteh da nicht so ganz eure Ansätze, tut mir leid. Es scheint mir, das Dirk bisher auch auf den richtigen Ansatz getippt hat, den Compair-dingsbums-Interrupt.

also auf den Ansatz habe ich nicht getippt. Beschrieben ist alles in diesem Thread.

Es gibt zwei Lösungen:
  1. Timeroverflow-Interrupt
  2. Compare-Interrupt
Bei dem Timeroverlow-Interrupt muss man in der Interruptserviceroutine den Timer nachladen, also mit dem Startwert initialisieren. Das Problem ist, dass man in einer Hochsprache nicht genau weiß, welche Zeit man zwischen Interruptevent und nachladen des Timers hat, dieses muss man nämlich berücksichtigen. Für reine Tasksteuerung ist es aber normalerweise ausreichend, wenn man diese Verzögerungszeit vernachlässigt.

Bei dem Compare-Interrupt startet der Timer grundsätlich von 0x0000 an und läuft bis zum Comparewert der im Compare-Register steht. Beim Compare-Ereignis wird der Timer automatisch auf 0x0000 gesetzt (nennt sich CTC-Mode, Clear Timer on Compare) und der Interrupt wird ausgelöst, man braucht hier also nichts nachladen.

Nun muss man schauen, welchen Prescaler man verwendet. Nicht jeder Mikrocontroller hat alle 2 hoch n Prescaler, da muss man eben drauf achten. Auch muss man schauen, ob ein 16Bit Timer frei ist oder nur noch ein 8Bit Timer.

Im Anhang sind mal zwei Berechnungen für fosc=16MHz, Event=1s, 16Bit Timer.

Ich würde im aktuellen Projekt erst einmal den Overflow-Interrupt verwenden und das Programm zum laufen bringen. Wenn alles funktioniert, kann man ja das Programm verbessern und den Compare-Interrupt verwenden. Wie auch immer, für eine Uhrsteuertung würde ich TOSC mit 32,768kHz verwenden, den TOSC muss natürlich der Mikrocontroller haben :)

Grüße,
Dirk
 

Anhänge

  • timercalculator_overflow.png
    timercalculator_overflow.png
    18,8 KB · Aufrufe: 11
  • timercalculator_compare.png
    timercalculator_compare.png
    18,2 KB · Aufrufe: 10
@Dirk, habe "noch " nicht ganz verstanden was Du gemeint hast.

Ich möchte mich bei allen sehr bedanken für die nette Unterstüzung bei meiner ersten Bascon Schritten !!!
 
Moin zusammen!

Was den Weg der Genauigkeit und die Verarbeitungsgeschwindigkeit betrifft, kann ich Oldmax und Dirk nur recht geben.

Ich bin mir aber nicht sicher, ob das der richtige Weg für ein Anfänger ist. :hmmmm:
Darum werde ich da auch nicht drauf eingehen. ;)

Letztlich kann man es auch drehen und wenden wie man möchte...
Selbst mit einem Uhrenquarz läuft meine alte Uhr in 8 Wochen locker zwei Minuten zu langsam. :rolleyes:
Ergo: Wenn es denn immer ganz genau sein soll, nimmt man doch besser ein DCF77-Modul. ;)


Ich sehe die momentane Programmiererei und Rechnerei auch nur als Übung für sulawesi.
Nun auch noch gleich von Hand mit Registern oder ASM-Routinen zu arbeiten halte ich persönlich für den zweiten Schritt vor dem Ersten.

Gruß,
Cassio
 
Hallo Sulawesi,
@Dirk, habe "noch " nicht ganz verstanden was Du gemeint hast.

mach es einfach so wie bisher, mit dem Timeroverflow-Interrupt, ich wollte dich nun auch nicht durcheinander bringen.


Ich bin mir aber nicht sicher, ob das der richtige Weg für ein Anfänger ist. :hmmmm:

Da gebe ich dir schon recht ... aber: wenn man sich beide Möglichkeiten mal ansieht, die Comparelösung ist eigentlich verständlicher, der Timer läuft von 0 bis zum Punkt A, dann gibt es einen Interrupt und er wird auf 0 zurückgesetzt, einfacher geht es nicht, selbst die Berechnung von Punkt A ist einfacher (man spart sich hier eine Subtraktion von 65535 :eek: ;)). Vielleicht ziehen viele die Overflow-Lösung der Compare-Lösung vor, da die Compare-Lösung bei Bascom nicht richtig unterstützt wird und man hier Register direkt beschreiben muss?!

Gruß,
Dirk
 
Hi
@Cassio
Über Assembler kann man geteilter Meinung sein, sicherlich werde ich kein PC -Programm in Assembler favorisieren. Bei den Controllern sieht's anders aus. Klinkt man mal das "schwere" Wort "Register" aus und setzt dafür "Speicherzelle mit besonderen Fähigkeiten" wird's vielleicht etwas verständlicher. Ein Basic Befehl A=200 entspricht einem LDI Register, 200
Wenn man lernt, ein "LD" als Load zu sprechen, "ST" als Store, verliert Assembler irgendwann einmal den Schrecken. Ich programmiere nur zum Spaß und habe mir Assembler, Basic und Pascal selbst beigebracht. Schau dir mal Open_Eye an, das war in 3 Tagen soweit fertig. Gelernt habe ich "Elektriker" oder anders "Strippenzieher"
Sicherlich liegen viele Tage zwischen damals und heute, aber ich persönlich halte Assembler nicht für schwieriger wie Basic. Viel wichtiger ist für einen Anfänger zu begreifen, hier ist ein Controller. Denn, berichtigt mich, wenn ich falsch liege, bei einem PC interessiert für die Funktionalität den Anwender nicht die Hardware, bei einem Controller ist dies das A und O. Also auch, was ein Register ist. Was früher mit einem enormen Aufwand an Elektronik aufgebaut wurde, erledigt ein einziger IC mit etwas drumrum. Die Minimalbeschaltung : ein paar LED und Taster, sowie eine Batterie, fertig. Das ist auch der Grund, warum die Controllertechnik so interessant ist.
Ich lese sehr häufig, das selbst das Wissen um einen Stromkreis nicht vorhanden ist, aber mit Controllern spielen wollen. Kann man machen, doch Erfolg ist nur jenem Beschert, der ein wenig über Grundwissen verfügt. Man braucht keinen Doktor oder Ing.-Titel. Und das möchte ich Sulawesi mit auf den Weg geben. Wenn der Timer-Compare Interrupt auch in Basic umsetzbar ist, dann sollte das auch gemacht werden. Und bevor eine Genauigkeit einer DCF - SChaltung hier besprochen wird, sollten doch erst die Grundlagen dafür geschaffen werden. Du sagst ja selbst, das ein Anfänger in deinen Augen mit Assembler überfordert ist. Sicher gibt's fertige Proramme, aber C&P hilft leider nicht beim Lernen.
Gruß oldmax
 
Vielleicht ziehen viele die Overflow-Lösung der Compare-Lösung vor, da die Compare-Lösung bei Bascom nicht richtig unterstützt wird und man hier Register direkt beschreiben muss?!

Hallo Dirk!

Genauso sieht das aus! ;)

In BASCOM kannst du mit Bordmitteln einen OVFL der Timer erzeugen.
Möchtest du aber den Compare-Interrupt benutzen, geht das nur mit direkten Anweisungen (anderes ist mir nicht bekannt).

Sicher gebe ich Oldmax recht dass man die Grundlagen kennen sollte, weil dann alles andere einfacher und verständlicher wird.
Das Problem ist nur, dass der Weg zum Ziel weit aus länger dauert. ;)

Wenn jemand beruflich Mikrocontroller programmieren möchte, ist das die sinnvollste Variante um später auch Erfolg zu haben.
Da wohl die Meisten dies hier aber nur als Hobby machen, möchte man auch schneller zum Ziel kommen.
BASCOM bietet einem die Möglichkeit seine Ziele schneller zu erreichen, weil es einfacher zu verstehen und anzuwenden ist.
Desweiteren hat man später in BASCOM immer noch die Möglichkeit, auch direkt z.B. die AVR-Register anzusprechen.
Gerade zu Beginn wird man aber wohl nur mit den Bordmitteln arbeiten!


Nun ja und wie wir alle wissen......
Habe ich erst einmal etwas selbst gemacht und begriffen, dann ist es natürlich alles gaaaaanz einfach. ;)

Gruß,
Cassio
 
Hallo!

Meiner Meinung nach kann man mit Bascom die Compare
genauso einfach handhaben wie zum Beispiel einen Overflow IRQ.
(einfach mal die Hilfe bemühen)

Ich hab mir einen Servotester mit Compare Interrupts gebaut, und alles
mit Bascom Boardmitteln, ohne direkte Registerzuweisungen.

Also sollte auch eine Uhr so zu realisieren sein.

Auch ich bin mit Cassio einer Meinung: Die Comparegeschichte ist der zweite
Schritt!

MfG
caargoo
 
Bascom Fragen zum Thema LCD Uhr

Ich dachte, ich mach mal einen "eigenen" Thread für dieses Projekt auf, bevor ich das Board an dieverse stellen zumülle..:)

Nun es geht mit dem Projekt weiter..nach dem die Uhr schon super läuft. Ich habe gerade ein bisschen mit Sound beschäftig. Hintergrund, daß ich noch eine Alarmfunktion über Menü machen möchte.

Also als erstes habe ich mit fixen Werten etwas probiert um meine Kenntnisse was subs anbelangt zu festigen...leider taucht das nächste Problem auf.

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


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

$baud = 9600
$regfile "m8def.dat"
$crystal = 16000000
Config Lcd = 16 * 2
Dim Sekunde As Word
Dim Minute As Word
Dim Stunde As Word
Dim S1 As String * 2
Dim S2 As String * 2
Dim S3 As String * 2
Config Portc.5 = Output
Speaker Alias Portc.5
Dim Alarm As Byte

'Minuten Einstellen
Config Pind.2 = Input
Portd.2 = 1
Taster0 Alias Pind.2

'Stunden Einstellen
Config Pind.3 = Input
Portd.3 = 1
Taster1 Alias Pind.3


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

'------------ Uhr Voreinstellung ----------------------------------------------
Sekunde = 0
Minute = 0
Stunde = 0

Cls
Do
                                                         ' Display löschen

'-------------------- Formatkonvertierung für Uhrzeit -------------------------

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"
Cursor Off Noblink
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 Taster0 = 0 Then
   Waitms 50
   Incr Stunde
 End If
 '--------------Uhr einstellen Stunde -----------------------------------------
If Taster1 = 0 Then
   Waitms 50
   Incr Minute
End If
'--------Uhr komplett auf Null stellen ----------------------------------------
If Taster0 = 0 And Taster1 = 0 Then
   Sekunde = 0
   Minute = 0
   Stunde = 0
   Waitms 50



End If
'------------------------------------------------------------------------------

If Sekunde = 10 And Minute = 01 Then
   Gosub Alarm
   Else
   End If
 Loop

   End

Test:
Incr Sekunde
Timer1 = 3036

Alarm:
   Sound Speaker , 124 , 675
   Sound Speaker , 110 , 758
   Sound Speaker , 248 , 675
Return

Wenn 1 Min und 10 sec erreicht sind, dann soll das Program zum SUB Alarm springen und den Ton abspielen..

Problem, er spielt die Töne ständig...Warum wenn es eine IF Bedinung gibt ?

Klaro so geht..aber nicht "sauber"

Code:
If Sekunde = 10 And Minute = 01 Then
   Sound Speaker , 124 , 675
   Sound Speaker , 110 , 758
   Sound Speaker , 248 , 675
   End If
 Loop
 
Hi
Sorry, wenn ich mal etwas aus dem Zusammenhang nehme...
Das Problem ist nur, dass der Weg zum Ziel weit aus länger dauert. ;)

Ich halte diese Einstellung für falsch. Der Weg dauert nicht wirklich länger, das Problem ist, das die gedankliche Sperre bremst. Und ihr seid kräftig dabei, an dieser Bremse zu ziehen. Assembler hab ich eigentlich nie richtig programmiert. Die ersten Schritte waren aus Tabellen Hex-Codes in Inline-Anweisungen eines Pascal-Programmes zu setzen. Ich wollte halt, das die Verschiebung des Bildschriminhaltes etwas flotter ging...
Mittlerweile ist in den Pascalcomilern ja ein Assembler eingebaut. Den hab ich dann in Turbo-Pascal schätzen gelernt, aber eben nur für gaaanz kleine Ruotinchen.
Es war dann lange Ruhe, bis mir vor ca. 2 Jahren die Controller in die Hände fielen.
Zurück zum Thema: Denkt mal dran, warum, um Gottes Willen, habt ihr in der Schule Mathe gelernt? Es gibt doch Rechner und die kosten noch nicht mal lächerliche 5 €. Warum habt ihr lesen und scheiben gelernt, es gibt doch die Telefonie. Alles Basiswissen, denn ohne dieses könnte ich hier jetzt keine dummen Sprüche klopfen...:)
Ne, mal im Ernst, redet sulawesi nicht ein, oh Gott, laß blos die Finger von Assembler oder der direkten Programmierung von Registern. Wenn ihr doch wißt, wie ein Timer Compare in Basic umgesetzt wird, zeigt ihm den Weg. Er hat nichts davon, das ihr der Meinung seid, das es geht, er möchte, das es geht. Ich bin auch ein Feind von C&P, das heiß aber nicht, das mal kleine Codeschnipsel mit etwas Kommentar versehen nicht sehr hilfreich ist. Damit wir uns nicht falsch verstehen, ich halte zwar für Controller Assembler als die richtige Grundlage, aber natürlich, wer es bevorzugt Basic oder C zu nutzen, bitte, no Problem. Die schwierigkeiten eigene Ideen in die Controller zu bringen liegen nicht an irgendeiner Software, sondern sind in den Köpfen der "Anfänger". Der Hinweis auf die Hilfe ist schonmal der richtige Weg. Kein Mensch kann auf Anhieb eine Programiersprache perfekt. Aber er muß den richtigen Weg finden. Warum meint ihr, gibt es verschiedene Arten von Scheifen...
Repeat, While, For ...von den ganz wilden Goto's ganz zu schweigen. Also, ein Timer-Compare ist nicht's wilderes, wie ein Timer -Overflow, allerdings muß er zwangsläufig ungenau sein, es sei denn, der Takt wird angepaßt. Ansonsten, es ist Wochenende...also seid schön fleißig.
Gruß oldmax
Gruß oldmax
 
Ein Problem mit CLS

Nun ich habe etwas weiter gemacht. Nun habe ich wieder ein Problem, bzw weiss ich nicht wie es lösen soll.

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 Portc.5 = Output
   Speaker Alias Portc.5

   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

   '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 Then
   Waitms 50
   Gosub Uhr

End If

If Taster1 = 0 Then
   Waitms 50
   Gosub Alarm
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 Taster2 = 0 Then
   Waitms 50
   Incr Stunde
 End If
 '--------------Uhr einstellen Stunde -----------------------------------------
If Taster3 = 0 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

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

Wenn Uhrzeit Modus gewählt wird, funzt alles perfekt. Wenn aber SUB Alarm
aufgerufen wird, habe ich folgendes Problem. Wenn ich kein CLS im Sub einfüge, bleiben die letzten 3 Buchstaben von "aktuelle Uhrezeit" stehen. Wenn CLS eingefügt wird, flimmert....ansonsten geht soweit alles gut.
Für einen Tipp wäre ich sehr dankbar !!

DEn Text mit Blanks auf 16 Zeichen auffüllen kann ich machen, das ist OK, aber ist eine saubere Lösung ?
 
Hallo,

also BASCOM ist für Anfänger eigentlich soweit die richtige Sprache um in die
Materie einzusteigen. Aber irgendwann ist dann die Zeit gekommen zu der
man über den Horizont hinaussehen muß und sich auf jeden Fall mal mit
Assembler beschäftigen sollte. Es macht manche Sachen wesentlich einfacher
die man in einer Hochsprache nur über viele Klimmzüge erledigen könnte.

Assembler ist nicht kompliziert ! Es ist nur eine etwas andere Philosophie der
Programmierung. Man muß ein paar Sachen dabei im Hinterkopf haben. Aber
sonst ist es eigentlich recht einfach. Wenn man es erst mal ein wenig versucht
hat wird man feststellen das es eine recht "schöne" Sprache ist mit der man
auf sehr einfache Weise komplizierte Probleme lösen kann. :D

Gruß
Dino
 
Hi,

Den Text mit Blanks auf 16 Zeichen auffüllen kann ich machen, das ist OK, aber ist eine saubere Lösung ?
das ist eine saubere Lösung. Das macht man auch bei Zahlenausgaben.
Wenn du zB ein Byte als Dezimalwert ausgeben willst dann füg bei der
Ausgabe 2 Leerzeichen an. Damit sind die Zahlen von 0...255 immer sauber
dargestellt. Das belastet den Prozessor auf jeden Fall weniger als wenn du
das LCD komplett löscht und alles neu darstellst.

Wie gesagt ... es ist keine Gigaherz-Kiste. Was funktioniert ist ok. Viele Wege
führen nach Rom. Du wirst bei den Atmels noch einiges an Kniffen kennenlernen
die ein Programm beschleugnigen können. Beim Sinclair ZX81 (Z80 mit 2,5MHz)
hat man zB auch nicht x^2 geschrieben sondern x*x . Also nicht quadriert
sondern multipliziert. Das hat weniger Prozessorzeit gekostet. Es gibt viele
solche Kunstgriffe um ein Programm zu beschleunigen. Bei nem Intel oder AMD
fällt so etwas nicht weiter auf. Die laufen mit um die 3GHz. Aber bei den
kleinen Atmels mußt du um jedes Byte und jede Microsekunde kämpfen.
Das ist es was den Spaß ausmacht. Man kann etwas machen was andere
eigentlich bei den begrenzten Ressourcen für unmöglich halten.

Gruß
Dino
 
Viel Dank Dino

ich mache jetzt mit dem Projekt noch weiter, ich bin noch zwar ein Anfänger mit 2 Wochen Bascom Erfahrung ( wirklich ) :eek: und habe gedacht, wenn alles fertig ist, werde ich noch Eaglepläne erstellen und als komplettes Projekt posten, vielleicht hat noch ein anderer Änfänger ähnliche Sachen vor, wobei wenn ich sehe womit schon die anderen sich beschäftigen ist es hier pilepale..
oder was meinst Du ?

Also Alarm geht super mit piepser, was ich noch machen will, eine LED blinken lassen eine Minute vor alarm, während diese Zeit kann man Tonalarm stoppen.
Ausgabe des Tonsignals will ich noch einstellbar machen...
 
Hi sulawesi,

ich bin noch zwar ein Anfänger mit 2 Wochen Bascom Erfahrung ( wirklich ) :eek:
...
wenn ich sehe womit schon die anderen sich beschäftigen ist es hier pilepale..
oder was meinst Du ?
was meinst du wohl wie ich angefangen habe ... :D
Kannst ja mal bei den Projekten nach dem Magierstab suchen. Das sind meine
Anfänge. Das Programm hat auch um die 2 Wochen gebraucht. Allerdings
wegen Vorbelastung in Assembler. Ist aber wohl vergleichbar.
Meine BASCOM-Anfänge hab ich hier auch drin (BASCOM lernen von Anfang an).

Gruß
Dino
 
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)