Forum: Projekte & Code Hilfe bei Atmega16-Manual-Lekture gesucht


von Egon Müller (Gast)


Lesenswert?

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.

von Rahul (Gast)


Lesenswert?

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.

von Egon Müller (Gast)


Lesenswert?

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

von peter dannegger (Gast)


Lesenswert?

"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

von Psychoelvis (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Psychoelvis (Gast)


Lesenswert?

Gut dan habe ich das mißverstnaden! Mit dem Rest haste recht laufen tuht
der immer.

von Simon K. (simon) Benutzerseite


Lesenswert?

ü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
Noch kein Account? Hier anmelden.