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
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
Zusätzlich habe ich Reset mit 10k gegen VDD geschaltet, + 100nf gegen Masse
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.