Hallo ATMega Experten, Ich möchte bei meinem ATMega16 den PortC benutzen. Im Datenblatt und auch im Forum habe ich gefunden, dass man die JTAGEN Fuse abschalten muss um die Ports PORTC2 - 5 als normale Portpins benutzen zu können. Alternativ noch das JTD Flag im MCUCSR setzen. Ich kriege das anscheinend nicht gebacken... Fuses sind eingestellt wie im Dateianhang. Mit folgendem Programm: .include "m16def.inc" .org 0x00 ; zusätzlich abschalten von JTD in MCUCSR, 2 mal laut Datenblatt) ldi r16,(1<<JTD) out MCUCSR,r16 out MCUCSR,r16 ldi r16,0xff out DDRC,r16 nop ldi r16,0b10101010 out PORTA,r16 ; PORTA ldi r16,0xff out DDRA,r16 nop ldi r16,0b10101010 out PORTA,r16 endloop: rjmp endloop müssten theoretisch die Ports A und C jeweils abwechselnd 0 und 1 zeigen. Beide Ports sind auf 0x00, bei PortC sind die JTAG Pins auf 1. Wenn ich nun bei den Fuses das JTAGEN "Häkchen" setze, geht zumindest der PortA wie gewünscht, PortC zeigt das gleiche verhalten. Was habe ich falsch gemacht? (STK500 Software 2.0 aus der neuesten AVRStudio V4.11 b401), STK500 Hardware ist der hvprog ( http:/www.der-hammer.info/hvprog ) Vielen Dank für Eure Hilfe, Klaus
Hallo nochmal, hab gerade gesehen, dass ich bei cut+paste einen Fehler gemacht habe: Der obere Befehl: out PORTA,r16 muss natürlich out PORTC,r16 heissen und ist auch so im original Source. Hab gerade nboch mal ausprobiert bei gesetzten JTAGEN Fuse per JTD Bit zu disablen, auch dann sind beide Ports "blockiert". Keiner eine Idee was es sein könnte? Danke für alle Hinweise, Klaus
Also bei deinem Programm oben wechselt garnichts, denn "rjmp endloop" ist ne Endlosschleife. Oder hast du da ein Fehler bei Copy&Paste gemacht? Und muß man bei den ATmegas nicht erst einen Stackpointer initialisieren?
Hallo Torsten, die Pins wechseln nicht, es sollte abwechselnd H und L anliegen. (also Bit0 = H Bit1=0 usw. es wird nur einmal der Port geschrieben. (out PORTC,r16) Stackpointer braucht man nur, wenn man rcall oder push nutzen will. Wenn ich JTAGEN programmiere funktioniert es auch für den PORTA. Nur eben nicht bei abgeschaltetem JTAGEN. Bin echt am zweifeln... Ciao, Klaus
Laß doch mal am Anfang diese JTD Geschichte mit dem MCUCSR weg. Ich habe zwar einen Mega162, aber da hatte es vollkommen gereicht, die JTAGEN-Fuse auszuschalten (so wie bei dir oben im Bild). Das ldi r16,(1<<JTD) out MCUCSR,r16 setzt ja nicht nur JTD auf 1, sondern auch alles andere im dem Register auf 0. Ich weiß jetzt zwar nicht im einzelnen, was da noch alles für Bits drin sind, aber könnte daran liegen. Gruß Ingo
die anderen bits in mcucsr scheinen irrelevant zu sein. das das jtagen fuse löschen klappt steht ausser frage bloss mit diesem jtd flag könnte man jtag dynamisch de/aktivieren, was denk ich mal das ziel des ganzen ist.
Hallo, Danke schon mal für die Antworten, @)Ingo: beim weglassen des "JTG" Codes passiert das gleiche, das mit dem JTG hab ich probiert, als das mit dem JTAGEN nicht geklappt hatte. @Torsten: bei mir im Simulator funktioniert es auch (auch wenn man das JTAGEN bit gar nicht anfasst...) Leider in echt nicht. @Tobi: Ich zweifle (leider) auch nicht daran, das das normalerweise funktionieren muss, aber was kann bei mir noch "schief" sein? Vor allem irritiert mich, das praktisch kein Port mehr funktioniert, wenn ich das JTAGEN disable. Das an PORTB angeschlossene LCD geht dann auch nicht mehr (im Originalcode, nicht in dem o.g. Beispiel) An PORT A ist garnichts angeschlossen, deshalb kann da auch ein Beschaltungsfehler ausgeschlossen werden. Hat jemand einen m16 der das beispiel mal ausprobieren könnte? Ts ts ts, Klaus
Hallo, ich habs mal schnell ausprobiert. Hab dein Programm geringfügig abgeändert, weil ich die toggelden Pins auf dem Scope sehen wollte: .include "m16def.inc" .org 0x00 ldi r16,(1<<JTD) out MCUCSR,r16 out MCUCSR,r16 ldi r16,0xff out DDRC,r16 ldi r16,0xff out DDRA,r16 ldi r16,0b10101010 loop: out PORTC,r16 out PORTA,r16 com r16 rjmp loop Die Änderungen dürften ja keine Rolle spielen. Jedenfalls toggeln alle Pins von PORTA und PORTC. Im Anhang meine Fuses. Wenn ich nochwas testen soll dann sags, hab das gerade hier aufgebaut. Gruß Thorsten
Hi Thorsten, vielen Dank fürs testen, hab gerade die Befürchtung gekriegt, dass es am Boot reset Vektor liegen könnte, wenn BOOTRST programmiert ist, springt er ja zuerst zum Bootloader. Den Fuses entnehme ich, dass Du einen Quart dranhast, hab ich auch und werde es gleich mit Deiner Einstellung testen. Unterschied ist noich der bei Dir aktivierte BrownOut. Ich bin gleich zurück... Danke nochmal, Klaus
Ja aber bei dir ist der Boot Reset Vector disabled, er dürfte eigentlich nicht zum Bootloader springen. Ich habe ihn nur enabled, weil ich über ihn programmiere.
Hallo, Gotcha! Hab ihn :) Ich glaubs nicht. Es lag an der LCD Beschaltung. Als ich das LCD abgezogen hatte, um das Board zum Oszi zu bringen ging alles. Bei gesetzten JTAGEN hat das nichts ausgemacht. Jetzt werde ich mal schauen, welcher Pin das war. Als ich nach dem Brennen das LCD wieder angesteckt habe, ist es weiter gegangen, bis zum nächsten Reset. Nicht zu vergessen, ohne JTAGEN Bit geht das komplette LCD... Ist mir noch ein Rätsel, werd mal die Pins und Spannungen einzeln messen. Und wieder was gelernt: im Zweifel immer den Controller ohne externe Beschaltung prüfen... Thorsten, und allen anderen vielen Dank für Eure Unterstützung. Viele Grüsse, Klaus
Just for the records... Damit der Thread komplett wird: Es war ein schluss im Wannenstecker, der nur bei gestecktem Verbinder aufgetreten ist. (schief aufs Flachkabel gequetscht) Der Pin PC4 wurde auf + gezogen, was im JTAG Mode offenbar nicht gestört hat, erst nach dem abschalten. Das Abschalten des JTAG Modes geht entweder mit der beschriebenen Fuse, oder durch 2maliges! setzen des JTD Bits im MCUCSR. Das muss direkt nacheinander passieren (innerhalb 4 Taktzyklen). Wer die Fuses also nicht brennen will, es geht auch so. Ciao, Klaus
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.