PDA

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

x-ryder
01.03.2006, 18:21
1111:1111 iss richtig, das iss external crystal

Martin

Berni28
10.03.2006, 11:03
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.

maze2k
10.03.2006, 11:44
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...

Berni28
10.03.2006, 12:15
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.

Berni28
13.03.2006, 09:40
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.

x-ryder
13.03.2006, 13:55
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

Berni28
13.03.2006, 14:29
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.

x-ryder
13.03.2006, 14:34
aaalso, in ponyprog musste CKSEL alle auf ohne häkchen, und SUT0-1 auch aus, also ohne häkchen, dann sollte es gehen ^^

Martin

Berni28
13.03.2006, 16:00
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 ???

x-ryder
13.03.2006, 16:03
doch eigentlich schon, hast du die fuses auch mal ausgelesen vorher?

Martin

Berni28
13.03.2006, 16:10
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).

x-ryder
13.03.2006, 16:12
ja, dann lies mal die fuses aus, und mach die alle aus, also die, die ich gesacht hab, und dann schreib die mal rein

Berni28
13.03.2006, 16:20
Ich steck auch mal einen fabrikneuen Mega16 rein und versuch die Fuses auszulesen. Mal sehen welche da dann gesetzt oder nicht sind.

Berni28
14.03.2006, 10:05
...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.

x-ryder
14.03.2006, 14:18
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

Berni28
14.03.2006, 15:05
...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.

x-ryder
14.03.2006, 15:43
du solltest es mal testen, wenn du noch ne config reinpaggst:


Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

Berni28
15.03.2006, 08:21
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.

x-ryder
15.03.2006, 14:55
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

Berni28
03.04.2006, 08:57
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 ?

jaspo
03.04.2006, 13:13
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

Berni28
03.04.2006, 13:42
... 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.

jaspo
03.04.2006, 16:33
..oder eine 0 an der Stelle addieren
X &= ~ 0b100000000000000

Berni28
04.04.2006, 09:38
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.