Springen naar inhoud

Program loop


  • Log in om te kunnen reageren

#1

Robertdw

    Robertdw


  • >100 berichten
  • 102 berichten
  • Ervaren gebruiker

Geplaatst op 15 april 2010 - 12:41

Goedendag,

Ik ben op het moment bezig met het integraal ontwerpen van een program loop voor een BOSE folietester. het gaat hier om een programma om een wandpanneel, van BOSE te testen op juistheid heb het volgende programma ontworpen

Het paneeltje is een zeer eenvoudige versie van een

-Volume up and Down
-Radio Channel + -
Display met hierop voorgaande informatie



Zou men hier een blik op kunnen werpen en evt. evrtellen of hier een vereenvoudiging van is? :eusa_whistle:

;=============================================================================
;
; Folie Tester voor CS-WC AMS8
;
;=============================================================================
;
; In opdracht van : ____
;
; Versie : 4.2
; Datum : 09-04-2010
; Auteur : Robert
;
;
;
;=============================================================================

.include "m32def.inc"

// IO definitions
.equ Return = PC0
.equ VolDown = PC1 // Volume minus button
.equ VolUp = PC2 // Volume positive button
.equ ChDown = PC3 // Channel minus button
.equ ChUp = PC4 // Channel positive button
.equ LedFoil = PA7
.equ LedR1 = PD0
.equ LedG1 = PD1
.equ LedR2 = PD2
.equ LedG2 = PD3
.equ LedR3 = PD4
.equ LedG3 = PD5
.equ LedR4 = PD6
.equ LedG4 = PD7

.equ dispErr = 0b00110000
.equ disp1 = 0b11001111
.equ disp2 = 0b10010010
.equ disp3 = 0b10000110
.equ disp4 = 0b11001100
.equ Startdisp = 0b10000001


// Registers definitions
.dseg
.def reserved = r0 ; reserved for LPM instructions
.def s_stack = r1 ; stack for status during interrupt
.def w = r16 ; working register
.def temp1 = r17 ; temporary register
.def temp2 = r18
.def counter = r19 ; general purpose counter
.def tempL = r24 ; temporary 16bits register
.def tempH = r25

.equ Stack = 100 ; reserved for stack 100 bytes
.equ Reserve = (RAMEND - Stack)

.cseg
.org $000 ;Reset Vector
rjmp Reset

;Interrupt vectors
.org INT0addr
reti
.org INT1addr
reti
.org OC2addr
reti
.org OVF2addr
reti
.org ICP1addr
reti
.org OC1Aaddr
reti
.org OC1Baddr
reti
.org OVF1addr
reti
.org OVF0addr
reti
.org SPIaddr
reti
.org URXCaddr
reti
.org UDREaddr
reti
.org UTXCaddr
reti
.org ADCCaddr
reti
.org ERDYaddr
reti
.org ACIaddr
reti
.org TWIaddr
reti
.org INT2addr
reti
.org OC0addr
reti
.org SPMRaddr
reti


;=============================================================================
; Main program init
;=============================================================================
Reset:
ldi w,low(RAMEND) // init stack
out SPL,w
ldi w,high(RAMEND)
out SPH,w // Init IO ports
ldi w,255
out PortA,w
ldi w,0b11111111
out DDRA,w // direction register all output

ldi w,0b11111111 // enable pullup portC
out PortC,w
ldi w,0b00000000 // direction register all input
out DDRC,w


ldi w,(1<<LedR1)|(1<<LedR2)|(1<<LedR3)|(1<<LedR4) // All RED Leds on
out PortD,w
ldi w,0b11111111 // enable all output mode leds
out DDRD,w



ldi w,0 // load value 0
ldi xl,low(0x0060) // load sram begin address
ldi xh,high(0x0060)
ldi temp2,high(Reserve+1) // load sram end address
ldi temp1,low(Reserve+1)
Startdisplay:
ldi w,Startdisp
out PortA,w


ClearSram:
st x+,w // clear sram register and increment pointer
cp xl,temp1
cpc xh,temp2
brne ClearSram

// enable timer0
// Tdeb=50ms, Fosc=4MHz
// F=1/T T=periodetime F=4mHz registerpins CS00|CS02 hoog maken omdat 1024 nodig is om te vertragen (delay)om uit te komen op:50mHz
ldi w,(1<<CS00)|(1<<CS02)
out TCCR0,w

;=============================================================================
; Main program loop
;=============================================================================
Main:
sbic PinC,Return // skip next instruction if input is low
rjmp MainTest
rcall DebounceDelay
sbic PinC,Return
rjmp MainTest
StartNewTest:
ldi w,(1<<LedR1)|(1<<LedR2)|(1<<LedR3)|(1<<LedR4) // All Red Leds on
out PortD,w

MainTest:
rcall ReadSwVolDown // Check VolDown button
rcall ReadSwVolup // Check VolUp button
rcall ReadSwChDown // Check ChDown button
rcall ReadSwChUp // Check ChUp button
rjmp Main

ReadSwVolDown: // Check VolDown button
sbic PinC,VolDown
ret
rcall DebounceDelay
sbic PinC,VolDown
ret
in temp1,PinC // Get status all keys
com temp1
ldi w,0xFF^(1<<VolDown)
and w,temp1
brne ReadSwVolDownErr
in temp1,PortD
ldi w,(1<<LedG1) // Led1 Green
ldi temp2,0xFF^((1<<LedG1)|(1<<LedR1))
and temp1,temp2
or w,temp1
out PortD,w
cbi PortD,LedR1
sbi PortD,LedG1
ldi w,disp1
out PortA,w
ret

ReadSwVolDownErr:
ldi w,DispErr
out PortA,w
ret

ReadSwVolUp: // Check VolUp button
sbic PinC,VolUp
ret
rcall DebounceDelay
sbic PinC,VolUp
ret
in temp1,PinC
com temp1
ldi w,0xFF^(1<<VolUp)
and w,temp1
brne ReadSwVolUpErr
in temp1,PortD
ldi w,(1<<LedG2) // Led2 Green
ldi temp2,0xFF^((1<<LedG2)|(1<<LedR2))
and temp1,temp2
or w,temp1
out PortD,w
cbi PortD,LedR2
sbi PortD,LedG2
ldi w,disp2
out PortA,w
ret

ReadSwVolUpErr:
ldi w,DispErr
out PortA,w
ret

ReadSwChDown: // Check ChDown button
sbic PinC,ChDown
ret
rcall DebounceDelay
sbic PinC,ChDown
ret
in temp1,PinC
com temp1
ldi w,0xFF^(1<<ChDown)
and w,temp1
brne ReadSwChDownErr
in temp1,PortD
ldi w,(1<<LedG3) // Led3 Green
ldi temp2,0xFF^((1<<LedG3)|(1<<LedR3))
and temp1,temp2
or w,temp1
out PortD,w
cbi PortD,LedR3
sbi PortD,LedG3
ldi w,disp3
out PortA,w
ret

ReadSwChDownErr:
ldi w,DispErr
out PortA,w
ret

ReadSwChUp: // Check ChUp button
sbic PinC,ChUp
ret
rcall DebounceDelay
sbic PinC,ChUp
ret
in temp1,PinC
com temp1
ldi w,0xFF^(1<<ChUp)
and w,temp1
brne ReadSwChDownErr
in temp1,PortD
ldi w,(1<<LedG4) // Led4 Green
ldi temp2,0xFF^((1<<LedG4)|(1<<LedR4))
and temp1,temp2
or w,temp1
out PortD,w
cbi PortD,LedR4
sbi PortD,LedG4
ldi w,disp4
out PortA,w
ret

ReadSwChUpErr:
ldi w,DispErr
out PortA,w
ret


DebounceDelay:
push temp1 // store temp1,temp2
push temp2
ldi temp1,0 // reset timer0
out TCNT0,temp1
ldi temp2,195
Wait:
in temp1,TCNT0
cp temp1,temp2
brne Wait
pop temp2 // restore temp2,temp1
pop temp1
ret

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Robertdw

    Robertdw


  • >100 berichten
  • 102 berichten
  • Ervaren gebruiker

Geplaatst op 19 april 2010 - 13:07

De PIC die ik hiervoor gebruik is de Atmega 32 16AU 0628B

Dit misschien ter verduidelijking

Veranderd door Robertdw, 19 april 2010 - 13:09


#3

Kaspace

    Kaspace


  • >100 berichten
  • 202 berichten
  • Ervaren gebruiker

Geplaatst op 19 april 2010 - 16:56

Ik zie dat je nogal een hoop met toetsjes doet, en dat debouncen kan nog wel iets beter.

Ik ben een grote fan van Peter Dannegger mbt zijn debouncing ("Entprellung"op zijn duits) code. Het is de beste. De meest rotte schakelaars doen het er mee.

http://www.mikrocont...les/Entprellung

#4

Robertdw

    Robertdw


  • >100 berichten
  • 102 berichten
  • Ervaren gebruiker

Geplaatst op 20 april 2010 - 07:01

de debounce gebruik ik vooral om wanneer ik vanuit de wandcontroller een (bijv) vol - indruk deze niet voor 200 x voorkomt...Dit in een hondertste van een seconde..omdat de schakelaar niet in 1 keer contact maakt. dat fijn tunen van de debounce doe ik dus zo

DebounceDelay:
push temp1 // store temp1,temp2
push temp2
ldi temp1,0 // reset timer0
out TCNT0,temp1
ldi temp2,195
Wait:
in temp1,TCNT0
cp temp1,temp2
brne Wait
pop temp2 // restore temp2,temp1
pop temp1
ret

als jij hier een verkorte maar toch ook efficiente manier weet..?

#5

Robertdw

    Robertdw


  • >100 berichten
  • 102 berichten
  • Ervaren gebruiker

Geplaatst op 04 mei 2010 - 09:58

Het debouncen doe ik vooral om een zo nauwkeurig mogelijk testsignaal te krijgen, zonder enige ruis in mijn meetpuls.

Veranderd door Robertdw, 04 mei 2010 - 09:58


#6

Robertdw

    Robertdw


  • >100 berichten
  • 102 berichten
  • Ervaren gebruiker

Geplaatst op 19 mei 2010 - 09:39

Vanwege ik hier eigenlijk nog geen reactie heb gehad wil ik dit nogmaals onder de aandacht brengen.. het gaat hier dus om het testen van de display die wordt dus aangesloten op mijn test unit. het 7segment display geeft dan aan wanneer deze in orde is. ook met behulp van een led reeks wordt aangegeven (wanneer men een toets indrukt) of deze goed(groen) of fout is (rood)





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures