Forum: Mikrocontroller und Digitale Elektronik Atmel mega16 verschiebt ungewollt


von Michael W. (herr_welker)


Lesenswert?

Hi,

ich will einen atmega16 Microprozessor programmieren.
Ich benutze das STK500 und das AVR Studio 4.

Ich will, dass wenn ich an Port A einen Taster drücke die dazugehörige 
LED an Port B leuchtet.

Also so:

PA0 = PB0
PA1 = PB1 etc.

Zurzeit ist es so:

PA1 = PB3
PA2 = PB4
PA3 = PB5
PA4 = PB6
PA5 = PB7
PA6 = nichts
PA7 = nichts
1
#include "m16def.inc"
2
3
loop:
4
  ldi  R18, 0x00  ;schreibe 00 in das Register 18
5
  out  DDRA, R18  ;setzt kompletten PortA als Eingang
6
  
7
  in  R22, PinA   ;kopiere PinA in Register 22
8
9
  ldi  R18, 0xFF  ;schreibe FF in Register 18
10
  out DDRB,R18    ;setzt kompletten PortB als Ausgang
11
  out PORTB,R22   ;aktiviert LEDs
12
13
  rjmp loop       ;springe zu Loop

Kann mir jemand helfen?

von Peter D. (peda)


Lesenswert?

Du hast nen Stecker um eine Reihe verschoben aufgesteckt


Peter

von Michael W. (herr_welker)


Lesenswert?

ne, das wars nich.

10 poliges Kabel auf 10 poligen Stecker.

Hab das Kabel mal ausgetauscht. Etz funktionierts.

Danke.

von Hans J. (hjm)


Lesenswert?

Hallo Stefan,

könnte sein was Peter schreibt.

Zudem wäre es besser, die E/A-Konfiguration zu Anfang ausserhalb der 
Schleife zum machen.

1
#include "m16def.inc"
2
3
  clr  R18        ; Reg löschen
4
                  ; Pull-ups aus, TriState schalten
5
  out  PORTA,R18  ; Port A löschen
6
  out  PORTB,R18  ; Port B löschen
7
8
  out  DDRA,R18   ; alles als Eingang
9
  neg  R18        ; Reg invertieren
10
  out  DDRB,R18   ; Port B auf Ausgang
11
12
loop:
13
  in  R22, PinA   ;kopiere PinA in Register 22
14
15
  out PORTB,R22   ;aktiviert LEDs
16
17
  rjmp loop       ;springe zu Loop

alternativ kannst Du auch:
1
#include "m16def.inc"
2
3
  clr  R18             ; Reg löschen
4
  out  PORTA,R18       ; Port A löschen
5
  out  PORTB,R18       ; Port B löschen
6
7
  ldi  R18,0b00000000  ; Muster 0=Eingang, 1=Ausgang
8
  out  DDRA,R18        ; PORT A Richtung setzen
9
  ldi  R18,0b11111111  ; Muster 0=Eingang, 1=Ausgang
10
  out  DDRB,R18        ; Port B Richtung setzen
11
12
loop:
13
  in  R22, PinA   ;kopiere PinA in Register 22
14
15
  out PORTB,R22   ;aktiviert LEDs
16
17
  rjmp loop       ;springe zu Loop

Da, kannst Du dann auch direkt sehen, welche Port-Pins wie geschaltet 
sind.


Grüße
Hans-Josef

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.