Hallo! Ich versuche gerade einen Drehgeber mit einem PIC16F887 auszuwerten... Das Problem ist, wenn ich an PORTE hänge gehts.. an PORTB nicht... Habe bei der initaliesierung keinen unterschied der beiden... beide normal als output gesetzt... Vorschläge? Danke!! Liebe Grüße Max
Wieso denn Ausgang? Mit Pic kenne ich mich nicht aus, aber evtl. ist bei dem Port eine alternative Funktion aktiv, sodass du ihn nicht als General Purpose IO verwenden kannst?
> beide normal als output gesetzt...
Vielleicht doch als Eingang und beim PortB sind die Pullups
aktiv? Der PortE hat keine Pullups.
Hey danke! Ja sowas hab ich mir auch schon gedacht... Nur weis ich eben nicht was genau =) Laut Datenblatt kann man die Ports noch anderswertig verwenden aber dazu müsste man irgendwelche Bit setzen... Das heißt Standartmäßig sollte es eigentlich richtig gesetzt sein... An PORTE 0 und 1 gehts... an PORTB 0 und 1 nicht.... Habe bei beiden keine extra initialiesierungen vorgenommen...
@Gast Nein die Pullups sind nicht aktiv und ich habe: clrf TRISB clrf TRISE also beide output...
Ah... Jetzt hab ich mal: movlw b'00000000' movwf ANSELH jetzt gehts.. Nur springt mein Drehgeber immer hin und her.. mal schaun das wird noch =)
Jap mit ANSELH gehts =) hab ich vergessen zusetzten! Aber danke an alles Antworter =) Schönen Abend noch...
Hallo!
Ich arbeite auch gerade an sowas. Prozessor ist Freescale HCS08. 14 Mhz
Busclock. Ich versuche auf eine Led Bandanzeige auszugeben. Ich hänge
aber irgendwie in der "rotstatushandler_sub" fest und weiß nicht genau
wie weiter. Vielleicht hat jemand eine Idee?
_Startup:
LDHX #RAMEnd+1 ; initialize the stack pointer
TXS
CLI ; enable interrupts
lda #%00000000
sta SOPT
mov #%11111000,ICGC1
mov #%01110000,ICGC2 ;External 4Mhz Crystal
source,~14Mhz internal Bus Clock
;mov #%11111111,ICGTRM ;~8Mhz internal Bus Clock
mov #$FF,PTFDD ;datadirection output
lda #$FF
sta PTAPE
bclr 6,PTADD ;datadirection input
bclr 2,PTADD ;datadirection input
clr RAM1
clr RAM2
clr left
clr right
clr rotstatus
mainLoop:
jsr rotencoder_sub
BRA mainLoop
rotencoder_sub:
brclr 2,PTAD,rotleft_sub
brclr 6,PTAD,rotright_sub
bra rotencoder_sub
rotleft_sub:
;brset 2,PTAD,*
brset 0,rotstatus,rotleft_sub1
brset 1,rotstatus,rotleft_sub1
brset 2,rotstatus,rotleft_sub1
brset 3,rotstatus,rotleft_sub1
brset 4,rotstatus,rotleft_sub1
brset 5,rotstatus,rotleft_sub1
brset 6,rotstatus,rotleft_sub1
brset 7,rotstatus,rotleft_sub1
lda #%10000000
sta left
rotleft_sub1:
brclr 2,PTAD,*
jsr delay
brset 6,PTAD,*
jsr delay
brclr 6,PTAD,*
jsr rotstatushandler_sub
lda rotstatus
sta PTFD
rts
rotright_sub:
;brset 6,PTAD,*
brset 0,rotstatus,rotright_sub1
brset 1,rotstatus,rotright_sub1
brset 2,rotstatus,rotright_sub1
brset 3,rotstatus,rotright_sub1
brset 4,rotstatus,rotright_sub1
brset 5,rotstatus,rotright_sub1
brset 6,rotstatus,rotright_sub1
brset 7,rotstatus,rotright_sub1
lda #%00000001
sta right
rotright_sub1:
brclr 6,PTAD,*
jsr delay
brset 2,PTAD,*
jsr delay
brclr 2,PTAD,*
lda right
jsr rotstatushandler_sub
lda rotstatus
sta PTFD
rts
rotstatushandler_sub:
lda left
cmp #%10000000
bne shiftleft_sub
lda right
cmp #%00000000
bhs shiftright_sub
bra rotstatushandler_sub
shiftleft_sub:
lda left
rol left
sta rotstatus
rts
shiftright_sub:
lda right
ror right
sta rotstatus
rts
delay:
mov #$10,RAM1
del3:
mov #$10,RAM2
del4:
dec RAM2
bne del4
dec RAM1
bne del3
rts
;**************************************************************
;* spurious - Spurious Interrupt Service Routine. *
;* (unwanted interrupt) *
;**************************************************************
spurious: ; placed here so that security value
NOP ; does not change all the time.
RTI
;**************************************************************
;* Interrupt Vectors *
;**************************************************************
ORG Vrti ; Start of interrupt vectors for device
DC.W spurious ; 25 RTI
DC.W spurious ; 24 IIC1
DC.W spurious ; 23 ADC1
DC.W spurious ; 22 KEYBOARD1
DC.W spurious ; 21 SCI2TX
DC.W spurious ; 20 SCI2RX
DC.W spurious ; 19 SCI2ERR
DC.W spurious ; 18 SCI1TX
DC.W spurious ; 17 SCI1RX
DC.W spurious ; 16 SCI1ERR
DC.W spurious ; 15 SPI1
DC.W spurious ; 14 TPM2OVF
DC.W spurious ; 13 TPM2CH1
DC.W spurious ; 12 TPM2CH0
DC.W spurious ; 11 TPM1OVF
DC.W spurious ; 10 TPM1CH5
DC.W spurious ; 9 TPM1CH4
DC.W spurious ; 8 TPM1CH3
DC.W spurious ; 7 TPM1CH2
DC.W spurious ; 6 TPM1CH1
DC.W spurious ; 5 TPM1CH0
DC.W spurious ; 4 ICG
DC.W spurious ; 3 LVD
DC.W spurious ; 2 IRQ
DC.W spurious ; 1 SWI
DC.W _Startup ; 0 RESET
END
@norticum (Gast) wirklich sehr schön, wie ausführlich Du Deinen Code kommentiert hast. Ich habe leider keine Lust, extra noch Freescale-Assembler zu lernen. Eine CPU, die sich Spurious Interrupts leisten kann, sollte genug Power unter der Haube haben, um in C programmiert zu werden. Kommentare sollten aber trotzdem nicht fehlen. Peter
norticum wrote: > Ich freu mich immer wieder über solche antworten! Aha, deshalb hast Du also so sparsam kommentiert, damit sie kommen mußte. Dann freut es mich, daß ich Dir eine Freude bereiten konnte. Der Begriff "Spurious Interrupt" ist bei Dir unglücklich vormuliert. Er ist nämlich schon mit einer anderen Bedeutung belegt: Bei größeren CPUs (ARM) kann er auftreten, obwohl keine Programmfehler vorliegen. Die Ursache liegt in einem schlechten Design des Interruptkontrollers. Durch Laufzeiteffekte kann er vergessen, wer ihm den Interrupt gemeldet hat und schaut dann blöd aus der Wäsche. Daher meine Annahme, es handelt sich beim Freescale um einen Boliden. Beim AVR-GCC wird Deine Art "Spurious Interrupt" BADISR_vect genannt: This is a vector which is aliased to __vector_default, the vector executed when an ISR fires with no accompanying ISR handler. Peter P.S.: Also wenn brclr ein Sprung ist, dann schaut die CPU beim rts ziemlich blöd aus der Wäsche.
Hallo Peter!
spurious ist im Codewarrior eine Art Standart routine. Wenn ich ein
neues Projekt in Codewarrior öffne sieht die Vectortabelle ziemlich
mager aus. Spurious macht in Codewarrior rein gar nix. Das ist nur gegen
nicht gewollte interrupts. Bsp.:
;**************************************************************
;* spurious - Spurious Interrupt Service Routine. *
;* (unwanted interrupt) *
;**************************************************************
spurious: ; placed here so that security value
NOP ; does not change all the time.
RTI
;**************************************************************
;* Interrupt Vectors *
;**************************************************************
ORG $FFFA
DC.W spurious ;
DC.W spurious ; SWI
DC.W _Startup ; Reset
RTS ist Return from Subroutine
RTI ist Return from Interrupt
brclr ist ein Branchbefehl bedeutet "branch if clear" oder "branch if
bit x in x clear" (Wenn Taste gedrückt springe nach Subroutine x)
Momentan hab ich es mit meinem Code das soweit hinbekommen, dass sich
die Balkenanzeige in eine Richtung bewegt. Leider unabhängig von der
drehrichtung meines encoders. Hast du vielleicht ein AVR Assembler
Beispiel das ich mir ansehen kann? Sprut hat auch so etwas gemacht. Ich
versteh jedoch die mnemonic von Microchip nicht.
norticum
norticum wrote: > RTS ist Return from Subroutine > brclr ist ein Branchbefehl ... ... und pusht keine Returnadresse. Deshalb kannst Du nicht mit RTS zurück. RTS geht nur nach einem Call. Peter
vergiss den mainloop nicht..... mit "jsr rotencoder_sub" springe ich nach "rotencoder_sub". Mit RTS gehts wieder raus in den mainloop. Das selbe gilt auch für die "rotright_sub" bzw. "rotleft_sub". norticum
norticum wrote: > mit "jsr rotencoder_sub" springe ich nach "rotencoder_sub". Daß JSR Call heißen soll, habe ich nicht gewußt. Ich werd wohl besser still sein, die Syntax ist doch zu sehr unterschiedlich zu 8051/AVR. Dürfte trotzdem keine so blöde Idee sein, mal zu kommentieren, wie die Dekodierung gedacht ist und dann als Anhang senden für die Frescale-Kenner. Wenn Du mal sehen willst, wie andere Encoder einlesen: Beitrag "Drehgeber/Encoder 1-, 2- oder 4-schrittig" Peter
Hallo Peter! Werd ich nachholen (kommentieren). Ich hab von C keine Ahnung. Hab aber viel Geld für zwei Kurse ausgegeben um C zu lernen. Die fangen ende März an. Vielleicht kann ich mir unter den routinen in dem Beitrag in den du verweist, mehr vorstellen. Ich hab mir vor zweieinhalb Jahren das mit den Mikrocontrollern angefangen. Zwischenzeitlich hab ich versucht mir auch über AVR´s und Pic´s etwas anzueignen. Irgendwie bin ich aber immer wieder auf Freescale hängen geblieben. Preis Leistung stimmt einfach. Man bekommt einfach "Viel controller für wenig Geld". Auch viele unterschiedliche Demoboards sind erhältlich für kleines Geld. Die HCS08 Serie lässt sich wirklich sehr komfortabel bearbeiten und wär für den Anfang in der 8 bit Reihe wohl am besten geeignet. Der saure Beigeschmack besteht jedoch darin, dass fast niemand damit arbeitet. Das soll bedeuten, man findet im gegensatz zur AVR Fraktion wenige die einem weiterhelfen können. Je weiter man nach oben kommt um so dünner wird die Luft. Hat ein Freund mal zu mir gesagt. norticum
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.