Forum: Mikrocontroller und Digitale Elektronik AVR ATmega162: Ports lassen sich nicht als Ausgang deklarieren


von Der mit den Bytes tanzt (Gast)


Angehängte Dateien:

Lesenswert?

Guten Tag,

ich habe einen ATmega162, und wollte alle I/O Ports als Ausgang 
deklarieren und auf high setzen (meine persönliche Art der 
Funktionsprüfung). Habe, wie es sich gehört, alle DDRx-Register und alle 
PORTx-Register auf high gesetzt (Nebenbei: JTAG habe ich abgeschaltet, 
um diese Ports auch nutzen zu können).

Nun das Problem: Die DDRx-Register sind zwar mit 0xff beschrieben, also 
auf high, dennoch sind die Ports nicht als Ausgang deklariert. Es sind 
lediglich die Pull-Ups eingeschaltet. Dies ist nur bei den Ports PA, PB, 
PC und PD so, der Port PE funktioniert.
Habe es auch mit einem Bau- und Typgleichen Controller – also auch 
ATmega162 – versucht, bei dem genau das gleiche.

Woran liegt das und was muss ich machen?

Der Source-Code ist, wie ihr sehen könnt, sehr einfach.
------------------------------------------------------------------------ 
---

;ATmega162__Port-Output-Test

;Alle Ports sind als Ausgang deklariert und führen High-Pegel

;_______________________________________________________________________ 
_
;-----------------------------------Boot-------------------------------- 
---

.include "m162def.inc"
.cseg
rjmp start
.org 0x038
start:

;----------------------------Stapelzeiger_laden------------------------- 
---

  ldi    r16,high(ramend)
  out    sph,r16
  ldi    r16,low(ramend)
  out    spl,r16

;----------------------------Ausgänge_definieren------------------------ 
---

  ldi    r23,0b11111111
  out    ddra,r16
  out    ddrb,r16
  out    ddrc,r16
  out    ddrd,r16
  ldi    r23,0b00000111
  out    ddre,r16

;-----------------------------JTAG_abschalten--------------------------- 
---

  in    r16,mcucsr    ;MCU Control and Status Register in r16 laden
  sbr    r16,1<<jtd
  out    mcucsr,r16    ;Bit7 (JTD) setzen
  nop
  out    mcucsr,r16    ;Bit7 (JTD) setzen

;_______________________________________________________________________ 
_
;------------------------------Haupt-Programm--------------------------- 
---

  ldi    r16,0b11111111
  out    porta,r16
  out    portb,r16
  out    portc,r16
  out    portd,r16
  ldi    r16,0b00000111
  out    porte,r16


loop:
  nop
  rjmp loop


.exit

von Gast (Gast)


Lesenswert?


von holger (Gast)


Lesenswert?

Das hast du schon mal gepostet. Wieso jetzt noch mal?
Quellcodes hängt man nicht als Bild an sondern als Text!

von spess53 (Gast)


Lesenswert?

Hi

>  ldi    r23,0b11111111
>  out    ddra,r16
>  out    ddrb,r16
>  out    ddrc,r16
>  out    ddrd,r16
>  ldi    r23,0b00000111
>  out    ddre,r16

Fällt dir was auf?

MfG Spess

von Der mit den Bytes tanzt (Gast)


Lesenswert?

Ja, ursprünglich war dies das Problem mit dem „Portspannung am ATmega 
bricht ein“. Ich habe aber nun – wie oben geschrieben – herausgefunden, 
dass einfach die DDRx-Register nicht gesetzt sind.

@spess53: Was mir auffallen soll, ist natürlich das Register r23. Aber 
ich habe es so gemacht, wie im Bild-Anhang. Für diesen Fehler bitte ich 
um Entschuldigung.

von Peter D. (peda)


Lesenswert?


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.