Forum: Mikrocontroller und Digitale Elektronik ich bins mal wieder ...


von hannes (Gast)


Lesenswert?

so ich hatte mal wieder ein bisschen zeit ...
und hab mich mit dem programm mal ein bisschen gespielt und was 
einfaches dazugebaut...

;------------------------------------------------
; timer5.asm
; Timer5
;------------------------------------------------

.include "4433def.inc"
.def temp     = r16
.def counter   = r17
.def leds     = r18
.def leds2    = r19
.def null     = r20
.def a       = r21
.def b       = r22
.def rSREG_BAK   = r23
.equ start = 256 - 244  ;  bei 8 MHz entspricht das ca. 1/32 sec
.equ loops = 1;

rjmp reset           ; Reset Handler
reti                 ; IRQ0 Handler
reti                 ; IRQ1 Handler
reti                 ; Timer1 Capture Handler
reti                 ; Timer1 compare Handler
reti                 ; Timer1 Overflow Handler
rjmp timer0          ; Timer0 Overflow Handler
reti                 ; SPI Transfer Complete Handler
reti                 ; UART RX Complete Handler : RXCIE
reti                 ; UDR Empty Handler
reti                 ; UART TX Complete Handler
reti                 ; ADC Conversion Complete Interrupt Handler
reti                 ; EEPROM Ready Handler
reti                 ; Analog Comparator Handler

reset:
    ldi temp, RAMEND
    out SP, temp  ; set stack pointer

    ldi temp, 0xFF
    out DDRB, temp  ; PORTB configured for output
  out DDRD, temp  ; PORTB configured for output
  ldi temp, 0x00
  out DDRC, temp  ; PORTD configured for inputput

  ldi temp, 0xFF

    ldi temp, 1<<TOIE0  ; 0000 0010
    out TIMSK, temp  ; timer 0 interrupt ein
    ldi temp, start
    out TCNT0, temp  ; Startwert des Timers
    ldi temp, 0b00000101
    out TCCR0, temp  ; Timer starten mit Vorteiler 1024

    ldi counter, loops
    ldi leds, 0x01
  ldi leds2,0x00
  ldi null,0x00

  ;sec leds2      ;set carryflag

  ;out PORTB, leds2  ; LEDs ausschalten
  out PORTD, leds    ; LEDs ausschalten

    sei      ; interrupts generell aktivieren

main:
    loop:
        rjmp loop


;--------------------------------------------------
timer0:

  in rSREG_BAK,SREG  ; sichern des status registers !!

  dec counter

    brne output
      ldi counter, loops

    in temp,PINC
    cp temp,null
    brne rightside

        ; Beide Register nach links schieben,
      ; ausgeschobenes Bit von leds an led2
        ; haengen.
        clc
        rol leds
        rol leds2
      ;adc leds2,null  ; add with carry

          ; Nur wenn beide Register leer sind, Register neu laden
      tst leds    ; test of 0 or minus
      brne output    ; branch if not equal
        tst leds2
        brne output

        ldi leds,0x01
        ldi leds2,0x00
        rjmp output
    rightside:
      ; Beide Register nach links schieben,
      ; ausgeschobenes Bit von leds an led2
        ; haengen.
        clc
      ror leds2
        ror leds
        ;adc leds,null  ; add with carry

          ; Nur wenn beide Register leer sind, Register neu laden
      tst leds    ; test of 0 or minus
      brne output    ; branch if not equal
        tst leds2
        brne output

        ldi leds,0x00
        ldi leds2,0x80

  output:
      out PORTD,leds
      out PORTB,leds2

      ldi temp, start
      out TCNT0, temp

  out SREG, rSREG_BAK  ; hohle status register !!
reti

das programm rotiert dann nach rechts wenn
irgendwas anderes als 0 bei PINC drinn ist
ich muss warscheinlich jetzt alle eingänge auf
masse hängen und wenn ich ne 1 haben will den ersten auf vcc oder ??
weil anders wenn ich die eingänge einfach offen lasse
spielt das programm verückt wenn ich die avr nur berühre und dann 
"shiften" die leds mal kurz links dann wieder rechts dann wieder links 
usw ...

ist das der grund ?? oder hab ich was mit dem eingang noch nicht 
verstanden ??

danke schon mal... :)

von mikki merten (Gast)


Lesenswert?

Offne Eingänge sollten immer auf definierten Pegel gelegt werden. Also 
beim AVR einfach die internen PullUp aktivieren:

  ldi temp, 0x00
  out DDRC, temp    ;Port C Eingang
  ldi temp, 0xFF
  out PORTC,temp    ;PullUp Port C einschalten

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.