PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Mega16 und STK500



harry2212
24.05.2008, 09:42
Hallo Leute,
hab da mal ein Problem.
Ich habe die ganze Zeit mit dem STK500 die Mega8515 programmiert, hat auch wunderbar funktioniert. Nun brauchte ich analoge Eingänge und hab deshalb einen Mega16 genommen. Um ein Gefühl für den Controller zu bekommen habe ich erst einmal ganz einfachen Code programmiert. Nun wider aller Erwartungen habe ich Probleme bekommen. Wahrscheinlich sind die fusebits falsch gesetzt. Aber da kenne ich mich gar nicht aus. Wer weiß wie ich die fusebits bei einem Mega16 im STK500 setzen muß.
Ein Beispiel: Zunächst kommt mir die Arbeitsgeschwindigkeit des Controllers sehr langsam vor. Das herunterzählen und anzeigen eines Ports geht so langsam, daß man es sehen kann.
Dann ein anderes Beispiel. So funktioniert folgender Code.

Do
toggle portb.0
wait 1
loop

Aber so funtioniert der Code nicht.

Do
portb.0 = 1
wait 1
portb.0 = 0
loop

Der Controller schaltet den Portpin auf 1 und fertig.

Vieleicht weiß jemand weiter. Auf jeden Fall im voraus danke.
Gruß Harald

uwegw
24.05.2008, 11:17
Das Teil läuft standardmäßig auf 1MHz internem Takt. Wie willst du es denn takten?


Do
portb.0 = 1
wait 1
portb.0 = 0
loop

schaltet ein, wartet eine Sekunde, schaltet aus, und dann geht es wieder von vorne los. Du schaltest also nach dem Ausschalten in kürzester Zeit (ein paar Taktzyklen) wieder ein.
[/quote]

harry2212
25.05.2008, 22:08
Hallo erstmal,
also ich bin mir nicht ganz sicher was Du meinst. Der Mega16 steckt ja im Sockel vom STK500 und wird mit dessem Taktgenerator betrieben. Das heißt der Controller taktet standartmäßig mit 3686000 Hz. Ich habe gerade gelesen, daß ich in diesem Fall die Fusebits auf external Takt setzen muß. Ich muß mal nachschauen ob bezw. wie die Fusebits im Controller gesetzt sind. ich gehe hier bewußt vorsichtig vor weil ich halt nichts falsch machen will.
Also vom Code her muß der Controller das ohne weiters ausführen. Wie gesagt ich hatte vorher einen 8515 drin und mit diesem Controller gabs mit solchen einfachen Codes keine Probleme.
Gruß Harald

harry2212
26.05.2008, 21:25
Hallo, ich bins nochmal.
Sorry, hast natürlich recht. das Teil läuft mit internem Takt.
Ich dachte weil es im STK500 an derem Taktsystem angeschlossen ist müßte es mit deren Takt laufen. Aber weit gefehlt, die fusebits waren gar nicht so eingestellt. Ich habe dann die fusebits umgestellt, jetzt ist der mega16 allerdings tot. :-s
Ich habe alles versucht was hier im Forum schon vorgeschlagen wurde, aber bis jetzt ohne Erfolg. NaJa sch... trauf, ich habe noch einen in Reserve.
Das Problem mit dem Port besteht allerdings immernoch. Ich glaube fast es hat doch nichts mit den fusebits zu tun.
Wenn der mega mit internem Takt von 1MHz läuft, sollte es doch kein Problem sein ein Portpin im Sekundentakt ein und auszuschalten. Wenn ich mit dem Befehl toggle Portb.0 wait 1, progge funktioniert es ja auch wunderbar.
Also im Moment stehe ich voll auf'm Schlauch.
Gruß Harald

Hubert.G
27.05.2008, 08:51
Wenn du nur den Takt umgestellt hast, kann der Mega nicht tot sein. Du hast entweder auf Quarz oder auf Oszillator gestellt, beides funktoniert im STK gleich. Es kann nur sein das die Jumper des STK auf Quarz sind und keiner gesteckt ist.
Eine weitere Möglichkeit wäre das du den Reset abgeschaltet hast, das lässt sich aber mit HV-Programmierung beheben.

fluchtpunkt
27.05.2008, 14:55
Das Problem mit dem Port besteht allerdings immernoch. Ich glaube fast es hat doch nichts mit den fusebits zu tun.
Hat es auch nicht, das hat was mit dem der sich die Software ausgedacht hat zu tun :)


Do
portb.0 = 1
wait 1
portb.0 = 0
loop

Ueberlegen wir uns doch einfach mal was der Controller so ausfuehrt..

Schalte PB0 ein.
warte 1 Sekunde
Schalte PB0 aus
Schalte PB0 ein
warte 1 Sekunde
Schalte PB0 aus
Schalte PB0 ein
usw.

Du erkennst das Problem? Einen Takt nachdem die Led ausgeschaltet wurde wird sie schonwieder eingeschaltet. Da is klar das man nix sieht,

Eine kleine Aenderung und das ganze sollte wie gewuenscht funktionieren:

Do
portb.0 = 1
wait 1
portb.0 = 0
wait 1
loop

harry2212
27.05.2008, 19:16
Hallo Alle zusammen,
danke für Eure Interesse. Zunächst zum Tod vom Mega16.
Er lebt wieder. Ich hatte noch ein altes Galep, mit dem ließ sich der Mega problemlos programmieren.

Jetzt zu dem Code, ich würde sagen das leuchtet mir ein. Ich probiers gleich aus. Melde mich dann wieder.
Gruß Harald

harry2212
27.05.2008, 19:24
Hallo ich bins nochmal,
also habs probiert. Du hast natürlich recht. Das zeigt mir mal wieder, daß man bei einem Fehler immer wieder den gleichen Fehler begeht und am besten den Rat Dritter einholt.
In diesem Sinne nochmals vielen Dank für Eure Hilfe.
Gruß Harald

harry2212
31.05.2008, 21:00
Hallo Alle zusammen,
ich habe mal wieder eine Frage zum Mega16. Es geht um die Genauhigkeit des internen Taktes.
Ich habe mittels timer0 interrupst eine Variable hochgezählt, sodaß alle 60 Sekunden eine Led getoggelt wird um die Zeit zu stoppen.
Ich habe nun festgestellt, daß ich bei einer Minute eine Abweichung von 4 Sekunden habe. Bei einem internen Takt von 8 Mhz.
Ist die Ungenauhigkeit normal?
Sollte ich den mega besser mit externem Quarz betreiben. Oder vieleicht sogar mit einer realtime clock?
Gruß Harald

Furtion
31.05.2008, 21:49
Hi,

ich kann RTC nur empfelen, die sind z.B. über I²C ansteuerbar und messen
die Zeit ziemlich perfekt und können auch ohne Versorgungsstrom mit
einer kleinen Baterie lange überleben. Zu der Ungenauigkeit: es wird oft
geschrieben, dass der interne Quarz sehr unstabiel ist, aber 4 sec? Vill.
solltes du mal dein Programm posten.

Was mir aufgefallen ist, vill. sollte man mal anfangen so ein Wikibeitrag
zu schreiben, der sich mit den Anfängerfehlern von Bascom befasst,
Beispiele wären z.B. diesese an,warten aus, an oder der Versuch
2 Do...Loop SChleifen gleichzeitig zum Laufen zu bringen.

harry2212
01.06.2008, 10:43
Hallo,
also die Idee mit dem Wikibeitrag fände ich sehr gut, ich denke das viele Anfänger immer über die gleichen Probleme stolpern.
Ich habe zwar ein Buch 'Programmieren der AVR - Risc mit Bascom-AVR' von Claus Kühnel, das ist auch nicht schlecht aber solche Probleme und Fragen werden darin überhaupt nicht behandelt.
Vieleicht kennst Du ein Buch das speziell die Mega8,16 und 32 behandelt.
Mit dem Datasheet in englischer Sprache komme ich oft nicht zurecht.
Hier mal den Code, ich habe dabei noch das LCD Display getestet. Es geht mir aber hauptsächlich um die Timer0 generierte Zeit.
Den Wert von Variable A habe ich aus dem Buch von Herrn Kühnel.
T=256*prescaler/Fosc
rein rechnerisch komme ich auf einen Wert 1/Interrupt = 122, mit diesem wert zähle ich dann bis auf eine Minute.
Ich mußte den Wert aber auf 126 setzen damit ich annähernd auf eine Sekunde komme.



$regfile = "M16def.dat" ' specify the used micro
'$crystal = 8000000 ' used crystal frequency
$baud = 9200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
'$sim




Const On = 1
Const Off = 0

Dim A As Word
Dim C As Word

Config Portd = Input
Portd = 255
Config Portc = Output
Portc = 255

Config Timer0 = Timer , Prescale = 256
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.0 , Rs = Portb.1
Config Lcdbus = 4
Config Debounce = 50
Taster Alias Portd.0
Anzeige Alias Portb.2
A = 0
C = 0


On Timer0 Timer0_isr

Enable Timer0
Enable Interrupts



Do

If C = 60 Then
Toggle Portc.1
End If
Wait 1
Debounce Pind.0 , 0 , Anzeige_aus , Sub
Cls
Lcd "Guten Tag"
Locate 2 , 1
Lcd C
Toggle Portc.0
Wait 1
Loop


Anzeige_aus:
If Anzeige = On Then
Anzeige = Off
Else
Anzeige = On
End If
Return


Timer0_isr:
Incr A
If A = 126 Then
Incr C
End If
If A > 126 Then
A = 0
End If
If C > 59 Then
C = 0
End If
Return



Also nach der Formel müßte alle 8,192ms ein Interrupt ausgelöst werden, demnach müßte ich nach 122 interrupst eine Sekunde haben.
Vieleicht mache ich da auch einen gedanklichen Fehler, aber der es so aus als wenn der Controller zu schnell liefe. Deshalb habe ich dann auf 126 geändert, in diesem fall habe ich eine Abweichung von 0,5 Sek. Wenn ich nun aber hochrechne auf einige Stunden, dann ist die Abweichung natürlich inakzeptabel.
Gruß Harald

Furtion
01.06.2008, 11:12
Hi,

für die Timerberechnung gibt es im Downloadbereich das Programm rnavr,
mit dem kann man die Timer sehr gut berechnen.