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... :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.