Anzeige:

Digitale Lösung für Schaltungen / Problem?

Hier finden sie die archivierten Beiträge des alten PHPBB Forums von www.loetstelle.net

Von Paraboloid87 am 26.05.2009 21:42

...Moment,
habe die Zeile gerade ergänzt, aber es wird trotzdem nicht hochgezählt...

Edit: sehe gerade, dass die Zeile schon in meinem Programm stand. Allerdings hatte ich versehentlich nicht ganz hochgescrollt und sie somit beim kopieren vergessen... (bin also trotzdem ein Schussel Smile )

Gruß
Alex

Von gerold am 26.05.2009 21:55

Paraboloid87 hat folgendes geschrieben:
aber es wird trotzdem nicht hochgezählt

Hallo Alex!

Das Programm sollte eigentlich laufen. Also sind es die üblichen Verdächtigen, die auszuschalten sind:

- Läuft der µC auch wirklich mit dem angeschlossenen Quarz? Nimm den mal weg. Wenn der µC dann trotzdem noch läuft, dann sind die Fuse-Bits falsch eingestellt.

- Nimm als Baudrate mal ``2.400`` her. Das funktioniert mit jedem Systemtakt. Werden dann die Zahlen richtig übertragen? Wenn Ja, dann gibt es also doch Übertragungsfehler. In diesem Fall --> Runter mit der Baudrate. Nimm nur dann eine so hohe Baudrate, wenn du auch einen schnellen Quarz angeschlossen hast.

- Setze im Code auch HWSTACK, SWSTACK und FRAME auf jeweils 100.
Code:
$hwstack = 100
$swstack = 100
$framesize = 100

Nicht dass uns irgend eine falsche Bascom-Einstellung dazwischenfunkt.

...mal abwarten, ob das was bringt.

mfg
Gerold
Smile

PS: Was manche auch vergessen: Die Baudrate muss auch beim Computer im Terminalprogramm eingestellt werden.

.

Von Paraboloid87 am 26.05.2009 22:07

Hallo Gerold,
habe die drei Zelen eigefügt und alles überprüft:

Ohne Quarz läuft der Atmega nicht (Test-LED hört auf zu blinken).

Niedrigere Baudraten bringen keinen Erfolg. Habe jetzt 2400, 4800 und 9600 versucht.

Das Terminal zeigt auch jede Sekunde eine neue 22 an. Es gibt keine anderen Zeichen oder so im Terminal, die auf eine Störung hindeuten würden. Es kommt jede Sekunde eine "saubere" 22 an.

Merkwürdige Geschichte...
hoffentlich fällt dir noch eine Fehlerquelle ein, ich bin langsam ratlos.
Alex

EDIT: habe immer beide Baudraten umgestellt: Terminal und BASCOM... Vielleicht muss ich die in den Systemsteuerungen noch ändern??? Das versuch ich gleich mal!

EDIT: Auch die Änderungen in den Systemsteuerungen bleiben erfolglos.

Von gerold am 26.05.2009 22:24

Hallo Alex!

Man muss die AVRs schon ziemlich martern, dass sie hin werden. Aber im Moment glaube ich schon fast, dass dein AVR kaput ist.

Probiere statt ``wert = wert + 2`` mal ``incr wert`` aus.
Probiere auch statt WORD, die Variable als BYTE zu definieren.

Aber trotzdem --> das Programm muss so funktionieren. Da stimmt irgendetwas Anderes nicht.

Zeige doch nochmal das ganze Programm her. Aber setze es hier bitte in CODE-Tags, damit die Einrückungen erhalten bleiben.

mfg
Gerold
Smile

Von Paraboloid87 am 26.05.2009 22:43

Die Datentypen der Variablen zu verändern und den Incr-Befehl habe ich auch schon versucht. Beides verläuft erfolglos.

Code:


$crystal = 3686411
$regfile = "m8def.dat"
$baud = 2400
$hwstack = 32
$swstack = 10
$framesize = 40

Ddrb = &B00000010                                           'Test-LED
Portb.1 = 1

Dim Zahl As Word
Zahl = 20

Do

   Wait 1
   Toggle Portb.1
   Zahl = Zahl + 2
   Print Zahl

Loop

End


Ich denke, es liegt wirklich daran, dass der Atmega8, den neuen Wert von "Zahl" nicht speichert. Die Konsolenausgabe funktioniert fehlerfrei.
Habe es auch mit print "Hallo" etc versucht.
Wenn ich den Startwert von Zahl verändere, erfolgt einmal die Addition eines Schrittes - danach nichts mehr.
Das sollte doch heißen, dass der neue Wert nicht gespeichert wird oder die Addition nur eimal ausgeführt wird. Letzteres würde ich allerdings ausschließen.

Von Paraboloid87 am 26.05.2009 22:56

Hi Gerold,
Ich habe gerade folgenden Versuch gemacht:
Einfach die LED dauerleuchten lassen. Jede Sekunde erlischt die LED jedoch kurzzeitig. kann es sein, dass der Atmega ständig resettet wird? wodurch auch immer?
und deshalb immer wieder auf den Startwert kommt und die erst Operation ausführt und sofort wieder resettet?

EDIT: Ja, das is der Fehler! Habe jetzt eine Schleife mit drei Print-Befehlen und jeweils 2 Sekunden Wartzeit dazwischen gebrannt. Es wird nur der erste Print-Befehl ausgeführt! Wenn ich in dem Code, den ich als letztes gepostet habe, die Wartezeit auf waitms 500 setze, dann schafft er 4 Additionen und dann fängt er von vorne an. Jetzt noch die Frage: Warum? Bzw, wie löst man ein solches reset überhaupt aus?
Es ist sicherlich ein Schaltungsfehler oder?

Von pcprofi am 26.05.2009 23:47

Frage:

Watchdog abgestellt? Wenn du nämlich sonst das Watchdog-Register nicht innerhalb eines bestimmten Zeitraumes resettest, dann macht er nen Reset...

Du kannst das in den FuseBits abstellen...

Gruß Rainer

Von gerold am 27.05.2009 07:07

EDIT: Ups, da habe ich doch glatt die Beiträge auf der nächsten Seite übersehen. Smile

- Watchdog
- Reset-Widerstand

-----------------

Paraboloid87 hat folgendes geschrieben:
Habe es auch mit print "Hallo" etc versucht.
Wenn ich den Startwert von Zahl verändere, erfolgt einmal die Addition eines Schrittes - danach nichts mehr.
Das sollte doch heißen, dass der neue Wert nicht gespeichert wird oder die Addition nur eimal ausgeführt wird. Letzteres würde ich allerdings ausschließen.

Hallo Alex!

Vielleicht resetet sich der µC immer wieder. Lass den Reset-Pin zum Testen mal offen und teste auch einmal, mit 10 kOhm nach VCC. Programmer abschließen -- nur die UART-Verbindungen und GND drann lassen. Wie ist dein µC angeschlossen? Schaltplan?
Code:
$regfile = "m8def.dat"
$crystal = 3686411
$baud = 2400
$hwstack = 100
$swstack = 100
$framesize = 100

'Test-LED
Ddrb = &B00000010                                           
Portb.1 = 1

Dim Zahl As Word
Zahl = 20


Do
   Print "Hallo 1"

   Wait 1
   Toggle Portb.1
   Zahl = Zahl + 2
   Print Zahl
   
   Wait 1
   Print "Hallo 2"
Loop

End

Wenn der Speicher hin wäre, dann müsste es einen Unterschied geben, wenn du die STACK-Größen und den Frame veränderst. Weiters belegt in diesem Programm der "Platzhalter" die ersten beiden Byte im übrigen Speicher. Die Variable "Zahl" ist somit nicht mehr auf dem selben Platz.
Code:
$regfile = "m8def.dat"
$crystal = 3686411
$baud = 2400
$hwstack = 100
$swstack = 100
$framesize = 100

'Test-LED
Ddrb = &B00000010                                           
Portb.1 = 1

Dim Platzhalter as Word
Dim Zahl As Word
Zahl = 20


Do
   Print "Hallo 1"

   Wait 1
   Toggle Portb.1
   Zahl = Zahl + 2
   Print Zahl
   
   Wait 1
   Print "Hallo 2"
Loop

End

Aus der Hilfe:
Zitat:
The $REGFILE directive must be the first statement in your program. It may not be put into an included file since only the main source file is checked for the $REGFILE directive.

Einen wirklichen Unterschied, konne ich nicht feststellen. Aber wenn es schon in der Hilfe steht...

Schon mit einem zweiten µC getestet? Schaltplan? Foto vom Aufbau?

mfg
Gerold
Smile

Von Paraboloid87 am 27.05.2009 07:07

Guten Morgen!
Ja es war der Watchdog-Timer eingestellt! Ich lasse jetzt jede Sekunde den Watchdog mit !WDR resetten und nun funktioniert es.
Wie kann ich denn den Watchdog über die FUSE-bits ausschalten? Habe dazu jetzt keine konkrete Anleitung gefunden und wollte dort nicht einfach "rumexperimentieren".

Danke Gerold und PCprofi!
Grüße,
Alex

Von gerold am 27.05.2009 07:14

Paraboloid87 hat folgendes geschrieben:
Wie kann ich denn den Watchdog über die FUSE-bits ausschalten?

Hallo Alex!

Dafür ist das FuseBit "WDTON" zuständig.

- http://halvar.at/elektronik/kleiner_bascom_avr_kurs/fuse_lock_bits_1/
- http://halvar.at/elektronik/kleiner_bascom_avr_kurs/fuse_lock_bits_2/
- http://halvar.at/elektronik/kleiner_bascom_avr_kurs/fuse_lock_bits_3/

In Teil 1 und Teil 3 wird jeweils kurz auf den Watchdog-Timer eingegangen.

mfg
Gerold
Smile

Anzeige: