Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega16 auf externes quarz schalten?
-=[Cassiopeia]=-
01.03.2006, 18:01
Hallo zusammen,
eigentlich wollte ich meinen atmega16 nur auf ein externes quarz mit 16 mhz umstellen aber in bascom finde ich unter den fusebits A987 nur:
0000 external clock
0001internal rc os. 1mhz
0010 internal rc os. 2mhz
0011 internal rc os. 4mhz
0100 internal rc os. 8mhz
und dann nur noch nummer
0101:0101
bis
1111:1111
was muss ich da nehmen um mein 16mhz externes quarz zu aktivieren?
1111:1111 denke ich mir bin da aber net sicher.
wenn jemand kurz antworten könnte bevor ich den atmega in nirvana schick....
1000 dank
1111:1111 iss richtig, das iss external crystal
Martin
Hallöle,
hab ein anderes Problemchen:
Ich kann über Bascom nur Programme erstellen und kompillieren. Beim Versuch zu brennnen kann er die Fusebits nicht auslesen und ich diese somit auch nicht setzen. Deshalb brenn ich mit PonyProg, wo ich die Bits einzeln setzten muss.
Versuchsaufbau: Ich lass die zwei LED's abwechselnd mit 500ms Wartezeit blinken. Bei interner Taktung passt die Zeit auch in etwa. Zur externen Taktung muss ich ja CKOPT und CKSEL3-1 schalten. Aber welche bei 8MHz ??? Aus dem Datenblatt vom Mega16 werd ich auch nicht schlau.
Setzte ich mal alle, dann wird die Wartezeit etwa viermal so lange (ca. 2sec.) und das bei ansich 8facher Geschwindigkeit ?!?
Was mache ich falsch ???
PS.: Ich hab das Evaluation-Board von Pollin zum experimentieren.
Erkennt deine Bacom Entwicklungsumgebung deinen Prozessor? Oder kommt bei "Run Programmer" eine Fehlermeldung "Could not identify chip with ID:FFFFFF"?
Dann ist entweder dein Board nicht richtig angeschlossen oder hat keinen Strom bzw. ist nicht eingeschaltet, oder du hast in den Einstellungen für den Programmer nicht den richtigen eingestellt.
Wenn Bacom deinen Controller erkennt, dann kann er auch die Fusebits auslesen...
Mit dem Board von Pollin kann der AVR auch programmiert werden. Da dies über den RS232 geschieht und nicht über den LPT wird die Auswahl von Bascom (Demoversion) relativ klein. Dort habe ich alle ausprobiert und die Fuses können von keinem gelesen werden. Das mit dem Erkennen muss ich erst noch ausprobieren.
Strom ist an allen Punkten ausreichend vorhanden (Hab die 5,25" Blende eines Desktop-PCs mit Buchsen versehen, die direkt mit dem Netzteil verbunden sind).
Und wie gesagt, das schreiben mit PonyProg funzt ja, ich weiß nur nicht, wie die Fusebits zu setzten sind ?!? :-k
Mit 1111:1111 kann ich leider nix anfangen, da ich erst ganz am Anfang der Mikroprozessor-Programmierung stehe. Wenn du mir das aufschlüsseln könntest, welcher 1er für was steht, käme ich auch schon ein Stück weiter.
Erkennt deine Bacom Entwicklungsumgebung deinen Prozessor? Oder kommt bei "Run Programmer" eine Fehlermeldung "Could not identify chip with ID:FFFFFF"?
Wenn ich nach dem Kompillieren in den Programmiermodus wechsle kommt eine Fehlermeldung, dass der angebene AVR mit dem eingestellten nicht übereinstimmt ( Mega16<>Mega64 ). Klicke ich auf den Chip Identify - Icon passiert gar nix. Ich wähle den Mega16. Wenn ich nun auf das Blatt Fuse/Lock-Bits wechsle, kommt eine Fehlermeldung wie : Kann Mega16 nicht lesen... (den genauen Wortlaut weiß ich jetzt nicht mehr ) :-k und das Blatt bleibt leer. Nachdem ich Bascom auf zwei verschiedenen Rechnern installiert habe und beide den gleichen Fehler bringen gehe ich mal davon aus, daß Bascom nicht mit diesem Evaluation Board umgehen kann.
Was auch festzustellen ist: ich übertrage bei jedem LED-Wechsel eine Nachricht (LED 1 ein - LED 2 aus und umgekehrt) per print. In einem Terminal sind aber nur die Ziffern sichtbar. Die Buchstaben werden zu Kauderwelsch.
alos das mit dem terminal kann ganz einfach daran liegen, dass du die falsche baudrate eingestellt hast, womit sendest du denn? mit wieviel baud, und den anderen einstellungen?
kannst du denn per bascom das teil programmieren, oder geht beides nicht, proggen und fuses?
Martin
kannst du denn per bascom das teil programmieren, oder geht beides nicht, proggen und fuses?
...nein, denn wenn er die Fuses nich lesen kann, läßt er auch das Proggen nicht zu
falsche baudrate eingestellt hast, womit sendest du denn? mit wieviel baud, und den anderen einstellungen?
...na so ungeschickt bin ich dann nun auch wieder nicht: programmiert sind 9600 und empfangen im Terminal tu ich auch 9600. Außerdem: wenn ich eine falsche Baudrate einstelle, bekomme ich irgendeinen String der viel länger ist. Ich kann ja zumindest die Zahlen erkennen und die richtige Anzahl an Zeichen überträgt er ja auch. Nur die Zeichen selbst sind Sonderzeichen. Was ich jetzt allerdings in einem anderen Forum gelesen habe kann das auch mit der internen Taktung zusammenhängen, die nicht immer korrekt ist und dadurch Fehler verursacht. Die 100n Abblocker sind jedenfalls anwesend. An denen kanns nicht liegen.
aaalso, in ponyprog musste CKSEL alle auf ohne häkchen, und SUT0-1 auch aus, also ohne häkchen, dann sollte es gehen ^^
Martin
aaalso, in ponyprog musste CKSEL alle auf ohne häkchen, und SUT0-1 auch aus, also ohne häkchen, dann sollte es gehen
... die waren schon beim ersten Programmieren alle aus.
Dann müsste aber die Anweisung $crystal keine Auswirkung haben, denn die steht auf 1MHz und es ist ein 8MHz Quarz eingebaut, sprich er müsste dann mit der 8-fachen Geschwindigkeit rechnen. Oder nicht ???
doch eigentlich schon, hast du die fuses auch mal ausgelesen vorher?
Martin
hast du die fuses auch mal ausgelesen vorher?
... nein, vorher nicht. Aber im Datenblatt zum Mega16 steht, dass die von Haus aus alle auf 0 (effektiv ja 1) stehen und somit auf interner Taktung (is jetzt nur so eine Vermutung, denn so ganz werd ich ja aus dem Datenblatt nicht schlau).
ja, dann lies mal die fuses aus, und mach die alle aus, also die, die ich gesacht hab, und dann schreib die mal rein
Ich steck auch mal einen fabrikneuen Mega16 rein und versuch die Fuses auszulesen. Mal sehen welche da dann gesetzt oder nicht sind.
...also ausprobieren konnte ich es jetzt leider nicht, aber ich hab mir nochmal das Datenblatt zu gemüte geführt:
Im Auslieferzustand ist CKSEL0 und SUT1 gesetzt. Das entspricht der internen Taktung mit 1MHz.
Für die externe Taktung müssen, so wie du's (x-ryder) beschrieben hast, CKOPT, CHSEL3-0 und SUT1-0 frei (nicht gesetzt - keine Häkchen) bleiben.
Somit habe ich unbewusst schon die richtigen Einstellungen beim ersten Mal programmiert. Auch nicht schlecht.
Jetzt muss ich nur noch das Problem mit den zu übertragenden Zeichen klären.
also, dann machich ma ne checkliste:
- wie lang ist dein kabel?
- hast du den konverter richtig aufgebaut, funktionierte der schonmal?
- was hast du überhaupt für einen?
- hast du den UART richtig definiert im programm? (schicks am besten mal)
- welches terminal benutzt du?
mal sehen, ob mir noch was einfällt, schreib ma erstmal
Martin
...also...
- wie lang ist dein kabel?
...ca. 1m voll belegtes und geschirmtes RS232 1:1 Kabel...
- hast du den konverter richtig aufgebaut, funktionierte der schonmal?
...richtig aufgebaut ja, Programmieren geht nur lesen per RS232 eben nicht...
- was hast du überhaupt für einen?
...es ist ein Bausatz von www.pollin.de (Art.-Nr.: 810022)...
- hast du den UART richtig definiert im programm? (schicks am besten mal)
'step2.bas.BAS
$regfile = "m16def.dat"
$hwstack = 32
$swstack = 8
$framesize = 24
$crystal = 8000000
$baud = 9600
Config Portd.2 = Input
Config Portd.3 = Input
Config Portd.4 = Input
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output
Do
Portd.5 = 1
Portd.6 = 0
Print "LED 1 ein / LED 2 aus"
Waitms 500
If Pind.2 = 1 Then
Portd.7 = 1
Waitms 1
Portd.7 = 0
End If
Portd.5 = 0
Portd.6 = 1
Print "LED 1 aus / LED 2 ein"
Waitms 500
If Pind.2 = 1 Then
Portd.7 = 1
Waitms 1
Portd.7 = 0
End If
Loop
End
- welches terminal benutzt du?
...es ist eins von der Buch-CD zu MSR mit Windows, bzw, MSR mit Word und Excel. Verwende ich ein Nullmodem-Kabel und zwei PC's auf denen jeweils das Terminal läuft, tauschen beide Daten ohne Probleme aus. Im Terminal von Bascom zeigt er mir den gleichen Fehler wie im anderen Terminal (die Zahlen leserlich, der Rest Kauderwelsch). Wie sich das Terminal genau nennt müsste ich zuhause nachschauen, dürfte aber nicht weiter relevant sein.
Bernhard.
du solltest es mal testen, wenn du noch ne config reinpaggst:
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Tja, manchmal sieht man den Wald vor lauter Bäumen nicht: Ich hab gedacht, dass die Fusebits beim Programmieren auch mit gebrannt werden. Dem ist aber nicht so !
Ich hab mir gestern mal den Spaß gemacht, und auf den lesen-Button in den Fusebits gedrückt und siehe da, er hat mir die Werkseinstellungen angezeigt: JTAGEN, BOOTSZ1-0, SUT1 und CKSEL3-1 waren gesetzt. Seit ich die Häckchen überall rausgemacht und auf schreiben geklickt hatte, funktioniert alles wunderbar. Auch die Übertragung per RS232 kommt nun vollständig und leserlich an !!!
Mit der internen Taktung kann er scheinbar die Baudrate nicht 100%tig auflösen.
Na immerhin, jetzt funktionierts (ohne, dass ich den zusätzlichen Code einfügen musste, trotzdem DANKE) !
Gruß, Berni.
ne, das mit der baudrate macht bascom ja durch das $baud= commando, und wenn du jetzt bei $crystal 8MHz angibst, nimmt bascom den wert 8MHz zur berechnung der baudrate, und nicht die internen 1MHz die tastächlich laufen ^^
Martin
Hab da jetzt ein anderes Problem:
Ich lese einen String von der RS232 ein, zerlege diesen in ein Array und verwende die Werte, um zunächst mal einen Schrittmotor zu steuern.
Da man mit einer Achse ja in beide Richtungen fahren kann, habe ich auch negative Werte. Die Vorzeichenerkennung funktioniert, wie aber bekomme ich den Wert in's Positive ?
Hier der Code:
...
Dim Ar(5) as string * 100
Dim X as double
...
If X < 0 then
Portc.1 = 0 'CW/CCW Umschaltung
Portd.5 = 1 'Signalisierung auf LED1 zur Kontrolle
X = Val(Ar(1)) * (-1)
Print "Xcorr=" ; X 'Kontrollausgabe des umgekehrten Wertes
Else
Portc.1 = 1 'CW/CCW bleibt
Portd.5 = 0 'Kontroll LED1 bleibt aus
end if
...
Er erkennt, dass der Wert kleiner null ist, da er die LED einschaltet und den Wert zurückgibt, allerdings ist er immer noch negativ !
Ich brauche diesen aber positiv, da die Schritte in einer anschließenden Schleife von null bis Wert hochgezählt werden.
Kann mir jemand einen Tipp geben ?
Ich verstehe dein Programm nicht ganz:
X enthält schon vor dem IF den Wert?
Warum greifst du dann aud das Array zurück und schreibst nicht
X = -1*X
Ich habe mit Bascom keine Erfahrung, aber könnte es hier ein Problem mit der Umwandlung des Strings nach double sein?
/jan
... in PHP kann ich Werte so zuweisen:
X = X * (-1)
Definiert ist das so, dass ich der Variablen einen neuen Wert zuweisen kann, indem ich sie selbst zur Berechnung hernehme. Bascom bringt hier die Fehlermeldung dass Quell und Zielvariable nicht gleich sind - lässt eine Berechnung mit sich selbst also nicht zu.
Außerdem muß ich den String ja in eine Zahl umwandeln, da ich sonst keine Berechnungen durchführen kann.
Du brinst mich jetzt aber auf eine Idee: Vielleicht gibt es eine Möglichkeit, im String noch das Vorzeichen zu kappen, vor ich daraus eine Zahl mache. Dann hätte ich dieses Problemchen auch gelöst.
..oder eine 0 an der Stelle addieren
X &= ~ 0b100000000000000
Hab nun auch eine Möglichkeit gefunden:
Xc = Mid(ar(1) , 2)
X = Val(Xc)
Somit kappe ich einfach das Vorzeichen.
Dein Source dürfte aber weniger Platz brauchen, da ich schon wieder über 4096 Bytes Source bin und ich mir nun doch die Bascom-Vollversion besorgen muss.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.