Forum: Mikrocontroller und Digitale Elektronik ATMEGA644 resetet sich, watchdog?


von J.R (Gast)


Lesenswert?

Ich versuche einen Atmega644 zum laufen zu bekommen.
Folgende HW Daten :
5V Vdd.
16MHz Quartz,
 usbprog (AVR ISP 2 Klon)

Zum programmieren benutze ich AVRStudio.

Controller lässt sich flashen, auch die Fuse Bits  (der Quarzoszillator 
lies sich aktivieren, CKDIV8 Fuse funktioniert auch,  CKOUT - Fuse 
funktioniert auch. Nach dem Programmieren des CKOUT - Fuse konnte ich 
die entsprechend resultierende Clock Frequenz an PORTB1 mit einem 
Multimeter messen.)

Jetzt komme ich zum Problem:

Ich habe ein einfaches Programm geflasht:

.include "m644def.inc"

  rjmp main   ; Reset Handler
main:
  ldi R16,0b01000000
  out DDRD,R16
  sbi PORTD,6
loop:
  rjmp loop

Wenn ich an PORTD6 mit einem Drehspulinstrument messe (hatte kein Oszi 
zur Hand),  dann schwankt der Zeiger sehr schnell. Es scheint so als ob 
der Controller jedes mal nach einer kürzen Zeit resetet würde. 
Watchdog?? Habe das WDTON-Fuse Bit geändert, doch nichts hat sich 
geändert.

Habe das Programm geändert, anstatt von PORTD6, PORTB0, so war das 
verhalten gleich, (dabei habe ich natürlich an PORTB0 gemessen)

Was resetet den Controller? Oder ist es kein Reset sondern was anderes?

Gruss,
Wojtek

: Verschoben durch Moderator
von Flo (Gast)


Lesenswert?

Wie sieht deine REsetbeschaltung und deine Quarzbeschaltung aus?

Steckbrett, Lochrater oder eigen Platine?

Ich würd bei dem Programm mal auf internen Quarz 1 MHz umschalten, wenns 
dann läuft wies soll, hast du Störungen beim Quarz.

von Pete K. (pete77)


Lesenswert?

Abblockkondensatoren vorhanden? Poste mal die Schaltung.

von J.R (Gast)


Lesenswert?

Lochrasterplatine + Minimalbeschaltung:
Controller  + 16MHz Quartz  + (2 * 18pF zu Masse)
ISP Anschluss : 2 reihige  Stiftkleiste (SCK,MISO,MOSI,VDD,GND,RESET)
Reset nicht beschaltet, besser gesagt an AVR ISP Klone angeschlossen
Spannungsversorgung über  AVR ISP Klone.
VDD Blockkondensator 100NF , 100µF
Alles Leitungen sind kurz, <3cm

Bei dem ATMEGA, ATTINY45 hat das immer so funktioniert.

Ich danke schon im Voraus für die Antworten

von J.R (Gast)


Lesenswert?

>Ich würd bei dem Programm mal auf internen Quarz 1 MHz umschalten, wenns
>dann läuft wies soll, hast du Störungen beim Quarz.

habe gemacht (über die entsprechende Fuse Bits), Verhalten war gleich. 
bin mir auch sich das, das Umschalten funktioniert hat, konnte am PB1 
(CKOUT enable) die entsprechende Taktfrequenz von dem Internem 
Oszillator messen.

Seltsam, irgendwas scheint den Controller ständig zu reseten.
Reset Eingang ist an AVRISP angeschlossen, somit ist er auch definiert.

von J.R (Gast)


Lesenswert?

Um die Schaltung zu überprüfen habe ich einen atmega32 in die Fassung 
eingesetzt. atmaga32 und atmega644 haben die gleiche Pinbelegung.
(In der software wurde natürlich die Zeile .include "m644def.inc" gegen 
.include "m32def.inc"  ausgetauscht.)

Atmega32 funktioniert ohne Probleme.

Was könnte es sein mit dem atmega644?

Danke für eure Antworten,

wojtek

von J.R (Gast)


Lesenswert?

Zusätzlich habe ich Reset mit 10k gegen VDD geschaltet, + 100nf gegen 
Masse

von J.R (Gast)


Lesenswert?

Entgegen meiner Erwartzungen kamen keine weiteren Vorschläge mehr zu 
diesem Forumbeitrag und Problem.

Nach längerem probieren habe ich den atmega644 zum laufen bekommen.

Ich poste die Lösung, vielleicht interessiert es doch noch den einem 
oder anderem :

Es war doch ein Watchdog der den Controller resetet hat.

Ich habe versucht noch mal denn WDTON fuse zu löschen, und auf einmal 
klappt es.
Seltsamer weise habe ich es zu vor auch probiert, hat aber nichts 
gebracht.
Und jetzt auf einmal geht es. (benutze AVRStudio + avrispmkII clone)
Manchmal gibt es doch Wunder.

 Laut Atmel Atmega644 Datenblatt :
The Watchdog always on (WDTON) fuse, if programmed, will force the 
Watchdog Timer to System
Reset mode. With the fuse programmed the System Reset mode bit (WDE) and 
Interrupt
mode bit (WDIE) are locked to 1 and 0 respectively. To further ensure 
program security, alterations
to the Watchdog set-up must follow timed sequences. The sequence for 
clearing WDE
and changing time-out configuration is as follows:

WDT_off:
; Turn off global interrupt
cli
; Reset Watchdog Timer
wdr
; Clear WDRF in MCUSR
in r16, MCUSR
andi r16, (0xff & (0<<WDRF))
out MCUSR, r16
; Write logical one to WDCE and WDE
; Keep old prescaler setting to prevent unintentional time-out
in r16, WDTCSR
ori r16, (1<<WDCE) | (1<<WDE)
out WDTCSR, r16
; Turn off WDT
ldi r16, (0<<WDE)
out WDTCSR, r16
; Turn on global interrupt
sei
ret


Habe die Atmel Routine leicht auf den Atmega 644 angepasst
In, out gegen lds, sts ausgetauscht (siehe weiter unten) und am Anfang 
aufgerufen

.include "m644def.inc"
;.include "m32def.inc"

rjmp    main                ; Reset Handler
main:
rcall  WDT_off
ldi  R16,0b01000000
out  DDRD,R16
sbi   PORTD,6
loop:
rjmp loop

WDT_off:
  push R16
  in  R16,SREG
  push R16
  cli  ;Turn off global interrupt
  wdr  ;Reset Watchdog Timer
  ; Clear WDRF in MCUSR
  in r16, MCUSR
  andi r16, (0xff & (0<<WDRF))
  out MCUSR, r16
  ; Write logical one to WDCE and WDE
  ; Keep old prescaler setting to prevent unintentional time-out
  lds r16, WDTCSR
  ori r16, (1<<WDCE) | (1<<WDE)
  sts WDTCSR, r16
  ; Turn off WDT
  ldi r16, (0<<WDE)
  sts WDTCSR, r16
  pop  R16
  out  SREG,R16  ; Turn on global interrupt
  pop R16
ret

Es bringt aber nichts, Watchdog resetet den kontroller (PORTD.6 togelt)
Erst das zurücksetzen des Fuses WDTON deaktiviert den Watchdog und am 
PORTD.6 lieg ein H-Pegel.

Interessant das ganze,
vielleicht habe ich im Atmel Datenblatt irgendwas falsch verstanden.
Hauptsache atmega644 läuft!

Gruss,
wojtek

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.