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 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

Von Paraboloid87 am 27.05.2009 12:35

Hallo,
ich habe jetzt per myAVRProgTool die high Fuses geschrieben. und zwar genau so wie in der ersten Abbildung von

http://halvar.at/elektronik/kleiner_bascom_avr_kurs/fuse_lock_bits_3/.

Danach habe ich in der Konsole nur noch Wirrwarr angezeigt bekommen. Also dachte ich mir, dass ich wahrscheinlich den externen Quarz in den Fuse-Bits deaktiviert habe. Diesen habe ich mit Hilfe von myAVRQuickProg wieder aktiviert. Seitdem kann ich mich nicht mehr mit dem Microkontroller verbinden. Weder Schreiben noch Auslesen funktioniert.
Spannung habe ich auch schon aus- und angeschaltet.

Ich habe mit dem myAVRProgTool nichts anderes gemacht, als auf den Reiter High Fuses geklickt (Ich sehe gerade, dass man daneben noch einen Haken setzen kann im Reiter. Den habe ich nicht gesetzt) und dann den Haken bei "SPI enabled" und den Punkt bei "Boot Flash section size = 1024" gesetzt.
Danach habe ich auf "Jetzt Schreiben" geklickt.

Kann hier ein Fehler unterlaufen sein? Etwas anderes habe ich nicht gemacht.

Habe leider nur diesen einen Atmega8 Sad

Gruß
Alex

Von Paraboloid87 am 27.05.2009 13:58

Noch eine weitere Frage: Sollte der Atmaga8 vielleicht doch "verfuset" sein, gibt es dann mit dem MYSMARTUSB die möglichkeit ihn zu retten?

Bevor ich mir einen Programmer zugelegt habe, hatte ich extra auf dieses Merkmal geachtet. (Ich hatte es damals in einem thread gelesen.) Leider finde ich jetzt keine Anleitung dazu.

Gruß
Alex

Von Paraboloid87 am 27.05.2009 18:02

Hallo,
wollte nur sagen, dass ich das Problem gefunden habe! Der Mikrokontroller geht doch noch. Ich hatte ein Quarzkabel falsch angeschlossen!

Jetzt ist der Watchdog aus und das Terminal zählt fleißig hoch.

Danke für eure Hilfe!

Aber die Sache, ob man den "verfuseten" Mikrokontroller mit dem MYSMARTUSB wieder in den Griff kriegt, würde mich trotzdem noch interessieren!

Bis demnächst,
Gruß,
Alex

Von gerold am 27.05.2009 19:18

Paraboloid87 hat folgendes geschrieben:
Aber die Sache, ob man den "verfuseten" Mikrokontroller mit dem MYSMARTUSB wieder in den Griff kriegt, würde mich trotzdem noch interessieren!

Hallo Alex!

Der "mySmartUSB MK3" kann auch "Hochvolt-Parallel". Damit kann der die AVRs auch dann wieder ins Leben zurückholen, wenn der Reset-Pin verstellt wurde.

Man kann die AVRs statt mit einem Quarz auch mit externen Oszillatoren betreiben. Wenn man versehentlich auf Oszillator stellt, aber nur einen Quarz hat, dann muss man den AVR zum erneuten Flashen mit einem Oszillator betreiben. Das geht mit einem NE555 oder sonst einem Taktgeber. Der "mySmartUSB MK3" hat auch so einen Taktgeber eingebaut, so dass man damit auch diesen Fehler beheben kann.

Der "mySmartUSB MK2" kann eigentlich nur dann nichts mehr ausrichten, wenn der Reset-Pin verstellt wurde. Oder wenn der AVR mit einem *anderen* Programmer so verstellt wurde, dass man den AVR nicht mehr über den "In System Programming"-Modus flashen kann. Das kann man aber nur mit einem anderen Programmer verstellen.

mfg
Gerold
Smile

Von Tux77 am 31.05.2009 21:15

Hallo,

Ich habe jetzt mein Programm um den Sonnensensor erweitert,
aber es funktioniert nicht so wie es soll.
Hier mal das ganze Programm vielleicht entdeckt jemand einen Fehler.
Das Problem ist das die Rollos rundergefahren sind obwohl es dunkel (Lichtwert < als 492 (2.4v)) war. Gemessen habe ich 1.8 V am ADC0.

Code:
$regfile = "m32def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100

'Variablen
Dim Tuer_motor_counter As Integer
Dim Fenster_motor_counter As Integer
Dim Sonnen_sensor_counter As Integer
Dim Lichtwert As Integer
Dim Rollo_status As Bit

'Schalter
Taster_tuer_auf Alias Pind.1
Config Taster_tuer_auf = Input                              'Tür AUF

Taster_tuer_ab Alias Pind.0
Config Taster_tuer_ab = Input                               'Tür AB

Taster_gesamt_auf Alias Pinc.6
Config Taster_gesamt_auf = Input                            'Gesamt AUF

Taster_gesamt_ab Alias Pinc.5
Config Taster_gesamt_ab = Input                             'Gesamt AB

Taster_fenster_auf Alias Pinc.4
Config Taster_fenster_auf = Input                           'Fenster AUF

Taster_fenster_ab Alias Pinc.3
Config Taster_fenster_ab = Input                            'Fenster AB

Taster_fenster_stop Alias Pind.2
Config Taster_fenster_stop = Input                          'Fenster STOP

Taster_tuer_stop Alias Pind.3
Config Taster_tuer_stop = Input                             'Tuer STOP

'Motor
Motor_fenster_auf Alias Portd.7
Config Motor_fenster_auf = Output                           'Fenster AUF

Motor_fenster_ab Alias Portc.0
Config Motor_fenster_ab = Output                            'Fenster AB

Motor_tuer_auf Alias Portc.1
Config Motor_tuer_auf = Output                              'Tür AUF

Motor_tuer_ab Alias Portc.2
Config Motor_tuer_ab = Output                               'Tür AB

'Timer0 konfigurieren (15,2587890625 Überläufe/sec)
Config Timer0 = Timer , Prescale = 256
On Timer0 On_timer0
Enable Timer0

'ADC konfiguration
Config Adc = Single , Prescaler = Auto , Reference = Avcc



'Interrupts global einschalten
Enable Interrupts


'Hauptschleife
Do
   Debounce Taster_fenster_auf , 1 , Motor_fenster_auf_einschalten , Sub
   Debounce Taster_fenster_ab , 1 , Motor_fenster_ab_einschalten , Sub
   Debounce Taster_tuer_auf , 1 , Motor_tuer_auf_einschalten , Sub
   Debounce Taster_tuer_ab , 1 , Motor_tuer_ab_einschalten , Sub
   Debounce Taster_gesamt_auf , 1 , Gesamt_auf_einschalten , Sub
   Debounce Taster_gesamt_ab , 1 , Gesamt_ab_einschalten , Sub
   Debounce Taster_fenster_stop , 1 , Motor_fenster_stop , Sub
   Debounce Taster_tuer_stop , 1 , Motor_tuer_stop , Sub

   If Fenster_motor_counter = 0 Then
      Motor_fenster_auf = 0
      Motor_fenster_ab = 0
   End If
   If Tuer_motor_counter = 0 Then
      Motor_tuer_auf = 0
      Motor_tuer_ab = 0
   End If
   If Sonnen_sensor_counter = 0 And Rollo_status = 0 Then
      Gosub Sonnenautomatik_ab
   End If
   If Sonnen_sensor_counter = 0 And Rollo_status = 1 Then
      Gosub Sonnenautomatik_auf
   End If
Loop

End

'Timer0-Interrupt-Handler
On_timer0:
   If Tuer_motor_counter > 0 Then
      Decr Tuer_motor_counter
   End If
   If Fenster_motor_counter > 0 Then
      Decr Fenster_motor_counter
   End If
   If Sonnen_sensor_counter > 0 Then
      Decr Sonnen_sensor_counter
   End If
Return


'Motor einschalten
Motor_fenster_auf_einschalten:
   Motor_fenster_ab = 0
   Waitms 200
   Motor_fenster_auf = 1
   Fenster_motor_counter = 610                              ' ca. 40 sec.
Return

Motor_fenster_ab_einschalten:
   Motor_fenster_auf = 0
   Waitms 200
   Motor_fenster_ab = 1
   Fenster_motor_counter = 610                              ' ca. 40 sec.
Return

Motor_tuer_auf_einschalten:
   Motor_tuer_ab = 0
   Waitms 200
   Motor_tuer_auf = 1
   Tuer_motor_counter = 687                                 ' ca. 45 sec.
Return

Motor_tuer_ab_einschalten:
   Motor_tuer_auf = 0
   Waitms 200
   Motor_tuer_ab = 1
   Tuer_motor_counter = 610                                 ' ca. 40 sec.
Return

Gesamt_auf_einschalten:
   Motor_fenster_ab = 0
   Motor_tuer_ab = 0
   Waitms 200
   Motor_fenster_auf = 1
   Motor_tuer_auf = 1
   Tuer_motor_counter = 610
   Fenster_motor_counter = 610
   Sonnen_sensor_counter = 27468                            ' ca. 1800 sec.
   Rollo_status = 0
Return

Gesamt_ab_einschalten:
   Motor_fenster_auf = 0
   Motor_tuer_auf = 0
   Waitms 200
   Motor_fenster_ab = 1
   Motor_tuer_ab = 1
   Tuer_motor_counter = 687
   Fenster_motor_counter = 610                              ' ca. 40 sec.
Return

Motor_fenster_stop:                                         'Fenster STOP
   Motor_fenster_auf = 0
   Motor_fenster_ab = 0
Return

Motor_tuer_stop:                                            'Tür STOP
   Motor_tuer_auf = 0
   Motor_tuer_ab = 0
Return

'Sonnenautomatik
Sonnenautomatik_ab:
   Lichtwert = Getadc(0)
   Start Adc
   If Lichtwert > 492 Then
   Motor_fenster_auf = 0
   Motor_tuer_auf = 0
   Waitms 200
   Motor_fenster_ab = 1
   Motor_tuer_ab = 1
   Tuer_motor_counter = 427                                 'ca. 28 sec.
   Fenster_motor_counter = 336                              'ca. 22 sec.
   Sonnen_sensor_counter = 27468
   Rollo_status = 1
   Stop Adc
   Reset Lichtwert
   End If
Return

Sonnenautomatik_auf:
   Lichtwert = Getadc(0)
   Start Adc
   If Lichtwert < 471 Then
   Motor_fenster_ab = 0
   Motor_tuer_ab = 0
   Waitms 200
   Motor_fenster_auf = 1
   Motor_tuer_auf = 1
   Tuer_motor_counter = 687
   Fenster_motor_counter = 610
   Sonnen_sensor_counter = 27468
   Rollo_status = 0
   Stop Adc
   Reset Lichtwert
   End If
Return


MfG
Nicola

Anzeige: