Bascom Uhr, erste Schritte, Fragen und Probleme

Status
Für weitere Antworten geschlossen.

sulawesi

Neues Mitglied
07. Juni 2009
123
0
0
Raum Stuttgart
Sprachen
Ich habe vor 1 Woche mit Bascom und AVR angefangen...:)
Nach Anschaffung der Hardware habe mit etwas einfaches begonnen. Eine Uhr mit LCD...Nun habe ich das Ganze fast aus eigner Kraft fertiggestellt....

Nun meine Frage, warum die Anzeige flackert..ein wenig, besonders die erste Zeile "aktuelle Uhrzeit",,nun erstmal mein 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 Pind.2 = Input
Portd.2 = 1
Taster0 Alias Pind.2

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

Initlcd
Cls ' 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
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
Timer1 = 3036

Return

Ich vermute es muss irgendwas mit dem Timer zusammenhängen....meine erste Version war mit einem Zähler..etwa so :

onfig Pind.2 = Input
Portd.2 = 1
Taster0 Alias Pind.2


Do
For Initcounter = 1 To 36
'LCD löschen
Cls

'Haupttext der ersten Zeile anzeigen
Locate 1 , 1
Lcd "Aktuelle Uhrzeit"


'Jede Sekunde um 1 hochzählen und neuen Wert anzeigen
Cursor Off
For Bt = 0 To 59
'Neuen Wert in einen Text umwandeln
S = Str(bt)
S = Format(s , "00")



Locate 2 , 13
Lcd S

Locate 2 , 11
Lcd ":"

Hier war es ok,,,,,ich komme momentan nicht weiter, ich wollte das Programm mit anderen Optionen erweitern, aber so lange, eins nicht 100% geht, gehe nicht weiter...Andere Frage wäre noch, klar mein Programmstiel ist Amateurhaft..ich weiss, bin aber froh daß ich erstmal soweit gekommen bin:)
 
Hallo sulawesi !

Willkommen im AVR-Praxis Forum..... :ciao:
und Respekt für dein erstes "Projekt"!

Wie man deinem Beitrag bzw. dem Programmcode entnehmen kann, hast du dich bereits schon sehr eingehend mit BASCOM und dem AVR beschäftigt. :)

Was deine "flimmernde" Anzeige betrifft....
Ich habe in deiner Hauptschleife leider kein "Do" gefunden..... nur ein "Loop".
Daher weiß ich nun auch nicht, ob du evtl. vor dem Anzeigen deiner Werte (Std:Min:Sec usw.) noch erst ein "Cls" benutzt.
Wenn dies so sein sollte, dann "flimmerd" oder "flackert" deine Anzeige mit Sicherheit.
Sollte das "Cls" nicht in der Do-Loop Schleife vorhanden sein, sendest du vielleicht die neuen Werte schneller, als es das Display verarbeiten kann.
Kannst meine Ideen ja mal als Ansatz zur "Fehlersuche" nehmen......


Auf alle Fälle kannst du dir voller Stolz auf die Schultern klopfen, wenn du als "Anfänger" gleich so ein Programm ganz allein geschrieben hast!

Schöne Grüße,
Cassio
 
Danke erstmal ..

also hier meine Flimmerfrei Version. Ohne Timer und es gab noch Probleme mit der Zählnung ...Ausserdem ist noch ein Fehler in der Logik drin, wenn die Uhr 23:59:59 erreicht..dann ..00:01:00

Nach 2 Tagen selbstudium und länge Nächte habe schon begriffen, daß es mit Timer gemacht werden muss...

in der "Flimmerversion" passt die Logik einwandfrei, und die Uhr ist gang genau.
'-------------------------------------------------------------------------
'Flimmerfrei - Schlechte Logik
$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



Dim Initcounter As Byte
Dim Bt As Byte
Dim S As String * 2
Dim M As Byte
Dim Minute As String * 2
Dim H As Byte
Dim Uhr As String * 2

Config Pind.2 = Input
Portd.2 = 1
Taster0 Alias Pind.2

Config Pind.3 = Input
Portd.3 = 1
Taster1 Alias Pind.3

Do
For Initcounter = 1 To 36
'LCD löschen
Cls

'Haupttext der ersten Zeile anzeigen
Locate 1 , 1
Lcd "Aktuelle Uhrzeit"


'Jede Sekunde um 1 hochzählen und neuen Wert anzeigen
Cursor Off
For Bt = 0 To 59
'Neuen Wert in einen Text umwandeln
S = Str(bt)
S = Format(s , "00")
Minute = Str(m)
Minute = Format(minute , "00")
Uhr = Str(h)
Uhr = Format(uhr , "00")

'Schreibe Sekunden
Locate 2 , 13
Lcd S

'Doppelpunkt vor Sekunde
Locate 2 , 11
Lcd ":"

'Minute um eins erhöhen
If Bt = 00 Then
M = M + 1
End If

'Minuten schreiben
Locate 2 , 8
Lcd Minute

'Doppelpunkt vor Minute
Locate 2 , 6
Lcd ":"

'Wenn 59 Sekunden und 59 Minuten erreicht sind
If M = 59 Then
If Bt = 59 Then
H = H + 1
End If
End If

'Uhr schreiben
Locate 2 , 3
Lcd Uhr



'Zurücksetzen
If H = 23 Then
If M = 59 Then
If Bt = 59 Then
H = 00
M = 00
Bt = 00
End If
End If
End If

'Minuten stellen
If Taster0 = 0 Then
M = M + 1
End If

'Stunden stellen
If Taster1 = 0 Then
H = H + 1
End If

'Eine Sekunde warten
Wait 1


Next Bt



'Das LCD nach ca. einer Stunden neu initialisieren
If Initcounter = 36 Then
Initlcd
End If

Next Initcounter


Loop

End

'-----------------------------------------------------

Bin mal gespannt, wo der fehler liegt..Das Programm müsste ohne Probleme laufen...Klar Wackler usw..kann ich zu 100000% ausschliessen:)
 
Hi,

auch von mir herzlich willkommen :flowers:

...Andere Frage wäre noch, klar mein Programmstiel ist Amateurhaft..ich weiss, bin aber froh daß ich erstmal soweit gekommen bin:)
Naja ... es gibt auf jeden Fall Kommentare und einzelne Funktionen im Programm
sind optisch voneinander getrennt. Sieht doch ganz ok aus ... ;)
Für den Anfang ist da nicht einzuwenden. Einfach drauf achten das genug
erklärende Kommentare drin sind und dran denken wie man nach 2-3 Monaten
Pause am besten wieder in ein Programm reinkommen könnte. Also so
programmieren das man es auch wenn man es 2-3 Monate nicht gesehen hat
schnell wieder den Sinn der einzelnen Bereiche verstehen kann.

Gruß
Dino
 
Kann niemand helfen ?

Danke auch..kann mir wirklich niemand helfen ? ich komme seit gestern nicht weiter !!!

Was ich noch gefunden habe ist, wenn ich den Kontrast erhöhen, flackert es weniger.

Dieses Effekt passiert aber nur bei diesem Programm. Ein einfaches mit "Hallo World geht..also kann nicht an der Schaltung liegen...

Nochmal der letzter Stand :

$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 = 256

Enable Timer1
On Timer1 Test
Enable Interrupts
Timer1 = 3036
'------------ Uhr Voreinstellung ----------------------------------------------
Sekunde = 0
Minute = 0
Stunde = 0

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


Return
 
Hallo und willkommen in unserem Forum sulawesi :)

Da ich nicht in Bascom AVR programmiere, kann ich dir wahrscheinlich nicht weiterhelfen, wenn es sich um ein bascomspezifisches Problem handelt ... aber so wie ich deinen Programmcode lese, machst du in einer do-loop Schleife permanent eine Displayausgabe, einschließlich "Cls". Dies hat ja auch Cassio bereits erwähnt! Da reicht auch nicht eine Pause von 50ms in der Endlosschleife. Am besten du machst nur dann eine Displayausgabe, wenn diese notwendig ist, wenn sich also zum Beispiel die Zeit geändert hat. Du könntest zum Beispiel in der Timerinterruptroutine (Sekunden-Ereignis) eine Variable Verwenden, der du einen Wert zuordnest und im Hauptprogramm (do-loop Schleife) dann auf diese Variabe reagierst und nur dann eine Displayausgabe machst, wenn die Variable den entsprechenden Wert hat (du musst dann natürlich der Variable im Hauptprogramm wieder den Ursprungswert geben). Ich hoffe, dir hilft es ein bisschen weiter.

Grüße,
Dirk
 
Hi,

..kann mir wirklich niemand helfen ? ich komme seit gestern nicht weiter !!!
wenn man um 5:00 aufsteht und abends um 18:00 zuhause ist, dann will man
erst mal was essen und danach ein wenig die Beine baumeln lassen. :eek:
Das ist hier Freizeitarbeit die im Forum gemacht wird. Das kann also auch mal
ne Woche dauern bis jemand der sich in dem Thema auskennt die richtige
Stelle im Programm gefunden hat an der man drehen muß. Und je länger ein
Programm ist in das man sich da als "Fremder" einarbeiten muß, desto länger
dauert es auch bis man die richtige Stelle findet. Du hast das Progg ja auch
nicht in 10 Minuten geschrieben also erwarte bitte auch nicht das ein anderer
in 10 Minuten den Fehler in deinem Programm findet.

Also bitte ein wenig Gedult :stop:

Ich hab das Programm jetzt noch nicht durchgesehen weil ich grad jetzt mal
ein wenig Zeit fürs Forum habe und irgendwann muß ich danach auch mal
schlafen damit ich morgen früh die Augen auch wieder aufbekomme.

Also das was Dirk da geschrieben hat ...
aber so wie ich deinen Programmcode lese, machst du in einer do-loop Schleife permanent eine Displayausgabe, einschließlich "Cls". Dies hat ja auch Cassio bereits erwähnt! Da reicht auch nicht eine Pause von 50ms in der Endlosschleife.
kann schon der Fehler sein. Wenn du was auszugeben hast, dann überschreib
die letzte Ausgabe mit den neuen Werten und lösch nicht jedes mal die
komplette Anzeige. Außerdem frißt dir das dauernde CLS und eine komplette
Ausgabe des Displayinhalts nur Systemzeit im Programm weg die man anders
besser gebrauchen könnte. Denk dran ... der Atmel ist keine Gigahertz-CPU
wie in deinem PC! Mit maximal 20MHz ist bei den schnellsten schluß.
Und wenn man das Display dann mit 4Bit-Modus betreibt statt mit 8Bit dann
wird sich das noch stärker bemerkbar machen.

Ich hab das mal in einer Endlosschleife getestet. Einfach ne Byte-Variable immer
hochzählen lassen. Den Wait-Befehl kann man sich da sparen. Wenn man den
Dezimalwert (3 Zeichen bei einer Byte-Variable) bei jedem Durchlauf anzeigen
läßt wird das alles ziemlich zäh und langsam.

Gruß
Dino
 
Erstmal entschuldigung, wenn ich etwas genervt habe..bin sehr ehrgeizig und lässt mich oft keine Ruhe, wenn etwas nichts funzt....

Die Lösung ist wirklich einfach !!!

CLS hab ich ausserhalb der Do Loop schleife gelegt ..

CLS
do
.....
Loop

Ihr seid Klasse !!!
 
Was deine "flimmernde" Anzeige betrifft....
Ich habe in deiner Hauptschleife leider kein "Do" gefunden..... nur ein "Loop".
Daher weiß ich nun auch nicht, ob du evtl. vor dem Anzeigen deiner Werte (Std:Min:Sec usw.) noch erst ein "Cls" benutzt.

Hallo!

Tja, wenn man die Beiträge aufmerksam lesen würde, dann hättest du um 15:21 Uhr schon die Lösung gehabt. ;)
Also ich finde die Reaktionszeit hier im Forum schon in Ordnung!

Manchmal kann aber Ehrgeiz auch etwas blind machen. :cool:


Finde es aber super, dass du dies alles allein geschafft hast!
Wenn ich bedenke, dass ich mich zu Beginn über eine simple blinkende LED wie Bolle gefreut habe..... :rolleyes:

Wünsche dir also viel Spaß weiterhin!

Cassio
 
Danke..danke....nun noch die Frage ob interesse im Forum besteht. weiterhin die eigene Projekte zu posten, wie man was gemacht hat,,,

Erhlich gesagt, kann ich wahrscheinlich im Vergleich zu Euch, nicht viel beitragen:(
 
Erhlich gesagt, kann ich wahrscheinlich im Vergleich zu Euch, nicht viel beitragen:(

Hallo !

Wie kommst du denn darauf?
Wir haben auch alle mal klein angefangen. ;)

Natürlich werden 95% der BASCOM-Programmierer (mich eingeschlossen) die fertige Softclock-Routine in BASCOM nutzen..... und nicht die Uhr selber programmieren.
Daraum geht es aber bei deiner Idee ja auch gar nicht!

Du wolltest etwas sinnvolles machen und dabei noch etwas lernen.
Tja und wie du das gemacht hast, ist vielleicht für den nächsten Anfänger wieder mächtig interessant.
Von daher darfst du hier gerne weitere Projekte einstellen bzw. vorstellen!
Dank des guten Tons und der guten Umgangsformen in diesem Forum, wird auch keiner etwas "abwertendes" zu deinem Programm schreiben.
Es geht hier (ein Glück) schließlich nicht nur um das Projekt, sondern um die persönliche Leistung des Users!

Wenn du in laufe der nächsten Monate und Jahre mit den AVR`s weiter arbeitest wirst du irgendwann deinen "Programmierstil" selbst entwickeln.
Tja und dann wunderst du dich bestimmt selber, warum dir "früher" manche Dinge Kopfschmerzen bereitet haben.....
Und über den Aufbau deiner ersten Programme wirst du dich dann auch etwas wundern..... wenn nicht sogar schmunzeln. ;)


Denk also daran.....
Jeder Beitrag ist hier willkommen und kann jemanden helfen. In welcher Form auch immer! Manchmal kann ein "fehlerhaftes" Programm, oder ungünstiger Aufbau mehr Leuten helfen, als die Präsentation eines perfekten Projektes!
Es geht hier nicht immer um Perfektion!

Im dem Sinne......
Wir freuen uns auf weitere Ideen und Projekte von dir! :)

Viele Grüße,
Cassio
 
Bascom Timer Uhr ist ungenau

Hallo liebe Forum Mitglieder,

nun läuft mein alle erstes Bascom Projekt, habe aber Probleme mit der Genauigkeit. Nun meine Verständnisfrage.

mein Code :


CodeBox bascom

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

End

Test:
Incr Sekunde


Return


Habe den Timer richtig berechnet ?

Quarz 16 Mhz / Prescale = 62500
Maximale Timerwert 65536-62500 = 3036

Sollte also genau 1 Hz erzeugen...Mein Ergebnis ist nämlich, daß die Uhr in ca 10 Stunden 20 Min nachgeht....Was habe ich falsch gemacht ?
 
Hallo,

du leitest den Sekundentakt vom Systemclock ab. bzw vom Timer, der diesen verwendet, das ist zu ungenau. Wenn du einen genaueren Sekundentakt benötigst, verwende einen Timer, der seinen Takt asynchron vom TOSC (Timer-Oszillator) erhält. TOSC ist für Uhrenquarz (32,768kHz) optimiert.

Deine Timerberechnung habe ich jetzt nicht überprüft, du kannst diese aber mal mit dem Tool AVR-Timer-Calculator aus unserem Forum selber überprüfen oder dir die Beschreibung zur Berechnung in dem Thread mal ansehen und prüfen, ob sie mit deiner Berechnung übereinstimmt. Aber wie schon erwähnt, für die Abweichung wird der Systemtakt verantwortlich sein, auch wenn die Timerberechnung richtig ist.

Grüße,
Dirk
 
Atmega8 hat mich ausgesperrt

Habe noch folgendes Problem, hoffe daß ihr mir wieder helfen könnt.

Im Eifer des Gefechtes habe bei der Fuse Bit Einstellungen etwas vergeigt...:mad:

Ich benutze das Pollin Board (16 Mhz Quarz on Board ) mit PonyProg..bin sehr zufrieden damit.

Nun habe ich etwas bei der Fuse Einstellungen herumgeklickt, weil ich Probleme hatte mit Display flackern..(falsch gedacht ). Ich habe schon einen anderen Thread gemacht, soweit OK.,,nun komme ich auf den Atmega nicht mehr drauf...Kann ich weder die Einstellungen auslesen noch flaschen...shhhh...Missing Meldung im PonyProg

Ich habe bereits etwas herumgestöbert, bin nicht der erste der sowas gemacht hat, bloss da ich noch Anfänger bin, fehlen mir noch die nötige Erfahrungen.

Also meine Fragen:
1) Wie kann ich meinen Atmega8-16 MHz auf default zurücksetzen ?

2) habe gelesen, daß man einen externen oszillator anschliessen muss an Pin9
dann mit AVRdude...."irgendwas" machen..Null Erfahrung damit...

3) Kann ich wirklich nicht mehr mit meinem Pollin Board zurücksetzen ?
Das Board hat eine ISP Schnittstelle, aber habe noch nie gebraucht. Ich flasche einfach über rs232 direkt, also IC im Sockel.

Danke erstmal im Voraus !!
 
Also die Berechnung stimmt soweit...kann ich mir aber nicht vorstellen, daß die Abweichung so gross ist. und vorallem wie ich es anders machen soll...
 
Guten Morgen zusammen!

Ich habe deinen Programmcode mal mit "BASCOM-Highlight" versehen, weil er dann übersichtlicher ist. ;)


Zu deiner Timerberechnung:
Code:
Config Timer1 = Timer , Prescale = 256

 

Enable Timer1
On Timer1 Test

Enable Interrupts
Timer1 = 3036

Wie bist du denn auf 3036 und einem Prescaler von 256 gekommen? :hmmmm:

Ich kann es gern noch mal manuell durchrechnen, aber wenn ich das kleine Tool von Dirk benutze bekomme ich folgende Werte:
Timer-Berechnung.jpg

Dort kannst du sehen, dass du bei einem Prescaler von 256 gut 8 µS Fehler hast..... abgesehen von zusätzlichen Systemtakten.

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.

Nun kommt allerdings der zweite Teil, der für Ungenauigkeit sorgt.
Beim Laden von Werten, Sicher und Rücksichern von Registern vergeht eben eine gewisse Zeit. Dies alles sorgt für Abweischungen..... wenn auch nur für µS. Diese kleinen Änderungen summieren sich und.......
Das Ende ist dir ja nun bekannt. ;)

Du merkst also, Programmieren hat nicht nur etwas mit den richtigen Anweisungen zu tun, sondern manchmal auch mit dem Timing.
Dies fällt aber nur bei zeitkritischen Anwendungen erst auf..... wie bei deiner selbstgebauten Uhr.

Solange du deine Uhr nur zum Üben der Programmierung einsetzen möchtest, ist das auch alles kein Problem.
Für "richtige" Anwendungen würde ich an deiner Stelle dann doch auf die Softclock-Routine mit 32,768kHz Uhrenquarz von BASCOM zurückgreifen. ;)
Wenn es später dann noch genauer sein soll, kannst du relativ einfach eine DCF77 synchronisierte Uhr programmieren.

Gruß,
Cassio
 
Eine Freude hier !!!

Was ist Bascom Highlight ? Einstellung...wo ?

Wie auf die Einstellungen gekommen bin gute Frage...Einfach ins Blaue...nach dem ich kapiert habe wie der Timer funzt...

Deine Ideen sind Klasse...nochmal herzlich Dank...

Was ist genau die Softclock-Routine mit 32,768kHz ?

Klaro das Uhrprojekt ist zum üben..habe schon DCF Uhr mit Atmage gebaut, mit Temp Sensor..usw..aber sage ganz ehrlich nachgebaut...ist in einem selbstgefrässten Makrolon Gehäuse mit Roten Flexi Frontplatte..Habe schon etliche Atmega Sachen "nachgebaut"

Ich möchte, wenn das erste Teil richtig läuft, Schritt für Schritt...dann noch ein Menüsystem einbauen für Alarm Funktion usw...

Also so gedacht ?

Config Timer1 = Timer , Prescale = 128

Enable Timer1
On Timer1 Test
Enable Interrupts
Timer1 = 65411
 
1) Wie kann ich meinen Atmega8-16 MHz auf default zurücksetzen ?

Hallo!

Also soetwas wie "default" gibt es nicht!
Daher kannst du den AVR auch nicht "per Knopfdruck" in den Auslieferungszustand zurücksetzen.

Beachte bitte..... DU bist nun der Programmierer und sozusagen der "Gott" für deinen AVR.
Wenn du etwas machst, dann wird das ausgeführt..... auch wenn es Unsinn gewesen ist. ;)
Zukünftig solltest du an den FUSES besser nicht herum spielen, wenn du die Auswirkungen nicht kennst bzw. absehen kannst.


Was das "Wiederbeleben" betrifft...
Dies kann mit einem externen Oszi funktionieren.
Allerdings nur dann, wenn du dich beim Einstellen der FUSE für den Takt vertan hast. Bei anderen Änderungen hilft dir der Trick aber auch nicht weiter.
Beim Mega8 kannst du z.B. auch den Reset "abschalten" und dafür den Pin PC6 verwenden. Allerdings kannst du ihn dann nicht mehr Programmieren. ;)

Verbuche es also zur Not unter "wertvolle Erfahrungen" und besorg dir einen Neuen.

Gruß,
Cassio
 
Also so gedacht ?

Config Timer1 = Timer , Prescale = 128

Enable Timer1
On Timer1 Test
Enable Interrupts
Timer1 = 65411


Hallo!

Ja.... fast! ;)

Entweder verwendest du:
Load Timer1 , 65411 (Es wird dann 65536 - 65411 = 125 ermittelt)

oder du verwendest ganz einfach:
Timer1 = 125

Beides bewirkt das Selbe!

Timer1 = 65411 bedeutet aber etwas gaaaaanz anderes. ;)


Wenn du hier deinen Code einstellen möchtest, dann benutz doch bitte diesen --->
code.gif
Button, in der oberen Leiste!

Wenn du mit Highlight arbeiten möchtest, dann musst du zur Zeit noch selber Hand anlegen.
Mit [ Highlight=Bascom ] und [ /Highlight ] kannst du deinen Programmcode dann mit BASCOM-Highlight versehen.


Noch mal zur Softclock.....
Bei einem Mega8 wird das schwer. :rolleyes:
Denn leider hat der Mega8 keine separaten Pins für den Anschluss eines Uhrenquarzes (32,768kHz).
Du musst dich also entscheiden..... Systemquarz mit 16MHz, oder Uhrenquarz.

Vielleicht solltest du dies daher mal mit einem Mega16 probieren. ;)


Habe schon etliche Atmega Sachen "nachgebaut"

Nun ja..... Das Nachbauen ist ja nicht so schlimm und bezieht sich ja auch nur auf die Hardware.
Das Programm muss dann aber doch auch irgendwo herkommen.... :hmmmm:
Oder hast du dann einen "öffentlichen" Code einfach nur kopiert?


Gruß,
Cassio
 
Super..!!!



CodeBox Bascom

Enable Timer1
On Timer1 Test
Enable Interrupts
Timer1 = 125


Ich werde erstmal mit der 16 MHz externe Quarz leben "müssen":)

Gebe ich gerne zu, daß ich publizierte Projekte nachgebaut habe...:)

Grosse Atmegas habe ich noch auf Lager, aber ich wollte mich erstmal in Atmage8 eineirbaten, bzw, lagsam mit einfachen Sachen anfangen...

Ich werde
 
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)