Bascom BASCOM ; Erste Schritte zum Ausprobieren

Ich habe es. Na gut, das formatieren für Stunde, Minute und Sekunden musste ich mir noch organisieren. Ansonsten habe ich den Ablauf, der ja immer von der Tick_1s Routine aus geht begriffen. Timer und Isr_oc2: war schon vorhanden, muss ich nicht jedes mal neu erfinden.


CodeBox BascomAVR
$regfile = "m8def.dat"                  'Controllerdefinitionsdatei einbinden
$crystal = 8000000                      'Systemtakt angeben (Baudrate)
$hwstack = 40                           'Stacks
$swstack = 16
$framesize = 32
Dim Count As Byte
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
' Aliase
Rot Alias Portd.7
Gruen Alias Portc.3
Blau Alias Portd.6
Key Alias Pind.5
'----------------------------------------------------------------------------
Sekunde = 00
Minute = 16
Stunde = 16
'----------------------------------------------------------------------------
Init:
   Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , _
   E = Portd.3 , Rs = Portd.2
   Config Lcd = 16 * 2
   Initlcd
   Cls
   Cursor Off
' 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
   Enable Interrupts
'----------------------------------------------------------------------------
Main:
   If Sekunde = 59 Then
      Sekunde = 0
      Incr Minute
   End If
   If Minute = 59 Then
      Minute = 0
      Incr Stunde
   End If
   If Stunde = 23 Then
      Stunde = 0
   End If
'----------------------------------------------------------------------------
   Home
   S1 = Str(stunde)
   S1 = Format(s1 , "00")
'----------------------------------------------------------------------------
   S2 = Str(minute)
   S2 = Format(s2 , "00")
'----------------------------------------------------------------------------
   S3 = Str(sekunde)
   S3 = Format(s3 , "00")
'----------------------------------------------------------------------------
   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 " Std. Min. Sek."
   Waitms 50
   Goto Main
'----------------------------------------------------------------------------
Isr_oc2:
   Incr Count
   If Count = 125 Then
      Count = 0
      Gosub Tick_1s
   End If
Return
'----------------------------------------------------------------------------
Tick_1s:
   Incr Sekunde
Return
 
Soweit so gut.
Nur haste den Hund jetzt so fest getreten dass er verschwunden ist. Idle hat er mit genommen.
38-48 hätt ich noch in Tick_1s rein genommen, das frisst nicht viel. Nur der LCD Kram gehört da nicht rein.

Und lass mich raten, Sekunde 59 siehst du nicht sonderlich lange, oder? ;)
Wenn ich mich nicht gewaltig vertue müsste deine Uhr jede Minute um eine Sekunde abdriften.
 
jede Minute um eine Sekunde abdriften.
Da kannst du Recht. Für's Erste war ich erst einmal zufrieden. Jetzt kommen die Feinheiten. Das wäre nun der Wachhund, Idle und natürlich die Genauigkeit. Wie aber Genauigkeit hinbekommen, wenn kein Uhrenquarz vorhanden ist. Dann fehlt auch noch das Stellen der Uhr. Und weil ich das Display auf einer Platine fest verdrahtet habe, mit nur einen Taster an B0, wird es jetzt kompliziert (Mehrfachverwendung von einem Taster).
 
Das RC Glid ist nicht so genau, aber es geht einigermaßen. Du liegst aber immer genau eine Sekunde daneben. Du machst nämlich genau das was ich befürchtet habe.
59 vs. 60. Hatten wir heut Morgen ;)
Das warum überlasse ich dir.

Stellen der Uhr hatten wir auch schon (lang / kurz). Kurz: Sprung Sekunden - Minuten - Stunden - Normalbetrieb. Lang: hochzählen. Nicht so optimal, geht aber.
 
Du machst nämlich genau das was ich befürchtet habe.
59 vs. 60
Ja, deine Befürchtung war richtig. Habe falsch gedacht, von 59 auf 00 muss es umschalten. Macht es auch, wenn ich 60 einstelle und jetzt geht die Uhr bloß noch 23 Sekunden / Stunde vor. Sind allerdings immer noch zu viel, 9 Minuten / Tag. Kann man das auch noch ausgleichen?
 
Denk mal drüber nach.
Du warst konsequent, der selbe Fehler ist 3x im Code.

Begründung: (versuch aber erst mal selbst drauf zu kommen)
Noch ist es ja ohne Watchdog / Idle. Also arbeitet der Chip deine Main Loop so schnell er kann immer und immer wieder ab. Selbst mit Watchdog und Idle würde sie 1x alle 8mS abgearbeitet werden. Warum alle 8mS?
Weil Timer2 alle 8mS einen Interrupt generiert und somit Idle unterbricht. 1 / (8.000.000 cpuclk / 256 prescaler / 249 CTC Max). Deswegen musst du auch bis 60 zählen, da dein Überlauf nahezu sofort eintritt, halt schon bei 59, was eins zu wenig ist.Das betrifft nicht nur Sekunden sondern auch Minuten und Stunden.

Bau aber bitte mal wieder WD und Idle ein. Gehört sich einfach so.
Du würdest es auch nicht so toll finden wenn du am PC Notepad öffnest, was eigentlich gar nichts macht, aber trotzdem 100% CPU Last frisst ;)

Optimierung (erst wenn alles Obrige geht und du verstanden hast warum!):
Das Display hat ja irgendeine Art von Enable Signal. Daran müsstest du ja mittels einer LED sehen können wie oft es beschrieben wird (nur zum Ansehen / Testen). Aktuell wird sie fast dauerhaft leuchten. Macht aber gar keinen Sinn das Display so oft zu überschreiben. Sinn würde es nur machen, wenn es "dreckig" ist (heißt im Programmier-Jargon wirklich so), sprich wenn sich der Inhalt ändert. Wann ändert sich der Inhalt? Aktuell nur in Tick_1s. Wäre ja eleganter das Display nur mit Daten zu versorgen wenn es "dreckig" ist, also aktualisiert werden muss. Nur wie?
Du könntest eine Variable definieren die du in Tick_1S setzt. In der Main Loop fragst du diese ab. Wenn gesetzt, dann LCD neu zeichnen und zurück setzen, sonst nichts machen. Diese Variable könnte z.B. ein Byte sein.
Ja, es gibt auch in Bascom Bit oder Bool(ean), wie auch immer genannt. Aber allzu häufig wird so für jedes Bit ein ganzes Byte ver(sch)wendet). Ich nenne es häufig IRQ (=Interrupt Request, Hier: Anfrage vom Interrupt an die Main Loop), da es dem am nähsten kommt. Hier könntest du auch wie gewohnt auf die Bits zugreifen. If IRQ.0 = 1 Then dann dein LCD Code, dann IRQ.0 = 0 zum zurück setzen. In der Tick_1S IRQ.0 = 1.
IRQ Bit 0 würde somit besagen dass das Display neu gezeichnet werden muss, der Inhalt hat sich verändert. Für andere Aufgaben hättest du noch 7 weitere Bits frei; jetzt noch ungenutzt.
Schlussendlich dürfte das LCD Enable nur noch kurz im Sekundentakt blinken.

So, fürs Erste genug Aufgaben glaub ich ;)
 
Aber allzu häufig wird so für jedes Bit ein ganzes Byte ver(sch)wendet)
Bitvariablen werden logischerweise in Bytes abgespeichert, der SRAM der AVR ist ja bytebasiert. Bascom faßt aber mehrere Bitvariablen in einem (bzw mehreren wenn nötig) Byte(s) zusammen.
Kehrseite der Medaille ist, daß die anderen Bits beim Zugriff berücksichtigt werden müssen, der Zugruff ist nicht mehr atomar.
(Für den hardwarenahen Programmierer sind hier die GPIOR interessant, da sie oft direct Bit accesible sind - sollten sich eigentlich auch unter Bascom gut verwenden lassen...)

Kurze Erklärung für Heini:
Der Arbeitsspeicher (SRAM) der AVR ist in Bytes (also 8-Bit-breit) organisiert.
Es wird also immer auf das ganze Byte zugegriffen - gelesen/gespeichert.

Natürlich können mehrere kleinere Variablen (zwei Nibbles (je 4 Bit breit) oder acht Bits (je ein Bit breit)) in einem Byte abgelegt werden (ist ja nicht unbegrenzt SRAM vorhanden), aber wenn nur eine dieser Teilvariablen geändert/geschrieben werden soll, muß automatisch das ganze Byte beschrieben werden. Da sich aber die anderen Teilvariablen nicht ändern sollen, muß erst das ganze Byte gelesen werden, dann die Änderung in den entsprechenden Bits vorgenommen werden, und anschließend das ganze Byte zurückgeschrieben werden.
Das sind mehrere Operationen. (nicht atomar, sondern mehr als ein Schritt).
Um den Ablauf (Lesen-Modifizieren-Schreiben) kümmert Bascom sich, aber zur Laufzeit kann (zufällig) zwischen den Einzelschritten ein Interrupt zuschlagen, und wenn da jetzt eines der Bits geändert werden soll, aber nach dem IRQ der alte Wert wieder drübergeschrieben wird, kommts zu schwer nachzuvollziehenden Fehlern.
 
Bitvariablen werden logischerweise in Bytes abgespeichert, der SRAM der AVR ist ja bytebasiert. Bascom faßt aber mehrere Bitvariablen in einem (bzw mehreren wenn nötig) Byte(s) zusammen.
Genau hier bin ich mir nicht sicher.
PC-Seitig ist ein Boolean immer so breit wie die CPU, also 64 oder 32 Bit (oder antiquiert 16, wenn man noch an DOS und QBasic denkt).

Ist jetzt aber für Heini egal, der Chip hat mehr als genug Speicher in Reserve :)
 
Ist jetzt aber für Heini egal
Na Gott sei Dank! Das klingt mir alles schon wieder zu kompliziert. Interrupt Request (IRQ) kann ich nichts finden. Habe es trotzdem geändert, um zu sehen, was sich ändert -> nicht viel. Hier noch einmal der Code.

CodeBox BascomAVR
$regfile = "m8def.dat"                  'Controllerdefinitionsdatei einbinden
$crystal = 8000000                      'Systemtakt angeben (Baudrate)
$hwstack = 40                           'Stacks
$swstack = 16
$framesize = 32
Dim Count As Byte
Dim Sekunde As Word
Dim Minute As Word
Dim Stunde As Word
Dim Irq As Byte
Dim S1 As String * 2
Dim S2 As String * 2
Dim S3 As String * 2
' Aliase
Rot Alias Portd.7
Gruen Alias Portc.3
Blau Alias Portd.6
Key Alias Pind.5
'----------------------------------------------------------------------------
Sekunde = 00
Minute = 33
Stunde = 08
'----------------------------------------------------------------------------
Init:
   Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , _
   E = Portd.3 , Rs = Portd.2
   Config Lcd = 16 * 2
   Initlcd
   Cls
   Cursor Off
' 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
   Config Watchdog = 2048
   Start Watchdog
   Enable Interrupts
'----------------------------------------------------------------------------
Main:
   Config Powermode = Idle
   Reset Watchdog
'----------------------------------------------------------------------------
   If Irq.0 = 1 Then
      Home
      S1 = Str(stunde)
      S1 = Format(s1 , "00")
'----------------------------------------------------------------------------
      S2 = Str(minute)
      S2 = Format(s2 , "00")
'----------------------------------------------------------------------------
      S3 = Str(sekunde)
      S3 = Format(s3 , "00")
'----------------------------------------------------------------------------
      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 " Std. Min. Sek."
      Waitms 50
      Irq.0 = 0
   End If
   Goto Main
   End
'----------------------------------------------------------------------------
Isr_oc2:
   Incr Count
   If Count = 125 Then
      Count = 0
      Gosub Tick_1s
   End If
Return
'----------------------------------------------------------------------------
Tick_1s:
   Irq.0 = 1
   Incr Sekunde
   If Sekunde = 60 Then
      Sekunde = 0
      Incr Minute
   End If
   If Minute = 60 Then
      Minute = 0
      Incr Stunde
   Endnig If
   If Stunde = 24 Then
      Stunde = 0
   End If
Return

1 / (8.000.000 cpuclk / 256 prescaler / 249 CTC Max)
Ergibt 0,007968 Sekunden, bei 1 / (8.000.000 cpuclk / 256 prescaler / 250 CTC Max) -> 0,008 Sekunden (8ms). Also warum 249, obwohl 250 auch nichts ändert.
Hat sich erledigt, gerade noch mal nachgelesen und überlegt.

Kann ja sein, dass ich das IRQ falsch gesetzt habe. Deshalb auch noch einmal der Code. Denn irgendwie sieht es eben blöd aus, wenn die Uhrzeit früh am Morgen einige Minuten abweicht.
Ja, If Sekunde = 60 Then (ist richtig) habe ich gedacht 0 bis 60 = 61. Aber die Anzeige springt tatsächlich von 59 auf 00. Hätte ich nicht gedacht. Aber das IRQ verstehe ich nicht und warum irq.0?
 
Der Name ist eigentlich auch nicht richtig, kommt dem Gängigsten aber am Nähesten.
Zu IRQ lies mal das hier:
Das ist zwar für PC, aber es gibt extrem viele Analogien zu Microcontrollern.

Das was beim PC der IRQ ist, ist beim Microcontroller eigentlich die Interrupt Vektor Tabelle (hatten wir mal angeschnitten). In Bascom halt das OnTimer2, OnADC, ... bzw. wie auch immer du sie im On Befehl benannt hast. Wobei auch dieser Vergleich etwas hinkt, das würde aber zu tief in's Detail gehen.

Ich nutze eine Variable namens IRQ worin ich speicher dass ein gewisser Interrupt ausgeführt wurde und Nachbearbeitung innerhalb der Main braucht, wie Aktualisieren des Displays, Senden oder Empfangen von größeren Daten per UART, ... sowas. Innerhalb des Interrupts an sich mache ich nur Zeitkritische Aufgaben oder Dinge die schnell erledigt sind, damit der Chip schnell wieder für andere Interrupts frei ist. Alles sonst nur in der Main. Aber die Main muss ja wissen was sie tun soll. Im Idealfall nichts, also Hund treten und weiter schlafen.

Warum IRQ.0... Du könntest auch Bit 2 oder 5 oder 7 nehmen, ich fange unten an zu zählen. IRQ ist ein Byte, Statusbyte wenn man so will, wovon du aber jetzt nur ein Bit benötigst, die anderen sind frei. Aber vielleicht möchtest du ja auch noch per ADC die Temperatur o. Ä. messen. Das könnte dann z. B. IRQ.1 sein, wenn ein neuer Messwert vorliegt. An sich frei vergeben, es gibt keine Norm für sowas, außer du machst dir selber eine.

Zum Aussehen:
Also, 41, 42 (WDR, Idle) würde ich erst nach getaner Arbeit setzen, also kurz vor Goto Main.
82 ebenfalls kurz vor Return.
Das ist aber rein optisch, es ändert an der Funktionalität nichts nennenswertes, es sollte so gehen.
Ich sehe so aber keine Fehler mehr im Code.

Hast du mal ne LED an E (PinD.3) gehängt? Da solltest du den Unterschied sehen zwischen jetzt und wenn du noch mal alle IRQ Befehle auskommentierst.

Nutzt du einen externen Quarz oder das interne RC Glied? Das steht nicht im Quelltext, das wird über die Fuses programmiert.
Die interne kann stark abdriften, vor allem auch je nach Temperatur.
Musst du mal nach schaun, auch wenn da ein Crystal angelötet ist kann über die Fuse trotzdem die Interne verwendet werden.
Sonst kann ich mir die Ungenauigkeit grade nicht erklären.
 
Hast du mal ne LED an E (PinD.3) gehängt?
Kann ich jetzt schlecht machen, da alles auf einer Platine gelötet ist. Müsste ich erst alles auf Steckbrett umsetzen. Schlecht mit nur linken Arm, aber geht.
Das mit dem Quarz musst mir noch einmal erklären. Wenn ich einen Code habe, der mit $crystal = 8000000 arbeitet, habe ich doch vorher die Fuse auf 8 MHz eingestellt und auf den µC geschrieben. Habe ich jetzt einen Code mit $crystal = 4000000, muss ich die Fuse wieder umstellen und neu auf den µC schreiben. Vor ein paar Wochen habe ich nur im Code die $crystal = 8000000 geändert und glaubte, der Code ändert auch die Hardware. Momentan ist auf derPlatine kein externer dran. Wenn ich aber umstecke kann ich einen setzen (8 und 16 MHz zur Verfügung).
Und dieseAnhang anzeigen 8116
Für externen Quarz habe ich diese Einstellmöglichkeiten
Anhang anzeigen 8117
Ich habe immer die letzte genommen.
 

Anhänge

  • 2019-06-23 17.40.59.jpg
    2019-06-23 17.40.59.jpg
    21,3 KB · Aufrufe: 5
  • Screenshot 2019-08-07 11.58.22.png
    Screenshot 2019-08-07 11.58.22.png
    16,7 KB · Aufrufe: 6
Zuletzt bearbeitet:
Nicht ganz.
Per Fuses (Screenshot) stellst du keine Frequenz ein, sondern definierst wo der Takt her kommen soll.
Externer Quarz, externer Takt, externer Resonator, internes RC Glied, was halt so möglich ist. Ebenfalls kannst du da den Start verzögern damit sich der Taktgeber - welcher Art auch immer - erst einschwingen kann. Ändert an der Frequenz nichts. Abgesehen vom clk/8 Bit was du setzen könntest. Dann würden zwar vielleicht 8MHz anliegen, aber bevor die irgendwo sonst verwendet werden erst /8 geteilt.
Laut dem Screenshot wird ein externer Crystal verwendet, der müsste denn halt auf dem Board sein.

Das was du als Frequenz im Quelltext angibst ist nur eine Hilfestellung für Bascom, um Dinge wie Baudraten, Wartezyklen (Wait, WaitMs, ...) und LCD Routinen zu berechnen. ... aber beeinflusst die eigentliche Taktfrequenz nicht.
Du könntest hier auch 80MHz angeben, dann würde alles was in Software läuft (Wait etc) nur 1/10. so schnell laufen wie gedacht. Die wirkliche Hardware, wie Timer, betrifft das natürlich nicht.

Prinzipiell ist zu sagen, dem Chip ist es egal. Klar, nen ATmega kannst du nicht mit 3GHz befeuern, irgendwo gibt es halt Grenzen. Zumindest nach oben. Nach Unten gibt es die nicht, du könntest ihn auch mit 1Hz takten wenn du unbedingt willst. Ratsam ist das allerdings nicht. Selbst bei 32kHz interner Clock mit aktiviertem /8 Prescaler ist der Chip schon so langsam, dass er von vielen ISP Programmern nicht mehr erkannt wird (Timeout).
Sonst, der Chip kennt seine eigene Frequenz nicht und sie ist ihm eh egal. 1 Takt, 1 Befehl (im Idealfall, manche Befehle brauchen auch 2 oder 3 Takte).

Zum Foto, das Eine scheint 24MHz zu sein (=zu schnell), der Andere 17, da bin ich mir aber nicht sicher.

Wegen Enable, haste keine Kroko Kabel da? Ist ja nur ein Signal, da geht das mal.
 
Es ist aber richtig, dass ich die Taktfrequenz des µC in den Fuse Bit einstellen muss.
Für den internen Quarz gibt es 1/2/4/8 MHz und den noch diese Unterschiede:
  • 000100:Int. RC 0sc. 8MHz
  • 010100:Int. RC 0sc. 8MHz
  • 100100:Int. RC 0sc. 8MHz
für externe Quarz
  • 111010:Int. Crystal/Resonator Low Freq.
  • 111011:Int. Crystal/Resonator Low Freq.
  • 111100:Int. Crystal/Resonator Medium Freq.
  • 111101:Int. Crystal/Resonator Medium Freq.
  • 111110:Int. Crystal/Resonator High Freq.
  • 111111:Int. Crystal/Resonator High Freq.
welche externe Einstellung sollte ich nehmen. Ich habe immer die 111111 genommen.
Kroko-Klemmen, nein, diese ganz feinen besitze ich nicht. Ich kann das schon mal umbauen, wenn es sich lohnt einen externen Quarz dran zu hängen.
 
Kann, nicht muss. Manche Chips haben intern nur eine Frequenz, der Mega8 hat 4. ok.
Angeblich kalibriert. Naja, auch eine defekte Uhr zeigt 2x am Tag präzise die genaue Zeit an.
Die interne Clock nutze ich höchstens für wegwerf-proof-of-concept Schaltungen, oder für solche wo das Timing gänzlich sch... egal ist, wie simples Dimmen von LEDs per PWM. Ob der nun mit 500 oder 600Hz rum dimmt ist sowas von egal. Sonst ist immer n Quarz dran, manchmal sogar Oszillator, falls die Clock mehrfach verwendet werden soll (z.B. für 2 Chips).
Du könntest die interne Clock feinabstimmen. Es gibt das OSCCAL Register (suche im Datenblatt danach), womit du die interne Taktfrequenz anpassen kannst (irgendwo im Bereich 50 - 200%). Driftet die Temperatur und/oder Spannung aber leicht ab, tuts auch die Frequenz. Das Problem haste mit nem Quarz nicht.
Bei Bauteiltoleranzen von rund 20% wirst du mit RC eh nie genau werden.
Kann dir nur (wieder) anraten, besorg dir n paar Quarze. 32.768Hz und von mir aus 8MHz. Dazu passende 22pf Kondensatoren, wobei, naja, die gehören schon dran, es geht aber zur Not auch ohne. Zumindest meistens. Idealerweise auch einen Oszillator. Das ist quasi auch ein Quarz, aber dieser arbeitet selbstständig und gibt ohne angesteuert werden zu müssen einen Takt aus, wie ein Rechteck-Generator. Sehr hilfreich wenn man sich bei den Fuses mal vertan hat, dann braucht man einen stabilen externen Takt. Nur damit man einen für Notfälle hat. Hierfür wäre 8MHz ideal, weil selbst wenn clk/8 hast du immer noch 1MHz, also genug Zeit für die üblichen 100dickemilch kHz ISP Frequenz. Und afaik kann jeder AVR 8MHz verarbeiten.
 
Du könntest die interne Clock feinabstimmen.
Das ist wieder eine Sache, wo man sich mit Datenblättern und Registern ect. auskennen muss.
Kann dir nur (wieder) anraten, besorg dir n paar Quarze. 32.768Hz und von mir aus 8MHz.
Habe ich auch schon mehrmals geschrieben, dass ich zumindestens 8 und 16 MHz habe. Auch Oszi's und den ganzen Kleinkram habe ich. Nur habe ich so einen Oszillator noch nie benutzt, weil ich nicht weiß, wie er geschalten wird und was dieser dann genau macht.
Sehr hilfreich wenn man sich bei den Fuses mal vertan hat,
Ja genau so etwas ist mir aus Neugier schon passiert. Wollte wissen, was die Fuse Bit Einstellung 111001: reserved macht. Der Atmega8 macht nichts mehr. So, dann bau ich das alles mal mit nen externen Quarz 8 MHz zusammen.
 
Es ist einfach nur ein Wert der gesetzt werden muss. Nur was der richtige ist zum Abstimmen, da wirds Haarig.

Ja, aber 32kHz fehlt ;)
Oszillator ist einfach, hat 4 Pins, einer davon unbelegt. +5V, GND, Ausgang. Mehr nicht. Und der gibt dir ein Rechtecksignal raus in der angegebenen / gekauften Frequenz.

Reserved sollte man tunlichst nicht nutzen. Gute Programmer verbieten es auch. Ggf. kannst du dir mit solchen Einstellungen den Chip komplett zerstören.
Zu den Bits was Bascom daraus macht kann ich nichts sagen, ich weiß nicht wie der die aneinander tackert. Das müsste mal einer der Bascom Experten hier sagen. @LotadaC, @dino03?
 
Reserved sollte man tunlichst nicht nutzen
Das weiß ich jetzt auch. Wie gesagt, habe ich mir schon einen Atmega8 zerschossen. Kann ich denn mit eine Oszillator meinen defekten Atmega8, den ich mit 111001: reserved zerschossen habe, wieder herrichten?
Die Uhr scheint mit dem externen Quarz genauer zu laufen. Erst mal etwas länger warten.
Wie bzw. wo kann ich jetzt das stellen der Uhr einfügen. Ich dachte mit
If Taster0 = 0 Then
Incr Minute
End If
In Tick_1s einfügen habe ich schon getestet. Geht nicht. Muss es ein neues Unterprogramm sein?
Der Code ist aber kein Pollin und jetzt weiß ich nicht weiter.
 
Irgendwo hatte dino glaub ich mal hier ein Tut geschrieben wie man somit (fast) jeden verfusten Chip wieder Leben einhauchen kann. Leider finde ich den grade nicht. Aber vom Prinzip nur den Ausgang vom Oszillator an einen der beiden Crystal Pins, das wars.
Sollte dieses Reserved jetzt intern allerdings bewirken dass garkeine Clock mehr akzeptiert wird, Pech. Dann geht es höchstens noch mit High Voltage programmmern.

Und ja, sollte so gehen, nur vorher hatten wir ja Tick_200ms. Jetzt wieder Tick_1s.
Ist doch die perfekte Aufgabe für dich: Wie kannst du beides erreichen? Tipp: Du brauchst keinen weiteren Timer.
 
Ja, ich wollte erst einen neuen Timer nehmen. Aber wenn du der Meinung bist, also ein neues Unterprogramm etwa so
Isr_???: (Kann das Unterprogamm beliebig genannt werden?)
Incr Count
If Count = 25 Then
Count = 0
Gosub Tick_200ms
End If
Return
und dann
Tick_200ms:
If Taster0 = 0 Then
Incr Minute
End If
 

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