Hallo, ich habe vor Jahren einen Atmega16 so programmiert, daß er bei Anlegen der Versorgungsspannung mit seiner Programmausführung startet. Ich meine, der Volksmund nennt dies "Power-On-Reset". Nun würde ich gern via JTAG etwas am Programm ändern, also sollte der Programmstart unterbleiben. Ich habe das Manual durchforstet, aber nirgends gefunden, wie man den automatischen Start verhindern kann, wenn er mal installiert ist. Selbst ein Reset bringt da wohl nichts, denn danach läuft das Programm sofort an. Leider habe ich meine Unterlagen nicht zur Hand. Kann mir vielleicht jemand helfen und schreiben, wo im Manual so etwas beschrieben ist.
Darum kümmert sich der JTAG-Programmer schon ganz alleine. Dazu muß man diesen im stromlosen Zustand mit der Zielschaltung verbinden. Wenn man dann die Zielschaltung unter Strom setzt, übernimmt der JTAG mit der Programmiersoftware das Kommando.
Hallo, Rahul, vielen Dank für Deine Antwort. Daß JTAG den direkten Zugriff auf den Atmega16 erlaubt, erleichert mich etwas. Leider kann ich es z.Zt. nicht ausprobieren, denn mein Olimex-JTAG funktioniert im Augenblick nicht, jedenfalls leuchtet die LED schon mal nicht. Ob es an der neuen Version von AVRStudio (4.12) liegt, die keine Verbindung herstellen kann? Aber noch eine Frage zum automatischen Programmstart: Ist das hardwareseitig verursacht (wie z.B. beim Motorola xxxHC12, wo man einen Pin definiert ansteuern mußte, um den automatischen Programmstart zu erreichen), oder wird das softwareseitig erreicht? Denn, wenn ich das mit dem JTAG nicht hinkriege, müßte ich mein Glück mit TwinAVR probieren, wo nach meiner Erinnerung eine Fehlermeldung kommt, wenn das Programm läuft. Gruß Egon
"ich habe vor Jahren einen Atmega16 so programmiert, daß er bei Anlegen der Versorgungsspannung mit seiner Programmausführung startet." Das kannst Du nicht programmieren, das ist automatisch so. Nur CPUs mit einem Bootloader fragen einen Pin ab, z.B. die Philips LPC2xxx-Serie. Die einzige Möglichkeit, den Programmstart zu verhindern, ist den Resetpin permanent auf Low zu halten. "Nun würde ich gern via JTAG etwas am Programm ändern" Irgendwie beschleicht mich das Gefühl, daß Du bisher noch garnichts mit AVRs gemacht hast. Der einfachste Weg etwas zu ändern ist nämlich, sich einfach die alten Sourcen zu schnappen, die Änderungen zu machen, neu compilieren und dann rüberbraten. Ansonsten kannst Du ohne den Flash zu löschen nur 1-Bits auf 0 setzen, wenn nicht die nötigen Fuses und Lockbits das generell verbieten. Peter
Also ich nutzte ein Boart mit 3 Tastern am PORT A Pin 0-1 und 2 (ADC0,ADC1,ADC2) Das Prog was ich da drauf habe wurde mit Assamper erstellt und wen der µC Strom bekommt wartet er bis der Taster 1 gedrück wird und läft erst dann. ;******************************************** ;*** Testprgramm für L293D ;******************************************** .include "m16def.inc" .def temp = r16 .def temp2 = r17 .def temp3 = r18 .def temp4 = r19 .equ Treiber= PortC .equ Treiber_DDR= DDRC .equ enable1= 0 .equ enable2= 1 .equ motor1_A=2 .equ motor1_B=3 .equ motor2_A=4 .equ motor2_B=5 .equ Taster1= 0 .equ LED1 = 2 .equ LED2 = 3 ;PortC als Ausgang schalten ldi temp, 0xFF out Treiber_DDR, temp ldi temp, 0x00 ;alles ausschalten out Treiber, temp ;PortA als Eingang schalten ldi temp, 0x00 out DDRA, temp ldi temp, 0xFF ;pullups aktivieren out PortA, temp ;PortB als Ausgang schalten ldi temp, 0xFF out DDRB, temp ldi temp, 0b00001100 out PortB, temp ;Stackpointer initialisieren ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp main: cbi PortB, LED2 sbis PinA, Taster1 ;wenn Taster gedrückt wird Befehle ausführen rcall go_baby_go rjmp main go_baby_go: cbi PortB, LED1 ;grüne LED anmachen und warten rcall wait sbi PortB, LED2 ;rote LED ausschalten rcall motor_vor rcall motor_bremsen rcall motor_zurueck rcall motor_bremsen rcall motor_rechts rcall motor_bremsen rcall motor_links rcall motor_bremsen rcall motor_aus sbi PortB, LED1 ;grüne LED aus reti ;****** Befehle ******** Motor_vor: cbi PortB, LED1 sbi PortB, LED2 sbi Treiber, motor1_A ;Richtung einstellen cbi Treiber, motor1_B sbi Treiber, motor2_A cbi Treiber, motor2_B sbi Treiber, enable1 ;Motor1 aktivieren sbi Treiber, enable2 ;Motor2 aktivieren rcall wait reti Motor_zurueck: cbi PortB, LED1 sbi PortB, LED2 cbi Treiber, motor1_A ;Richtung einstellen sbi Treiber, motor1_B cbi Treiber, motor2_A sbi Treiber, motor2_B sbi Treiber, enable1 ;Motor1 aktivieren sbi Treiber, enable2 ;Motor2 aktivieren rcall wait reti Motor_rechts: cbi PortB, LED1 sbi PortB, LED2 sbi Treiber, motor1_A ;Richtung einstellen cbi Treiber, motor1_B cbi Treiber, motor2_A sbi Treiber, motor2_B sbi Treiber, enable1 ;Motor1 aktivieren sbi Treiber, enable2 ;Motor2 aktivieren rcall wait reti Motor_links: cbi PortB, LED1 sbi PortB, LED2 cbi Treiber, motor1_A ;Richtung einstellen sbi Treiber, motor1_B sbi Treiber, motor2_A cbi Treiber, motor2_B sbi Treiber, enable1 ;Motor1 aktivieren sbi Treiber, enable2 ;Motor2 aktivieren rcall wait reti Motor_bremsen: cbi PortB, LED1 cbi PortB, LED2 cbi Treiber, motor1_A ;Richtung einstellen cbi Treiber, motor1_B cbi Treiber, motor2_A cbi Treiber, motor2_B sbi Treiber, enable1 ;Motor1 aktivieren sbi Treiber, enable2 ;Motor2 aktivieren rcall wait reti Motor_aus: cbi Treiber, motor1_A ;Richtung einstellen cbi Treiber, motor1_B cbi Treiber, motor2_A cbi Treiber, motor2_B cbi Treiber, enable1 ;Motor1 aktivieren cbi Treiber, enable2 ;Motor2 aktivieren reti wait: ldi temp, 255 ldi temp2, 255 ldi temp3, 2 ;52 ldi temp4, 2 ;2 wait_loop: dec temp brne wait_loop dec temp2 brne wait_loop dec temp3 brne wait_loop dec temp4 brne wait_loop reti
> Das Prog was ich da drauf habe wurde mit Assamper > erstellt und wen der µC Strom bekommt wartet er bis der Taster 1 > gedrück wird und läft erst dann. Das hat aber nichts mit dem Original-Problem zu tun und ist besten falls missverständlich. > wartet er bis der Taster 1 > gedrück wird und läft erst dann. Der µC läuft ständig. Nur sagt ihm der erste Teil des Programmes zu warten bis der Taster gedrückt wurde. Da läuft genauso ein Programm ab. Wenn dann der Taster kommt, wird ein anderer Teil des Programmes ausgeführt.
Gut dan habe ich das mißverstnaden! Mit dem Rest haste recht laufen tuht der immer.
übrigens ist das "reti" totaler quatsch in dem code.. Mehr Fehler hab ich beim überfliegen nicht gefunden..
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.