Hy,
hoffe man hält mich nicht für bekl...
habe ein ganz einfaches Prgramm für einen Attiny 2313 geschrieben, das
signal von 2 eingängen soll ausgewertet werden, und dann auf 4 led´s
ausgegeben werden.
Das ist der quellcode (mit SiSy erstellt):
begin:
rjmp main ; RESET External Reset, Power-on Reset
reti ; INT0 External Interrupt Request 0
reti ; INT1 External Interrupt Request 1
reti ; TIMER1 CAPT Timer/Counter1 Capture
reti ; TIMER1 COMPA Timer/Counter1 Compare
reti ; TIMER1 OVF Timer/Counter1 Overflow
reti ; TIMER0 OVF Timer/Counter0 Overflow
reti ; USART, RX USART, Rx Complete
reti ; USART, UDRE USART Data Register Empty
reti ; USART, TX USART, Tx Complete
reti ; ANA COMP Analog Comparator
reti ; PCINT
reti ; TIMER1 COMPB
reti ; TIMER0 COMPA
reti ; TIMER0 COMPB
reti ; USI START USI Start Condition
reti ; USI OVERFLOW USI Overflow
reti ; EEPROM Ready
reti ; WDT OVERFLOW Watchdog Timer Overflow
;-----------------------------------------------------------------------
-------
main:
ldi r16,lo8(RAMEND) ; Main program start
out SPL,r16 ; Set Stack Pointer to top of RAM
sbi DDRB,0 ;out Port B.0
sbi DDRB,1 ;out Port B.1
sbi DDRB,2 ;out Port B.2
sbi DDRB,3 ;out Port B.3
cbi DDRB,6 ;IN Port B.6
cbi DDRB,7 ;IN Port B.7
;-----------------------------------------------------------------------
-------
mainloop:
in r16, PINB ;lade Port B in r16
ror r16 ;schiebe r16 nach rechts
ror r16 ;schiebe r16 nach rechts
ror r16 ;schiebe r16 nach rechts
ror r16 ;schiebe r16 nach rechts
ror r16 ;schiebe r16 nach rechts
ror r16 ;schiebe r16 nach rechts
cpi r16, 1 ;vergleiche r16 = 1
breq LED1 ;springe zu "LED1" wenn r16 = 1
cpi r16, 0 ;vergleiche r16 = 0
breq LED2 ;springe zu "LED2" wenn r16 = 0
cpi r16, 3 ;vergleiche r16 = 3
breq LED3 ;springe zu "LED3" wenn r16 = 3
cpi r16, 2 ;vergleiche r16 = 2
breq LED4 ;springe zu "LED4" wenn r16 = 2
rjmp mainloop
;-----------------------------------------------------------------------
-------
LED1:
sbi PORTB, 0 ;LED1 = on
cbi PORTB, 1 ;LED2 = off
cbi PORTB, 2 ;LED3 = off
cbi PORTB, 3 ;LED4 = off
rjmp mainloop ;zurück zu "mainloop"
;-----------------------------------------------------------------------
-------
LED2:
sbi PORTB, 0 ;LED1 = on
sbi PORTB, 1 ;LED2 = on
cbi PORTB, 2 ;LED3 = off
cbi PORTB, 3 ;LED4 = off
rjmp mainloop ;zurück zu "mainloop"
;-----------------------------------------------------------------------
-------
LED3:
sbi PORTB, 0 ;LED1 = on
sbi PORTB, 1 ;LED2 = on
sbi PORTB, 2 ;LED3 = on
cbi PORTB, 3 ;LED4 = off
rjmp mainloop ;zurück zu "mainloop"
;-----------------------------------------------------------------------
-------
LED4:
sbi PORTB, 0 ;LED1 = on
sbi PORTB, 1 ;LED2 = on
sbi PORTB, 2 ;LED3 = on
sbi PORTB, 3 ;LED4 = on
rjmp mainloop ;zurück zu "mainloop"
;-----------------------------------------------------------------------
------
das Ganze wird aber nur ein mal durchgelaufen, wenn sich das signal am
eingang ändert passiert nichts.
erst wenn ich die Betriebsspannung kurz unterbreche, werden die LED´s
"aktuallisiert"
kann mir aber nicht erklären warum :-(
MfG
Tim
Alternativ kannst Du Dir das ganze geschubse auch sparen indem Du: ANDI R16,192 ; 11000000 CPI R16,64 ; 01000000 BREQ LED1 CPI R16,0 ; 00000000 BREQ LED2 CPI R16,192 ; 11000000 BREQ LED3 CPI R16,128 ; 10000000 BREQ LED4 verwendest.
genau das wollte ich auch schreiben... bin zwar nicht wirklich assebmlerfest aber ich hätte durchaus ein Problem in dem ROR (Rotieren) gesehen. Ein wahres Shift wird besser sein, da dann die anschliessenden Bedingungen auch erfüllt werden können. Gruss k.
Danke, jetzt geht es.:-) aber theoretisch hätte es doch mit dem rotieren auch funktionieren müssen, oder? euch allen ein schönes WE noch. mFg Tim
Tim schrieb: > aber theoretisch hätte es doch mit dem rotieren auch funktionieren > > müssen, oder? Nein. Ein Rotieren füllt dir das Register wieder mit den ausgeschobenen Daten (durch das Carrybit). Daher musst du deine geschobenen Daten trotzdem maskieren, bevor du sie vergleichst.
>aber theoretisch hätte es doch mit dem rotieren auch funktionieren >müssen, oder? Ja und? Was nützt die Theorie nach der es gehen sollte, wenn sie nicht funktioniert? Guck Dir doch mal den Unterschied zwischen LSR und ROR an.
Tim schrieb: > aber theoretisch hätte es doch mit dem rotieren auch funktionieren > müssen, oder? Nein, das ROR ist hier absoluter Unsinn. Es schiebt nämlich das Carry mit rein und das ist wohl durch andere Pins gesetzt. Nimm das LSR, das schiebt 0-Bits rein. Oder maskieren nach dem Schieben die nicht benötigten Bits aus: andi r1, 0x03
@Tim Beim Schieben oder Rotieren ist immer die Überlegung: "Was schiebe ich rein". >aber theoretisch hätte es doch mit dem rotieren auch funktionieren >müssen, oder? Die Antwort hierauf ist ein klares Jein. 6 Mal ror r16 und einmal andi r16,3 hätten Dich auch glücklich gemacht. L=LED; C=Carry; I=Input PINB = II??LLLL 6 X ROR LLLL?CII ; Ist nur beim ersten Mal 000000II Nur weil Deine LEDs beim Start=0 waren hat die erste Abfrage etwas ergeben. Nur solange alle LEDs aus sind ist LLLL=0000. Auch Dein Carry-Bit ist nach einer positiver Abfrage gesetzt und wird "reinrotiert". Solche Fehler sind später sehr schwer zu finden da von "außen" kein System erkennbar ist.
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.