Moin!
Ich habe eine Frage, bin gerade erst am einsteigen mit der kleinen
Elektronik.
Wenn ich ein ganz simples Programm schreibe für den Mega8 in dem er
einen Code ausführt, dann beendet, und danach in eine unendlich Schleife
geht, dürfte er den vorherigen Dode doch nciht wieder ausführen oder?
Bei mir springt er aber irgendwann wieder zum Anfang...
nur wenn ich in die do loop funktion auch einen Print reinsetze, tut er
das nicht.
wie mache ich das nun richtig, dass er die Endlosschleife nicht
verlässt?
vielen Dank
Andreas
Beispiel für Bascom:
Vielleicht optimiert der Compiler die leere Schleife einfach weg?
Müsste es korrekt nicht heissen
DO
LOOP UNTIL <Bedingung>
Vielleicht lässt sich die Optimierung lokal oder global ausschalten.
(-> Handbuch)
Watchdog ausgeschaltet? Irgendwelche Reset-Quellen (freigegebene
Interrupts ohne Handler, keine Ahnung, was BASCOM damit macht)?
BTW:
Ich hab zwar von BASCOM an sich nicht viel Ahnung, aber wenn Du schon
eine for-Schleife benutzt, die nach einer vorgegebenen Anzahl von
Durchläufen (in diesem Fall 10) sowieso abgebrochen wird, dann brauchst
Du den Abbruch nicht auch noch mit einem if und einem goto in der
Schleife herbeizuführen. Eine for-Schleife macht wenig Sinn, wenn sie so
"abgewürgt" wird.
Danke für die Antworten!
Ähm ja das abwürgen ist hässlich war noch ein relikt aus meinem
testversuchen...
das mit dem wegoptimieren macht sinn...
paul, der code bewirkt ziemlich genau das selbe...
und wenn ich den
Do
loop until A=12
mache, springt er auch raus.
Mal sehen immerhin macht es jetzt sinn, danke!
Andreas
Hm, ich habe mal weiter probiert:
ich habe einen NTC an nen ADC angeschlossen, der Wert verändert sich
auch, aber auch dann wird der Mega immer wieder neu gestartet. undzwar
alle 1,64 Sekunden
Wie kann das sein?
Johannes M. du hast vorhin von Watchdog und Interrupt gesprochen. sowas
habe ich in meinem aktuelen Programm nicht drin, kann es sein das das
von älteren Programmen im Mega gespeichert bleibt? Das kann ich mir ja
garnicht vorstellen.
Meine lfuse sind: 0xEE und hfuse 0x99 und habe einen externen 16mhz
quarz.
Merlin
1
$regfile = "m8def.dat"
2
$crystal = 16000000
3
$baud = 57600
4
5
Waitms 500
6
7
Print ""
8
Print "neustart"
9
Print ""
10
11
Waitms 500
12
13
14
Config Adc = Single , Prescaler = Auto
15
16
Start Adc
17
18
Dim W As Word , Channel As Byte
19
Dim Mx As Word 'max
20
Dim Mn As Word 'min
21
22
Channel = 0
23
24
Mx = Getadc(channel)
25
Mn = Getadc(channel)
26
27
Do
28
29
W = Getadc(channel)
30
31
If W < Mn Then
32
Mn = W
33
End If
34
35
If W > Mx Then
36
Mx = W
37
End If
38
39
Print "Min: " ; Mn ; " Aktuell: " ; W ; " Max " ; Mx
Hm. Das Programm sieht gut aus. Hast Du am PC einen fehlerfreien
Empfang,
d.h. kommt der Text vernünftig an? Wenn ja, stimmen die
Fuse-Einstellungen
auch.
57600 Baud sind aber für 16 Mhz nicht so gut, weil das schon 2,1%
Abweichung vom Ideal ergibt. Nimm mal 9600 Baud. (aber das ist nicht die
Ursache für einen Neustart).
Mach mal einen 10 Kiloohm Ziehwiderstand von Reset nach +Ub.
MfG Paul
Geht es auch mit einem
Do
...
Loop until 0
nicht ?
Wenn das Programm beendet wird, wird das Programm doch nicht automatisch
so periodisch wiederholt, oder ?
Vielleicht den uC mal komplett löschen und dann neu flashen.
Bricht die Spannung bei der Wandlung ein ? Sind genug Kondensatoren in
der Schaltung ?
andreas wrote:
> auch, aber auch dann wird der Mega immer wieder neu gestartet. undzwar> alle 1,64 Sekunden
...
> Meine lfuse sind: 0xEE und hfuse 0x99 und habe einen externen 16mhz> quarz.
Setze das Fuse High Byte auf 0xD9 und alles wird gut. Mit 0x99 (Bit 6
auf '0') hast du den Watchdog Timer permanent enabled, welcher dir dann
in regelmäßigen Abständen deinen Controller resetet.
Gruß,
Magnetus
Moin,
Die Daten kommen am PC super an, ohne Fehlern...
der 10kOhm widerstand von Reset an + ist drin,
Controller komplett löschen, hm, ich programme mit Avrdude (Wegen dem
USBasp) habe den mit parameter -e (perform chip erase) gelöscht, dann
kam natürlich nix mehr im Terminal an, danach neu geflasht und das selbe
scenario.
Bei welcher Wandlung könnte die Spannung einbrechen? Ich habe ein
stabilisiertes Netzteil mit dem der Chip versorgt wird.
Kondensatoren zwischen VCC und GND am uC einen 100nf und am Quarz 22pF
Kondensatoren... Sollte doch ausreichen, oder?
Ich werde mal mit dem internen Quarz versuchen...
Merlin
Moin Magnus!
Das wars, vielen Dank!!
ich ahbe deinen beitrag vorher leider nicht gesehen, habe wohl gerade
getippt!
Also dankeschön dir und auch den anderen für die unterstützung!
Merlin
Biddeschöööön ;)
Ich dachte mir schon, dass du mein Posting nicht gesehen hast, weil du
wahrscheinlich vorher begonnen hattest, dein Posting zu tippen. Deswegen
mein (ähüm...) "dezenter" Hinweis :o)
Viel Spaß noch,
Magnetus
Ja, das habe ich auch gedacht :)
Ich ahb sie einfach mal mit dazu geschriebn da ich mir mit den fuses
garnicht sicher war, ich habe einfach in dem fuse calculator:
http://palmavr.sourceforge.net/cgi-bin/fc.cgi auf externen quarz
gestellt und dachte ich werde glücklich :)
vielleicht noch eine Frage dazu, wofür steht das 1k CK oder 16k CK und
die startup time? Wann ist es denn sinnvoll den Controller zu verzögern?
aber viel mehr interessiert mich das mit den **K CK
naja, bis dann!
Andreas
This setting is for slow rising power which may be necessary
depending on your power supply. (The time needed by your power
supply to reach a stable voltage).
Stable voltage = stable operation of the microcontroller.