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