www.mikrocontroller.net

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

Autor: andreas (Gast)
Datum: 16.05.2008 13:34

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:
Dim A As Byte


   For A = 1 To 10

    Print "A: " ; A

    If A > 9 Then
     Goto Weiter
    End If

   Next A

Weiter:

Do
Loop

End
Autor: Severino R. (severino)
Datum: 16.05.2008 13:38

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)
Autor: Johannes M. (johnny-m)
Datum: 16.05.2008 13:39

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.
Autor: Paul Baumann (Gast)
Datum: 16.05.2008 13:43

Probier mal so:

Dim A as Byte

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

Do

Loop

End

MfG Paul
Autor: andreas (Gast)
Datum: 16.05.2008 14:18

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
Autor: andreas (Gast)
Datum: 16.05.2008 15:35

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
$regfile = "m8def.dat"
$crystal = 16000000
$baud = 57600

Waitms 500

Print ""
Print "neustart"
Print ""

Waitms 500


Config Adc = Single , Prescaler = Auto

Start Adc

Dim W As Word , Channel As Byte
Dim Mx As Word                                              'max
Dim Mn As Word                                              'min

Channel = 0

Mx = Getadc(channel)
Mn = Getadc(channel)

Do

   W = Getadc(channel)

   If W < Mn Then
      Mn = W
   End If

   If W > Mx Then
      Mx = W
   End If

   Print "Min: " ; Mn ; " Aktuell: " ; W ; " Max " ; Mx

Loop

End
Autor: Paul Baumann (Gast)
Datum: 16.05.2008 17:43

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
Autor: Pete K. (pete77)
Datum: 16.05.2008 17:58

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 ?
Autor: Magnus Müller (magnetus)
Datum: 16.05.2008 22:48
Dateianhang: Fuse_High_Byte__Mega8.PNG (13,7 KB, 25 Downloads)
preview image for Fuse_High_Byte__Mega8.PNG

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
Autor: andreas (Gast)
Datum: 16.05.2008 22:53

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
Autor: Magnus Müller (magnetus)
Datum: 16.05.2008 23:13

Nochmal: Fuse High Byte !

Beitrag "Anfängerfrage für Mega8"
Autor: andreas (Gast)
Datum: 16.05.2008 23:31

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
Autor: Magnus Müller (magnetus)
Datum: 16.05.2008 23:41

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
Autor: Magnus Müller (magnetus)
Datum: 16.05.2008 23:43

Nachtrag:

Es war übrigens eine Weise Entscheidung, uns den Inhalt der Fuse Bytes
mitzuteilen.
Autor: andreas (Gast)
Datum: 17.05.2008 01:41

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
Autor: Anonymous (Gast)
Datum: 17.05.2008 09:32

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.
Autor: andreas (Gast)
Datum: 18.05.2008 10:07

Danke!

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net