Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage für Mega8


von andreas (Gast)


Lesenswert?

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:
1
Dim A As Byte
2
3
4
   For A = 1 To 10
5
6
    Print "A: " ; A
7
8
    If A > 9 Then
9
     Goto Weiter
10
    End If
11
12
   Next A
13
14
Weiter:
15
16
Do
17
Loop
18
19
End

von Severino R. (severino)


Lesenswert?

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)

von Johannes M. (johnny-m)


Lesenswert?

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.

von Paul Baumann (Gast)


Lesenswert?

Probier mal so:

Dim A as Byte

A = 1
While A < 10
  Print "A: " ; A
  Incr A
Wend

Do

Loop

End

MfG Paul

von andreas (Gast)


Lesenswert?

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

von andreas (Gast)


Lesenswert?

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
40
41
Loop
42
43
End

von Paul Baumann (Gast)


Lesenswert?

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

von Pete K. (pete77)


Lesenswert?

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 ?

von Magnus Müller (Gast)


Angehängte Dateien:

Lesenswert?

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

von andreas (Gast)


Lesenswert?

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

von Magnus Müller (Gast)


Lesenswert?

Nochmal: Fuse High Byte !

Beitrag "Re: Anfängerfrage für Mega8"

von andreas (Gast)


Lesenswert?

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

von Magnus Müller (Gast)


Lesenswert?

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

von Magnus Müller (Gast)


Lesenswert?

Nachtrag:

Es war übrigens eine Weise Entscheidung, uns den Inhalt der Fuse Bytes 
mitzuteilen.

von andreas (Gast)


Lesenswert?

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

von Anonymous (Gast)


Lesenswert?

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.

von andreas (Gast)


Lesenswert?

Danke!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.