Bascom Uhr, erste Schritte, Fragen und Probleme

Status
Für weitere Antworten geschlossen.
Hallo!

Nun ja..... genaues kann ich dazu von hier auch nicht sagen.

Ich würde ihn erst mal an die Seite packen und ggf. später noch mal rausholen.
Wenn du noch einen Mega16 zur Verfügung hast, dann nimm doch den.
Dann kannst du auch gleich die Softlock mit nem zusätzlichen externen Uhrenquarz ausprobieren. ;)

Gruß,
Cassio
 
Hi
Nun, ich kann zwar kein BASCOM oder anders, ich hab mich damit noch nicht befaßt. Aber du bekommst schon einen sehr genauen Sekundentakt aus 16 Mhz. Hier mal en Ausschnitt aus dem Datenblatt.
Timer 1 ist ein 16 Bit Timer
TCCR1B
+------+------+------+------+------+------+------+------+
| ICNC1| ICES1| | WGM13| WGM12| CS12 | CS11 | CS10 |
+------+------+------+------+------+------+------+------+
CS12 - CS10 Clock Select
CS12 CS11 CS10 Bedeutung
0 0 0 keine (Der Timer ist angehalten)
0 0 1 Vorteiler: 1
0 1 0 Vorteiler: 8
Wenn du den Vorteiler auf 8 setzt, dann bekommt der Zähler nur jedes 8 mal einen Impuls, andersrum, er zält keine 16 sondern nur 2 Millionen Imp/ sek.
Wenn du nun nach 2000 Imp. einen Interrupt auslösen läßt, bedeutet das jede ms wird die Interrupt Service Routine angesprungen (ISR).
dort zählst du einfach wieder einen Zähler bis Tausend und du hast deine Sekunde.
In Assembler hab ich das mal so umgesetzt:

InitTimer1:
ldi Temp_Reg, high( 2000 - 1 ) ;
out OCR1AH, Temp_Reg
ldi Temp_Reg, low( 2000 - 1 )
out OCR1AL, Temp_Reg
; CTC Modus einschalten
; Vorteiler auf 8
ldi Temp_Reg, ( 1 << WGM12 ) | ( 1 << CS11 )
out TCCR1B, Temp_Reg
ldi Temp_Reg, 1 << OCIE1A ; OCIE1A: ISR Timer -Compare
out TIMSK, Temp_Reg
Ret
Diese Initialisierung erfolgt gleich nach dem Start und der Stackfestlegung. Danach wird die ISR jede ms aufgerufen.
PS. Dies ist ein Beispiel aus dem Tutorial bei Mikrocontroller.net auf meine Bedürfnisse abgewandelt.
Sorry für den Hinweis auf die "Konkurenz" :eek:
PS : Ich krieg einfach keine vernünftige Formatierung der Codezeilen mit Code Formatierung, deshalb Zitat. Man möge es mir nachsehen... danke.
Gruß oldmax
 
Hallo,

den Atmel nicht wegwerfen! Den kann man über ne HV-Programmierung
wiederbeleben. Ist also normalerweise kein Thema wenn man das richtige
Programmiergerät (zB STK500) hat. Notfalls sitzt ja jemand in der Nähe der
so eins hat. Also wie Cassio gesagt hat ... erst mal beiseite legen und mit
nem anderen weitermachen.

Gruß
Dino
 
Hallo Dino,

so habe ich auch weitergemacht..aber ich kenne niemanden in Stuttgarter Umgebung der einen STK hätte, und wenn jemand so freundlich wäre den zu reanimieren, würde der Postversand mehr kosten als der Atmega...

hmm..muss mal krusteln habe irgedwo was gelesen mit externen Oszillator, einige habe herumfahren, dann steckbrett..RS232 ISP kabel hätte ich, oder kann man schnell löten..wenn es hilft...aber mit welcher Software und wie, das ist das Problem..und wegen 2 € Atmega werde ich nicht so lange herum doktorn...:)
 
@Oldmax....Fortgestritten..merkt man....

Blicke leider nicht und vorallem, kann ich wahrscheinlich mit meinem Bascom nichts anfangen..Ich dachte bloss, mit dem Quarz sollte ich auf bessere Ergebnisse kommen.

Heute Morgen um 7.00 habe ich meine Uhr eingestellt, exakt auf DCF Zeit..
nun jetzt ist 18:01 meine zeigt 17:30 an ...achso muss ich noch den neuen Wert im Timer einsetzen ( 125 )
 
Hallo sulawesi!

Ich bin ein Trottel!

Mir ist gerade aufgefallen, dass du für die Timer bei BASCOM ja nur bestimmte Prescale-Werte nutzen kannst. :rolleyes:

Lt. BASCOM-Hilfe:
PRESCALE= 1|8|64|256|1024

Du kannst also nicht direkt einen Prescale von 128 verwenden!
Ergo musst du einen Wert tiefer gehen.....
Siehe Liste---> Timer-Berechnung.jpg

Also:
Code:
Timer1 = Timer , Prescale = [B]64[/B]
.
.
.
Timer1 = 250
'bzw.
'Load Timer1 = 65286

Sorry!
War mein Fehler!

Gruß,
Cassio
 
Hallo!

Ach so.... weil ich es oben gerade gesehen habe, noch mal kurz zum Thema Highlight=Bascom !

Du musst nur eines von beiden verwenden.
Also nicht:
[ CODE ]
[ Highlight=Bascom ]

Dein Code....

[ /Highlight ]
[ /CODE ]

sondern nur:
[ Highlight=Bascom ]

Dein Code....

[ /Highlight ]


oder eben:
[ CODE ]

Dein Code....

[ /CODE ]


OK soweit? :hmmmm:

Gruß,
Cassio
 
Also jetzt verstehe es wirklich nicht:(

Bei einem Prescaler von 128 gibt es rechnerisch zumindest schon mal keine Abweichung vom Timer.
Dann hättest du also einen Prescaler von 128 und lädst den Timer mit 125...... bzw. du nutzt den Reloadwert von 65411

Wenn es Code :
Code:
Config Timer1 = Timer , Prescale = 128                                             Enable Timer1                                              
On Timer1 Test                                            
Enable Interrupts                                           
Timer1 = 65411

bekomme ich die Meldung Prescale 1,8,64,256,1024

Wenn ich dieses verwende :



Code:
Enable Timer1
On Timer1 Test
Enable Interrupts
timer1 = 125

läuft die Uhr garnicht.

Wenn diese :
Code:
Config Timer1 = Timer , Prescale = 64
Enable Timer1
On Timer1 Test
Enable Interrupts
Timer1 = 64286

läuft die Uhr extrem schnell..Die Werte stammen aus AVR-Timer Calculator

was ist jetzt kaputt ???
 
Sorry Cassio...

die Uhr läuft etwa 5 mal schneller..

Code:
Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcd = 16 * 2

Config Timer1 = Timer , Prescale = 64
Timer1 = 250


'------------ Uhr Voreinstellung ----------------------------------------------
Sekunde = 0
 
Hallo!

Das Programm aus dem Eröffnungsbeitrag ist schon fast richtig.

Du mußt die Anweisung Timer1 = 3036 in die Interruptroutine schreiben.

Test:
Timer1 = 3036
Incr Sekunde
Return

MfG
caargoo
 
Jungs..ich hoffe Ihr macht mir keine Witze...:)

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

'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 = 64
Timer1 = 250

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

   End

Test:
Timer1 = 3036
Incr Sekunde
Return

Die Uhr läuft nichtmal an---
 
Hi zusammen,

um jetzt alle nochmal richtig zu verwirren, ein kleiner Tipp von mir. :D Wenn möglich, verwendet anstelle des OverflowInterrupts den CompareInterrupt, dann braucht man in der Interruptserviceroutine den Timer nicht initalisieren und man braucht dabei auch folgendes nicht berücksichtigen
  • die Einsprungzeit in den Interrupt (jmp)
  • das Sichern von Registern (push, pop) und
  • die Rücksprungzeit (reti)
... uns ich meine irgendwo mal gelesen zu haben (war glaube ich von Dino), dass bei Bascom und Interrupts ziemlich viel gepusht und gepopt wird ... und da können sich auch einige us summieren ;)

Dirk
 
LIES meinen Beitrag genau!!!

Und dann guck mal in Dein Programm was Du da zusammen
kopiert und eingefügt hast.

Aber bitte ganz genau, Zeile für Zeile.

Vielleicht fallen Dir dann so einige Ungereimtheiten auf.
Dies trifft übrigens auch auf Dein Simulatorproblem zu.

caargoo
 
@ Dirk....Thanx...:) :) :) :)

Der Fluxcompensator fluxuiert nicht :)

Nach "erfolgreichen" Hacking habe ich die zu langsame Uhr schnell gemacht und jetzt steht
 
hmm..muss mal krusteln habe irgedwo was gelesen mit externen Oszillator, einige habe herumfahren, dann steckbrett..RS232 ISP kabel hätte ich, oder kann man schnell löten..wenn es hilft...aber mit welcher Software und wie, das ist das Problem..und wegen 2 € Atmega werde ich nicht so lange herum doktorn...:)
schau mal hier ...
Fuse-Bits für Systemtakt und Startup-Time
da hab ich mal was erklärt.
Du kannst statt dem Quarzoszillator auch nen NE555 nehmen oder was weiß
ich. Solange der Takt mit 5V-Pegel am Mega ankommt.

Schau mal hier ... FAQ-Verzeichnis (Wo wurde was beschrieben)
Da ist ein größeres Sammelsurium an recht nützlichen Infos.

Gruß
Dino
 
Caargoo..stehe echt auf dem Schlauch...

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

'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 = 64 'Timer1 Config mit Vorteiler
Enable Timer1                                 'Startet den Timer
On Timer1 Test                               'Springe zu bei Überlauf
Enable Interrupts                             'Interrupts ein
Timer1 = 250                                   'Voreinstellung

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

   End

Test:
Incr Sekunde                     '1 Schritt vor
Timer1 = 3036                    'Ab 3036 zählen
Return

Habe kommentiert wie ich den Code verstehe....Ergebnis..Uhr läuft zu schnell
HIIIIILLLFFFEEEEE
 
Vielleicht habe ich jetzt..

Also habe folgendes gedacht ( 3 Kippen geraucht :) )

Mit dem AVR Timer Calculator habe 16 MHZ und Interrupttime 1000000 us ausgewählt. dann habe ich die Möglichkeit einen 256er Teiler nehmen mit 0 Errors...

Dann rechne ich..

16000000 / 256 = 62500 die maximale Zeit kann 65536 sein....

65536-62500 wäre 3036.

Im Code..

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

'Am Ende :
Test:
Incr Sekunde
Timer1 = 3036
Return

Die Uhr läuft, muss ich mal sehen wie genau..Habe ich alles richtig verstanden ?

Aber mein Simulator will noch nicht (auch mit $sim nicht...)
 
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)